LangChain接入本地Ollama时Embedding与LLM模型混用报错排查

文章导读
本地 Ollama 服务在同一个 11434 端口上同时提供嵌入和生成两类模型能力,但 LangChain 侧是用不同封装类去对接的。混用报错时先别急着重下模型,多数情况是请求被发到了该模型并不支持的端点。
📋 目录
  1. A 先判断报错来自哪一层
  2. B 用 Ollama 原生接口确认模型与端点
  3. C 修正 LangChain 侧的模型与类对应关系
  4. D 向量库写入前的维度确认
  5. E 排查顺序核对清单
  6. F 常见问题
A A

本地 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 端点:

LangChain接入本地Ollama时Embedding与LLM模型混用报错排查
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,如果是自选端口要写全。

LangChain接入本地Ollama时Embedding与LLM模型混用报错排查

向量库写入前的维度确认

换过 embedding 模型后,向量库还可能报维度错误。embedding 模型不同,输出向量长度可能不同,同一个 collection 只能接受固定维度。插入集合前先取一个向量确认长度:

vec = embedding_model.embed_query("测试")
print(len(vec))

拿到长度后,与向量库 collection 的维度设置比对。如果不一致,需要在写库建 collection 时指定新维度,或者直接新建 collection 重新写入。已经在用的 collection 无法直接兼容旧维度,检索时也得用同一个 embedding 模型生成查询向量。

排查顺序核对清单

按下面顺序过一遍,多数混用问题能在前四步解决:

LangChain接入本地Ollama时Embedding与LLM模型混用报错排查
  1. ollama list 核对模型名拼写
  2. curl 分别请求 /api/embed 与 /api/chat,确认模型支持哪个端点
  3. 核对代码中使用的类与模型类型是否对应
  4. 检查 base_url 端口与 Ollama 启动配置一致
  5. 打印 embed_query 的向量长度,与向量库维度比对
  6. 维度不一致时新建 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 模型计算查询向量。