在本地通过 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 脚本
以下是一个最小可用的 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. 嵌入模型维度不匹配
如果更换了嵌入模型,向量库中的旧数据可能无法检索,建议清空向量库目录后重新入库。
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/