1、 AnalyticDB MySQL提供的Agent日志可观测能力
2、实战:从原始日志到 Token 归因与 Prompt 优化
Step 1:从非结构化日志提取完整执行链路
WITH
TaskBoundaries
AS
(
SELECT
*,
SUM
(
CASE
WHEN
role
=
'user'
THEN
1
ELSE
0
END
)
OVER
(
PARTITION
BY
session_id
ORDER
BY
row_id)
AS
chain_id
FROM
openclaw_logs.openclaw_sessions
WHERE
role
IS
NOT
NULL
),
TaskChains
AS
(
SELECT
CONCAT
(session_id,
'_'
, chain_id)
AS
unique_chain_id,
GROUP_CONCAT
(...
ORDER
BY
row_id SEPARATOR
' >>> '
)
AS
full_trace,
COUNT
(
CASE
WHEN
tool_name
IS
NOT
NULL
THEN
1
END
)
AS
tool_usage_count,
...
FROM
TaskBoundaries
GROUP
BY
session_id, chain_id
)
SELECT
chain_id, session_id, tool_usage_count,
LEFT
(full_trace,
200
)
AS
trace_preview
FROM
TaskChains
LIMIT
5
;
Step 2:用 AI 函数自动标注失败模式
ADB MySQL 的
ai_classify
在 SQL 中直接调大模型完成失效分类,
ai_generate
自动生成根因诊断——零 Python 代码:
WITH
TaskBoundaries
AS
( ... ),
-- 同 Step 1
TaskChains
AS
( ... )
SELECT
unique_chain_id,
ai_classify(
'qwen_max_test'
,
LEFT
(full_trace,
600
),
'["死循环", "工具参数幻觉", "拒绝执行", "逻辑断裂", "成功解决"]'
)
AS
failure_label,
ai_generate(
'qwen_max_test'
,
CONCAT
(
'你是OpenClaw AI诊断员。分析以下任务链...'
,
LEFT
(full_trace,
400
))
)
AS
root_cause_notes
FROM
TaskChains
WHERE
tool_usage_count >
0
OR
last_stop_reason
IS
NULL
OR
last_stop_reason !=
'stop'
;
Step 3:量化各失效模式的 Token 消耗
WITH
TaskBoundaries
AS
( ... ),
ChainTokens
AS
(
SELECT
CONCAT
(session_id,
'_'
, chain_id)
AS
unique_chain_id,
SUM
(
IFNULL
(total_tokens,
0
))
AS
chain_total_tokens
FROM
TaskBoundaries
GROUP
BY
session_id, chain_id
)
SELECT
a.failure_label,
COUNT
(*)
AS
task_count,
ROUND
(
AVG
(ct.chain_total_tokens))
AS
avg_tokens,
SUM
(ct.chain_total_tokens)
AS
total_tokens_burned
FROM
openclaw_logs.t_ai_audit_results a
JOIN
ChainTokens ct
ON
a.unique_chain_id = ct.unique_chain_id
GROUP
BY
a.failure_label
ORDER
BY
total_tokens_burned
DESC
;
结论令人震惊: 工具参数幻觉仅占 15% 的任务量,却烧掉了 3,161,237 Token——是全部成功任务总量的 3.27 倍! 单条最高消耗达 958,743 Token。
进一步通过
tokens_per_step
下钻,可精准定位每条失败链路的单步消耗密度:
Step 4:基于根因生成Prompt优化建议
Agent 失败分两种:规范失败(指令不清晰)和泛化失败(模型无法应用指令)。最优先动作:先修 Prompt,别急着建评估器。利用
ai_generate
,一条 SQL 同时提取原始指令和优化 Prompt 做并排对比:
WITH
TaskBoundaries
AS
( ... ),
ChainTokens
AS
( ... ),
FirstUserMsg
AS
(
SELECT
CONCAT
(session_id,
'_'
, chain_id)
AS
unique_chain_id,
SUBSTRING_INDEX(content_text,
CONCAT
(
'```'
,
CHAR
(
10
),
CHAR
(
10
)),
-1
)
AS
original_prompt,
ROW_NUMBER()
OVER
(
PARTITION
BY
session_id, chain_id
ORDER
BY
row_id)
AS
rn
FROM
TaskBoundaries
WHERE
role
=
'user'
),
FailedChains
AS
(
SELECT
unique_chain_id, failure_label, root_cause_notes,
ROW_NUMBER()
OVER
(
PARTITION
BY
unique_chain_id
ORDER
BY
created_at
DESC
)
AS
rn
FROM
openclaw_logs.t_ai_audit_results
WHERE
failure_label !=
'成功解决'
)
SELECT
fc.unique_chain_id,
LEFT
(fu.original_prompt,
200
)
AS
original_prompt,
fc.root_cause_notes
AS
root_cause,
ai_generate(
'qwen_max_test'
,
CONCAT
(
'你是Prompt优化专家。...原始指令:'
,
LEFT
(fu.original_prompt,
500
),
'失败根因:'
, fc.root_cause_notes)
)
AS
optimized_prompt
FROM
FailedChains fc
JOIN
ChainTokens ct
ON
...
JOIN
FirstUserMsg fu
ON
...
AND
fu.rn =
1
WHERE
fc.rn =
1
ORDER
BY
ct.chain_total_tokens
DESC
LIMIT
3
;
3、 结语
我们用 4 条 SQL 走完了从原始日志到闭环修复的全链路 。
不要把 AI 的命脉交给通用外部指标。 死磕 Trace,围绕真实问题构建专属评估体系——ADB MySQL 把这套工程压缩成了几行 SQL,轻松的嵌入到企业日常的 workflow 里。这为企业提供了一个绝佳的“经验回放缓冲区”,让高价值的 SOP 在 Agent 进行 Bootstrapping 的过程里得以沉淀。欢迎钉钉搜索“173295003853”加入钉群进行交流。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049330/viewspace-3115251/ ,如需转载,请注明出处,否则将追究法律责任。