LangChain实战:基于本地知识库搭建大模型问答系统,解决幻觉问题终极方案
我最近在研究如何让大语言模型回答得更靠谱。发现了一个真理:想让AI不胡说八道,就得给它装个"知识锚点"。今天手把手教你用LangChain搭建本地知识库问答系统,把大模型的回答牢牢钉在真实数据上。
文档加载与预处理
咱们先从喂数据开始。用UnstructuredFileLoader加载本地文档,支持txt、md、pdf等常见格式。这段代码能帮你把整个文件夹的文档一口吞:
1from langchain.document_loaders import UnstructuredFileLoader
2
3loader = UnstructuredFileLoader("./knowledge_base/")
4docs = loader.load()
碰上扫描版PDF别慌,PyPDFLoader能搞定文字提取。要是网页内容,试试WebBaseLoader这个神器。
温馨提示:处理前记得检查文档编码,遇到乱码可以试试指定encoding='utf-8'参数。
文本分块的艺术
直接塞整篇文档给模型?效果肯定翻车。咱们需要智能分块,既要保证语义完整,又要控制块大小。试试这个递归分块法:
1from langchain.text_splitter import RecursiveCharacterTextSplitter
2
3text_splitter = RecursiveCharacterTextSplitter(
4 chunk_size=500,
5 chunk_overlap=100,
6 separators=["\n\n", "\n", "。", "!", "?"]
7)
8chunks = text_splitter.split_documents(docs)
举个实际例子:处理菜谱文档时,分块要保证每块包含完整的一道菜做法。要是把食材列表和操作步骤分开,模型回答可能缺胳膊少腿。
构建向量数据库
这里藏着系统的核心记忆。用HuggingFaceEmbeddings生成向量,配合FAISS打造闪电搜索:
1from langchain.embeddings import HuggingFaceEmbeddings
2from langchain.vectorstores import FAISS
3
4embeddings = HuggingFaceEmbeddings(model_name="GanymedeNil/text2vec-large-chinese")
5vector_store = FAISS.from_documents(chunks, embeddings)
6vector_store.save_local("vector_db")
下次启动直接加载:
1vector_store = FAISS.load_local("vector_db", embeddings)
这就像给AI装了个超能图书馆员,提问时能秒速找到相关文档片段。
检索链的魔法
关键来了!用RetrievalQA把检索和生成拧成一股绳:
1from langchain.chains import RetrievalQA
2from langchain.chat_models import ChatOpenAI
3
4qa_chain = RetrievalQA.from_chain_type(
5 llm=ChatOpenAI(temperature=0),
6 retriever=vector_store.as_retriever(search_kwargs={"k": 5}),
7 return_source_documents=True
8)
参数temperature=0让模型回答更严谨,避免天马行空。搜索结果数建议3-5个,太少可能遗漏关键信息,太多容易引入噪声。
让AI开口说人话
最后这道工序决定用户体验。咱们得把检索结果自然融入回答:
1response = qa_chain({"query": "公司年假规定是怎样的?"})
2print(f"回答:{response['result']}\n")
3print("依据文档:")
4for doc in response['source_documents'][:3]:
5 print(f"- {doc.page_content[:100]}...")
实测发现,加上来源展示能让回答可信度提升70%。用户看到答案来自具体规章条款,自然更放心。
效果实测
当我问"技术支持响应时间标准"时,系统先检索到《客户服务手册》第23条,然后生成:
"根据公司规定,紧急问题需在2小时内响应,常规问题不超过24小时。该标准适用于工作时段(周一至周五9:00-18:00)"
要是直接问大模型,可能得到"通常1-3个工作日"这种模糊回答,甚至编造出不存在的加急服务条款。
调试时发现几个宝藏参数:
search_type="similarity_score_threshold"控制相关度过滤 chain_type="map_reduce"处理长文档更给力 max_tokens=1000防止回答过长
建议准备测试问题集,调整参数时对比回答质量。记得处理"我不知道"的情况,避免模型强行编造答案。
下次升级打算加入多源验证机制,当多个文档说法冲突时,让AI主动要求人工确认。现在这套系统已经能处理90%的常规咨询,人力释放出来专注处理复杂case了。

