Langchain-Chatchat 防止虚假新闻传播的机制
在当今信息泛滥的时代,AI生成内容正以前所未有的速度扩散。一个看似权威的回答,可能只是模型“凭空想象”的产物——这种“幻觉”问题已成为大语言模型应用中最棘手的风险之一。尤其是在企业、政务、医疗等高敏感领域,一次错误的信息输出就可能导致严重的决策失误或舆论危机。
有没有一种方式能让AI“只说它知道的”?
Langchain-Chatchat 给出了答案:不是靠模型更聪明,而是靠系统设计更克制。
这个开源本地知识库问答系统的核心理念非常朴素:所有回答必须源自用户提供的文档,绝不允许自由发挥。它不依赖互联网搜索补全知识,也不靠通用语料库猜测答案,而是构建了一个完全封闭、可控的知识闭环。正是这种“限制”,让它成为当前对抗AI虚假信息最有效的工程实践之一。
这套系统的根基,是将传统大语言模型(LLM)从“全能选手”降维为“忠实执行者”。它不再承担记忆和理解世界的责任,而只是一个根据已有材料组织语言的工具。真正的“大脑”,其实是背后那个由私有文档构建而成的本地知识库。
整个流程可以用一句话概括:
你问我问题 → 我去你的文件里找相关内容 → 把找到的内容交给AI生成回答 → 回答附带原文出处。
听起来简单,但实现起来却涉及多个关键技术模块的精密协作。下面我们拆解看看它是如何一步步堵住虚假信息的漏洞的。
首先,当一份PDF、Word或TXT文档被上传后,系统并不会直接将其扔进数据库。而是经历三个关键处理阶段:
- 解析:使用如
PyPDF2、Unstructured等工具提取原始文本,保留标题、段落结构等语义信息; - 分块:将长文本切分为 300~500 token 的片段,并设置 50~100 token 的重叠区域,防止关键句子被截断;
- 向量化:通过嵌入模型(如
moka-ai/m3e-base中文模型)将每个文本块转换为高维向量,存入 FAISS 或 Chroma 这类向量数据库中。
这一步至关重要。因为普通的关键词匹配很容易漏掉同义表达——比如“年假”和“带薪休假”会被视为无关内容。而向量检索则不同,它基于语义相似性进行匹配,在向量空间中,“年假”与“带薪假期”的距离可能比“年假”与“节日”的距离还要近。
from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain.document_loaders import PyPDFLoader from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS # 加载并解析PDF loader = PyPDFLoader("company_policy.pdf") pages = loader.load() # 智能分块 text_splitter = RecursiveCharacterTextSplitter(chunk_size=300, chunk_overlap=50) docs = text_splitter.split_documents(pages) # 向量化并建立索引 embeddings = HuggingFaceEmbeddings(model_name="moka-ai/m3e-base") db = FAISS.from_documents(docs, embeddings) # 保存至本地 db.save_local("vectorstore/faiss_company_db")完成这一步后,你的企业制度、产品手册、合同模板等私有资料就变成了一个可快速检索的语义知识库。此时,任何后续提问都将受限于这些已知内容。
接下来是问答环节。当你问出一个问题时,系统并不会立刻让AI作答,而是先走一遍“证据查找”流程:
- 将你的问题也转化为向量;
- 在 FAISS 数据库中执行近似最近邻(ANN)搜索,找出 top-3 最相关的文本片段;
- 只有这些片段会被作为上下文传给 LLM。
这就形成了第一道防火墙:如果文档里没写,AI根本看不到。
然后才是生成阶段。这里也很有讲究——并不是随便调用一个云端大模型完事。Langchain-Chatchat 推崇的是本地部署 LLM,比如量化后的 ChatGLM3-6B 或 LLaMA 系列模型。它们运行在企业内网服务器上,数据无需上传至第三方平台,彻底杜绝了隐私泄露风险。
更重要的是,Prompt 设计上有明确约束:
“请根据以下信息回答问题,若信息不足请回答‘未找到相关依据’。”
同时,关闭采样、降低 temperature(设为 0.1 或更低),采用贪婪解码策略,进一步压缩模型“自由创作”的空间。
from transformers import AutoTokenizer, AutoModelForCausalLM import torch tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b-int4", trust_remote_code=True) model = AutoModelForCausalLM.from_pretrained("THUDM/chatglm3-6b-int4", trust_remote_code=True).cuda() def generate_answer(question, context): prompt = f"请根据以下信息回答问题,若信息不足请回答“未找到相关依据”。\n\n相关信息:{context}\n\n问题:{question}" inputs = tokenizer(prompt, return_tensors="pt").to("cuda") outputs = model.generate( **inputs, max_new_tokens=200, temperature=0.1, do_sample=False, pad_token_id=tokenizer.eos_token_id ) return tokenizer.decode(outputs[0], skip_special_tokens=True)你会发现,这套机制的本质不是“教AI说实话”,而是让它没有机会说谎。
因为它既不能访问外部网络,也无法回忆训练数据中的模糊印象,唯一能依靠的就是你给它的那几页文档。
再结合 LangChain 提供的RetrievalQA链,整个流程可以高度自动化:
from langchain.chains import RetrievalQA from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS from langchain.llms import HuggingFaceHub embeddings = HuggingFaceEmbeddings(model_name="sentence-transformers/all-MiniLM-L6-v2") vectorstore = FAISS.load_local("path/to/db", embeddings, allow_dangerous_deserialization=True) llm = HuggingFaceHub(repo_id="google/flan-t5-large", model_kwargs={"temperature": 0}) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", retriever=vectorstore.as_retriever(search_kwargs={"k": 3}), return_source_documents=True ) result = qa_chain("公司年假政策是什么?") print("答案:", result["result"]) print("来源文档:", result["source_documents"])最终输出不仅包含答案,还会返回引用的原始段落。这意味着每一次回应都是可验证、可审计的。你可以点击来源跳转到原文位置,确认其真实性。这在法律合规、内部审计等场景下尤为关键。
整个系统架构呈现出清晰的数据闭环:
+------------------+ +---------------------+ | 用户提问 | ----> | 问题预处理模块 | +------------------+ +----------+----------+ | v +------------------------------+ | 向量数据库(FAISS/Chroma) | | 存储:文档分块 + 向量表示 | +--------------+---------------+ | v +----------------------------------------+ | 检索模块:ANN 查找 top-k 相关段落 | +------------------+---------------------+ | v +--------------------------------------------------+ | LLM 生成模块:基于 context 生成最终回答 | | (本地部署,如 ChatGLM、LLaMA 等) | +--------------------------------------------------+ | v +----------------------+ | 输出:答案 + 来源引用 | +----------------------+所有环节均运行于本地或内网环境,形成一道坚固的信任边界。
但这并不意味着系统完美无缺。实际落地时仍需考虑一些关键设计细节:
- 拒答机制要合理:不能因为相似度略低就强行拼凑答案。建议设定余弦相似度阈值(如 < 0.6 则判定为无关),主动返回“无法回答”;
- 冲突内容需预警:若不同文档对同一问题表述矛盾,应标记冲突并提示人工介入,避免传播错误共识;
- 权限控制要到位:可集成企业身份认证系统,实现按角色访问不同知识子集,确保机密信息不越权;
- 知识覆盖率监测:定期评估常见问题是否能在库中找到对应内容,及时补充缺失文档。
此外,系统的有效性很大程度上取决于知识库的质量。如果你上传的文档本身存在错误或过时信息,那么AI也会“忠实地”传播这些错误。因此,知识维护机制同样重要——支持增量更新、版本管理、变更日志等功能,才能保证系统的长期可信度。
从更高维度看,Langchain-Chatchat 不仅仅是一个技术工具,它代表了一种全新的 AI 应用哲学:与其追求模型更强,不如让系统更可靠。
在通用大模型不断刷新参数规模的同时,这类“小而专”的本地化系统正在默默解决真正影响业务落地的核心问题——事实准确性、数据安全性和结果可追溯性。
它的适用场景极为广泛:
- 企业HR助手,解答薪酬福利、请假流程等问题;
- 政府政策咨询系统,确保答复与官方文件一致;
- 医疗机构辅助查询诊疗指南,减少人为疏漏;
- 法律事务所内部案例检索,提升响应效率;
- 教育机构教学资源问答,帮助师生快速获取资料。
这些场景的共同特点是:不怕AI不知道,就怕AI乱说。
而 Langchain-Chatchat 正是通过“知识限定 → 检索验证 → 受限生成”的三重机制,把AI的回答牢牢锚定在真实文档之上。每一次输出,都有据可查;每一次交互,都在可控范围之内。
在AI生成内容日益模糊真相边界的今天,也许我们不需要更多“能说会道”的模型,而是需要更多“知道自己无知”的系统。
让AI学会诚实地说“我不知道”,有时候比让它说出一万句正确的话更重要。
这,正是 Langchain-Chatchat 带给我们的最大启示。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考