如何利用 Ollama 搭建本地知识库并实现 RAG 检索增强生成

前端小哥哥 中级 2026/5/1 380 浏览 8 点赞 约 1 分钟

把 LLM 跑在本地最大的痛点不是模型能不能跑,而是它没有你的私有数据。纯靠 Prompt 喂文档,上下文窗口很快就爆了,而且 Token 消耗在长文本面前毫无优势。我最近把本地知识库跑通了,核心方案是 Ollama + AnythingLLM(或者用 Python 撸 LangChain),实现一个不需要联网的 RAG 流程。

如何利用 Ollama 搭建本地知识库并实现 RAG 检索增强生成

最关键的配置在 Embedding 模型上。很多人直接用 Llama 3 这种对话模型去做向量化,效果极差。建议单独跑一个专门的 Embedding 模型,比如 bge-m3nomic-embed-text

先在终端拉取模型:

ollama pull llama3:8b
ollama pull nomic-embed-text

如果你不想写代码,直接装个 AnythingLLM 桌面版,在设置里把 LLM Provider 改成 Ollama,Embedding Provider 同样选 Ollama 并指定 nomic-embed-text。这样它会自动把你的 PDF 或 Markdown 文件切片、向量化,存进本地的 LanceDB 数据库里。

对于想自定义流程的开发者,用 Python 实现 RAG 的核心逻辑是:文档 → 切片 → 向量化 → 检索 → 喂给 LLM。这里分享一个我踩坑后的优化技巧:切片(Chunking)不能太死板。如果固定 500 字切分,很容易把一个关键定义切成两半,导致检索不到。建议使用 RecursiveCharacterTextSplitter 并设置 chunk_overlap 为 50-100 字,保证上下文衔接。

简单的检索调用逻辑如下:

from langchain_community.embeddings import OllamaEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_community.llms import Ollama

# 初始化本地 Embedding 和 LLM
embeddings = OllamaEmbeddings(model="nomic-embed-text")
llm = Ollama(model="llama3")

# 加载已有的本地向量库
vectorstore = Chroma(persist_directory="./my_kb", embedding_function=embeddings)

# 检索相关片段并构建 Prompt
query = "公司关于远程办公的报销政策是什么?"
docs = vectorstore.similarity_search(query, k=3)
context = "\n".join([doc.page_content for doc in docs])

prompt = f"基于以下已知信息回答问题:\n{context}\n\n问题:{query}"
print(llm.invoke(prompt))

一个实战心得:本地 RAG 的质量 80% 取决于检索阶段。如果发现 AI 在胡说八道,大概率是 k 值(检索片段数)太小,或者 Embedding 模型对中文语义理解不够精准。这时候可以尝试在 Prompt 中加入强制约束,比如:如果已知信息中没有相关内容,请直接回答不知道,不要尝试编造。这样能有效降低本地模型的幻觉问题。

全部回复 (0)

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

发表回复

支持 Markdown 格式