ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

知识库问答效果差,先别急着换模型

知识库问答效果差,先别急着换模型

之前参与过一个企业知识库问答项目,目标是让员工可以通过自然语言查询制度、流程、产品说明和常见问题。

最开始大家都把注意力放在模型和提示词上,觉得只要模型足够好,回答就会准确。但第一版上线后,问题很快出现:同一个问题,有时回答新版流程,有时引用旧版制度;有些答案看起来很流畅,但细节并不符合当前规定;还有一些问题会把不同部门的流程混在一起回答。

前期我们不断调整 prompt,比如要求模型“只根据知识库回答”“不要编造”“不确定时说明无法判断”。这些提示确实能减少一部分幻觉,但无法解决根本问题。后来我们检查知识库内容,才发现里面混了很多过期文档、重复文档和版本冲突资料。模型不是不够努力,而是检索到的资料本身就不干净。

知识库数据集需要版本和状态字段

企业知识库最怕的是资料没有版本管理。比如同一个报销流程,2022 年、2023 年、2024 年各有一份文档,但知识库里没有标记哪个是 current,哪个是 deprecated。检索系统只根据文本相似度召回内容时,很可能把旧文档也召回来。模型看到多个版本后,就可能混合生成一个看起来合理但实际错误的答案。

所以后面我们先重新设计知识库数据结构。每份文档都要有 document_id、title、department、version、effective_date、status、content_type、source_url、updated_at。对于 FAQ 类型资料,还会单独拆出 question、answer、keywords 和 applicable_scope。

doc_schema = { "document_id": "文档 ID", "title": "文档标题", "department": "所属部门", "version": "版本", "effective_date": "生效日期", "status": "current / deprecated", "content_type": "制度 / FAQ / 产品说明 / 流程", "updated_at": "更新时间", "source_url": "原始链接" }

这个结构的核心是 status 和 effective_date。只要能区分当前有效资料和历史资料,检索阶段就可以过滤掉 deprecated 文档,减少模型引用旧信息的概率。

用高质量数据集校准问答样本

在这个场景里,可以使用 Dataify 高质量数据集作为样本补充和数据校验基础。

立即体验:https://dataify.com?utm_source=imchloe&utm_term=01

它不直接替代问答系统,但能帮助团队准备更规范的训练样本、分类样本和 FAQ 样本。对于知识库问答来说,高质量数据集的价值是让模型有更清楚、更干净的参考材料。

例如我们会整理标准问答样本:

qa_samples = [ { "question": "差旅报销需要提交哪些材料?", "answer": "需要提交审批单、发票、行程单和支付凭证。", "department": "财务部", "content_type": "FAQ", "status": "current", "effective_date": "2024-01-01" }, { "question": "新员工入职需要完成哪些系统权限申请?", "answer": "需要完成邮箱、IM、项目管理系统和代码仓库权限申请。", "department": "人力资源部", "content_type": "FAQ", "status": "current", "effective_date": "2024-03-01" } ]

这些样本可以用于测试问答系统。如果系统回答内容和标准样本明显不一致,就说明检索或数据源可能存在问题。相比盲目调 prompt,这种基于样本的校验更容易定位问题。

检索前先过滤,再生成答案

后来我们在问答链路里加了一个简单规则:检索前先过滤 status != current 的资料,只在当前有效文档中做相似度召回。这样可以减少旧文档干扰。

def filter_current_docs(docs): return [ doc for doc in docs if doc.get("status") == "current" ]

如果资料很多,还可以按部门和内容类型进一步过滤。比如用户问报销问题,优先检索财务部文档;用户问权限问题,优先检索 IT 或 HR 相关文档。这样模型拿到的上下文更集中,回答自然更稳定。

def filter_by_scope(docs, department=None, content_type=None): results = docs if department: results = [ doc for doc in results if doc.get("department") == department ] if content_type: results = [ doc for doc in results if doc.get("content_type") == content_type ] return results

写在最后

这次项目给我的经验是,知识库问答效果不好时,不要第一时间责怪模型。很多时候,问题出在底层数据集:资料过期、版本冲突、字段缺失、样本不规范。模型只是根据检索到的内容回答,如果输入本身混乱,输出自然不稳定。

Dataify 高质量数据集在这类项目里可以作为基础数据补充和校验样本来源,帮助团队构建更干净的知识库结构。它不需要占据项目全部篇幅,但在关键环节能减少很多无效调参。对于企业问答、智能客服、内部知识库这类项目来说,先把数据集整理好,再谈模型优化,会更有效。

返回列表