如何在本地用 Ollama 部署 Llama 3 并通过 LangChain 实现私有知识库问答

一杯咖啡日记 初级 2026/5/2 258 浏览 2 点赞 约 2 分钟

把 Llama 3 跑在本地做 RAG(检索增强生成)最头疼的不是部署,而是怎么让 LLM 别在检索到文档后还一本正经地胡说八道。我最近把这套流程跑通了,核心是利用 Ollama 的 API 接口配合 LangChain 的内存向量库,实现完全离线的私有知识库。

如何在本地用 Ollama 部署 Llama 3 并通过 LangChain 实现私有知识库问答

第一步是把 Llama 3 拉下来。安装好 Ollama 后直接执行:

ollama run llama3
为了让 LangChain 能调用,确保 Ollama 在后台运行,它默认会占用 11434 端口。

最关键的配置在 LangChain 的 Embedding(向量化)选择上。很多人直接用 Llama 3 来做 Embedding,这会导致推理速度极慢且效果一般。我建议单独跑一个轻量级的 bge-small-en-v1.5 或者 nomic-embed-text

下面是实现私有问答的核心代码逻辑:

from langchain_community.llms import Ollama
from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_community.document_loaders import TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.chains import RetrievalQA

# 加载本地私有文档
loader = TextLoader("./my_knowledge.txt")
documents = loader.load()

# 文本切分:chunk_size 建议在 500-800 之间,太小丢失上下文,太大干扰检索
text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
texts = text_splitter.split_documents(documents)

# 使用 nomic-embed-text 提高向量化速度
embeddings = OllamaEmbeddings(model="nomic-embed-text")
vectorstore = FAISS.from_documents(texts, embeddings)

# 初始化本地 Llama 3
llm = Ollama(model="llama3", temperature=0.1) # 温度调低,减少幻觉

# 构建检索链
qa_chain = RetrievalQA.from_chain_type(
    llm=llm,
    chain_type="stuff",
    retriever=vectorstore.as_retriever()
)

response = qa_chain.invoke("文档中关于XX项目的具体要求是什么?")
print(response)

在这个过程中我踩了两个坑,分享给打算尝试的朋友:

内存溢出与显存抢占:如果你同时运行 llama3nomic-embed-text,Ollama 会尝试把两个模型都加载进显存。如果显存不足 8G,会出现极其严重的卡顿。解决办法是在 .bashrc 或环境变量中配置 OLLAMA_MAX_LOADED_MODELS=1,强迫它在切换时卸载旧模型,虽然增加了加载延迟,但保证了不会崩溃。

检索精度问题:默认的 as_retriever() 检索出来的片段如果不够精准,Llama 3 很容易开始自由发挥。建议在 as_retriever 中加入 search_kwargs={"k": 3} 限制返回片段数量,并手动优化提示词模板,明确告诉模型「如果检索内容中没有答案,请直接回答不知道,不要猜测」。

这套方案的效率提升在于完全脱离了网络 API,响应延迟仅取决于你的 GPU 算力,且数据完全不出本地,适合处理公司内部敏感文档。

全部回复 (0)

还没有回复,来发第一条吧!

发表回复

支持 Markdown 格式