RAG 知识库实战:LangChain 本地问答系统(可落地)

RAG 知识库实战:LangChain 本地问答系统(可落地)

让 AI 回答"只有你公司知道的事":规章制度、产品手册、私有文档。RAG(检索增强生成)是目前最实用的落地方案,这篇用 LangChain 完整实现一套本地知识库问答,代码直接跑。

前言

去年有客户问:能不能让 AI 基于他们公司的规章制度回答问题?直接问通用大模型不行——它不知道这些私有内容,还容易一本正经地胡说八道(幻觉)。标准答案是 RAG:先把文档建成本地知识库,提问时先检索相关段落,再让大模型"带着资料"回答。

这套方案我落地过好几个,隐私安全(数据不出内网)、效果可控、还能随时更新文档。这篇把核心代码完整写出来,你改改路径就能用。

在这里插入图片描述

一、RAG 是什么(一句话 + 流程图)

检索增强生成:回答前,先从你的文档里检索出最相关的几段,连同问题一起交给大模型,让它"依据资料"作答。

你的文档 → 切片 → 向量化 → 存入向量库
                                ↑
用户提问 → 向量化 → 检索最相关 k 段
                                ↓
              问题 + 检索段落 → 大模型 → 带依据的回答

为什么效果好:大模型不靠"记忆"回答,而是"现查资料"回答——知识可以随时更新(改文档即可),还能在回答里指出依据来源,幻觉大幅减少。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

二、技术选型

组件 选型 说明
文档加载/切片 LangChain 统一接口,md/pdf/docx 都能读
嵌入模型 BAAI/bge-small-zh-v1.5 中文语义检索标杆,模型小效果好
向量库 FAISS 本地轻量,够用且免部署
大模型 本地 Ollama(qwen2.5)或任意 OpenAI 兼容接口 隐私场景用本地,效果场景用云端

全部组件都能离线跑(嵌入模型和向量库都在本地,LLM 用本地 Ollama 的话整个链路不出网)。

三、完整代码(真实可跑)

pip install "langchain<0.3" langchain-community langchain-huggingface faiss-cpu sentence-transformers
from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_huggingface import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain_community.llms import Ollama

# 1. 加载文档(docs 目录下的所有 md/txt 文件)
loader = DirectoryLoader("docs/", glob="**/*.md", loader_cls=TextLoader)
docs = loader.load()
print(f"加载 {len(docs)} 个文档")

# 2. 切片:500 字一段,重叠 50 字(重叠保证上下文连贯)
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(docs)

# 3. 向量化 + 建库(首次运行会自动下载嵌入模型,约 100MB)
embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-zh-v1.5")
db = FAISS.from_documents(chunks, embeddings)

# 4. 检索 + 大模型回答
llm = Ollama(model="qwen2.5:7b")   # 本地模型;云端换 OpenAI() 等
qa = RetrievalQA.from_chain_type(
    llm=llm,
    retriever=db.as_retriever(search_kwargs={"k": 4}),  # 每次取最相关的 4 段
)

answer = qa.invoke("公司报销流程是什么?")
print(answer["result"])

跑起来之后,问什么它都会先查你的文档再回答,回答末尾还会带依据片段。

运行验证:首次运行会自动下载嵌入模型(约 100MB,稍等);之后提问,回答内容应来自你 docs/ 目录里的文档(比如问"报销流程"能答出你文档里写的步骤);问一个文档里没有的问题,模型会回答"资料中没有相关信息"——这正是 RAG(检索增强)生效的证据,而不是模型瞎编。

四、工程化要点(从 demo 到能交付)

  1. 文档更新机制:文档变了向量库不会自动变,要重建或增量更新——db.add_documents(新切片) 增量加,或写个"重建知识库"脚本(生产环境这是标配);
  2. 检索参数调优:k(每次检索的段落数)默认 4,文档大或问题复杂可以调到 6~8;chunk_size 500~800 是常见区间,太大检索不准、太小上下文碎片化;
  3. 嵌入模型升级路线:先 bge-small-zh-v1.5 跑通,追求精度再换 bge-large-zh-v1.5(更准但更慢更占内存);
  4. 回答带来源:把检索到的文档名拼进 prompt,让 AI 回答时标注"依据:xxx.md 第 3 段",客户能溯源,可信度直接拉满;
  5. 查询改写(进阶):用户问题太口语时,先让 LLM 把问题改写成适合检索的形式,再检索,命中率明显提升。

五、常见坑

坑 解决
装 langchain 依赖冲突 版本很乱:按文章 pip install "langchain<0.3";0.3+ 的 API 换了(用 create_retrieval_chain)
嵌入模型下载慢/失败 国内设镜像:set HF_ENDPOINT=https://hf-mirror.com 再运行
检索答非所问 chunk 大小不合适、嵌入没换中文模型、k 值太小,逐一排查
Ollama 连不上 确认 ollama serve 在跑、模型名对得上(ollama list)
回答还是胡编 prompt 里强调"只依据提供的资料回答,资料没有就说不知道"

六、总结

链路就一条:加载 → 切片 → 向量化 → 检索 → 回答。

接单角度说重点:企业私有知识库问答(规章制度助手、产品手册问答、客服知识库)是目前需求最旺的 AI 交付类型之一,很多公司愿意为"让 AI 懂自己公司"付费。这套代码就是内核,加上界面和文档管理,就是一个能卖钱的产品。

觉得有用点个赞收藏,有问题评论区见,看到都会回。

posted @ 2026-08-16 00:41  橘和柠  阅读(18)  评论(0)    收藏  举报