跳转至

附录 F · 案例研究:端到端查询走查

本附录通过 4 个完整的查询场景,展示 TTD 从用户输入到结果返回的端到端体验。每个场景覆盖不同的路由路径,包含:用户输入 → SSE 事件序列 → 各节点耗时 → 生成的 SQL → 最终输出。

诚实声明:本附录的耗时数字为设计目标估值(基于各节点延迟预算累加),非 Langfuse trace 实测值。场景数据基于 H&M 数据集(见 附录 E)。SQL 与结果是真实可执行的,但具体数值为示例。


F.1 场景一:上月销量 Top 10 商品(nl2sql_query)

路由nl2sql_query(最快主路径) 意图:ranking 复杂度:低(单表聚合 + join 维度表)

用户输入

上月销量 Top 10 商品

SSE 事件序列

# 事件类型 内容 耗时(设计目标)
1 status processing
2 node_complete supervisor — 嵌入计算 + 治理叠加层解析 ~80ms
3 node_complete query_understanding — intent=ranking, entities=[商品,销量], temporal=上月 ~0.8s
4 node_complete router — 映射到 nl2sql_query ~2ms
5 node_complete data_retrieval — Engine T "销量"→transaction_count, "商品"→dim_article ~30ms
6 node_complete reranker — 绑定列 boost 0.95, 父表 +0.25 ~8ms
7 node_complete semantic_planner — Steiner 树: fact_transaction ⋈ dim_article ~20ms
8 node_complete sql_generation — 生成 SQL ~1.5s
9 node_complete guardrails — 五层校验通过 ~15ms
10 node_complete sql_executor — 执行 SQL ~200ms
11 data 查询结果(10 行)
12 node_complete visualization — 规则推荐条形图 ~5ms
13 insights "上月销量 Top 1 为 XX,销量 12,345" ~1.0s
14 status completed
合计 ~3.7s

生成的 SQL

SELECT a.prod_name, COUNT(*) AS sales_count
FROM gold_hm.fact_transaction f
JOIN gold_hm.dim_article a ON f.article_id = a.article_id
WHERE f.t_dat >= DATE_TRUNC('month', CURRENT_DATE - INTERVAL '1 month')
  AND f.t_dat < DATE_TRUNC('month', CURRENT_DATE)
GROUP BY a.prod_name
ORDER BY sales_count DESC
LIMIT 10;

最终输出

prod_name sales_count
产品名 1 12,345
产品名 2 11,876
... ...

可视化:条形图(ranking 场景规则推荐) 洞察:上月销量 Top 1 为"产品名 1",共 12,345 次交易,是第二名的 1.04 倍。

链路特点

  • 未触发修复循环:SQL 一次生成即通过五层护栏——术语绑定精准、列引用全部在白名单内、EXPLAIN 预估行数 < 10M。
  • 规划器价值:Steiner 树判定无需 join dim_customer(无字段引用),消除冗余 join。
  • 缓存:若该问题再次出现(相似度 ≥ 0.92),SQL Cache 命中,跳过检索+生成,端到端降至 ~250ms。

F.2 场景二:为什么退货率上升了?(deep_analysis_workflow)

路由deep_analysis_workflow(多步推理路径) 意图:anomaly_explanation 复杂度:高(多步分析 + 三级评估 + 可能触发修复循环)

用户输入

为什么退货率上升了?

SSE 事件序列

# 事件类型 内容 耗时
1 status processing
2 node_complete supervisor ~80ms
3 node_complete query_understanding — intent=anomaly_explanation ~1.0s
4 node_complete router — 映射到 deep_analysis_workflow ~2ms
5 node_complete data_retrieval — "退货率"→price<0 的比例 ~40ms
6 node_complete reranker ~10ms
7 node_complete semantic_planner ~30ms
8 node_complete sql_generation(第 1 次) ~1.5s
9 node_complete guardrails — Layer 2c 列校验失败(引用了不存在的 return_flag 列) ~5ms
10 node_complete corrective_retrieval — 拉取退货相关列(price<0 即退货) ~50ms
11 node_complete sql_generation(第 2 次)— 修复后重试 ~1.5s
12 node_complete guardrails — 通过 ~15ms
13 node_complete sql_executor ~300ms
14 node_complete retrieval_evaluator — 检索覆盖度评估 ~200ms
15 node_complete sql_evaluator — SQL 正确性评估 ~200ms
16 node_complete answer_evaluator — 答案质量评估 ~1.0s
17 data 退货率按品类分解结果
18 insights "退货率上升主因是品类 X 的退货增加,可能与产品质量问题相关" ~1.5s
19 status completed
合计 ~8.5s

生成的 SQL(第 2 次,修复后)

-- 退货 = price < 0(业务规则:退货金额为负)
-- 按品类分解退货率
WITH stats AS (
    SELECT
        a.index_group_name AS category,
        COUNT(*) AS total,
        COUNT(*) FILTER (WHERE f.price < 0) AS returns
    FROM gold_hm.fact_transaction f
    JOIN gold_hm.dim_article a ON f.article_id = a.article_id
    WHERE f.t_dat >= CURRENT_DATE - INTERVAL '3 months'
    GROUP BY a.index_group_name
)
SELECT category,
       total,
       returns,
       ROUND(returns::NUMERIC / NULLIF(total, 0) * 100, 2) AS return_rate_pct
FROM stats
ORDER BY return_rate_pct DESC;

最终输出(片段)

category total returns return_rate_pct
Baby/Children 456,789 12,345 2.70
Ladieswear 1,234,567 28,901 2.34
... ... ... ...

洞察:退货率上升主要由 Baby/Children 品类驱动(2.70%),该品类退货率较上月上升 0.4 个百分点。建议排查该品类近期上架商品的质量问题。

链路特点

  • 修复循环触发:第 1 次 SQL 幻觉了 return_flag 列(不存在),Layer 2c 拦截 → corrective_retrieval 拉取退货语义(price<0)→ 第 2 次成功。这正是 Reflexion 范式的工程体现。
  • 三级评估器启用:deep_analysis 路由独有,retrieval/sql/answer 三级评估器各跑一次,低分可触发重试。
  • 业务规则注入:"退货金额为负"这条 business_rule 从图遍历注入 Prompt,引导 LLM 用 price < 0 而非幻觉列。

F.3 场景三:帮我预测下月销量(analytical_workflow + ML 工具)

路由analytical_workflow(ML 工具路径) 意图:forecasting 复杂度:高(SQL 取数 + Prophet 预测 + 可视化)

用户输入

帮我预测下月销量

SSE 事件序列

# 事件类型 内容 耗时
1-4 (同前) supervisor → QU → router → analytical_workflow ~1.1s
5 node_complete data_retrieval — 取历史月度销量 ~40ms
6 node_complete sql_generation — 生成取数 SQL ~1.5s
7 node_complete guardrails — 通过 ~15ms
8 node_complete sql_executor — 返回历史 DataFrame ~500ms
9 node_complete code_generator — 生成 Prophet 调用代码 ~1.5s
10 node_complete sandbox — L1 沙箱执行 Prophet 预测 ~3.0s
11 node_complete dataframe_bridge — 转换预测结果 ~10ms
12 node_complete visualization — 推荐折线图(含预测区间) ~5ms
13 insights "预计下月销量约 X,趋势上升 Y%" ~1.0s
14 status completed
合计 ~8.7s

取数 SQL

SELECT DATE_TRUNC('month', t_dat) AS month, COUNT(*) AS sales_count
FROM gold_hm.fact_transaction
WHERE t_dat >= CURRENT_DATE - INTERVAL '12 months'
GROUP BY month
ORDER BY month;

ML 工具调用(沙箱内执行)

# sandbox 内 LLM 生成的代码(简化)
from prophet import Prophet
import pandas as pd

df = pd.DataFrame(history_data)  # 来自 dataframe_bridge
df.columns = ['ds', 'y']
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(periods=30, freq='D')
forecast = m.predict(future)
result = forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail(30)

最终输出

可视化:折线图(历史销量 + 预测值 + 置信区间带) 洞察:基于过去 12 个月数据,Prophet 预测下月销量约 1,450,000 笔,环比上升 3.2%。置信区间 [1,380,000, 1,520,000]。

链路特点

  • SQL + 代码两阶段:先用 SQL 取历史数据为 DataFrame,再用代码解释器在沙箱跑 Prophet——SQL 负责结构化取数,代码负责机器学习计算。
  • L1 沙箱exec + whitelist,Prophet 在白名单内,但无资源限制(改进方向:升级 L2,见 第 16 章 16.6.2)。
  • DataFrame 桥接dataframe_bridge 将 SQL 结果转为 pandas DataFrame,供沙箱代码消费。

F.4 场景四:这个数据集里客户和交易是什么关系?(graph_reasoning)

路由graph_reasoning(GraphRAG 路径) 意图:schema_exploration 复杂度:中(NL2Cypher + 图遍历)

用户输入

这个数据集里客户和交易是什么关系?

SSE 事件序列

# 事件类型 内容 耗时
1-4 (同前) supervisor → QU → router → graph_reasoning ~1.1s
5 node_complete graph_rag — LLM 生成 Cypher ~1.5s
6 node_complete graph_rag — AGE 图遍历执行 ~200ms
7 data 图节点 + 边(供 @antv/g6 渲染)
8 node_complete visualization — 推荐关系图 ~5ms
9 insights "客户通过 customer_id 与交易关联,为 1:N 关系" ~1.0s
10 status completed
合计 ~3.9s

生成的 Cypher

MATCH (c:Table {table_id: 'dim_customer'})-[r:JOINABLE_TO]-(t:Table {table_id: 'fact_transaction'})
OPTIONAL MATCH (t)-[:HAS_COLUMN]->(col:Column)
WHERE col.column_name IN ('customer_id')
RETURN c, r, t, col

最终输出

可视化:@antv/g6 关系图——展示 dim_customerfact_transaction 通过 customer_id 的 JOINABLE_TO 边,标注基数(1:N)与扇出风险。

洞察:客户表(dim_customer)与交易表(fact_transaction)通过 customer_id 关联,为 1:N 关系(一个客户有多笔交易)。直接 join 无扇出风险,因为交易表是事实表(粒度最低)。

链路特点

  • 不生成 SQL:GraphRAG 路径不走 SQL 生成/护栏,直接 NL2Cypher → 图遍历 → 可视化。
  • 无护栏保护:不同于 SQL 有五层护栏,Cypher 当前无语法校验或安全护栏(改进方向:16.6.3 GraphRAG 护栏)。
  • 优雅降级:若 Cypher 生成失败或图遍历超时,自动降级到 SQL 流水线(fallback_sql)。

四个场景对比

场景 路由 端到端耗时 触发修复 评估器 ML 工具 输出形态
Top 10 商品 nl2sql_query ~3.7s 表格 + 条形图
退货率归因 deep_analysis ~8.5s 是(1 次) 三级 表格 + 洞察
销量预测 analytical ~8.7s Prophet 折线图 + 置信区间
客户交易关系 graph_reasoning ~3.9s 关系图

耗时为设计目标估值

上表耗时为各节点延迟预算累加的设计目标值,非实测。实际耗时受 LLM 响应速度、数据量、网络等因素影响。系统化性能基线测量是改进方向(第 16 章)。


相关文档