|
|
|
@ -3,8 +3,8 @@ |
|
|
|
<template #header> |
|
|
|
<span style="font-size:16px;font-weight:600;">🔀 AI 执行链</span> |
|
|
|
<p style="font-size:12px;color:var(--td-text-color-placeholder);margin:4px 0 0;"> |
|
|
|
下图展示从用户请求到 AI 回复的完整处理流程,包含意图路由、RAG 检索和 Advisor 链。 |
|
|
|
菱形节点 = 决策分支 · 虚线框 = 独立子系统 · 蓝/绿/黄色高亮 = 入口/出口/LLM。 |
|
|
|
下图展示从用户请求到 AI 回复的完整处理流程,包含意图路由、RAG 检索、熔断保护和 Advisor 链。 |
|
|
|
菱形节点 = 决策分支 · 虚线框 = 独立子系统 · 虚线箭头 = 降级/异步路径。 |
|
|
|
</p> |
|
|
|
</template> |
|
|
|
|
|
|
|
@ -59,19 +59,20 @@ mermaid.initialize({ |
|
|
|
|
|
|
|
// Mermaid 流程图 DSL 定义 |
|
|
|
// 节点类型: [矩形]=处理步骤, {菱形}=决策分支, subgraph=子系统 |
|
|
|
// %%graph-meta: { updated: "2026-08-04", basedOn: "ChatPipeline v3, RagPipeline v2, AssistantApp v2", mermaidVersion: "flowchart-v2" } |
|
|
|
const GRAPH_DEFINITION = ` |
|
|
|
flowchart TD |
|
|
|
A["<b>用户请求</b><br/>message + roleId + accountId + chatId"] |
|
|
|
|
|
|
|
A --> B{"<b>Controller</b><br/>鉴权 / 角色解析<br/>构建 ChatContext"} |
|
|
|
A --> B{"<b>Controller</b><br/>鉴权 / 角色解析 / KB 隔离判断<br/>构建 ChatContext"} |
|
|
|
|
|
|
|
B --> C["<b>ChatPipeline.buildRequest</b><br/>编排决策入口"] |
|
|
|
|
|
|
|
C --> D{"enableRag ?"} |
|
|
|
|
|
|
|
D -- "❌ false" --> E["<b>模式: 纯对话</b><br/>systemPrompt(角色人设)<br/>不检索知识库"] |
|
|
|
D -- "❌ false" --> E["<b>模式: 纯对话</b><br/>systemPrompt(角色人设 + 全局配置)<br/>不检索知识库"] |
|
|
|
|
|
|
|
D -- "✅ true" --> F["<b>IntentRouter</b><br/>LLM 意图识别<br/>FAQ / RAG / CHITCHAT"] |
|
|
|
D -- "✅ true" --> F["<b>IntentRouter</b><br/>🔹 寒暄词快速路径: 本地列表精确匹配(零 LLM)<br/>🔹 未命中则 LLM 意图分类<br/>FAQ / RAG / CHITCHAT"] |
|
|
|
|
|
|
|
F --> G{"意图分类结果"} |
|
|
|
|
|
|
|
@ -81,26 +82,27 @@ flowchart TD |
|
|
|
|
|
|
|
G -- "RAG / 降级<br/>其余情况" --> J["<b>RagPipeline.retrieve</b><br/>RAG 检索流水线入口"] |
|
|
|
|
|
|
|
subgraph RAG["📚 RAG 检索流水线"] |
|
|
|
J --> K["<b>1. FAQ 优先匹配</b><br/>FaqMatchEngine 三级匹配<br/>命中则短路返回"] |
|
|
|
H -- "✅ 命中标准答案" --> T |
|
|
|
H -. "❌ 未命中 → 降级 RAG" .-> J |
|
|
|
|
|
|
|
subgraph RAG["📚 RAG 检索流水线(当前: 纯向量检索)"] |
|
|
|
J --> K["<b>1. FAQ 优先匹配(二次兜底)</b><br/>FaqMatchEngine 三级匹配<br/>命中则短路返回"] |
|
|
|
K --> L["<b>2. 查询重写</b><br/>REWRITE / TRANSLATION<br/>COMPRESSION / MULTI_QUERY"] |
|
|
|
L --> M{"<b>3. 检索模式</b>"} |
|
|
|
M --> N["<b>VECTOR</b><br/>向量语义检索"] |
|
|
|
M --> O["<b>KEYWORD</b><br/>全文关键词检索<br/>PostgreSQL tsvector"] |
|
|
|
M --> P["<b>HYBRID</b><br/>向量 + 关键词<br/>双路检索"] |
|
|
|
N --> Q["<b>4. RRF 融合排序</b><br/>Reciprocal Rank Fusion<br/>k=60"] |
|
|
|
O --> Q |
|
|
|
P --> Q |
|
|
|
Q --> R["<b>5. Reranker 重排序</b><br/>DashScope / OpenAI 兼容<br/>超时 3s 自动 fallback"] |
|
|
|
R --> S["<b>6. 构建资料块</b><br/>拼接检索文档<br/>注入 system prompt 末尾"] |
|
|
|
L --> M["<b>3. 向量检索</b><br/>PGVector similaritySearch<br/>topK=4 + 分类过滤"] |
|
|
|
M --> S["<b>4. 构建资料块</b><br/>拼接检索文档<br/>注入 system prompt 末尾"] |
|
|
|
end |
|
|
|
|
|
|
|
H --> T["<b>组装 ChatRequest</b><br/>finalMessage + finalSystemPrompt<br/>+ faqAnswer (可选)"] |
|
|
|
I --> T |
|
|
|
S --> T |
|
|
|
E --> T |
|
|
|
|
|
|
|
T --> U["<b>AssistantApp</b><br/>chat / chatStream<br/>构建 ChatClient + MCP 工具"] |
|
|
|
T["<b>组装 ChatRequest</b><br/>finalMessage + finalSystemPrompt<br/>+ faqAnswer (可选)"] |
|
|
|
|
|
|
|
T --> CB{"<b>🔌 AI 熔断检查</b><br/>SimpleCircuitBreaker<br/>阈值: 连续 3 次失败 / 恢复: 5 分钟"} |
|
|
|
|
|
|
|
CB -- "熔断中" --> FALLBACK["<b>返回降级提示</b><br/>「AI 服务暂时不可用<br/>请稍后重试」"] |
|
|
|
|
|
|
|
CB -- "正常" --> U["<b>AssistantApp</b><br/>chat / chatStream<br/>构建 ChatClient + MCP 工具"] |
|
|
|
|
|
|
|
subgraph ADVISOR["🛡️ Advisor 链(环绕 LLM 调用)"] |
|
|
|
U --> V["<b>ContentSafetyAdvisor</b><br/>🔽 before: DFA 敏感词检测<br/>用户输入 BLOCK/MASK"] |
|
|
|
@ -113,9 +115,21 @@ flowchart TD |
|
|
|
|
|
|
|
AA --> AB["<b>返回 AI 回复</b><br/>SSE 流式输出<br/>+ MCP 工具调用事件"] |
|
|
|
|
|
|
|
FALLBACK --> AB |
|
|
|
|
|
|
|
AB -. "异步按需触发" .-> SG |
|
|
|
|
|
|
|
subgraph SUGGEST["💡 推荐问题(异步)"] |
|
|
|
SG["<b>SuggestionGenerator</b><br/>独立 ChatClient(无 MCP 工具)<br/>基于最近 10 条历史<br/>生成 3 条推荐问题<br/>超时 15s · 结果缓存"] |
|
|
|
end |
|
|
|
|
|
|
|
style A fill:#dbeafe,stroke:#3b82f6,stroke-width:2px |
|
|
|
style AB fill:#d1fae5,stroke:#10b981,stroke-width:2px |
|
|
|
style Y fill:#fef3c7,stroke:#f59e0b,stroke-width:2px |
|
|
|
style CB fill:#fef3c7,stroke:#f59e0b,stroke-width:2px |
|
|
|
style FALLBACK fill:#fee2e2,stroke:#ef4444,stroke-width:2px,stroke-dasharray:5 |
|
|
|
style M fill:#e0e7ff,stroke:#a5b4fc,stroke-width:2px |
|
|
|
style S fill:#e0e7ff,stroke:#a5b4fc,stroke-width:2px |
|
|
|
` |
|
|
|
|
|
|
|
const svg = ref('') |
|
|
|
|