news 2026/4/17 18:11:18

Langchain-Chatchat如何设置停用词表?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Langchain-Chatchat如何设置停用词表?

Langchain-Chatchat 中停用词表的设置与优化实践

在构建企业级本地知识库问答系统时,一个常被忽视但极具影响力的细节浮出水面:如何有效过滤那些高频却无意义的词汇?比如“的”、“是”、“在”这类词语,在日常交流中不可或缺,但在语义检索场景下却可能成为干扰项。这正是 Langchain-Chatchat 这类基于大语言模型(LLM)的知识问答系统中,停用词表所要解决的核心问题。

随着 AI 技术深入企业内部应用,从客服机器人到技术文档助手,越来越多组织希望借助 LLM 实现对私有知识的精准访问。Langchain-Chatchat 作为开源领域中的代表性项目,不仅支持 PDF、Word、TXT 等多种格式文档的离线处理,更通过模块化设计实现了高度可定制的文本预处理流程——其中,停用词机制便是提升检索准确率的关键一环。

那么,这个看似简单的“黑名单”功能,到底该如何配置才能真正发挥作用?它又在系统架构中扮演着怎样的角色?

停用词的本质:不只是“去掉常用词”

停用词(Stop Words),顾名思义,是在自然语言处理过程中被主动忽略的一类词汇。它们通常是语法功能词,如助词、介词、连词等,在中文里像“了”、“呢”、“我们”、“这个”等出现频率极高,但单独存在时几乎不携带实质语义信息。

如果不加以处理,这些词会在向量化阶段拉高向量空间的维度冗余,导致两个本应差异明显的句子因共现多个虚词而被判为“相似”。例如:

文档 A:“系统在启动时会检查配置文件。”
文档 B:“用户在登录后会收到通知消息。”

若不停用“在”、“会”,仅凭这两个词的共现就可能导致错误匹配。而经过清洗后,前者变为“系统启动检查配置文件”,后者为“用户登录接收通知消息”,语义区分度显著增强。

因此,停用词的作用远不止“减少数据量”这么简单,它直接影响的是向量表示的质量和语义检索的准确性

在 Langchain-Chatchat 中的工作机制

Langchain-Chatchat 的整体流程可以概括为六个阶段:

  1. 文档加载→ 2.文本分割→ 3.预处理(含分词与停用词过滤)→ 4.向量化编码→ 5.向量存储与检索→ 6.LLM 回答生成

停用词处理主要发生在第 3 阶段,即文本预处理环节。值得注意的是,这一过程必须双向一致:不仅文档内容需要过滤,用户的查询语句也应使用相同的规则进行清洗,否则将造成“训练-推理”空间错位,严重削弱检索效果。

以下是典型的技术实现路径:

如何加载自定义停用词表

最常见的方式是从文件读取,每行一个词,构建成集合以实现 O(1) 查找效率:

def load_stop_words(file_path: str): """ 从文本文件加载停用词,返回 set 类型便于快速查找 """ stop_words = set() with open(file_path, "r", encoding="utf-8") as f: for line in f: word = line.strip() if word and not word.startswith("#"): # 忽略空行和注释 stop_words.add(word) return stop_words # 示例调用 STOP_WORDS_FILE = "data/stopwords.txt" stop_words = load_stop_words(STOP_WORDS_FILE) print(f"已加载 {len(stop_words)} 个停用词")

你可以在data/目录下维护一份标准停用词文件,推荐参考哈工大、百度或 CNKI 提供的中文停用词库作为基础,并根据业务场景增删调整。

分词与过滤的实际操作

中文处理离不开分词工具,Langchain-Chatchat 默认集成 Jieba 是最常见的选择。以下是一个完整的预处理函数示例:

import jieba def preprocess_text(text: str, stop_words: set): """ 对文本进行分词 + 停用词过滤 """ tokens = jieba.lcut(text) # 使用精确模式分词 filtered_tokens = [ token for token in tokens if token not in stop_words and len(token.strip()) > 0 and not token.isspace() ] return "".join(filtered_tokens) # 或使用空格连接:" ".join(filtered_tokens)

注意这里的选择:是否保留空格取决于后续 embedding 模型的输入要求。例如m3ebge系列中文模型通常能良好处理无空格文本,但某些 Sentence-BERT 变体可能更适应带空格的形式。

与 LangChain 文本分割器的集成

为了确保每个 chunk 都经过统一清洗,建议将停用词逻辑封装进自定义的TextSplitter

from langchain.text_splitter import RecursiveCharacterTextSplitter class StopWordTextSplitter(RecursiveCharacterTextSplitter): def __init__(self, stop_words=None, *args, **kwargs): super().__init__(*args, **kwargs) self.stop_words = stop_words or set() def split_text(self, text: str): # 先按原策略切分 raw_chunks = super().split_text(text) # 再对每个 chunk 进行清洗 cleaned_chunks = [preprocess_text(chunk, self.stop_words) for chunk in raw_chunks] return cleaned_chunks

这样做的好处是解耦清晰,既复用了成熟的分割逻辑,又能灵活插入业务特定的清洗步骤。

使用方式如下:

text_splitter = StopWordTextSplitter( stop_words=stop_words, chunk_size=500, chunk_overlap=50 ) documents = text_splitter.split_text(full_document_content)

整个流程无缝嵌入现有 pipeline,无需修改上层逻辑。

架构位置与影响链条

停用词处理虽小,却处于整个知识问答系统的“上游咽喉”位置:

[原始文档] ↓ (Loader) [Document 对象] ↓ (Text Splitter + 停用词过滤) [Cleaned Chunks] ↓ (Embedding Model) [Vector Embeddings] ↓ (Vector Store) [FAISS / Milvus] ↓ (Retriever) [Top-k 相似片段] ↓ (LLM Prompt 组合) [Final Answer]

一旦在此处引入偏差,后续所有环节都将继承错误。例如:
- 若误删关键术语(如把“API”当作缩写词删除),相关知识点将永远无法被检索;
- 若未对查询做同样处理,则用户提问“怎么配置 API?”对应的向量与文档中已被清洗过的“配置接口”无法对齐,导致漏检。

这也解释了为何许多团队在初期搭建系统时感觉“效果不稳定”——表面看是模型不准,实则可能是预处理环节埋下的隐患。

实践中的常见误区与应对策略

✅ 推荐做法

实践说明
选用权威词表为基础如哈工大停用词表包含近 700 个高频虚词,适合作为起点;避免自行凭感觉编写。
结合业务微调法律文档中的“应当”、医疗文本中的“患者”,虽然频发但具语义价值,不应盲目加入停用词。
保持查询一致性用户输入的问题必须走相同的分词+过滤流程,确保向量空间对齐。
动态维护能力可考虑开发简易后台界面,允许管理员实时增删停用词并热更新,适应知识演进。

❌ 应避免的陷阱

  • 直接替换原始字符串:不要用.replace("的", "")这种粗暴方式,容易破坏词语边界,如“目的地”变成“原地”。
  • 混用英文停用词表处理中文:英语中的 “the”, “a”, “is” 并不适用于中文语境,且可能导致编码异常。
  • 过度删除导致语义断裂:否定词如“不”、“非”必须谨慎对待,否则“不能访问”变成“能访问”,完全反转原意。
  • 忽略 tokenizer 特性:若使用 BERT 类模型(如bert-base-chinese),其 WordPiece 分词本身已具备一定抗噪能力,过度干预反而适得其反。

一个典型的反例是某团队为追求“极致精简”,将所有单字词全部设为停用词,结果“云平台部署失败”变成了“平台部署失败”,丢失了“云”这一关键上下文,导致检索偏离。

更进一步:智能化停用策略的可能性

虽然目前主流仍是静态词表过滤,但未来方向正逐步走向动态识别与上下文感知。例如:

  • 利用 TF-IDF 或 TextRank 算法自动识别当前文档集中“高频低信息量”的词汇,辅助人工决策;
  • 结合词性标注(POS),仅过滤助词、介词、语气词,保留代词、数词等潜在关键成分;
  • 引入轻量级分类器判断某个高频词在特定领域是否具有语义权重。

这些方法虽尚未成为 Langchain-Chatchat 的默认选项,但得益于其开放架构,开发者完全可以扩展preprocess_text函数,接入 THULAC、LTP 等 NLP 工具实现更精细控制。

小改动,大影响

回到最初的问题:为什么要在 Langchain-Chatchat 中设置停用词表?

答案或许比想象中深刻。这不是一项单纯的性能优化,而是一种语义净化工程——通过剥离语言表层的冗余结构,让真正有价值的信息浮出水面。

在一个真实的客户案例中,某制造企业的运维手册系统初始检索准确率仅为 62%。经分析发现,“设备在运行期间可能会发生故障”这类描述因频繁共现“在”、“会”、“的”等词,导致大量误召回。引入定制化停用词表并排除专业术语后,准确率跃升至 89%,响应速度也提升了约 15%。

这种提升的背后,是对“什么是噪声、什么是信号”的深刻理解。

对于追求高精度问答体验的技术团队而言,精细化的文本预处理不再是可选项,而是构建差异化竞争力的基础能力。而停用词表,正是这条路上最值得认真对待的第一步。

正如一句老话所说:“垃圾进,垃圾出。”再强大的大模型,也无法弥补源头数据的混乱。唯有在预处理阶段下足功夫,才能让 AI 真正读懂你的知识。

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

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

3、简单高效的PF防火墙配置与管理指南

简单高效的PF防火墙配置与管理指南 1. OpenBSD上的PF最简配置 在OpenBSD系统中,若要在启动时启用PF(Packet Filter),需告知rc系统启动该服务。具体操作是编辑或创建 /etc/rc.conf.local 文件,并添加以下内容: pf=YES # enable PF pf_rules=/etc/pf.…

作者头像 李华
网站建设 2026/4/16 18:40:05

5大技巧解锁Qobuz无损音乐宝库:从零搭建你的高解析度音乐收藏

你是否曾经为Qobuz平台上琳琅满目的高解析度音乐而心动不已?那些24bit/192kHz的母带级音源,仿佛就在指尖却又遥不可及。传统的在线收听方式总是让人意犹未尽,而Qobuz严格的下载限制更是让无数音乐爱好者望而却步。今天,让我带你一…

作者头像 李华
网站建设 2026/4/16 5:08:11

ZLMediaKit终极指南:Windows服务化部署完整解决方案

ZLMediaKit终极指南:Windows服务化部署完整解决方案 【免费下载链接】ZLMediaKit 基于C11的WebRTC/RTSP/RTMP/HTTP/HLS/HTTP-FLV/WebSocket-FLV/HTTP-TS/HTTP-fMP4/WebSocket-TS/WebSocket-fMP4/GB28181/SRT服务器和客户端框架。 项目地址: https://gitcode.com/G…

作者头像 李华
网站建设 2026/4/17 15:32:30

结合Kotaemon与Go语言开发高并发智能助手

结合Kotaemon与Go语言开发高并发智能助手 在企业智能化转型的浪潮中,一个常见却棘手的问题浮出水面:如何让AI助手既“聪明”又“扛压”?我们见过太多演示惊艳、上线即崩的智能客服系统——面对几百人同时提问,响应延迟飙升&#x…

作者头像 李华
网站建设 2026/4/13 19:59:01

免费图像艺术化工具Pintr:一键将照片转化为专业线条画

免费图像艺术化工具Pintr:一键将照片转化为专业线条画 【免费下载链接】pintr Create single line illustrations from your pictures. Get a drawing, SVG or coordinates for a CNC. 项目地址: https://gitcode.com/gh_mirrors/pi/pintr 你是否曾经想要将普…

作者头像 李华
网站建设 2026/4/16 10:37:13

ExoPlayer播放器状态持久化完整解决方案:告别进度丢失的终极指南

ExoPlayer播放器状态持久化完整解决方案:告别进度丢失的终极指南 【免费下载链接】ExoPlayer 项目地址: https://gitcode.com/gh_mirrors/ex/ExoPlayer 你是否曾经历过这样的场景:正在追剧时接到重要电话,返回后发现视频又从头开始播…

作者头像 李华