本地 Ollama 服务在同一个 11434 端口上同时提供嵌入和生成两类模型能力,但 LangChain 侧是用不同封装类去对接的。混用报错时先别急着重下模型,多数情况是请求被发到了该模型并不支持的端点。
混用报错一般是“模型类型与调用端点不匹配”。OllamaEmbeddings 只能指定 embedding 类模型,ChatOllama 只能指定生成类模型。先分清报错是 404、model not found 还是维度不一致,再依次核对模型名、端点、向量维度,能较快收敛到原因。
先判断报错来自哪一层
报错信息里能直接看到分层。请求路径错误时,LangChain 会抛出 404 Client Error,URL 里通常带 /api/embed 或 /api/chat;模型名不对时,服务端返回 model not found 或 does not support embeddings;如果报错出现在向量库写入或检索阶段,则是维度不匹配。先把这三种情况分开,后面的排查动作就不容易走偏。
- 404 Client Error,URL 含 /api/embed:模型不支持嵌入,或 LangChain 与 Ollama 端点版本不一致
- model not found / does not support embeddings:模型名拼写错误,或类与模型类型不匹配
- dimension mismatch / vector size mismatch:新旧 embedding 模型输出维度不同,向量库 collection 兼容不上
用 Ollama 原生接口确认模型与端点
先用 Ollama 原生接口确认模型到底支持哪种调用。这一步绕过 LangChain,能直接判断问题在模型层还是封装层。
ollama list
ollama list 输出中每一行是一个已拉取的模型,先核对名称拼写。接着用 curl 打 embedding 端点:
curl http://localhost:11434/api/embed \
-d '{"model": "nomic-embed-text", "input": "测试文本"}'
返回 JSON 里出现 embeddings 数组,说明该模型具备嵌入能力。把模型名换成生成模型再试同样命令,通常得到 404 或 model not found,这就复现了混用报错的根源。同理验证 chat 端点:
curl http://localhost:11434/api/chat \
-d '{"model": "qwen2.5", "messages": [{"role": "user", "content": "你好"}]}'
能正常返回 message 内容,说明该模型可用作生成模型。反过来把 nomic-embed-text 传入 chat 端点,也会收到不支持类型的响应。
修正 LangChain 侧的模型与类对应关系
LangChain 侧修正对应关系并不复杂。OllamaEmbeddings 用于嵌入,ChatOllama 用于对话,二者接收同一个 Ollama 地址,但 model 参数必须传各自支持的模型名:
from langchain_ollama import ChatOllama, OllamaEmbeddings
embedding_model = OllamaEmbeddings(
model="nomic-embed-text",
base_url="http://localhost:11434"
)
chat_model = ChatOllama(
model="qwen2.5",
base_url="http://localhost:11434"
)
如果项目里用的是 langchain_community 路径,保持代码风格统一也很重要,不要在两处混用 langchain_ollama 和 langchain_community 的类。参数方面优先使用 model,LangChain 新版对 model_name 已不推荐,继续用只是能跑但会带来弃用告警。base_url 则需要与 Ollama 实际监听端口一致,默认是 11434,如果是自选端口要写全。
向量库写入前的维度确认
换过 embedding 模型后,向量库还可能报维度错误。embedding 模型不同,输出向量长度可能不同,同一个 collection 只能接受固定维度。插入集合前先取一个向量确认长度:
vec = embedding_model.embed_query("测试")
print(len(vec))
拿到长度后,与向量库 collection 的维度设置比对。如果不一致,需要在写库建 collection 时指定新维度,或者直接新建 collection 重新写入。已经在用的 collection 无法直接兼容旧维度,检索时也得用同一个 embedding 模型生成查询向量。
排查顺序核对清单
按下面顺序过一遍,多数混用问题能在前四步解决:
- ollama list 核对模型名拼写
- curl 分别请求 /api/embed 与 /api/chat,确认模型支持哪个端点
- 核对代码中使用的类与模型类型是否对应
- 检查 base_url 端口与 Ollama 启动配置一致
- 打印 embed_query 的向量长度,与向量库维度比对
- 维度不一致时新建 collection 或全项目统一 embedding 模型
常见问题
为什么用 OllamaEmbeddings 指定 qwen2.5 会报 404
qwen2.5 这类生成模型没有嵌入端点,OllamaEmbeddings 固定调用 /api/embed,服务端对不支持的模型返回 404 或 model not found。应把生成模型放入 ChatOllama。
nomic-embed-text 能放进 ChatOllama 当对话模型用吗
不能。embedding 模型只输出向量,不做对话补全,ChatOllama 调用 /api/chat 时也会收到错误响应。需要区分两个类。
换了 embedding 模型之后向量库报维度错误怎么办
先打印新模型向量长度,与现有 collection 的维度比对。不一致时需要创建新 collection 重新写入,无法在原 collection 上直接追加。后续检索使用同一个 embedding 模型计算查询向量。