1. 页面概览
「决策证据链」是 AIP 的决策支持页面(V5 Stage 2 B2-2,action/web/src/views/DecisionPage.vue)。用户输入决策问题(可指定数据源名),后端同步执行 5 步证据链:问题拆解 → 三路检索 → 证据核验 → 答案生成 → 引用溯源,一次返回 markdown 答案、5 步执行记录与引用列表。页面为三栏布局:左栏提问与历史,中栏 5 步进度与答案,右栏引用面板。一句话总结:本页是「带证据链的问答」,每个结论都能溯源到知识文档、实体或结构化查询证据。
2. 访问入口
2.1 路由与菜单
路由 path: /decision、name: Decision、meta 标题「决策证据链」、requiresAuth;顶部导航栏菜单「决策分析」(title 提示「决策证据链(检索/核验/引用溯源)」)。源码 action/web/src/views/DecisionPage.vue。
2.2 认证与权限
需要登录(aip_token);普通登录用户即可访问。
2.3 端口与 API 前缀
AIP 后端 18080;客户端 action/web/src/api/decisionApi.js 复用 aipClient,baseURL /aip-api/v1。
3. 界面布局
三栏网格(左 300px / 中弹性 / 右 300px,窄屏自动折行):
┌───────────────┬───────────────────────────┬────────────────┐
│ AIP · 决策证据链 [刷新历史] │ │
│ ┌ 提问 ───────┐│ ┌ 5 步证据链进度 ─────┐ ││ ┌ 引用 ───────┐ │
│ │ [textarea] ││ │ 1 问题拆解 完成 │ ││ │ [1] 知识/RAG│ │
│ │ [数据源名] ││ │ 2 三路检索 完成 │ ││ │ 标题/uri │ │
│ │ [提问] ││ │ 3 证据核验 降级 │ ││ │ [展开片段] │ │
│ └────────────┘││ │ 4 答案生成 完成 │ ││ └────────────┘ │
│ ┌ 最近提问 ───┐│ │ 5 引用溯源 完成 │ ││ │
│ │ 历史条目列表 ││ │ trace_id: xxx │ ││ │
│ └────────────┘││ └────────────────────┘ ││ │
│ ││ ┌ 答案 ──────────────┐ ││ │
│ ││ │ markdown 渲染正文 │ ││ │
│ ││ └────────────────────┘ ││ │
└───────────────┴───────────────────────────┴────────────────┘
- 左栏「提问」卡片:问题文本域 + 数据源名输入 + 提问按钮 + 同步执行提示;「最近提问」卡片列出历史条目。
- 中栏「5 步证据链进度」卡片:每步名称/状态徽标/耗时(
latency_ms),下方显示trace_id。 - 中栏「答案」卡片:markdown 渲染的答案正文;失败时显示错误注记。
- 右栏「引用」卡片:引用条目(序号/来源标签/标题/uri),点击展开 snippet。
4. 交互元素
| 控件 | 位置 | 含义与作用 |
|---|---|---|
| 文本域「提问」 | 左栏 | 决策问题,必填;支持 Ctrl+Enter 提交;placeholder 示例「当前差旅报销标准是多少?与上季度相比有何变化?」 |
| 输入框「数据源名」 | 左栏 | 可选;为空则跳过结构化查询(NLQ)通道 |
| 按钮「提问」 | 左栏 | 同步执行 5 步链;asking 时文案「证据链执行中...」并禁用 |
| 按钮「刷新历史」 | 页头 | 重新拉取最近 20 条历史 |
| 历史条目 | 左栏「最近提问」 | 点击回放该次答案(loadDetail) |
| 引用条目 | 右栏「引用」 | 点击展开/收起 snippet 片段 |
次要:步骤行内状态徽标与耗时列(完成/跳过/降级/执行中)。
5. 后端关联
5.1 API 客户端
action/web/src/api/decisionApi.js(复用 aipClient);askDecision 请求单独 timeout: 300000(5 分钟,多步 LLM);统一响应体 {code, message, data},code 非 0 抛错。
5.2 端点表
| 方法 | 路径 | 请求体/参数 | 页面触发点 | 成功响应 data |
|---|---|---|---|---|
| POST | /decision/answer | {question, data_source} | 提问 | {answer, steps, citations} |
| GET | /decision/answers | limit=20 | 加载历史 | {answers, total} |
| GET | /decision/answers/:id | — | 历史回放 | {answer, steps, citations} |
5.3 关键机制
- 5 步链:
decompose(问题拆解)→retrieve(三路检索 + 融合去重)→verify(证据核验 support/refute/irrelevant)→synthesize(生成 markdown 答案)→cite(引用溯源)。步骤状态:ok完成、degraded降级、skipped跳过,每步带latency_ms。 - 三路检索:
rag(知识/RAG 多路召回)、entity(实体通道,直查aie_entities)、nlq(结构化查询通道,data_source为空跳过)。 - 降级约定:单步失败一律降级继续(verify 失败按 support 处理并标注未核验;synthesize 失败降级为证据摘要 markdown;某路检索失败跳过不阻塞)。
- 审计留痕:答案 ID 即
trace_id,与ai_decision审计轨迹ref_id一致,可在 Admin「AI 决策审计」按 trace_id 回放;数据落表ad_answers/ad_citations(服务 AutoMigrate 建表)。
6. 权限与安全
- 三个端点均挂
protected登录组(JWT 鉴权)。 - 答案 markdown 在浏览器端先
marked解析,再经DOMPurify.sanitize清洗后才以v-html输出,防 XSS。 - 引用与步骤均只读展示;历史按登录用户
created_by归属记录。
7. 常见问题与排错
- 提问后长时间无响应:原因是同步多步 LLM,通常需数秒至数十秒(客户端超时 300s)。处理:耐心等待;超时后提示「决策链执行失败」,确认 AIP 后端 18080 与 LLM 网关(
/api/v1/llm)可用。 - 步骤显示「降级」或某步跳过:原因是对应通道依赖未注入(无 RAG 索引、无实体数据、未填数据源名)。处理:属设计行为,答案仍会生成;需要完整三路检索时先建知识库/实体,提问时填数据源名。
- 答案区提示「暂无答案」:原因是尚未提问且未选择历史。处理:在左栏提问,或点击「最近提问」中的历史条目。
- 历史加载失败/刷新历史报错:原因是
GET /decision/answers失败(后端未启动、token 失效 401)。处理:确认 18080 启动与 token 有效;Network 查看具体状态码。
8. 已知缺陷与边界
- 三路检索任一依赖(rag/entities/nlq)未注入则对应通道跳过并标注,不报错;LLM 为 nil 时全链降级。
- 提问为同步阻塞,无后台任务化与断点续传;页面刷新后进行中的证据链丢失。
- 历史列表为轻量摘要(不含 steps/citations 正文),完整回放需再请求详情接口。
- markdown 渲染覆盖标题/列表/引用/表格/行内代码等常用元素,复杂排版有限。