oh-my-muse/design-docs/专题-03-AI编排上下文与质量评测实现规范.md
zizi 0d0e1d4473 添加产品设计文档
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)

Co-authored-by: Sisyphus <clio-agent@sisyphuslabs.ai>
2026-05-20 10:38:31 +08:00

26 KiB
Raw Blame History

专题-03AI 编排、上下文与质量评测实现规范

  • 版本v1
  • 更新日期2026-05-19
  • 目标读者:架构 / 后端 / 前端 / 测试 / 文档维护者
  • 阅读时间35-55 分钟
  • 边界说明:本文件补齐 AI 编排、检索、上下文、风险路由和质量评测的跨文档设计合同。它描述目标设计,不代表当前代码都已实现。精确表结构仍以 后端-04-统一数据库Schema-v1.md 为准,精确 API 路径和错误码仍以 后端-05-统一API契约-v1.md 为准,阶段门禁和证据包仍归 doc/dev/*

1. 归属范围

本文件只承载第一类设计缺口:系统运行合同、接口语义、字段合同、失败路径和质量算法。以下内容不放在本文件:

  • 阶段是否退出、证据包字段、review 记录和命令输出。
  • 当前代码是否已经实现。
  • 具体服务类名、JPA 泛型、前端 hook 或测试文件路径。
设计主题 本文件负责 其它主文档
RAGFlow 运行合同 客户端调用语义、错误分类、阻塞边界、来源标记 Schema 看 后端-04API 看 后端-05
Graph Query Provider 查询能力矩阵、返回元信息、降级边界 ADR 决策看 架构-03
Falsification Benchmark query set、阈值、记录字段、失败原因分类 评测 API 和表结构看 后端-04 / 后端-05
上下文组装(Context Assembly) 请求/响应合同、Layer 0-3、权限二次过滤、Token Budget 系统流程看 流程-02
Agent / Prompt 能力矩阵、fallback、模板族、审计字段白名单 管理 API 看 后端-05
Pipeline / Risk Routing 风险等级行为、重试与自动确认边界 状态机看 架构-04
Planning Candidate / Knowledge Draft 待审对象字段合同和版本校验 表结构看 后端-04
全书解析批量返回 / 一致性检查结果 用户可解释返回结构 用户流程看 流程-01
质量评测 多模型聚合、分歧惩罚、配置快照绑定 评测集 API 看 后端-05
S0-AUTH 默认超级管理员 初始化与凭据交付安全合同 认证 API 和 RBAC 表看 后端-04 / 后端-05

2. RAGFlow 运行合同

2.1 定位

RAGFlow 是外部语义检索基座,不是 Muse 的事实源。它只能消费 PostgreSQL 中的规范数据(Canonical)和授权资料投影,不能反向决定作品事实。

允许进入正式检索的来源类型:

sourceType 含义 是否可进正式检索
work_content 当前作品已确认正文、章节和文本块摘要
local_knowledge_base 当前作品已确认局域知识
global_knowledge_base 当前用户/作品被授权的全局知识库资料
shadow_draft Suggestion / Knowledge Draft / Planning Candidate 等待审内容 否。只能用于明确标记的预览或审计,不得进入正式生成上下文

2.2 调用输入

Muse 后端调用 RAGFlow 时,必须传入或等价计算以下上下文:

字段 要求
workId 当前作品 ID
userId 当前用户 ID 或系统任务服务身份
scenario generation / extraction / validation / planning / consistency_check / search
allowedGlobalKbIds 当前请求允许使用的全局知识库 ID 列表
sourceTypes 本次允许检索的来源类型,默认不包含 shadow_draft
queryText / queryVectorInput 检索查询文本或等价输入
maxResults 最大返回数量
traceId 链路追踪 ID

RAGFlow 请求不得只依赖物理 dataset 隔离做权限边界。即使多个全局知识库共用物理索引,请求或后处理也必须按 global_kb_id IN allowedGlobalKbIds 或等价规则过滤。

2.3 错误分类与阻塞边界

错误 系统行为
RAGFlow 不可用 / 超时 / 认证失败 阻塞依赖检索上下文的生成、提取、校验、规划和一致性检查,返回可恢复失败
RAGFlow 限流 任务进入可重试失败;不静默降级为低质量生成
投影落后 使用 watermark + overlay 补齐;补不齐时返回投影未追平错误
单条资料缺权限 丢弃该条结果,记录审计摘要,不进入上下文
单条资料缺来源元信息 丢弃该条结果,不作为事实上下文

RAGFlow 不可用不得阻塞:

  • 正文保存。
  • 手工编辑章节或文本块。
  • 查看已确认正文和已确认作品知识。
  • 处理不依赖检索上下文的本地 UI 状态。

2.4 投影失败与重建

正式写入 Canonical 后,投影事件通过 projection_outbox 或等价机制发送给 RAGFlow。投影消费者必须满足

  • 幂等:同一 PG 业务 ID 重放不会生成重复事实。
  • 可重试:超时、限流、临时不可用要保留失败原因和重试次数。
  • 可观测:管理员能看到投影目标、失败原因、最后尝试时间和待处理数量。
  • 可重建:重建索引时以 PostgreSQL 事实源为准,旧 RAGFlow 文档 ID 只能作为映射参考,不作为事实。

3. Graph Query Provider

3.1 能力矩阵

Graph Query Provider 是图查询抽象,不直接等同 Neo4j。它的实现可以是 RAGFlow GraphRAG、Neo4j 或其它 provider但对 Muse 的合同必须稳定。

queryType 必须支持的语义 典型用途
entity_adjacency 实体邻接关系、关系类型、方向、证据来源 角色关系、组织关系、地点关联
relationship_evolution 同一实体关系随章节或时间变化 角色关系演变、阵营变化
event_timeline 事件时间线、章节范围、先后顺序 时间线一致性
causal_chain 因果链、触发事件、后果事件 因果检查、伏笔回收
foreshadowing_trace 伏笔、铺垫、回收节点 长篇结构检查
consistency_evidence 支撑一致性检查的问题证据集合 风险解释和定位

3.2 请求合同

{
  "workId": "string-id",
  "queryType": "entity_adjacency",
  "entityIds": ["string-id"],
  "chapterRange": {
    "fromChapterId": "string-id",
    "toChapterId": "string-id"
  },
  "allowedGlobalKbIds": ["string-id"],
  "maxResults": 20,
  "traceId": "request-trace-id"
}

3.3 返回合同

每条结果必须带可追溯来源。缺少来源对象、授权状态或置信度的结果不得进入上下文。

{
  "provider": "ragflow_graphrag",
  "queryType": "entity_adjacency",
  "degraded": false,
  "watermark": {
    "projectionTarget": "graph_provider",
    "lastSyncedRevision": 123
  },
  "results": [
    {
      "sourceObjectType": "knowledge_relation",
      "sourceObjectId": "string-id",
      "sourceChapterId": "string-id",
      "globalKnowledgeBaseId": null,
      "authorization": "allowed",
      "confidence": 0.87,
      "evidence": "引用摘要或证据片段",
      "metadata": {
        "relationType": "ally",
        "direction": "outgoing"
      }
    }
  ]
}

3.4 降级边界

  • Graph Query Provider 不可用时,可以让非因果、非时间线类生成继续使用 RAGFlow 语义检索,但响应必须标记 degraded=true
  • 因果链、事件时间线、伏笔回收和一致性检查不能静默降级为普通语义检索后假装完整。
  • Provider 返回投影落后时,必须先尝试 PG overlay仍无法补齐时返回可恢复失败。

4. Falsification Benchmark

4.1 Query set

S1-B 起GraphRAG / Graph Query Provider 的决策不能靠主观感受。首批 benchmark query set 至少包含:

类别 目标 最低通过阈值
local 当前作品局域知识、正文和规划项检索 90%
global 授权全局知识库检索和过滤 90%
temporal 时间线、章节顺序、事件先后关系 80%
causal 因果链、伏笔铺垫和回收关系 80%

低于阈值不自动等于必须引入 Neo4j但必须触发 ADR-006 决策复审并记录失败原因。mock provider 或手写假结果不得计入正式 benchmark 结论。

4.2 记录字段

每次 benchmark run 必须记录:

字段 说明
datasetVersion 固定 query set 版本
provider ragflow_graphrag / neo4j / mock
queryType local / global / temporal / causal
queryText 查询输入
expectedEvidence 期望命中的事实、章节或关系
actualResults 实际返回摘要和来源
score 单条得分
failureReason 失败分类
testedConfigSnapshot RAGFlow、Graph Provider、Prompt、Agent、上下文策略和 New-API 摘要
traceId 可追踪请求 ID

失败原因至少包含:missing_factwrong_sourceunauthorized_sourcestale_projectiontemporal_order_wrongcausal_link_missinglow_confidenceprovider_error

5. 上下文组装(Context Assembly)

5.1 请求合同

上下文组装是后端内部合同,可以有内部 API 或服务接口。无论实现形态如何,输入语义必须稳定:

{
  "workId": "string-id",
  "userId": "string-id",
  "scenario": "continuation",
  "targetChapterId": "string-id",
  "targetBlockId": "string-id",
  "userIntent": "继续写下一段",
  "currentText": "用户当前输入或选中文本",
  "allowedGlobalKbIds": ["string-id"],
  "tokenBudget": {
    "maxInputTokens": 12000,
    "reservedOutputTokens": 2000
  },
  "includeDebugSnapshot": false
}

scenario 至少包含:continuationrewritedescriptionplanningextractionvalidationconsistency_checkner_previewfull_parse

5.2 四层上下文

Layer 内容 缓存策略 可省略性
Layer 0 当前输入 用户当前意图、目标文本、目标章节、目标 Block revision 不跨请求缓存 不可省略
Layer 1 近邻正文 当前章节、相邻 Block、章节目标、已确认规划项 可按章节和 revision 缓存 续写、改写、描写不可省略
Layer 2 作品事实 正式局域知识、Narrative State、角色关系、事件时间线 可按 work watermark 缓存 一致性检查和规划不可省略
Layer 3 授权全局资料 被授权全局知识库摘要、体裁规则、平台规范 可按授权策略版本缓存 可按场景省略,但不能越权

Token Budget 处理顺序:

  1. 先保留输出预算。
  2. Layer 0 必须完整保留。
  3. Layer 1 优先于 Layer 2Layer 2 优先于 Layer 3。
  4. 超限时先摘要化低优先级资料,再截断;不得丢失来源引用。
  5. 被省略资料必须进入 omittedSources,写明原因:token_budgetnot_authorizedstale_projectionlow_confidencenot_relevant

5.3 场景注入矩阵

场景 必须注入 可以省略
续写 Layer 0、Layer 1、核心 Layer 2、已授权且相关的 Layer 3 低相关全局资料、远距离章节摘要
改写 Layer 0、目标 Block revision、局部上下文、风格约束 远距离时间线
描写 Layer 0、目标实体/地点、风格约束、相关局域知识 与描写无关的事件链
规划生成 作品方向、章节规划、Narrative State、相关实体关系 当前正文全文
提取 来源文本、来源快照、MetaSchema 全局资料,除非提取规则依赖它
校验 待审草稿、当前 Canonical、相关关系和事件 与冲突无关的风格规则
一致性检查 正式正文、正式知识、规划项、时间线/因果图 未确认草稿
NER Preview 当前文本和局部 MetaSchema 正式检索上下文
Full Parse 章节文本、章节边界、MetaSchema、parse job 信息 其它章节全文,除非用于跨章冲突检查

5.4 响应合同

{
  "contextId": "string-id",
  "scenario": "continuation",
  "layers": [
    {
      "layer": "L1",
      "tokenCount": 3200,
      "sourceRefs": [
        {
          "sourceType": "block",
          "sourceId": "string-id",
          "revision": 12
        }
      ]
    }
  ],
  "omittedSources": [
    {
      "sourceType": "global_knowledge_base",
      "sourceId": "string-id",
      "reason": "not_authorized"
    }
  ],
  "permissionFilters": {
    "allowedGlobalKbIds": ["string-id"],
    "droppedResultCount": 2
  },
  "projectionState": {
    "usedOverlay": true,
    "laggingTargets": ["ragflow"]
  },
  "userExplanation": "参考了当前章节、角色关系和已授权资料;部分资料因未授权未使用。",
  "auditSnapshotRef": "string-id"
}

普通用户只能看到 userExplanation 和可理解来源摘要。完整 Prompt、配置快照、Layer 明细、Graph Query Provider 结果和 Token Budget 调试信息只允许管理员、审计或调试接口查看。

5.5 二次权限校验

上下文组装必须做两次权限控制:

  1. 检索前:根据当前用户、作品、套餐、访问策略计算 allowedGlobalKbIds
  2. 检索后:对每条外部返回再次校验来源、授权状态和元数据完整性。

检索后发现未授权、已撤销、缺 global_kb_id 或缺来源对象的结果时,必须丢弃并记录摘要。不得因为结果来自外部检索系统就直接进入 Prompt。

6. Planning Task 与规划候选

6.1 建模口径

Planning Task 是任务类型(task_type),不是 S3 阶段必需的独立 Planning Agent。

  • S3 阶段:通过现有 Agent 能力执行 task_type=planning,输出规划候选。
  • S5 后:如果 benchmark、可观测性和产品需求证明规划能力需要独立生命周期再新增独立 Planning Agent ADR。
  • 任何规划候选仍然进入 Shadow由普通用户确认后才成为正式规划数据或生成上下文。

6.2 Planning Candidate 合同

规划候选至少需要以下语义字段:

字段 说明
candidateId 规划候选 ID
workId 所属作品
sectionKey 作品设定、章节大纲、世界设定、角色关系、文风检查等分区
taskType 固定为 planning 或规划子类型
baseItemId 被修改的规划项;新建时为空
baseItemVersion 生成时读取的规划项版本
sourceSnapshot 输入文本、上下文、配置和来源摘要
proposedData 候选规划数据
evidence 支撑该候选的正文、知识或全局资料来源
riskLevel low / medium / high / critical
expiresAt 过期时间

确认规划候选前必须校验 baseItemVersion。版本不匹配时返回 stale不得把旧候选强行写入 Canonical用户可以重新生成或手动修改后保存。

7. Agent 能力矩阵与 fallback

能力 输入 输出 可接受 fallback 不允许
Generation 上下文、Prompt、当前文本、New-API 绑定 Suggestion、可选 Knowledge Draft、Risk Markers Agent 服务不可用时,可走直连 New-API fallback但必须标记 degraded 并保留任务记录 缺检索硬依赖时静默生成低质量候选
Extraction 来源快照、MetaSchema、正文或候选文本 Knowledge Draft / Proposal 旧 NER 只能作为预览或低置信草稿来源,不得自动确认 提取失败静默跳过
Validation Draft、当前 Canonical、关系和时间线 风险标记、冲突摘要、去重建议 可以返回 needs_review 无校验时标记 safe
Planning task_type、作品规划上下文、目标 section Planning Candidate 可使用通用生成能力执行规划任务 S3 阶段强制引入独立 Planning Agent
Retrieval / Context 查询、授权、场景和 Token Budget 可解释上下文 非图强依赖场景可降级为语义检索 越权资料进入上下文
Evaluation 固定数据集、候选输出、评审模型集合 评测报告和风险结论 单模型临时评审只能做调试,不计正式结论 用评测结论替代用户确认

fallback 对用户的基本反馈:

  • 生成不可用提示“AI 助手暂时不可用,可以稍后重试”。
  • 检索资料未授权:提示“部分资料当前无权使用,已从本次参考中排除”。
  • 来源已变更:提示“源文本已变更,需要重新生成或重新提取”。
  • Token Budget 超限:提示“参考资料过多,系统已优先保留当前章节和关键设定”。

普通用户界面不得直接暴露 AgentPromptToken BudgetGraph Query ProviderLayer 等系统词。

8. Prompt 工程合同

8.1 模板族

Prompt 至少按以下模板族管理:

模板族 用途 必含变量
generation 续写、改写、描写、插入 作品方向、当前章节目标、目标文本、上下文摘要、文风约束、输出格式
planning 作品设定、章节规划、世界设定、角色关系、文风检查 规划分区、当前规划项、约束条件、候选数量、输出 schema
extraction 从正文、候选或导入内容提取知识草稿 MetaSchema、来源快照、目标 domain/scope/targetType、输出 schema
validation 校验来源、冲突、重复和风险 当前 Canonical、待审数据、风险等级规则、输出 schema
evaluation 多模型评审和回归对比 评测场景、评分标准、候选输出、参考答案或参考证据

8.2 激活前要求

Prompt 新版本激活前必须满足:

  • 变量结构完整,不能依赖运行时拼接隐式变量。
  • 输出格式明确,能被后端解析或人工审阅。
  • 禁止直接要求 AI 写 Canonical。
  • 关联至少一个可回归评测场景,或者标记为临时实验版本。
  • 激活、停用、回滚都有审计记录。

Prompt 工程的质量闭环是:模板版本 -> 固定评测集 -> 多模型评审 -> 聚合结论 -> 人工复核 -> 激活或回滚。不能只靠一次手工试跑决定上线。

9. New-API 审计字段白名单

Muse 不复制 New-API 的成本账本,也不持久化 New-API token 明文。Muse 可以保存的任务级摘要字段:

字段 说明
newApiBindingId Muse 侧 New-API 绑定引用
newApiRequestId New-API 返回的请求引用或 trace
modelAlias 模型别名或逻辑模型名,不作为供应商路由权威
inputTokenCount / outputTokenCount 任务级 usage summary
latencyMs 调用耗时
finishReason 正常结束、长度截断、内容过滤、错误等
errorCode / errorMessage 脱敏错误摘要
promptVersionRef Prompt 版本引用
agentConfigRef Agent 配置引用
contextSnapshotRef 上下文摘要引用

禁止保存:

  • New-API token 明文。
  • Prompt secret。
  • 模型供应商成本明细作为 Muse 权威账本。
  • 未脱敏的完整请求头。
  • 普通用户不可见的系统配置全文,除非走管理员审计视图并受权限控制。

10. Risk Routing

10.1 风险等级行为表

riskLevel 系统行为 是否允许自动确认
low 展示轻量提示,允许用户正常确认 可允许
medium 明确展示风险和来源,要求用户显式确认 不建议自动确认
high 阻止批量自动确认,要求用户逐项处理或重新生成
critical 阻止确认进入 Canonical要求重新生成、人工修改或管理员排查

生成链路最多自动重试 2 次。两次后仍为 high / critical 时,不继续循环重试,必须给出失败状态、替代候选或人工处理入口。

用户手工编辑正文时Risk Routing 只能标记风险、生成待审草稿或提示重新提取,不得自动改写用户正文。

10.2 与待审层的关系

  • 风险标记属于 Shadow 解释的一部分,不是 Canonical 事实。
  • high / critical 不得通过“一键确认全部可确认章节”绕过。
  • 风险状态、来源证据和用户决策必须进入 Archive 或审计摘要,便于后续追溯。

11. Knowledge Draft 字段合同

Knowledge Draft / Proposal 至少需要以下语义字段:

字段 说明
id Draft / Proposal ID
workId 所属作品
proposalType create_entity / update_attribute / add_relation / update_narrative_state / planning_update
sourceKind block / suggestion / parse_job / planning_candidate
sourceRefId 来源对象 ID
sourceBlockRevision 来源 Block revision适用时必填
sourceContentHash 来源内容 hash
evidence 支撑该草稿的证据数组
proposedData 拟写入数据
currentData 当前 Canonical 快照
riskLevel low / medium / high / critical
suggestionId 生成链路中关联 Suggestion
parseJobId + chapterId Full Parse 章节确认边界
expiresAt 过期时间

evidence 至少包含:

{
  "sourceType": "block",
  "sourceId": "string-id",
  "revision": 5,
  "quoteOrSummary": "证据摘要",
  "confidence": 0.82
}

缺少来源快照、来源 hash 或章节边界的旧草稿不得 best-effort 硬确认,应作废并重新提取。

12. 全书解析批量返回合同

批量选择和“一键确认全部可确认章节”只是用户操作效率优化。后端仍按章节逐个事务执行,并返回可解释摘要。

建议返回结构:

{
  "parseJobId": "string-id",
  "summary": {
    "requestedChapterCount": 12,
    "succeededChapterCount": 10,
    "failedChapterCount": 2
  },
  "chapters": [
    {
      "chapterId": "string-id",
      "status": "succeeded",
      "acceptedProposalCount": 18,
      "archivedProposalCount": 18,
      "outboxEventCount": 6,
      "retryable": false
    },
    {
      "chapterId": "string-id",
      "status": "failed",
      "failureCode": "CHAPTER_BATCH_CONFLICT",
      "failureReason": "本章存在冲突草稿,需要逐项处理",
      "retryable": true
    }
  ],
  "retryableChapterIds": ["string-id"]
}

失败章节不得回滚已成功章节;也不得只返回一个全局错误让用户无法定位。

13. 一致性检查结果结构

一致性检查是主动质量工具,不是强制审批。返回结果至少包含:

{
  "checkId": "string-id",
  "workId": "string-id",
  "issues": [
    {
      "issueId": "string-id",
      "issueType": "timeline_conflict",
      "severity": "high",
      "title": "角色到达地点的时间冲突",
      "description": "第 12 章和第 14 章对同一事件时间顺序描述不一致",
      "locations": [
        {
          "chapterId": "string-id",
          "blockId": "string-id",
          "revision": 8
        }
      ],
      "relatedObjects": [
        {
          "type": "knowledge_entity",
          "id": "string-id"
        }
      ],
      "evidence": [
        {
          "sourceType": "graph_provider",
          "sourceId": "string-id",
          "summary": "证据摘要"
        }
      ],
      "suggestedActions": [
        "修改第 14 章事件描述",
        "更新角色时间线"
      ]
    }
  ]
}

严重程度使用 low / medium / high / critical。检查结果只提示、定位和解释风险,不自动写正文、规划项或知识。

14. 质量评测聚合算法

14.1 多模型评审输入

正式 Evaluation Run 至少绑定:

  • 评测集版本。
  • Prompt 版本。
  • Agent 配置版本。
  • 上下文策略版本。
  • 全局知识库和访问策略版本。
  • New-API 绑定摘要。
  • judge model set。

14.2 加权中位数 + 分歧惩罚

每个评审模型返回 scoreconfidencerationale 和结构化问题列表。聚合时:

  1. 按模型可信度、场景适配度和历史稳定性计算权重。
  2. 用加权中位数作为基础分,降低极端模型输出影响。
  3. 计算分歧度,例如四分位距、最大最小差或高低分阵营差。
  4. 根据分歧度扣减置信度或最终分。
  5. 输出三态结论:passneeds_human_reviewfail

聚合结果必须保留:

字段 说明
baseScore 加权中位数基础分
disagreementPenalty 分歧惩罚
finalScore 最终分
confidence 聚合置信度
verdict pass / needs_human_review / fail
judgeBreakdown 各模型得分摘要
failureReasons 失败或需复核原因

评测结论只能用于改进 Prompt、Agent、上下文策略和回归风险判断不替代普通用户对正文、规划和作品知识的确认。

15. 默认超级管理员初始化

Sa-Token 引入后,系统需要可审计的默认超级管理员初始化,但不能交付明文默认密码。

目标合同:

  • 初始化只允许在安装、首启或明确的系统管理命令中执行。
  • 初始化必须幂等:已存在超级管理员时不得重复创建或覆盖密码。
  • 凭据交付只能使用一次性 bootstrap token、临时密码哈希、控制台一次性输出或等价安全机制。
  • 首次登录必须强制改密或完成凭据轮换。
  • 初始化行为必须写审计日志,记录时间、来源、操作者或系统服务身份。
  • 日志、接口响应和文档不得包含明文默认密码。

错误处理:

场景 行为
超级管理员已存在 返回已初始化状态,不改写凭据
bootstrap token 过期 拒绝初始化,要求重新生成
初始化部分失败 回滚用户/角色绑定或进入可重试失败状态
无安全凭据来源 拒绝创建默认账号

16. 与 doc/dev 的关系

doc/dev/00-09 仍负责研发管理基线、阶段依赖、验收门禁和证据包。本文件只把其中已经属于“目标设计合同”的内容沉入 doc/design-docs。后续如果 doc/dev 再出现新的设计合同,应先判断:

  1. 是否属于产品/架构/API/Schema/流程目标设计。
  2. 是否已有正式设计 owner。
  3. 是否只是阶段门禁或证据要求。

只有第 1 类和第 2 类才需要进入 doc/design-docs;阶段门禁和证据要求继续留在 doc/dev