跳转至

04 - 知识库问答机器人

项目背景与目标

某大型制造企业内部知识库积累了 20 余万份文档(操作规程、设备手册、工艺标准、培训资料、历史故障案例),散落在 SharePoint、Confluence、共享盘与纸质档案中。员工查找一个工艺参数平均要翻阅 5 份文档、耗时 20 分钟,且常因版本过期导致操作失误。企业希望构建企业内部知识库问答机器人,让员工用自然语言提问即可获得带引用溯源的准确答案,覆盖 90% 以上常见查询,单次问答响应 < 3 秒,并强制引用溯源以保证可信度。

核心目标: 1. 支持 20 万+ 文档的语义检索,召回准确率 ≥ 90% 2. 答案必带原文引用与版本信息(溯源) 3. 多文档类型解析(PDF/Word/Excel/PPT/图片) 4. 权限隔离,员工仅能检索授权范围文档

预期价值:缩短知识获取时间、减少操作失误、沉淀隐性知识、新人快速上手。

需求分析

用户角色与场景 - 一线员工:查设备操作参数、故障处理流程 - 工程师:检索历史故障案例、工艺标准 - 新员工:自助学习规程与制度 - 知识管理员:维护文档、版本、权限

功能需求列表 - 自然语言提问 + 多轮追问 - 文档分块与多级索引(按文档/章节/段落) - 向量检索 + 关键词检索混合召回 - 答案引用溯源(文档名、章节、页码、版本号) - 多模态:识别文档中图表/公式 - 权限过滤:按部门/岗位/密级隔离 - 反馈机制(点赞/纠错)回流优化

非功能需求 - 性能:P95 < 3 秒,并发 2000 - 安全:文档不外泄、传输加密、审计日志 - 可用性:99.9% - 准确性:答案与原文一致性 ≥ 95%

约束条件:纸质文档需 OCR 入库;部分图纸为 CAD 格式需特殊处理。

技术选型说明

层次 技术选择 选型理由
Agent 框架 LlamaIndex 原生面向 RAG,文档解析与索引能力强
LLM Qwen2.5-72B 私有化 数据安全要求高,必须私有化
Embedding bge-large-zh 中文工业文档检索效果好
向量库 Milvus + BM25(ES) 混合检索,向量+关键词互补
文档解析 Unstructured + PaddleOCR 多格式 + 中文 OCR
后端 Python FastAPI 与 LlamaIndex 生态契合
部署 K8s + GPU 推理 企业内网私有化

架构设计

flowchart LR
    subgraph 离线[离线索引流水线]
        DOC[多源文档] --> PARSE[解析 Unstructured/OCR]
        PARSE --> CHUNK[智能分块]
        CHUNK --> META[元数据: 权限/版本]
        CHUNK --> EMB1[Embedding]
        EMB1 --> VEC[(Milvus)]
        CHUNK --> BM[(ES BM25)]
    end
    subgraph 在线[在线问答]
        Q[员工提问] --> REW[查询改写]
        REW --> HY[混合检索]
        HY --> VEC
        HY --> BM
        HY --> RR[重排序 Rerank]
        RR --> GEN[生成+引用]
        GEN --> RAG_P[权限过滤]
        RAG_P --> A[带引用答案]
    end

核心是「离线索引流水线 + 在线混合检索 + 强制引用生成」。离线保证文档结构与元数据完整,在线用混合检索提升召回,生成阶段强制对齐原文片段做引用。

关键模块实现思路

模块1:文档解析与智能分块

  • 思路:用 Unstructured 解析 PDF/Word/PPT 保留结构(标题层级、表格、列表);按「语义+结构」分块,章节标题作为块元数据;表格单独成块并保留行列关系;图片走 OCR 提取文字与图注。
  • 关键点:分块大小 300-500 token,重叠 50,避免割裂语义;为每块打 doc_id / section / page / version / permission 元数据。
  • 示意:
    def chunk_document(doc):
        elements = unstructured.parse(doc.path)
        for el in elements:
            chunk = {"text": el.text, "section": el.section_path,
                     "page": el.page, "version": doc.version,
                     "acl": doc.acl_groups}
            yield chunk
    

模块2:混合检索与重排序

  • 思路:向量检索(语义相似)与 BM25(关键词精确匹配)并行召回各 Top-30,去重合并后用 bge-reranker 交叉重排取 Top-5。
  • 关键点:工业文档含大量型号、参数代号,BM25 对精确匹配至关重要;rerank 模型对召回质量提升显著(实测 +15% 准确率)。

模块3:权限过滤

  • 思路:检索时用 Milvus 标量过滤 acl ∩ user_groups ≠ ∅,从源头隔离;生成阶段二次校验引用块权限,防止 prompt 注入泄露。
  • 关键点:权限必须前置到检索阶段,而非仅生成后过滤,否则向量召回会因权限块占用 Top-K 挤掉合法结果。

模块4:引用溯源生成

  • 思路:Prompt 强制要求每个事实陈述后标注 [来源:文档名-章节-p页-v版本];后处理用正则提取引用并与召回块比对,无对应来源的陈述删除或标记「未溯源」。
  • 关键点:溯源是可信度的核心,宁可答「无依据」也不允许无引用陈述。

核心流程详解

流程1:查询设备故障处理参数

  1. 员工提问「3 号轧机液压系统压力报警怎么处理」
  2. 查询改写:补全设备代号、同义词扩展
  3. 混合检索召回 Top-30,权限过滤后 rerank Top-5
  4. 生成答案:「按规程先检查 X 阀,压力调至 12MPa [来源:3号轧机操作规程-液压章节-p45-v2.3]」
  5. 员工点击引用可跳转原文对应页

流程2:多轮追问细化

  1. 员工追问「如果还报警呢」
  2. Agent 维护上下文,结合上一轮检索结果继续检索故障树下一步
  3. 返回后续处理步骤并带新引用

部署与优化建议

  • 部署架构:索引流水线离线跑(夜间增量更新),在线服务无状态可水平扩展;Milvus 与 ES 独立集群。
  • 性能优化:高频问题答案缓存(带版本失效);embedding 批量化;rerank 仅对 Top-30 做。
  • 成本控制:文档变更时仅重新 embedding 变更块,不全量重建索引。

常见问题与解决方案

  • 文档版本过期误导 → 元数据带生效/失效时间,检索时过滤失效版本;答案标注版本号提示用户核对。
  • 表格/公式召回差 → 表格转 Markdown 后单独索引;公式用 LaTeX 文本索引。
  • 权限旁路攻击 → 生成后引用块二次权限校验,prompt 注入检测。

扩展方向

  • 知识图谱增强:抽取文档实体关系,支持复杂推理(如「A 故障是否影响 B 工序」)。
  • 主动推荐:根据员工岗位与当前任务主动推送相关规程。
  • 多模态问答:支持上传现场照片匹配历史故障案例图片。