Files
MemoryBear/docs/rag/end-to-end
Multica PM Agent 343a5eebe3
Some checks failed
Sync to Gitee / sync (push) Has been cancelled
docs(rag): add MemoryBear RAG implementation docs v1.0
Submit the formed RAG documentation set produced across Sprint-1/2/3
(WS-12 through WS-26) under docs/rag/. Includes:

- README.md / INDEX.md: landing + total index (responsibility matrix,
  review verdicts, dual-link to source issues)
- overview/: full-pipeline architecture (4 .mmd diagrams),
  11-stage boundary contracts, doc map, source-code inventory
- pipeline/: 5 deep-dives (Loader/Parser/Chunking, Embedding,
  VDB & retrieval, GraphRAG, Rerank/Prompt/LLM)
- graphrag/, end-to-end/: v1.0 formal versions with full source
  retained as reference
- evolution/: 11 architecture-refactor proposals,
  6-direction roadmap, capability map
- review/: S3-T1 / S3-T2 final reviews, S2-T7 final summary
- _indexes/: glossary (81 terms), source->doc reverse index, chart index
- _release/: v1.0-RC1 release manifest, versioning convention,
  ops & freshness plan
- _meta/README.md: placeholder noting WS-12 governance assets gap

Aggregate review score 92.6/100 (8/8 PASS, 31/31 source-code spot
checks hit). The legacy docs/ ignore in .gitignore is narrowed to
docs/* with an explicit allowlist for docs/rag/.

Refs: WS-26
Co-authored-by: multica-agent <github@multica.ai>
2026-05-09 10:51:48 +08:00
..

title, author, reviewer, source-commit, last-reviewed-at, scope, version, status
title author reviewer source-commit last-reviewed-at scope version status
[S2-T6] 端到端检索-生成调用链路与时序图 — 正式版 AI 知识库解决方案专家 知识运营与治理专家 feae2f2e (MemoryBear) 2026-05-08 api/app/{services,app_chat_service,draft_run_service,core/agent/langchain_agent,core/models/{llm,rerank,embedding},core/rag/{nlp/search,vdb/elasticsearch/elasticsearch_vector,app/naive,graphrag/{search,general/index}}} v1.0 正式版(已解除占位)

[S2-T6] 端到端检索-生成调用链路与时序图 — 正式版

本文档为 WS-24 v1.0 文档全集的正式组成文件,替换 v1.0-RC1 中的占位版本。 原始完整文档与逐节详评见 WS-20WS-21 §S2-T6 评审报告。


1. 一句话定位

本文档是 Sprint-2 的"全链路串联"文档,将 [S2-T1]~[S2-T5] 五篇独立深度文档中的调用栈、数据结构与配置项,整合为两条端到端时序图Query 端 + Indexing 端)、一张关键路径表三套多场景调用链一张错误降级路径图。所有函数引用均直接来源于子任务文档,未凭空虚构。


2. 评审结果

维度 满分 得分 关键说明
准确性 25 24 抽检 7/7 命中:agnet_chat / _prepare_messages / knowledge_retrieval / _retrieve_for_knowledge / insert_citations / chunk() / _classify_error
完整性 25 24 5 项硬性验收 100% 满足Query 端时序图、Indexing 端时序图、关键路径表15 行、3 场景调用链、错误降级矩阵13 行 + 6 路径 + 5 代码片段)
时效性 15 14 frontmatter 完整规范author / source-commit feae2f2e / last-reviewed-at / scope仅缺 reviewer 字段(等待评审填入)
可读性 15 14 Mermaid autonumber + Note over + alt/par/loop 专业级写法;瓶颈🔴🟡🟢色标视觉化优秀
可执行性 20 19 P50/P95 基线 + 瓶颈分析可直接落地为运维 SOP5 个降级代码片段 copy-pasteable
合计 100 95 PASS整合标杆超 ≥85 门槛 +10

裁定: Sprint-2 整合标杆,直接通过,无 Must-Fix。


3. Query 端 E2E 时序图(摘要)

sequenceDiagram
    autonumber
    actor U as 用户
    participant FE as 前端
    participant API as FastAPI
    participant CS as AppChatService
    participant AS as AgentRunService
    participant Agent as LangChainAgent
    participant KR as knowledge_retrieval()
    participant VDB as ElasticSearchVector
    participant Graph as KGSearch
    participant LLM as RedBearLLM

    U->>FE: 输入 Query
    FE->>API: POST /api/v1/chat
    API->>CS: await agnet_chat()
    CS->>Agent: LangChainAgent()
    Agent->>LLM: invoke(messages) [首轮判断工具]
    LLM-->>Agent: 需调用 knowledge_retrieval_tool
    Agent->>KR: knowledge_retrieval(query, config)

    loop 遍历每个知识库
        KR->>VDB: _retrieve_for_knowledge()
        alt retrieve_type == "semantic"
            VDB->>VDB: search_by_vector() + embed_query()
        else retrieve_type == "participle"
            VDB->>VDB: search_by_full_text() + ik_max_word
        else retrieve_type == "hybrid"
            par 双路并发
                VDB->>VDB: search_by_vector()
                VDB->>VDB: search_by_full_text()
            end
            VDB->>VDB: rerank() + RedBearRerank
        end
        alt use_graph=true
            KR->>Graph: kg_retriever.retrieval()
            Graph->>Graph: query_rewrite() LLM 提取实体+类型
            Graph->>Graph: 三路召回: entity/relation/community
        end
    end

    KR-->>Agent: List[DocumentChunk]
    Agent->>LLM: astream_events() [流式生成]
    LLM-->>FE: SSE 逐字渲染

完整版含 30+ 步骤调用栈、输入输出数据结构、同步/异步标注,见 WS-20 §1。


4. Indexing 端 E2E 时序图(摘要)

sequenceDiagram
    autonumber
    actor U as 用户
    participant API as document_controller.py
    participant Task as Celery Task
    participant Chunk as chunk()
    participant Parser as DeepDoc Parser
    participant NLP as naive_merge
    participant Emb as RedBearEmbeddings
    participant VDB as ElasticSearchVector
    participant ES as Elasticsearch
    participant Graph as GraphRAG Index

    U->>API: POST /documents 上传文件
    API->>Task: 异步触发 chunk 任务
    Task->>Chunk: chunk(filename, binary, ...)

    alt PDF 格式
        Chunk->>Parser: Pdf.__call__() → OCR → Layout → TSR
    else DOCX 格式
        Chunk->>Parser: Docx.parse()
    else Excel/CSV
        Chunk->>Parser: ExcelParser.__call__()
    else Markdown
        Chunk->>Parser: MarkdownParser
    end

    Chunk->>NLP: naive_merge(sections) + tokenize_chunks()
    Chunk-->>Task: List[Dict] (ES doc 格式)

    Task->>Emb: embed_documents(texts)
    Emb-->>Task: List[List[float]]

    Task->>VDB: add_chunks(chunks, embeddings)
    VDB->>ES: helpers.bulk(actions)

    alt GraphRAG 启用
        Task->>Graph: run_graphrag_for_kb()
        Graph->>Graph: generate_subgraph() → LLM 抽取
        Graph->>Graph: merge_subgraph()
        Graph->>ES: 写入 entity/relation chunks
        alt General 模式
            Graph->>Graph: EntityResolution()
            Graph->>Graph: leiden.run() + CommunityReportsExtractor()
        end
    end

完整版含 14 步骤调用栈、ES Doc 字段契约,见 WS-20 §2。


5. 关键路径表Critical Path Table

# 环节 关键函数 文件:行号 P50 P95 阻塞性 瓶颈
1 PDF 解析 (OCR+Layout+TSR) Pdf.__call__() deepdoc/parser/pdf_parser.py:1006 3s 15s 阻塞 🔴
2 Chunking naive_merge() + tokenize_chunks() nlp/__init__.py:562,258 50ms 200ms 阻塞 🟡
3 Embedding (批量) embed_documents() models/embedding.py:65 200ms 1s 阻塞 🔴
4 ES 批量写入 helpers.bulk() elasticsearch_vector.py:85 100ms 500ms 阻塞 🟡
5 GraphRAG 实体抽取 generate_subgraph() graphrag/general/index.py:333 30s 120s 阻塞 🔴
6 GraphRAG 消歧 EntityResolution.__call__() entity_resolution.py:53 10s 60s 阻塞 🔴
7 GraphRAG 社区报告 CommunityReportsExtractor.__call__() community_reports_extractor.py:55 20s 90s 阻塞 🔴
8 Query Embedding embed_query() models/embedding.py:65 50ms 300ms 阻塞 🟡
9 ES 向量检索 search_by_vector() elasticsearch_vector.py:374 30ms 200ms 阻塞 🟡
10 ES 关键词检索 search_by_full_text() elasticsearch_vector.py:468 20ms 100ms 阻塞 🟢
11 外部 Rerank RedBearRerank.compress_documents() models/rerank.py:11 100ms 500ms 阻塞 🟡
12 GraphRAG 检索 KGSearch.retrieval() graphrag/search.py:19 200ms 1s 阻塞 🟡
13 LLM 首次调用 _chat() chat_model.py:122 500ms 3s 阻塞 🔴
14 LLM 流式生成 _chat_streamly() chat_model.py:152 500ms 5s 流式 🔴
15 引用回填 Dealer.insert_citations() search.py:489 100ms 500ms 阻塞 🟡

5.1 四大🔴瓶颈与缓解方向

瓶颈 根因 缓解方向
PDF 解析 (P95=15s) OCR + Layout + TSR 串行执行 MinerU 替代 / 异步队列 / 预加载模型
Embedding API (P95=1s) 外部 API 延迟batch_size=16 本地 Xinference / GPUStack 部署
GraphRAG 建图 (P95=120s) LLM 多轮抽取,单文档串行 增加 max_parallel_documents / 增量更新
LLM 流式输出 (P95=5s) 首次 token (TTFT) 慢 缓存高频 query / 缩短 max_tokens

6. 多场景调用链3 场景)

场景 A纯向量检索问答

Query → AppChatService → LangChainAgent → knowledge_retrieval()
  → _retrieve_for_knowledge() [retrieve_type="semantic"]
  → ElasticSearchVector.search_by_vector() + embed_query()
  → ES script_score: cosineSimilarity
  → top_k chunks → Agent → LLM 流式生成

场景 B混合检索问答关键词 + 向量)

Query → knowledge_retrieval() [retrieve_type="hybrid"]
  → 双路并发: search_by_vector() + search_by_full_text()
  → metadata.doc_id 去重
  → rerank() + RedBearRerank.compress_documents()
  → top_k → Agent → LLM 流式生成

场景 CGraphRAG 关系推理问答

Query → knowledge_retrieval() [retrieve_type="graph"]
  → 先执行 hybrid 检索
  → KGSearch.retrieval() → query_rewrite() LLM 提取实体+类型
  → 三路召回: entity/relation/community
  → n-hop 路径扩展 (sim_decay = 1/(2+hop_depth))
  → 融合打分: score = sim × pagerank
  → Token 预算截断 → Agent → LLM 流式生成

完整 ASCII 流程图与数据结构流转详见 WS-20 §4。


7. 错误传播与降级路径

7.1 错误矩阵(核心项)

环节 失败模式 兜底逻辑
PDF 解析 OCR 模型缺失 标记 failed_document
Embedding API 超时/限流 抛出异常,整批重试
ES 写入 ConnectionTimeout ATTEMPT_TIME=2 重试
知识库检索 单 KB 不可用 try/except continue跳过失败 KB
向量检索为空 阈值过严 fallback 降低 min_match 0.3→0.1
外部 Rerank API 超时 fallback 返回原始排序
GraphRAG 检索 图谱未建 fallback 仅 hybrid 结果
LLM 调用 RATE_LIMIT 重试 5 次 + 随机抖动
LLM 截断 finish_reason="length" 自动追加截断提示

7.2 降级路径图

正常路径:  Query → Hybrid → Rerank → LLM → 引用回填 → 输出

降级 1 (检索为空):   Hybrid (空) → fallback 降低阈值 → 仍空 → LLM 直接回答
降级 2 (Rerank 失败): Hybrid → Rerank 超时 → fallback 原始排序 → LLM 生成
降级 3 (GraphRAG 失败): Hybrid → GraphRAG 失败 → fallback 仅 hybrid → LLM 生成
降级 4 (单 KB 失败):  KB-A 失败 + KB-B 成功 → 合并 → LLM 生成
降级 5 (LLM 失败):   检索成功 → LLM 5 次重试后 → 返回 "**ERROR**: 服务暂不可用"

完整代码片段5 段可复用降级代码)见 WS-20 §5.3。


8. 跨文档引用索引

本章节 被引文档 引用点
§3 Query 端 [S2-T5] app_chat_service.py:43, langchain_agent.py:230, _chat_streamly()
§3 Query 端 [S2-T3] search_by_vector(), search_by_full_text(), rerank()
§3 Query 端 [S2-T4] KGSearch.retrieval(), query_rewrite()
§3 Query 端 [S2-T2] embed_query()
§3 Query 端 [S2-T5] RedBearRerank.compress_documents(), _filter_citations()
§4 Indexing 端 [S2-T1] chunk(), naive_merge(), tokenize_chunks()
§4 Indexing 端 [S2-T2] embed_documents()
§4 Indexing 端 [S2-T3] add_chunks(), helpers.bulk()
§4 Indexing 端 [S2-T4] run_graphrag_for_kb(), generate_subgraph(), EntityResolution(), leiden.run()

结论6 篇文档形成完整闭环,跨文档引用 0 不一致。


本文档为 MemoryBear RAG Docs v1.0 正式版本的组成文件。完整时序图、数据结构定义、关键路径分析与代码片段参见 WS-20 评论历史。