跳转至

15 - 技术文档问答

项目背景与目标

某开源软件公司维护着十余个技术产品,官方文档累计上万页(API 参考、教程、最佳实践、变更日志),用户与内部支持团队每天产生大量提问。传统搜索只能返回文档列表,用户仍需自行阅读定位答案,且代码示例与版本耦合易出错。企业希望构建技术文档智能问答系统,支持多文档 RAG、代码示例检索、版本感知,让用户用自然语言获得带引用与可运行示例的答案,问答准确率 ≥ 90%,含可运行代码示例。

核心目标: 1. 多文档 RAG,跨产品跨章节检索 2. 代码示例专用检索与版本匹配 3. 答案含引用溯源与可运行示例 4. 问答准确率 ≥ 90%,响应 < 3 秒

预期价值:降低支持成本、提升开发者体验、文档反馈闭环、推广产品采用。

需求分析

用户角色与场景 - 开发者用户:查 API 用法、找代码示例、排错 - 内部支持:快速答用户问题、定位文档缺陷 - 文档作者:基于问答数据发现文档缺口

功能需求列表 - 自然语言提问 + 多轮追问 - 多文档 RAG(API 参考、教程、最佳实践、变更日志) - 代码示例专用索引(按语言、版本、功能标签) - 版本感知(答案对应提问者使用版本) - 引用溯源(文档链接 + 锚点) - 可运行示例(标注运行环境与依赖) - 文档缺口发现(高频无答案问题反馈作者) - 多语言文档(中英)

非功能需求 - 性能:P95 < 3 秒 - 准确性:代码示例可运行率 ≥ 85% - 可用性:99.9% - 覆盖:支持 10+ 产品文档

约束条件:需与官方文档站点集成;支持版本切换。

技术选型说明

层次 技术选择 选型理由
Agent 框架 LlamaIndex 多文档 RAG 与代码索引强
LLM Qwen2.5-72B 代码与文本双强
Embedding bge-m3 + 代码专用模型 文本与代码分库索引
向量库 Milvus 多索引、标量过滤
重排序 bge-reranker 提升召回质量
后端 Python FastAPI 异步
部署 K8s + CDN 全球访问

架构设计

flowchart LR
    subgraph 离线
        DOC[多产品文档] --> PARSE[解析+分块]
        PARSE --> TXT[文本索引]
        PARSE --> CODE[代码示例索引]
        TXT --> VEC1[(Milvus 文本)]
        CODE --> VEC2[(Milvus 代码)]
    end
    subgraph 在线
        Q[用户提问+版本] --> REW[查询改写]
        REW --> H1[文本检索]
        REW --> H2[代码检索 版本过滤]
        H1 --> RR[重排序]
        H2 --> RR
        RR --> GEN[生成+引用+示例]
        GEN --> A[答案]
        GEN --> GAP[缺口检测]
    end

核心是「双索引(文本+代码)+ 版本感知检索 + 引用溯源生成」。文档文本与代码示例分库索引,代码索引带语言与版本标签;检索时按用户版本过滤,避免给出过期 API;生成阶段强制引用与示例对齐。

关键模块实现思路

模块1:文档与代码双索引

  • 思路:文档文本按章节分块入文本索引;代码示例(代码块)单独提取,带「语言、产品、版本、功能标签」元数据入代码索引;两者都用 bge 生成向量。
  • 关键点:代码示例独立索引使其能精确召回可运行片段,而非混在长文中。

模块2:版本感知检索

  • 思路:用户提问时识别使用版本(显式指定或从上下文推断);代码检索用标量过滤 version ∈ 用户版本兼容范围;对已废弃 API,答案标注「此 API 在 vX 废弃,建议用 Y」。
  • 示意:
    def search_code(query, lang, version):
        flt = f"lang == '{lang}' and version_compatible contains '{version}'"
        return code_vec_db.search(embed(query), filter=flt, top_k=5)
    

模块3:引用溯源生成

  • 思路:Prompt 强制答案每个要点后标注文档引用(产品-章节-锚点);代码示例标注来源与版本;后处理校验引用真实存在。

模块4:文档缺口发现

  • 思路:对「无高置信召回」或「用户标记无用」的问题聚类,输出高频缺口主题给文档作者,指导文档补充。

核心流程详解

流程1:查 API 用法

  1. 用户「如何在 v2.3 用 Python 批量导入数据」
  2. 识别版本 v2.3、语言 Python
  3. 文本检索批量导入教程,代码检索 Python 示例(版本过滤)
  4. 生成答案:步骤说明 + 可运行代码示例 + 文档链接
  5. 代码示例标注「适用于 v2.3+」

流程2:废弃 API 提示

  1. 用户问某 v1 API 用法,但已 v2 废弃
  2. 检索发现该 API 在变更日志标记废弃
  3. 答案提示「此 API 已废弃,建议使用 Y,示例:...」

部署与优化建议

  • 部署架构:索引离线流水线;在线服务全球多区域 + CDN 缓存高频问答。
  • 性能优化:高频问答答案缓存(带版本失效);rerank 仅 Top-30。
  • 成本控制:缓存命中不调 LLM;代码与文本检索可合并为一次召回。

常见问题与解决方案

  • 代码示例不可运行 → 代码示例入库前做可运行性验证;标注运行环境。
  • 版本混淆 → 严格版本过滤 + 答案标注适用版本。
  • 跨产品答案错位 → 检索带产品标签过滤。

扩展方向

  • 在线运行:文档站点内嵌代码运行沙箱。
  • 智能补全:用户写代码时实时推荐对应文档。
  • 多模态:支持架构图与截图问答。