深圳市住房和建设网站,平台关键词排名优化,家教网站开发,wordpress首页跳出广告Langchain-Chatchat 内容安全控制#xff1a;黑白名单过滤实战
在企业逐步将大语言模型#xff08;LLM#xff09;引入内部知识管理系统的今天#xff0c;一个看似简单却至关重要的问题浮出水面——如何防止用户问出“不该问的”#xff0c;或者上传“不能要”的内容…Langchain-Chatchat 内容安全控制黑白名单过滤实战在企业逐步将大语言模型LLM引入内部知识管理系统的今天一个看似简单却至关重要的问题浮出水面——如何防止用户问出“不该问的”或者上传“不能要”的内容尤其是在完全离线部署的私有化问答系统中没有云端审核兜底一旦放任敏感请求进入模型推理链路轻则生成不当回复影响专业形象重则触碰合规红线。Langchain-Chatchat 作为当前主流的开源本地知识库问答框架虽然默认不包含完善的内容审查机制但其模块化设计为自定义安全策略提供了充足空间。其中黑白名单过滤因其轻量、高效、可控性强成为构建第一道防线的首选方案。这套机制的核心思想并不复杂在用户提问或文档上传时先过一遍“词库关”。如果命中黑名单关键词比如“破解”、“翻墙”、“赌博”直接拦截若启用了白名单则仅允许预设术语通行其余一概拒绝。整个过程可在毫秒内完成几乎不影响系统响应速度且全程本地执行无需依赖外部服务。那么具体该如何实现并集成到 Langchain-Chatchat 中我们不妨从最基础的 Python 实现开始。以下是一个简洁但实用的内容过滤器类import re from typing import List, Tuple class ContentFilter: def __init__(self, blacklist_path: str None, whitelist_path: str None): self.blacklist self._load_words(blacklist_path) if blacklist_path else set() self.whitelist self._load_words(whitelist_path) if whitelist_path else None # 编译正则表达式以提高匹配效率 if self.blacklist: escaped [re.escape(word.strip()) for word in self.blacklist if word.strip()] pattern |.join(escaped) self.black_pattern re.compile(pattern, re.IGNORECASE) else: self.black_pattern None staticmethod def _load_words(file_path: str) - set: 从文件加载词汇每行一个词 words set() with open(file_path, r, encodingutf-8) as f: for line in f: word line.strip() if word and not word.startswith(#): # 忽略注释行 words.add(word.lower()) return words def check_blacklist(self, text: str) - Tuple[bool, List[str]]: 检查文本是否包含黑名单词汇 :param text: 待检测文本 :return: (是否安全, 命中的词列表) if not self.black_pattern: return True, [] cleaned_text re.sub(r[^\w\s], , text.lower()) # 去除标点 matches self.black_pattern.findall(cleaned_text) unique_matches list(set(matches)) is_clean len(unique_matches) 0 return is_clean, unique_matches def check_whitelist(self, text: str) - bool: 检查文本是否仅包含白名单词汇严格模式 :param text: 待检测文本 :return: 是否合法 if self.whitelist is None: return True # 无白名单即不限制 words_in_text set(re.findall(r\w, text.lower())) return all(word in self.whitelist for word in words_in_text) def filter(self, text: str) - dict: 综合过滤接口 # 先检查黑名单 safe, bad_words self.check_blacklist(text) if not safe: return { allowed: False, reason: blacklist_hit, details: {blocked_by: bad_words} } # 再检查白名单如有 if self.whitelist and not self.check_whitelist(text): return { allowed: False, reason: not_in_whitelist } return {allowed: True}这个类的设计有几个值得注意的细节支持从.txt文件动态加载词表运维人员只需编辑文本即可更新规则自动忽略以#开头的注释行便于维护带说明的词库对输入文本进行清洗去标点、转小写提升匹配鲁棒性正则表达式预先编译避免每次调用重复解析适合高频场景返回结构化结果方便后续做日志记录或策略决策。接下来是如何将其嵌入 Langchain-Chatchat 的请求流程。该系统通常基于 FastAPI 构建后端服务因此最自然的方式是通过 HTTP 中间件实现全局拦截from fastapi import Request, HTTPException # 初始化过滤器 filter ContentFilter(blacklist_pathconfig/blacklist.txt) app.middleware(http) async def content_security_middleware(request: Request, call_next): if request.method POST and request.url.path /chat: body await request.json() query body.get(query, ) result filter.filter(query) if not result[allowed]: raise HTTPException(status_code403, detailContent rejected by security policy) response await call_next(request) return response这段中间件代码的作用是在每次/chat接口被调用前自动触发内容检查。一旦发现黑名单命中立即返回403 Forbidden从而彻底阻断恶意请求进入 LangChain 的检索与推理流程。这不仅保障了输出安全也节省了宝贵的计算资源——毕竟没人希望把 GPU 算力浪费在处理“如何制作炸弹”这类问题上。实际部署中这套机制往往位于整个系统的最前端形成一道“前置网关”式的防护层graph TD A[用户客户端] -- B[API Gateway / Middleware] B -- C{内容过滤模块} C --|否| D[拒绝请求] C --|是| E[LangChain问答流程] E -- F[文档检索 → Prompt拼接 → LLM调用]这种架构遵循“尽早拦截”原则确保危险请求不会深入系统核心。尤其对于高并发环境提前终止非法请求能显著降低后端负载。不过简单的关键词匹配也有局限。攻击者可能通过拆字、同音替换、拼音缩写等方式绕过检测例如用“破jie”代替“破解”或“fanqiang”代替“翻墙”。为此我们需要增强防绕过能力模糊匹配扩展除了精确匹配可加入常见变体。例如在黑名单中同时添加“破解”、“破 解”、“po jie”、“p0jie”等使用高性能多模匹配算法当词库规模上升至数千甚至上万条时朴素的正则遍历会成为性能瓶颈。此时推荐采用 Aho-Corasick 算法它能在一次扫描中完成所有关键词的匹配。Python 中可通过pyahocorasick库实现import ahocorasick def build_automaton(word_list): A ahocorasick.Automaton() for idx, word in enumerate(word_list): A.add_word(word, (idx, word)) A.make_automaton() return A # 使用示例 blacklist [破解, 翻墙, 赌博] matcher build_automaton(blacklist) text 我想知道怎么破 解软件 matches [item[1][1] for item in matcher.iter(text)] # 输出: [破解]Aho-Corasick 在大规模词库下的性能优势明显即便是百万级关键词也能保持亚毫秒级响应。此外黑白名单不应孤立存在。更健全的安全体系应是“规则 模型”的双引擎模式黑白名单负责拦截明确已知的威胁速度快、准确率高同时接入轻量级 NLP 分类模型如基于 BERT 的敏感意图识别用于捕捉语义层面的风险弥补规则覆盖不足的问题输出阶段也可增加二次过滤对模型生成的回答再次扫描形成闭环控制。配置管理方面建议将词库存放在独立目录并支持热重载或重启生效。有条件的企业还可开发简易 Web 管理界面让非技术人员也能便捷地增删敏感词降低运维门槛。值得一提的是黑白名单的价值远不止于“防坏人”。在某些受监管行业它可以发挥更精细的治理作用。例如在金融客服系统中设置白名单仅允许“理财”、“基金”、“利率”等业务相关术语防止员工查询竞品信息在医疗知识库中屏蔽未上市药品名称避免误导性回答在教育机构内部系统中限制只能访问教学大纲范围内的知识点维持问答的专业边界。这些策略本质上是一种“权限分级”的体现——不是所有知识都应对所有人开放AI 助手的回答也需符合组织的合规框架。回顾整个方案黑白名单之所以能在 Langchain-Chatchat 这类系统中脱颖而出正是因为它完美契合了私有化部署的核心诉求低成本、低延迟、高可控。相比动辄需要标注数据、持续训练的机器学习模型或依赖网络连接的第三方审核 API一套精心设计的规则系统反而更具落地优势。当然它并非万能。面对复杂的语义欺骗或新型攻击手法仍需结合其他技术手段。但作为第一道防线黑白名单的性价比无可替代。未来的发展方向很可能是将这类轻量规则引擎与小型化安全模型深度融合形成可插拔、可组合的内容风控中间件。而 Langchain-Chatchat 的开放架构恰恰为这样的创新预留了足够的演进空间。某种意义上这不仅是技术选型的问题更是对 AI 可信性的实践回应真正的智能始于克制。创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考