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:查询设备故障处理参数¶
- 员工提问「3 号轧机液压系统压力报警怎么处理」
- 查询改写:补全设备代号、同义词扩展
- 混合检索召回 Top-30,权限过滤后 rerank Top-5
- 生成答案:「按规程先检查 X 阀,压力调至 12MPa [来源:3号轧机操作规程-液压章节-p45-v2.3]」
- 员工点击引用可跳转原文对应页
流程2:多轮追问细化¶
- 员工追问「如果还报警呢」
- Agent 维护上下文,结合上一轮检索结果继续检索故障树下一步
- 返回后续处理步骤并带新引用
部署与优化建议¶
- 部署架构:索引流水线离线跑(夜间增量更新),在线服务无状态可水平扩展;Milvus 与 ES 独立集群。
- 性能优化:高频问题答案缓存(带版本失效);embedding 批量化;rerank 仅对 Top-30 做。
- 成本控制:文档变更时仅重新 embedding 变更块,不全量重建索引。
常见问题与解决方案¶
- 文档版本过期误导 → 元数据带生效/失效时间,检索时过滤失效版本;答案标注版本号提示用户核对。
- 表格/公式召回差 → 表格转 Markdown 后单独索引;公式用 LaTeX 文本索引。
- 权限旁路攻击 → 生成后引用块二次权限校验,prompt 注入检测。
扩展方向¶
- 知识图谱增强:抽取文档实体关系,支持复杂推理(如「A 故障是否影响 B 工序」)。
- 主动推荐:根据员工岗位与当前任务主动推送相关规程。
- 多模态问答:支持上传现场照片匹配历史故障案例图片。