如何在 Python 脚本中通过 langchain 调用本地 Ollama 接口实现 RAG

文章导读
在本地通过 LangChain 调用 Ollama 接口实现 RAG 是可行的,适合隐私敏感或无网环境,关键是确保 Ollama 服务正常运行且 Python 端安装了正确的集成包。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

在本地通过 LangChain 调用 Ollama 接口实现 RAG 是可行的,适合隐私敏感或无网环境,关键是确保 Ollama 服务正常运行且 Python 端安装了正确的集成包。

先说结论:这套方案适合本地开发与数据隐私场景,依赖 Ollama 后端服务与 LangChain 客户端的正确对接

  • 适合:本地部署、数据不出域、低成本验证 RAG 流程
  • 先看:Ollama 服务是否启动、模型是否已拉取、端口是否占用
  • 建议:嵌入模型与生成模型需分别指定,注意维度匹配问题

命令速用版

# 1. 启动 Ollama 服务(默认端口 11434)
ollama serve

# 2. 拉取所需模型(示例:llama3 和 nomic-embed-text)
ollama pull llama3
ollama pull nomic-embed-text

# 3. 安装 Python 依赖
pip install langchain-ollama langchain-community chromadb

为什么会这样

RAG 的核心是将外部知识存入向量库,检索后再交给大模型生成。Ollama 提供了本地运行的 LLM 和 Embedding 模型接口,LangChain 则有专门的组件来调用这些接口。两者结合可以在不依赖云端 API 的情况下,完成“文档加载 - 向量化 - 检索 - 生成”的闭环。

分步处理

1. 确认 Ollama 服务状态

在终端执行 ollama list,确保看到已下载的模型。若服务未运行,先执行 ollama serve

2. 编写 Python 脚本

如何在 Python 脚本中通过 langchain 调用本地 Ollama 接口实现 RAG

以下是一个最小可用的 RAG 脚本结构,使用 Chroma 作为向量存储:

from langchain_ollama import OllamaEmbeddings, OllamaLLM
from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import Chroma
from langchain_text_splitters import CharacterTextSplitter

# 初始化模型
embeddings = OllamaEmbeddings(model="nomic-embed-text")
llm = OllamaLLM(model="llama3")

# 加载与切片
docs = TextLoader("./data.txt").load()
splits = CharacterTextSplitter().split_documents(docs)

# 存入向量库
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)
retriever = vectorstore.as_retriever()

# 构建链
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import create_retrieval_chain

prompt = ChatPromptTemplate.from_template("""基于以下内容回答问题:
{context}

问题:{input}""")

chain = create_retrieval_chain(retriever, llm, prompt)
response = chain.invoke({"input": "你的问题"})
print(response["answer"])

3. 注意包名变化

LangChain 近期拆分了包结构,调用 Ollama 建议使用 langchain-ollama 而非旧的 langchain_community.llms.Ollama,以减少废弃警告。

怎么验证是否生效

运行脚本后,观察终端是否有文本输出。若报错,检查 Ollama 日志或 Python traceback。可以在 Ollama 服务启动的终端看到请求日志,确认有 /api/embeddings/api/generate/api/chat 的调用记录。

常见坑

1. 嵌入模型维度不匹配

如何在 Python 脚本中通过 langchain 调用本地 Ollama 接口实现 RAG

如果更换了嵌入模型,向量库中的旧数据可能无法检索,建议清空向量库目录后重新入库。

2. 上下文窗口限制

本地模型上下文长度有限,文档切片大小(chunk_size)不宜过大,否则会被截断。

3. 服务端口冲突

Ollama 默认占用 11434 端口,若被占用会导致连接拒绝,可通过环境变量 OLLAMA_HOST 修改。

参考来源

  • Ollama GitHub Repository, "API Documentation", https://github.com/ollama/ollama
  • LangChain Documentation, "Integrations: Ollama", https://python.langchain.com/docs/integrations/llms/ollama/