news 2026/5/9 22:09:18

Langchain-Chatchat支持自定义停用词表:优化检索相关性

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain-Chatchat支持自定义停用词表:优化检索相关性

Langchain-Chatchat 支持自定义停用词表:优化检索相关性

在企业知识管理日益智能化的今天,一个常见却棘手的问题浮现出来:为什么我们的大模型明明“读”了所有文档,回答却总是似是而非?比如员工问“年假可以跨年使用吗”,系统却从某段落中提取出“详见人力资源部规定”作为答案——看似合理,实则无效。这种“答非所问”的背后,往往不是模型能力不足,而是文本处理链条中的细节被忽略了。

Langchain-Chatchat 作为一款支持本地部署的知识库问答系统,在隐私安全与功能可定制性上表现出色。而其中一项容易被低估、却极为关键的功能,就是自定义停用词表。它虽不起眼,却是决定检索是否精准、回答是否靠谱的“隐形开关”。


传统自然语言处理流程中,停用词过滤被视为标准步骤——像“的”、“是”、“在”这类高频虚词通常会被直接删除,以减少噪声。但问题在于,通用规则无法适应专业语境。在一份法律合同里,“不得”中的“得”若被当作普通助词删去,剩下“不”,语义就彻底反转;在医疗文档中,“非典型肺炎”若因“非”和“典型”分别命中默认停用词而被拆解,信息完整性便荡然无存。

这正是 Langchain-Chatchat 提供自定义停用词机制的意义所在:让用户根据业务场景,动态控制哪些词该留、哪些该去。这个功能并不炫技,但它决定了系统能否真正理解你的行业语言。

整个知识库构建过程始于文档加载。无论是 PDF 报告、Word 手册还是纯文本文件,系统首先通过 PyPDFLoader 或 Docx2txtLoader 等组件将其转换为纯文本内容。接着进入关键阶段——文本切片(Text Splitting)。LangChain 的RecursiveCharacterTextSplitter按设定长度(如 chunk_size=500)将长文分割成小块,确保每段都能被嵌入模型有效编码。

此时,分词与停用词过滤登场。项目默认集成 Jieba 中文分词器,对每个文本块进行切词。而在这一步,如果沿用默认停用词表,可能会误伤关键术语。例如某企业内部常用缩写“OA系统”中的“系统”一词,若被归为泛化词汇而剔除,则后续检索“OA”时可能无法匹配到相关内容。

def load_stopwords(stopwords_path="config/custom_stopwords.txt"): stopwords = set() with open(stopwords_path, "r", encoding="utf-8") as f: for line in f: word = line.strip() if word: stopwords.add(word) return stopwords def preprocess_text(text, stopwords): words = jieba.lcut(text) filtered_words = [w for w in words if w not in stopwords and len(w.strip()) > 0] return " ".join(filtered_words)

上面这段代码展示了如何在文档预处理阶段引入自定义停用词逻辑。用户只需维护一个custom_stopwords.txt文件,增删词语即可全局生效。更重要的是,这一规则不仅作用于知识入库阶段,也同步应用于用户提问时的查询预处理,保证了向量空间中“问”与“答”的语义对齐。

实验数据显示,某金融机构在其内部政策库测试中启用自定义停用词后,Top-1 检索准确率从 72% 提升至 86%,平均响应时间下降约 15%。性能提升的背后,其实是噪声干扰的显著降低:原本频繁出现但无实质意义的引导性短语如“如下所示”、“请参见附件”等被主动过滤,使得真正承载信息密度的关键词得以凸显。

但这并不意味着停用词越多越好。实践中我们发现,过度删除会导致语义断裂。例如否定结构中的“未审批”、“不可撤销”一旦丢失核心虚词,就会变成误导性表达。因此建议:

  • 停用词总量控制在 200~500 个之间;
  • 明确保留逻辑否定词(如“非”、“不”、“禁止”);
  • 定期结合查询日志分析高频无效结果,反向推导需新增的过滤项;
  • 使用 Git 对stopwords.txt进行版本管理,记录每次调整背景。

这套机制之所以能发挥价值,离不开 LangChain 框架本身的模块化设计。Langchain-Chatchat 并非闭门造车,而是深度依赖 LangChain 提供的标准接口完成各环节编排。从 Document Loaders 到 Text Splitters,再到 Embeddings 和 Vector Stores,每一个组件都像乐高积木一样独立又协同。

以向量数据库为例,系统可选择 FAISS 或 Chroma 存储文档向量。这些向量由本地嵌入模型(如 BGE、Sentence-BERT)生成。当用户发起查询时,问题经过相同的分词与过滤流程后也被转化为向量,并在向量空间中寻找最相似的 top-k 片段。这一过程被称为“语义检索”,其准确性直接受文本清洗质量影响。

from langchain.embeddings import HuggingFaceEmbeddings from langchain.vectorstores import FAISS embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-small-en-v1.5") vectorstore = FAISS.from_documents(processed_docs, embeddings) retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

可以看到,向量化入口完全开放,开发者可以在processed_docs上自由施加预处理逻辑。这也意味着,只要你在构建文档和处理查询时保持一致的停用策略,就能最大程度避免“训练—推理不一致”带来的偏差。

最终的回答生成由本地部署的大语言模型完成。这是整个 RAG(Retrieval-Augmented Generation)流程的收官之笔。不同于调用 OpenAI API,Langchain-Chatchat 支持将 Qwen、ChatGLM、Llama 等开源模型部署在私有服务器上,实现数据零外泄。

from langchain.llms import LlamaCpp llm = LlamaCpp( model_path="models/qwen-7b-chat-q4_k_m.gguf", n_ctx=4096, n_batch=512, n_gpu_layers=35, temperature=0.7, verbose=True ) qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="map_reduce", retriever=retriever, return_source_documents=True )

借助 llama.cpp 加载 GGUF 量化模型,即使在没有高端 GPU 的环境下也能实现高效推理。7B 参数级别的模型在 Q4_K_M 量化下仅需约 6GB 显存即可运行,非常适合边缘设备或笔记本部署。同时,通过设置合理的上下文长度与批处理大小,可在响应速度与生成质量之间取得平衡。

整个系统的架构清晰体现了典型的 RAG 范式:

+------------------+ +---------------------+ | 用户前端 |<----->| 查询接口 (API) | +------------------+ +----------+----------+ | +-----------------v------------------+ | 查询预处理 | | - 分词 | | - 自定义停用词过滤 | +-----------------+------------------+ | +---------------------------v----------------------------+ | 向量检索引擎 | | - FAISS / Chroma | | - 基于语义相似度返回 top-k 文档片段 | +---------------------------+----------------------------+ | +---------------------------v----------------------------+ | 大语言模型 (LLM) | | - 本地部署(GGUF/Qwen/GLM等) | | - 结合检索结果生成自然语言回答 | +--------------------------------------------------------+

在这个闭环中,自定义停用词的作用贯穿始终。它不仅是文本清洗的一环,更是一种语义调控手段——通过对词汇粒度的精细把控,让系统更贴近真实业务需求。

实际应用中,一些典型问题得到了有效缓解:

  • 检索命中无关段落?可将“详见”、“如下”、“点击此处”等引导性短语加入停用表。
  • 关键术语被误删?将领域专有名词(如“ERP系统”、“KPI考核”)从停用列表中移除。
  • 否定语义误解?强制保留“不得”、“禁止”、“未经许可”等复合否定结构。
  • 多义词混淆?针对歧义词添加上下文无关的常见搭配至停用项,降低误匹配概率。

一位客户曾反馈,在审查采购合同时,模型多次将“不含税金额”误解为“含税”。排查发现,“不含”中的“不”被正常保留,但“含”却被当作高频动词误删。解决方案很简单:不在全局层面处理,而是将“不含”作为一个整体保留在允许词中,或将其拆解逻辑写入分词后处理规则。

这样的案例提醒我们:文本预处理从来不是一刀切的任务。越是专业的场景,越需要个性化的语言理解策略。

部署过程中还需注意几个工程实践要点:

  1. 分词一致性:确保训练与推理使用同一版本的 Jieba 及相同自定义词典,避免因分词差异导致向量偏移。
  2. 性能监控:定期采样查询日志,统计召回率、精确率与人工评分,形成反馈闭环。
  3. 硬件适配:对于内存有限环境,优先选用轻量级嵌入模型(如 bge-small)配合量化 LLM,保障流畅运行。
  4. 权限控制:限制对 LLM 接口的访问权限,防止未授权调用造成资源滥用或信息泄露。

Langchain-Chatchat 的真正价值,不在于它用了多么先进的模型,而在于它把控制权交还给了使用者。自定义停用词表只是一个切入点,背后体现的是“可解释、可调试、可优化”的设计理念。在一个越来越强调数据合规与业务贴合度的时代,这种能力尤为珍贵。

未来,随着嵌入模型对细粒度语义捕捉能力的增强,以及本地推理效率的持续提升,类似机制将在更多垂直领域发挥作用。而对于 AI 工程师而言,掌握这些“微调艺术”,或许比盲目追求更大模型更具现实意义。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:53:15

自抗扰控制(ADRC)这玩意儿玩起来挺有意思的。今天咱们就拆开它的内核看看,特别是怎么从传递函数推导到PID等效。先来段MATLAB代码热热身

自抗扰控制&#xff0c;幅频特性曲线&#xff0c;传函推导&#xff0c;pid等效&#xff0c;跟踪曲线&#xff0c;抗扰曲线。 s tf(s); G 1/(s^2 2*0.6*5*s 5^2); % 二阶振荡环节 bode(G), grid on 这代码画出来的幅频特性曲线能直观展示系统谐振峰的位置。注意看相位曲线…

作者头像 李华
网站建设 2026/5/9 10:39:04

单片机 433MHz 超再生模块发送接收 Proteus 仿真探秘

单片机433MHz超再生模块发送接收Proteus仿真源程序 使用Proteus7.8&#xff0c;实现超再生模块接收发送程序的仿真。 附有原理说明和单片机程序下载。 就是这种433M超再生收发模块&#xff1a;在电子制作的世界里&#xff0c;433MHz 超再生模块因其成本低、易实现等特点&#x…

作者头像 李华
网站建设 2026/5/1 20:35:46

基于改进A*算法的机器人路径规划MATLAB仿真:探索优化之路

6.基于改进A*算法的机器人路径规划MATLAB仿真程序&#xff08;含注释) 改进方法: 1、8个搜索方向变5个 2、冗余节点的删除 3、对评价函数f(n)进行改进 代码拿来可以直接用。在机器人路径规划领域&#xff0c;A算法一直是经典且应用广泛的方法。不过&#xff0c;为了让算法更加高…

作者头像 李华
网站建设 2026/5/3 13:16:36

单电阻采集FOC在STM32 F1/F3芯片上的实现

提供单电阻采集Foc&#xff0c;stm32 f1/f3芯片由于是源码不换在电机控制领域&#xff0c;磁场定向控制&#xff08;FOC&#xff09;技术因其能够实现高精度、高性能的电机控制而备受青睐。而单电阻采集方案则以其成本低、硬件设计简单的优势&#xff0c;在实际应用中有着广泛的…

作者头像 李华
网站建设 2026/5/8 18:01:12

探索四旋翼无人机的ADRC轨迹跟踪算法

四旋翼无人机自抗扰控制算法研究 ADRC 轨迹跟踪 附带说明文在无人机的控制领域&#xff0c;实现精准的轨迹跟踪一直是个热门话题。今天咱们就唠唠四旋翼无人机的自抗扰控制算法&#xff08;ADRC&#xff09;在轨迹跟踪方面的神奇之处。 什么是自抗扰控制算法&#xff08;ADRC&a…

作者头像 李华
网站建设 2026/5/1 9:27:22

Langchain-Chatchat与Zotero文献管理工具联动:科研人员福音

Langchain-Chatchat与Zotero联动&#xff1a;打造科研人员的AI知识助理 在今天&#xff0c;一位博士生可能需要阅读上百篇PDF论文才能完成一个研究方向的文献综述&#xff1b;一位研究人员深夜翻找三个月前读过的某篇论文中的实验参数&#xff1b;更有人因为担心数据泄露而不敢…

作者头像 李华