model not found, try pulling it first的意思很直接:Spring AI 已经把请求发给 Ollama 了,但 Ollama 本机没有这个模型。别先改 Bean、别先改 prompt,先跑一遍ollama list。
Issue & Env(案发现场与环境)
- 业务场景:用 Spring AI 对接本地 Ollama,想切到
llama3.1、deepseek-r1或 embedding 模型,结果一调用就失败。 - 常见环境:macOS / Linux 本地开发机,Ollama 已安装并启动,但没有提前把对应模型拉到本地。
StackTrace(堆栈日志)
报错原文来自 Ollama 服务端:
Error: model "llama3.1" not found, try pulling it first
自然,Spring AI 不会原样把这段话透传出来,而是包成框架异常往外抛。完整堆栈是:
org.springframework.ai.SpringAIFrameworkException: model "llama3.1" not found, try pulling it first
at org.springframework.ai.ollama.api.OllamaApi.chat(OllamaApi.java:103)
at org.springframework.ai.ollama.OllamaChatModel.call(OllamaChatModel.java:158)
at com.example.service.OllamaService.ask(OllamaService.java:24)
at com.example.controller.OllamaController.chat(OllamaController.java:42)
at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103)
at java.base/java.lang.reflect.Method.invoke(Method.java:580)
Caused by: org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request
at org.springframework.web.client.DefaultResponseErrorHandler.handleError(DefaultResponseErrorHandler.java:70)
at org.springframework.web.client.RestClient$DefaultRestClientBuilder$DefaultRequestUriSpec.lambda$retrieve$0(RestClient.java:388)
最上面是 Spring AI 的框架异常,Caused by 才是 Ollama 服务端返回的原始 400。只要看到 model "..." not found 这句话,问题就出在本地模型仓库,别往 Bean 或 prompt 上绕。
Reproduce(复现代码)
配置一个本地还没下载过的模型:
spring:
ai:
ollama:
chat:
options:
model: llama3.1
或者 embedding 配成:
spring:
ai:
ollama:
embedding:
options:
model: nomic-embed-text
如果当前机器上没 pull 过这个模型,第一次调用就会失败。
Root Cause(根因分析)
Ollama 和云模型不一样。它不是你写了模型名就能远程自动推断,而是要求本机已经存在该模型文件,或者应用显式打开自动拉取能力。
这类错误最常见有三个根因:
1. 模型从没 pull 过
这是最常见情况。Spring AI 请求到 Ollama 时,Ollama 会去本地模型仓库找对应模型;找不到就直接报 model not found。
2. 模型名写对了主名,写错了 tag
很多人只记得 llama3.1、deepseek-r1 这类主名,但实际要用的 tag 可能是 8b、70b、latest 或别的量化版本。如果你配置和本地实际存在的 tag 对不上,也会报“找不到模型”。
3. 以为 Spring AI 默认会自动 pull
Spring AI 文档里单独提供了 Auto-pulling Models 章节,说明自动拉取是显式能力,不是默认心智。你如果没配置自动拉取,框架不会替你默默下载几十 GB 的模型。
The Fix(解决方案)
先用 ollama list 看本地到底有什么
第一步永远是:
ollama list
如果输出里根本没有你配置的模型名,那问题就已经坐实了。
手动 pull 最稳
比如你要用 llama3.1:
ollama pull llama3.1
要用 embedding:
ollama pull nomic-embed-text
拉完后再跑一次:
ollama list
确认模型真的落在本地,再回到 Spring AI。
模型名和 tag 要和本地一致
如果你本地实际拉的是:
llama3.1:8b
那 Spring AI 里最好也明确写成:
spring:
ai:
ollama:
chat:
options:
model: llama3.1:8b
不要赌 latest 或默认 tag。
需要时再打开 auto-pulling
Spring AI 官方文档已经给了 Auto-pulling Models 章节。这个能力适合本地开发、临时环境或演示环境;如果你在生产环境打开它,要提前评估网络、磁盘和启动时间,因为模型下载不是轻操作。
小结
model not found, try pulling it first本质是 Ollama 本地没有这个模型。- 先查
ollama list,再决定是手动 pull 还是打开自动拉取。 - 模型主名对了,不代表 tag 也对;最好把完整模型名写进配置。
- 这类问题通常不是 Spring AI Bean 配错,而是本地模型仓库状态不对。
References(参考来源)
- Ollama Chat — Spring AI 官方文档spring-docs
- Ollama Downloadollama-docs
- Ollama Model Libraryollama-docs
