如何通过Trace数据监控Cortex Agent性能|技术实践

2026-05-27 1 阅读 Michael Segner
2026 年,智能体将在企业级应用中取得哪些实质性突破? 点击下载 "《2026 年 AI 与数据发展预测》白皮书,获悉专家一手前瞻,抢先拥抱新的工作方式! 观察你的 Cortex Agent 集群 使用 Snowflake Intelligence 的团队往往行动很快。Cortex Agents 可以快速且无缝地构建,不知不觉间,你就已经有一个集群在不同领域和业务职能中投入生产运行。 Snowflake Intelligence 架构 部署 agents 是一种赋能体验。然而,理解和评估它们的性能可能是另一回事。监控错误率、延迟、token 消耗等健康功能指标,以及新鲜度和数量等质量指标,是任何生产系统的基本要求;agents 也不例外。 Snowflake Intelligence 为团队回答这些重要问题提供了所需的基础。它会原生记录丰富的 trace 数据——对话历史、工具执行、LLM 规划、响应生成。 挑战在于如何以具有运营实用性的方式呈现这些数据,而不是每次都要针对可观测性表编写 SQL。 可以把它看作一条成熟曲线。 一开始,你可能只是通过查询 agent 错误率或其他性能指标来获取某个时点的快照。随着不断推进,你会开始构建和维护仪表板,然后使用异常检测模型监控这些仪表板趋势,以识别离群值和 SLA 违约。最终,你可以主动识别导致“边缘案例”的系统性问题,并实施事件管理流程,以维持生产级 SLA。 要沿着这条成熟曲线不断升级,需要深入理解 agent telemetry,以及它如何被观察、分析,并最终用于排查 Agentic 故障。 我们将在本文中探讨这些主题,逐步介绍 Snowflake 如何记录 Cortex Agent telemetry,以及 agent 可观测性解决方案如何帮助监控并修复常见的性能故障模式。agent 可靠性的其他关键方面,包括上下文(数据质量)、轨迹(工具调用)和输出,将留待以后讨论。 Snowflake 为 Cortex Agents 记录了什么:深入底层一探究竟 在设置任何监控之前,值得先理解 Snowflake Intelligence 生成的 trace 结构。 每一次 Cortex Agent 交互都由一个 spans 层级结构组成,每个 span 代表 agent 操作的不同阶段。Snowflake 将这些 trace 数据存储在原生可观测性表中,可以通过一个名为 SNOWFLAKE.LOCAL.GET_AI_OBSERVABILITY_EVENTS 的表函数访问,该函数可以直接在 Snowflake SQL worksheet 中调用。 例如, Monte Carlo " 在底层运行、用于支持我们 agent 性能监控的查询如下。这个查询值得仔细看一看,因为它准确揭示了 Snowflake 在 span 级别记录了什么: SELECT * FROM TABLE( SNOWFLAKE.LOCAL.GET_AI_OBSERVABILITY_EVENTS( 'YOUR_DATABASE', 'YOUR_SCHEMA', 'YOUR_AGENT_NAME', 'CORTEX AGENT' ) ) WHERE RECORD_TYPE = 'SPAN' AND RECORD:name::STRING NOT LIKE 'SqlExecution_%' 在 Snowflake 中对 “MSegner_Demo_Agent” 运行 Get_AI_Observability_Events 查询 这里有意过滤掉了 SqlExecution_* spans,因为它们代表 Cortex Analyst 触发的实际 SQL 运行,如果包含在 agent 级指标中,往往会产生噪声。将它们移除后,剩下的就是 agent 行为 trace。 将 records 映射到 span 类型 每个 span 都有一个 record_name,用于标识其 span 类型。 这些元数据对于理解每个 record_name 在 agent 行为中实际代表什么至关重要,也正是它让 trace 数据变得可操作。如果没有这种映射,你看到的只是一串晦涩字符串组成的扁平列表,无法清楚判断 agent 操作中的哪个环节出了问题。 它们与 agent 操作的映射关系如下: CASE WHEN record_name = 'AgentV2RequestResponseInfo' THEN 'chat' WHEN record_name LIKE 'ReasoningAgentStepPlanning-%' THEN 'planning' WHEN record_name LIKE 'ReasoningAgentStepResponseGeneration-%' THEN 'response_generation' WHEN record_name LIKE 'CortexSearchService_%' THEN 'tool_call' WHEN record_name LIKE 'CortexAnalystTool_%' THEN 'tool_call' ELSE 'unknown' END AS request_type Snowflake 中的 Agent telemetry,record_name 每种 span 类型代表什么: - chat:完整对话轮次的顶层 span。AgentV2RequestResponseInfo 是最外层封装:它捕获单次用户交互的完整输入和输出,以及将多轮对话关联在一起的 thread_id; - planning:ReasoningAgentStepPlanning spans 捕获 agent 的决策过程:下一步调用哪个工具、制定什么查询、传递什么上下文。每个 planning step 都会在 RECORD_ATTRIBUTES 中记录自己的 token 数量、模型名称和工具选择; - response_generation:ReasoningAgentStepResponseGeneration spans 捕获最终答案合成过程。此时 agent 已经完成工具调用,正在生成响应。这里的 token 数量反映最终 LLM 调用的成本; - tool_call:两类工具会使用不同的属性 schema 记录,包括: CortexSearchService_* spans 记录搜索查询、请求的列、应用的筛选器、结果限制、返回结果和状态;CortexAnalystTool_* spans 记录传入的 messages、使用的 semantic model、生成的 SQL 查询、文本响应,以及——尤其值得注意的是——一个 question_category 字段,用于分类 Cortex Analyst 收到的问题类型。 关于 question_category 字段,Cortex Analyst 会自动对问题进行分类,并且该分类可在 trace 数据中观察到。类别可能包括简单查找、聚合、时间序列查询和比较分析等。 如果你发现某个特定 agent 出现 token