Skip to content

模块之间传递什么

以下是建议契约,字段名和错误码在开发时通过真实代码确定。教学示例不代表已有 API。所有在线对象都应关联 trace_id,并固定本次查询使用的版本。

从请求到答案

生产者 → 消费者对象关键字段不变量
API → OrchestratorQueryRequestquestion、session_id、now身份来自服务端会话
Auth → 全链路AuthorizationContextprincipal_id、role/attributes、allowed_scope、policy_version、fingerprint模型和用户文本不能修改
Understanding → Router/LinkingQueryIntent指标提及、维度提及、过滤、时间、比较、unresolved未确认项显式保留
SearchRepository → LinkingCandidateobject_id、kind、datasource_id、version、score/rank、evidence已过滤授权与版本
Linking → PlannerLinkedSchema字段映射、类型化值、Join Path、confidence字段必须存在,路径必须有业务含义
Semantic → Planner/GeneratorSemanticContextmetric_id、expression、grain、rules、time_role、versionPublished 且版本固定
Planner → GeneratorQueryPlan / IR度量、聚合、维度、时间、过滤、操作、来源校验通过后才进入生成
Generator → ValidatorSQLCandidateSQL、parameters、dialect、plan_id、attempt不直接执行
Validator/Policy → ExecutorExecutionDecisionallow/reject、reason、validated_sql_hash、policy_version、budget与真正执行的 SQL 一致
Executor → Result ValidatorQueryResulttyped_columns、rows、row_count、truncated、duration不超过权限与资源边界
Result Validator → AnswerValidatedResultstate、warnings、evidence、unitswarning 与 success 区分
全链路 → EvaluationQueryTracestages、versions、errors、latency、usage脱敏、可关联、可重放

三种引用不要混用

metric_id 是业务指标引用,column_id 是物理字段引用,document_id 是索引文档引用。一个指标可依赖多列;同一对象在两个搜索系统都有文档。RRF 必须按稳定业务对象 ID 合并,不能按不同系统的随机文档 ID 计成两个候选。

一个小型接口示例

python
# 设计示例;完整类型由对应阶段实现。
from typing import Protocol

class SearchRepository(Protocol):
    async def search_schema(
        self,
        query: "SchemaSearchQuery",
        auth: "AuthorizationContext",
    ) -> list["Candidate"]:
        ...

这个接口表达“在授权范围内查 schema”。Milvus collection、OpenSearch DSL、RRF 常数和重排模型属于实现细节。可先使用简单模块和函数;接口只在隔离存储、模型或外部服务时建立,不要求每个函数都套一层类。

成功以外的契约

状态谁决定下一步
needs_clarification理解、链接、语义冲突向用户补槽位
degraded一路检索或可选依赖失效使用允许回退并标记证据缺口
rejected安全、权限、成本策略结束,提供可理解原因
failed模型、存储或不可恢复执行错误提供 trace_id;可恢复类别允许有限重试
cancelled用户或 deadline停止工具、模型等待与数据库执行
succeeded_with_warning有效结果但异常/截断展示限制,避免过度解释

不能用空列表同时表达“没有匹配”和“搜索服务宕机”;不能让 Generator 捕获所有异常后仍返回一条猜测 SQL。

防止校验与执行对象错位

ExecutionDecision 应绑定最终 SQL 内容、参数、身份和策略版本。若修复改变 SQL,旧决定失效;若权限撤销或版本改变,应按定义重新验证。实现时不一定需要复杂签名机制,但调用链必须保证校验后到执行前不能替换查询。

需求 → 代码 → 验证 → 复盘