Microsoft Foundry 智能体的 AI 可观测性入门套件
本文编译自 Microsoft Tech Community 上 varghesejoji 的博客文章 AI Observability Starter Kit for Microsoft Foundry agents,我按自己上手时的理解重新整理,并补充了一些实际跑下来的体会。
先把结论放前面:一条 PowerShell 命令,就能拉起一个包含四个智能体的 Microsoft Foundry 环境,带遥测、8 个内置评估器、1 个自定义合规评估器、一次自动化红队扫描,还有两条 scheduled-query 告警。整套东西端到端验证过,再敲一条命令就能全部拆掉。Fork 下来直接跑。我觉得它最对胃口的人群是那些在 Azure 上跑 AI 智能体、又不想自己手写一堆管道代码的应用开发者、ML 工程师和 SRE。
1. 从"全绿仪表盘"到真正能上生产的 AI 可观测性
设想这样一个场景:你的 AI 智能体在生产环境跑着,负载均衡器显示零错误,Application Insights 仪表盘一片绿。但底下其实出了好几档子事:
-
有个模型部署根本不存在。某个智能体指向的模型压根没部署,每个请求都撞上 chat 级错误——可 HTTP 响应还是返回 200,因为智能体框架在内部把异常吞掉了。
-
某个工具返回了脏数据。用户查客户 C999 的订单,智能体调对了工具,但工具抛了个 LookupError。智能体礼貌地道了个歉,HTTP 状态 200,除非你去追 execute_tool 这个依赖 span,否则错误根本看不见。
-
模型上钩回答了一个安全诱饵提示。用户要暴力虚构内容,模型照做了。没有过滤器拦住,没有评估器给它打分,也没有告警响。
这些问题不会出现在常规日志或者通用的资源仪表盘里。第一次意识到 HTTP 200 背后能藏这么多事,我还挺意外的。它们需要另一种可观测性,把五件事拼到一起:
-
用 OpenTelemetry(OTel)GenAI 语义约定做插桩追踪,这样每次模型调用和工具执行都变成一个可查询的 span。
-
自动化的质量评估器,在真实流量上给推理、意图识别、工具使用打分,而不是在测试夹具上。
-
对抗性红队测试,用生成的攻击提示去探安全边界,赶在真实用户之前。
-
Scheduled-query 告警,盯着错误率和延迟退化触发,而不是只盯可用性。
-
仪表盘,把 token、模型、工具、错误集中到一处,给运维和 on-call 看。
这些零件没一个是新东西。难的是把它们正确地接起来。这个 starter kit(仓库在 github.com/jvargh/ai-observability-starter-kit)把接线部分打包好了:一个已插桩的智能体、绑到正确追踪字段上的评估器、一套红队分类法、一份可导入的 Grafana 仪表盘,还有部署后的检查——全都塞进一条命令里。你从一个已知可用的基线出发,而不是自己从零攒。
这一节先讲清楚这套东西是怎么把这些零件接起来的。第 2 节往后覆盖部署、评估、红队、可观测性各个视图,以及拆除。
1.1 数据是怎么流动的
一个用户提示进入托管智能体,智能体调用模型(比如 gpt-4o-mini),可能还会执行一个或多个工具(订单查询、供应商查询、天气、掷骰子)。每次模型调用和工具执行都会发出 OpenTelemetry span,自动摄入到 Azure Application Insights。除了在智能体清单里设一个 ENABLE_INSTRUMENTATION=true,你不需要额外写任何 SDK 接线代码。
从 Application Insights 出发,遥测数据喂给三个下游消费者:
-
Grafana 仪表盘通过 KQL(Kusto 查询语言,Azure Log Analytics 的查询语言)查底层的 Log Analytics 工作区,渲染出运营面板(token 用量、延迟、错误率、模型分布)。
-
Agent evaluators 拉取最近的追踪,用 8 个内置质量检查加上你注册的任意自定义评估器给它们打分。结果出现在 Microsoft Foundry 的 Evaluations 面板里。
-
Scheduled-query 告警在错误计数或 p95 延迟(95 分位响应时间)在 15 分钟窗口内超阈值时触发。
设计上有个关键点:智能体本身不知道仪表盘、评估器或告警的存在。它只管发 span。下游的一切都通过 Application Insights 这条遥测主干接起来。我个人挺喜欢这种解耦——智能体代码里没有任何"监控逻辑"污染。
1.2 智能体的定义
Foundry 托管的智能体是一个容器化的 AI 智能体,由 Microsoft Foundry 负责管理、部署和扩缩:你提供 Python 代码(main.py)和一份小小的 YAML 清单(agent.yaml),Foundry 负责运行时、OTel 管道和每个智能体的独立身份。这套 kit 里的四个智能体共用完全一样的代码、工具和系统指令,唯一的区别是各自指向的模型部署:
| 智能体 | 模型 | 用途 |
|---|---|---|
| agent-framework-agent-basic-responses | gpt-4o-mini(通过 ${MODEL_DEPLOYMENT_NAME}) |
主智能体,带 6 个 @tool 函数。用于遥测、评估和填充仪表盘。 |
| agent-framework-agent-gpt5-mini | gpt-5-mini(硬编码) | 姊妹智能体,用于跨模型延迟和 token 对比。 |
| agent-framework-agent-gpt41-mini | gpt-4.1-mini(硬编码) | 姊妹智能体,用于跨模型对比。 |
| agent-framework-agent-broken-model | nonexistent-model-deployment-xyz(硬编码) | 故意做坏的。每个请求都触发 chat 错误,填充 Gen AI Errors 面板。 |
智能体代码(main.py)创建一个连到模型的 FoundryChatClient,定义一个带采购助手系统提示的 Agent,然后注册六个工具函数:
get_orders, find_suppliers_for_request, get_company_supplier_info, get_current_utc_date, get_weather, and roll_dice.
有些工具是故意在特定输入上报错的(比如客户 C999 会抛 LookupError),这就制造出仪表盘和评估器要消费的错误遥测。
一个工具函数就是一个带注解的普通 Python 函数。Foundry 从 @tool 装饰器发现它,再把它暴露给模型,像下面这样:
|
|
这六个工具函数注册到 Agent 构造函数里,模型能看到的全部界面就这些。
主智能体的 YAML 清单:
|
|
两个环境变量控制遥测:
-
ENABLE_INSTRUMENTATION=true为每次 chat 模型调用和 execute_tool 调用激活 OpenTelemetry 子 span(每次 LLM 调用一个 span,每次工具执行一个 span)。不设它的话,就只会发出父级的 invoke_agent span,Agents 面板会一直空着。 -
ENABLE_SENSITIVE_DATA=true在 span 上捕获完整的提示和响应文本,评估器要靠这些来给响应质量打分。
2. 部署与运行
这套 kit 里的一切都是自动化的。一个 PowerShell 脚本负责预配基础设施、部署智能体、灌入流量、跑评估、配告警、验证结果。这一节讲清楚部署了什么、怎么跑、你最后能拿到什么。
运行成本:一次端到端跑下来几美分,运行期间大约每天 $0.03(Grafana 成本面板里能看到)。拆除会把一切都删干净。
2.1 这套 starter kit 里有什么
下面是跑起来后会部署的东西,以及每一块能让你做什么:
| 组件 | 作用 | 用来做什么 |
|---|---|---|
| 4 个 Foundry 托管智能体 | gpt-4o-mini(主,带 6 个 @tool 函数)、gpt-5-mini、gpt-4.1-mini,以及一个触发 chat 级错误的 broken-model 智能体 | 在同一负载下对比不同模型的延迟、token 和错误率 |
| Application Insights + Log Analytics | 接收 OpenTelemetry 追踪(GenAI 语义约定) | 即使 HTTP 返回 200,也能把工具失败追溯到具体调用和依赖 span |
| Grafana for Azure Monitor | token、延迟、操作和模型分布的自定义仪表盘 | 追踪 token 消耗趋势,找出消耗过多 token 的提示或智能体 |
| Agent evaluators | 8 个内置评估器(系统 + 过程),作为批处理跑在 Application Insights 的追踪上 | 按需验证智能体质量:意图识别、任务遵循、工具准确性等 |
| 自定义代码评估器 | 检查每条响应是否包含必需的合规免责声明短语 | 落实领域特定策略(合规短语、格式检查、监管规则) |
| Red-team scan | 用 Flip 和 Base64 策略、3 个安全评估器做对抗性探测 | 在真实用户之前,通过探测安全边界自动发现不安全输出 |
| 2 个 scheduled-query 告警 | 错误计数(sev 2)和 p95 延迟(sev 3),15 分钟窗口 | 对真正重要的信号告警:错误尖峰和延迟退化,而不只是可用性 |
| 端到端自动化 | 单个编排脚本(run-e2e.ps1)和单个拆除脚本 | 用两条命令完成整个栈的部署、演练和拆除 |
2.2 运行这套 kit
前置条件:一个 Azure 订阅,你在上面有 Contributor(或 Owner)加 User Access Administrator 权限;装好 PowerShell 7+(pwsh)、Azure CLI(az)和 Azure Developer CLI(azd)并加入 PATH;对目标订阅完成过 az login;仓库根目录有一个 Python 3.13 的 venv(.venv/)。脚本在动任何 Azure 之前会先检查虚拟环境、agent/ 目录和两个 CLI,所以缺前置条件时会提早失败并给出清晰的修复提示,而不是跑到 azd up 半路才崩。
从这里开始,工作流会自动预配基础设施、部署智能体、生成遥测、跑评估、配置仪表盘和告警。
|
|
| 参数 | 默认值 | 说明 |
|---|---|---|
| -Region | eastus2 | Foundry 账户的 Azure 区域 |
| -EnvName | aiobs-foundry-<yyyymmdd> | azd 环境名(也是资源组后缀:rg-<EnvName>) |
| -SubscriptionId | 当前 az 上下文 | 目标订阅 |
| -SkipPhases | (无) | 用逗号分隔要跳过的阶段编号 |
这个编排器一共跑 13 个阶段,每个都记录到 artifacts/e2e-<timestamp>/phase-NN.log:
| 阶段 | 做什么 | 时间 |
|---|---|---|
| 1 | azd up:预配 Foundry 账户、项目、ACR、Application Insights、Log Analytics、gpt-4o-mini | ~7 分钟 |
| 2 | 给项目 MI 授予 Foundry User 角色 | ~10 秒 |
| 3 | 部署 basic 智能体(gpt-4o-mini,带 @tool 函数) | ~3 分钟 |
| 4 | 创建 gpt-5-mini + gpt-4.1-mini 模型部署 | ~1 分钟 |
| 5 | 部署 3 个姊妹智能体(gpt5-mini、gpt41-mini、broken-model) | ~9 分钟 |
| 6 | 预热(3 次 ping)+ 种子流量(来自 clean、ambiguous、safety-bait 语料的 48 条提示) | ~6 分钟 |
| 7 | 扇出:12 条工具提示 × 3 个工作智能体 + 8 次 broken-model 调用 | ~3 分钟 |
| 8 | 在 Foundry 目录注册自定义合规评估器 | ~30 秒 |
| 9 | 批量评估:8 个 agent evaluator 跑在 Application Insights 最近的追踪上 | ~3 分钟 |
| 10 | 红队扫描(2 种攻击策略、3 个安全评估器、临时 prompt 智能体) | ~8 分钟 |
| 11 | 通过 ARM REST 创建 2 个 scheduled-query 告警 | ~10 秒 |
| 12 | 把遥测导出到 artifacts/telemetry.json | ~10 秒 |
| 13 | 冒烟调用 + 验证评估运行完成 | ~2 分钟 |
端到端总时长:大约 35 到 50 分钟。
某个阶段失败时,脚本会停下来并打印日志路径。不需要的阶段可以用 -SkipPhases 9,10 跳过。
参考运行记录:一份来自成功运行、做过脱敏的端到端日志放在 scripts/e2e-run.log。
2.2.1 部署后验证
跑完之后,验证一切正常:
|
|
它检查 8 个类别(一共 26 项检查):基础设施、模型部署、托管智能体、智能体调用、遥测、评估、告警和 RBAC(基于角色的访问控制)。
每项检查会打印 [PASS]、[FAIL] 或 [SKIP],末尾给一个汇总。想跳过智能体调用测试就加 -SkipInvoke。
一次干净的运行会在大约 90 秒里打印 26 项通过 / 0 失败 / 0 跳过。
参考验证记录:一份来自成功运行(26/26 通过)、做过脱敏的验证日志放在 scripts/e2e-validation.log。
2.2.2 一次成功的部署长什么样
跑完之后,Grafana 仪表盘和 Application Insights 面板应该显示:
-
Agent Summary:总操作数(150+)、输入 token(136K+)、输出 token(6.6K+)、平均响应时间(约 7.5 秒)
-
Chat and Tool Summary:LLM 调用(196+)、chat 会话(84+)、工具调用(64+)、平均 chat 延迟(约 5.1 秒)
-
Models 表:gpt-4o-mini、gpt-5-mini、gpt-4.1-mini(各带调用次数和错误率)
-
Gen AI Errors:broken-model 智能体那条 chat nonexistent-model-deployment-xyz 的切片,错误率 100%
-
Tool Calls:6 个工具函数,其中 3 个有非零错误计数(LookupError 和 ValueError)
-
Evaluations:批量运行得到的 8 个 agent evaluator 分数(task_adherence、task_completion、intent_resolution、tool_call_accuracy、tool_selection、tool_input_accuracy、tool_output_utilization、tool_call_success)
2.2.3 拆除
想拆掉一个部署、并把 Azure AI Services 账户名释放出来复用:
|
|
它会删掉资源组,清除 Azure AI Services 的软删除(这样账户名能立刻复用),再验证所有资源都已移除。加 -NoPurge 可以跳过软删除清除,加 -ForceDeleteRg 还会删掉那些通过 ARM REST 在 azd 模板之外创建的告警和 action group。
2.2.4 临时流量与评估刷新
kit 部署好之后,想刷新遥测并不需要重跑完整的 13 阶段流水线。用 scripts/run-adhoc-traffic-and-eval.ps1 就能针对一个已有环境生成一批新追踪、对新追踪跑智能体批量评估、刷新遥测导出。典型用法:截一张新的仪表盘图、模型或提示改动后重新评估一次、或者在某次 Azure 平台更新之后快速确认部署还能用。
|
|
| 参数 | 默认值 | 说明 |
|---|---|---|
| -EnvName | 当前选中的 azd 环境 | 要刷新的 azd 环境。先跑 azd env select <name> 或显式传入。 |
| -MaxPrompts | 10 | 预热+种子阶段的种子提示数。用 0 表示完整的约 48 条语料。 |
| -RunRedTeam | (关闭) | 包含红队扫描(额外约 8 分钟)。默认关闭。 |
| -LogFile | scripts/e2e-adhoc-run.log | 输出同时实时打到控制台并写入该文件。 |
这个包装脚本用 -SkipPhases 1,2,3,4,5,8,11 去调 run-e2e.ps1(不请求红队时再加上 10),所以真正会跑的阶段是:
| 阶段 | 你得到什么 |
|---|---|
| 6 | 预热(3 次 ping)+ 种子 N 条提示 |
| 7 | 扇出:12 条工具提示跨 3 个工作智能体 + 8 次 broken-model 调用 |
| 9 | 对新追踪做全新批量评估(8 个 agent evaluator,Application Insights 2 小时回看) |
| 10 | 全新红队扫描(仅在 -RunRedTeam 时) |
| 12 | 刷新 artifacts/telemetry.json |
| 13 | 冒烟调用 + 验证批量评估产物 |
端到端总时长:默认约 15 分钟(带红队约 25 分钟)。
实时进度会同时流到控制台和日志文件,所以你也可以从另一个终端 tail 它:
|
|
参考运行记录:一份来自成功临时运行、做过脱敏的日志放在 scripts/e2e-adhoc-run.log。
3. 评估:智能体评估器与自定义检查
返回 200 OK 不代表智能体答对了。传统软件的输出是可预测的,AI 智能体不是。同一个提示在不同运行里可能给出不同响应,而且当模型更新、提示演化或工具变化时,质量也会跟着漂。没有评估,你就只能靠用户投诉来发现质量问题——往往是在损失已经造成好几天之后。这一点我印象很深,因为质量退化是那种"悄无声息"的故障。
这一节讲的是这套 kit 怎么给每条响应打分:既用 Microsoft Foundry 内置的智能体评估器,也用一个自定义的代码评估器,两者都作为批处理作业跑在 Application Insights 里存的追踪上。
3.1 两条评估路径
这套 starter kit 包含两种互补的做法,各自解决不同的需求:
| 路径 | 何时运行 | 检查什么 | 最适合 |
|---|---|---|---|
| Agent evaluators | 按需(对追踪的批量运行) | 8 个内置评估器,覆盖系统结果和过程质量 | 衡量端到端智能体质量和工具使用 |
| Custom evaluators | 按需(对追踪的批量运行) | 任意领域特定规则(合规短语、格式检查、策略) | 超出内置评估器的企业需求 |
3.2 智能体评估器
Microsoft Foundry 提供 9 个内置的智能体评估器,分成两类:系统评估器看端到端结果(任务遵循、任务完成、意图识别),过程评估器看工作流里的每一步(工具调用准确性、工具选择、工具输入准确性、工具输出利用、工具调用成功)。第 9 个评估器 Task Navigation Efficiency 需要 ground truth,所以不包含在默认批量运行里。
这套 kit 通过 scripts/20-agent-batch-eval.py,在一次批处理里对智能体存在 Application Insights 里的追踪跑全部 8 个评估器。
一次验证过的运行结果(11 条追踪、8 个评估器打分):
| 评估器 | 得分 | 说明 |
|---|---|---|
| task_adherence | 73% (8/11) | 11 例中 8 例遵循了系统指令 |
| task_completion | 64% (7/11) | 4 个失败里包含故意触发错误的提示 |
| intent_resolution | 73% (8/11) | 正确识别并处理了用户意图 |
| tool_call_accuracy | 80% (8/10) | 用对了工具且参数正确 |
| tool_selection | 73% (8/11) | 没有多余的工具调用 |
| tool_input_accuracy | 82% (9/11) | 参数格式正确且有依据 |
| tool_output_utilization | 55% (6/11) | 最严格的过程评估器:智能体在回答里用了工具结果吗? |
| tool_call_success | 82% (9/11) | 2 个失败是故意触发的错误 |
每个评估器都需要一份 data_mapping,告诉 Foundry 去读哪些追踪字段。系统评估器需要 query + response;过程评估器再加上 tool_definitions 和 tool_calls。所有评估器还都需要 deployment_name 作为初始化参数。少了任何一个,就会得到 MissingRequiredDataMapping 错误(这是 Foundry 在提示你评估契约不完整)。如果你撞上它,检查你的 data_mapping 字典是不是包含了你要跑的评估器需要的每个字段,以及那些字段是不是真的存在于这次运行读取的 App Insights 追踪记录上。
3.3 自定义评估器:合规短语检查
内置评估器覆盖了智能体质量和工具使用,但多数团队还需要领域特定的检查。Microsoft Foundry 支持两种自定义评估器:代码型(一个返回 0.0 到 1.0 浮点数的 Python grade() 函数,确定性强,非常适合合规短语、格式检查、正则匹配这类通过/失败规则)和提示型(一段由 LLM 评判的裁判提示,适合语气、有用性这类模糊标准)。这套 kit 用一个合规免责声明检查器演示了代码型的写法。
工作流有三步:(1)在 evaluators/custom_compliance_phrase.py 里写一个 grade(sample, item) 函数,检查响应是否包含必需的免责声明短语,返回 1.0 或 0.0;(2)通过 scripts/11-custom-evaluator-register.py 把它注册到 Microsoft Foundry,脚本会上传源码、定义指标、设置通过阈值;(3)在任何批量评估的 testing_criteria 里,把它和内置评估器并列放进去。
一次验证过的运行结果(10 条追踪打分):
compliance_check 评估器打了 40%(10 条追踪里 4 条通过)。通过的 4 条来自明确要求带免责声明的提示;失败的 6 条是没带免责声明的正常响应。把里面的逻辑换成你自己的、重新注册,同一套模式就能用在任何策略、格式或监管检查上。
交互式的替代方案:想做现场演示或一步步探索的话,notebooks/ 目录里有评估设置的 Jupyter notebook 版本:01-continuous-eval-setup.ipynb(评估组 + 规则 + 批量运行)和 02-custom-evaluator-register.ipynb(自定义评估器注册)。它们跑的是和脚本一样的 SDK 调用,但可以一格一格执行。想不打开 notebook 就把四个按顺序全跑一遍,用 notebooks/run_notebooks.ps1。
4. 红队测试:自动化安全扫描
质量评估器看的是智能体答得好不好。红队看的是它能不能被骗着答坏——那些主动想挑出有害、跑题或违反策略响应的对抗性用户。能通过质量评估的模型,在输入被精心构造去钻边界时照样可能翻车。这套 kit 用一次 Foundry 托管的扫描把这件事自动化了:生成攻击提示、以多轮对话发过去、再拿每条响应去对安全评估器打分。完整的 SDK 参考见 Run AI red teaming in the cloud。
4.1 扫描是怎么工作的
scripts/12-red-team.py 在一个脚本里搞定一切:脚本创建一个临时 prompt 智能体(redteam-prompt-agent),镜像生产智能体的模型、指令和工具定义,然后建一个带三个安全评估器(禁止行为、任务遵循、敏感数据泄露)的评估组,再加一份把 PROHIBITED_ACTIONS 风险类别映射到目标的分类法。它发起一次攻击运行,在 5 轮对话里自动生成对抗性提示,最后在 finally 块里清掉临时智能体。典型运行时长:4 到 8 分钟。
4.2 结果与解读
这次扫描用三个安全评估器(Prohibited Actions、Task Adherence、Sensitive Data Leakage)和两种攻击策略(Flip 和 Base64)。
想加更多策略——IndirectJailbreak、Tense、Morse、Crescendo 之类——往脚本的 attack_strategies 列表里塞就行。
一次验证过的运行结果(total=204,passed=139,failed=65,errored=0):
攻击成功率(ASR)31.9%(204 条里 65 条失败)意味着攻击者在大约三分之一的尝试里诱出了不良响应。按评估器拆开看:Prohibited Actions 的 ASR 最高,38%;Sensitive Data Leakage 29%;Task Adherence 最低,21%。三种攻击策略(Base64、Baseline、Flip)表现相近,都在 31–34%,说明不管用哪种编码技巧,模型的安全姿态都差不多,也说明想实质性压低整体比率,得上自定义的安全系统提示。
每条提示的判定结果保存在 artifacts/redteam_eval_output_items_redteam-prompt-agent.json。
交互式的替代方案:notebooks/ 目录把红队工作流拆成两个 notebook:03-red-team-taxonomy.ipynb(预置分类法)和 04-red-team-run.ipynb(发起攻击运行并收集结果)。
5. 可观测性
智能体部署好、流量流起来之后,你得能看到到底发生了什么。这一节讲这套 kit 露出遥测的两种方式:给临时排查用的原始 KQL 查询,以及给日常监控用的三个仪表盘视图。
5.1 用 KQL 查遥测
scripts/13-telemetry-kql.py 对 Log Analytics 工作区跑四条查询,每条回答一个不同的运营问题。所有查询都过滤 requests 表里的 invoke_agent span。
| KQL 查询 | 回答什么 | 关键字段 |
|---|---|---|
| 调用量 + 成功率 | 每个智能体多少次调用,多少失败? | count()、countif(success)、dcount(operation_Id) by name |
| 延迟百分位 | p50/p90/p95/p99 响应时间是多少? | percentile(duration, N)、avg(duration)、max(duration) |
| 会话活动 | 流量在时间和会话间如何分布? | customDimensions 里的 session_id、bin(timestamp, 5m) |
| Token 使用 | 消耗了多少输入/输出 token? | customDimensions 里的 gen_ai.usage.input_tokens、gen_ai.usage.output_tokens |
这些正是驱动 Grafana 仪表盘面板的同一批信号。每条查询的完整 KQL 都在 scripts/13-telemetry-kql.py 里。
5.2 可视化遥测:三个查看界面
上面的 KQL 查询适合临时排查,但日常监控你会想要仪表盘。这套 starter kit 填充了三个互补的视图,各服务不同的受众。
5.3 App Insights Agents 面板
Azure Application Insights 里的 Agents(预览)面板是看智能体健康状况最快的方式。它从这套 kit 发出的 OpenTelemetry span 里自动填充,不需要导入仪表盘或做任何配置。
一次成功运行之后,这个面板会显示:
| 面板 | 展示什么 | 为什么重要 |
|---|---|---|
| Agent Runs | 每个智能体随时间的调用次数 | basic-responses 处理了 26 次,broken 智能体 9 次:一眼看出流量不均衡 |
| Gen AI Errors | 按操作类型(invoke_agent、chat、execute_tool)的错误 | 11 个 invoke 错误、2 个工具错误、1 个 chat 错误:定位哪一层在失败 |
| Tool Calls | 每个工具的调用次数、错误次数、平均耗时 | get_orders 显示 4 个错误、平均 18.06 秒:在用户报告前发现坏的或慢的工具 |
| Models | 每个模型的调用次数、错误率、平均耗时 | nonexistent-model-deployment-xyz 显示 775.33 毫秒、3 次调用全错:抓出配置错误的部署 |
| Token Consumption | 按模型堆叠的 token 使用 | gpt-4o-mini 69.9K,gpt-5-mini 36.8K,gpt-4.1-mini 34.1K:看清哪个模型驱动成本 |
| Evaluations | 每个评估器的得分磁贴 | intent_resolution 3.96、tool_call_accuracy 4.13、coherence 3.95:确认分数守在阈值之上 |
从 Application Insights > 左侧菜单 > Agents(预览)进入。把时间范围设成"Last 48 hours",避开 15 到 30 分钟的汇总延迟。
5.4 预置的 Grafana 仪表盘
三个 Azure 托管的仪表盘开箱即用,从同一批遥测里填充:
| 面板 | 展示什么 | 为什么重要 |
|---|---|---|
| Agent Framework | 每个智能体的 KPI:运行次数、延迟、token 花费、工具使用 | 所有智能体操作的单页概览 |
| Agent Framework workflow | 多步工作流和编排模式 | 追踪多智能体或多步流水线 |
| Foundry | 托管智能体细节:项目、部署、版本、身份 | 确认哪个智能体版本在线且健康 |
三个里 Agent Framework 仪表盘最全,在一个视图里覆盖操作、token、工具和性能:
| 面板 | 展示什么 | 为什么重要 |
|---|---|---|
| Summary Statistics | 68 个操作、65K 输入 token、4.68K 输出 token、9.97 秒平均响应 | 一眼看健康和成本 |
| Token Consumption Over Time | 输入/输出 token 趋势 + 每个智能体的分解 | gpt-4o-mini 32.6K、gpt-4.1-mini 17.5K、gpt-5-mini 17.5K:发现成本变化 |
| Daily Cost Estimation | 估算的每日成本(本次运行 $0.0256) | 不离开仪表盘就能做预算跟踪 |
| Tool Usage Leaderboard | 每个工具的调用次数、成功率、平均/p95 延迟 | get_orders 成功率 77.8%,roll_dice 100%:找出不可靠的工具 |
| Chat p95 Latency by Model | 每个模型的 p95 chat 延迟 | 并排比较模型响应速度 |
| Agent Response Time Trends | 延迟随时间变化,带 min/mean 区间 | 检测与部署相关的延迟退化 |
| Success Rate | 总体成功百分比(本次 98.5%) | 给 on-call 分诊的单一红绿信号 |
| Agent Performance Summary | 每个智能体的操作数、平均耗时、成功率 | broken-model 88.9% 成功:确认故意报错的智能体 |
| Agent Utilization Heatmap | 按智能体和时间桶的活动强度 | 可视化流量模式和空闲时段 |
5.5 自定义仪表盘
这套 kit 在 artifacts/grafana/ 里附了两份可导入的仪表盘 JSON。主仪表盘(agent-observability-dashboard.json)提供一个完整的运营概览:
| 面板 | 展示什么 | 为什么重要 |
|---|---|---|
| Agent Summary Statistics | 68 个操作、60.6K 输入 token、4.25K 输出 token、9.97 秒平均响应 | 单行确认总体健康和成本 |
| Chat and Tool Summary | 115 次 LLM 调用、34 个 chat 会话、63 次工具调用、5.13 秒平均 chat 延迟 | 理解每个请求的构成 |
| Operations Over Time | 随时间的调用计数(chat、execute_tool、invoke_agent) | 发现流量尖峰或安静时段 |
| Token Consumption by Model | gpt-4o-mini 主导约 35K,gpt-5-mini 和 gpt-4.1-mini 其次 | 识别哪个模型驱动成本 |
| Model Usage Distribution | gpt-4o-mini 50%,gpt-5-mini 25%,gpt-4.1-mini 24%,broken-model 1% | 验证跨部署的负载分布 |
| Response Duration by Model | gpt-4o-mini 平均约 6 秒/p90 7 秒,gpt-5-mini 约 6 秒,broken-model 接近 0 | 抓每个模型的延迟退化 |
| Chat Latency by Model | 每个模型的 p50 和 p90 chat 级延迟 | gpt-5-mini p90 最高:钻取模型级性能 |
配套仪表盘(agent-observability-custom-dashboard.json)加了五个更聚焦的面板做深入排查(每工具 p95 延迟、错误率、会话计数)。
导入方式:Application Insights > Dashboards with Grafana > New > Import > 上传 JSON。两个都用了模板化变量,所以同一份 JSON 能跨环境用。完整走查见 docs/GRAFANA_GUIDE.md。
6. 仓库结构
先看个概览:
| 目录 | 里面有什么 |
|---|---|
| agent/ | azd 项目根:4 个托管智能体、Bicep 基础设施(Foundry 账户、ACR、Application Insights、Log Analytics) |
| scripts/ | run-e2e.ps1 编排器、validate-deployment.ps1、teardown.ps1、run-adhoc-traffic-and-eval.ps1,以及 13 个带编号的 Python/PowerShell 助手脚本 |
| evaluators/ | 自定义代码评估器(grade(sample, item) -> float)+ YAML 元数据 |
| prompts/ | 三个语料:clean、ambiguous、safety-bait |
| artifacts/ | 所有运行输出(评估结果、遥测、仪表盘)。grafana/ 存放可导入的仪表盘 JSON |
| notebooks/ | 用于现场演示的评估和红队流程的 Jupyter 版本 |
| docs/ | QuickStart、手动深入指南、Grafana 指南 |
/
agent/ # azd project root
azure.yaml # service definitions for 4 hosted agents
src/
agent-framework-agent-basic-responses/
agent.yaml # primary agent (gpt-4o-mini)
main.py # @tool functions + Agent() constructor
requirements.txt # agent-framework + foundry-hosting deps
Dockerfile # container build
agent-framework-agent-gpt5-mini/
agent.yaml # sister agent (gpt-5-mini)
main.py # same code, different model
agent-framework-agent-gpt41-mini/
agent.yaml # sister agent (gpt-4.1-mini)
agent-framework-agent-broken-model/
agent.yaml # deliberately broken (populates error charts)
infra/ # Bicep (Foundry account, ACR, Application Insights, Log Analytics)
scripts/
run-e2e.ps1 # single command: provision to smoke test (13 phases)
validate-deployment.ps1 # post-deploy validation (8 categories)
teardown.ps1 # single command: destroy everything + purge
run-adhoc-traffic-and-eval.ps1 # ad-hoc traffic + eval refresh (skips infra/deploys)
03-grant-foundry-user.ps1 # grants Foundry User role to project MI
04-warmup.ps1 # 3 fast pings to defeat scale-to-zero
05-seed-traffic.ps1 # 48 prompts from clean, ambiguous, safety-bait corpora
06b-alerts-rest.py # 2 scheduled-query alerts via ARM REST
10-continuous-eval.py # evaluation rule (3 agent evaluators)
11-custom-evaluator-register.py # code-based compliance evaluator (grade -> float)
12-red-team.py # adversarial red-team scan (temporary prompt agent)
13-telemetry-kql.py # KQL export (volume, latency, tokens)
14-verify-continuous-eval.py # verify eval runs completed
15-list-eval-rules.py # debug: dump eval rule definitions + runs
16-list-rules.py # debug: list all evaluation rules (GA API)
17-list-connections.py # debug: list project connections
18-trigger-eval-runs.py # debug: store-based eval trigger workaround
20-agent-batch-eval.py # batch eval: 8 agent evaluators over Application Insights traces
evaluators/
custom_compliance_phrase.py # grade(sample, item) -> float (0.0 or 1.0)
custom_compliance_phrase.yaml # evaluator metadata for Foundry catalog registration
prompts/
clean.txt # normal traffic prompts
ambiguous.txt # edge-case prompts
safety-bait.txt # 5 adversarial prompts for safety testing
artifacts/ # all run outputs (eval results, telemetry, dashboards)
sample-app-request.json # reference: OTel GenAI span shape
sample-chat-dependency.json # reference: LLM chat dependency span shape
grafana/
agent-observability-dashboard.json # full operational dashboard (7 panels)
agent-observability-custom-dashboard.json # companion dashboard (5 panels)
DASHBOARD_IMPORT_GUIDE.md # import walkthrough
DASHBOARD_SUMMARY.md # panel descriptions
notebooks/ # interactive Jupyter versions for live demos
run_notebooks.ps1 # runs all 4 notebooks in sequence via nbconvert
01-continuous-eval-setup.ipynb # eval group + rule + batch run over traces
02-custom-evaluator-register.ipynb # custom evaluator registration
03-red-team-taxonomy.ipynb # taxonomy creation (pre-stage)
04-red-team-run.ipynb # red team attack run
docs/
QUICKSTART.md # 6-command walkthrough
MANUAL_GUIDE.md # step-by-step deep dive
GRAFANA_GUIDE.md # Grafana dashboard setup + custom KQL panels
7. 小结与下一步
AI 可观测性不是可选的附加项,而是你有底气运营智能体系统的前提。跑过一遍我更确信这一点。这套 starter kit 把它落到了实处:一个能用的 Foundry 托管智能体、已插桩的遥测、仪表盘、批量评估、对抗性红队测试、合规检查、告警——全都一条命令预配、另一条命令拆掉。
现在就试
Fork 仓库,在你自己的订阅上端到端跑一遍:
|
|
仓库地址:github.com/jvargh/ai-observability-starter-kit
- 本文作者:BeanHsiang
- 本文链接:https://beanhsiang.github.io/post/2026-05-30-ai-observability-starter-kit-for-microsoft-foundry-agents/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. 进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。