Microsoft Agent Framework 如何用 Foundry Evals 评估 Agent 行为与工具调用?
【免费下载链接】agent-frameworkA framework for building, orchestrating and deploying AI agents and multi-agent workflows with support for Python and .NET.项目地址: https://gitcode.com/GitHub_Trending/age/agent-framework
如果你已经用 Microsoft Agent Framework 的 Python 包写好了带工具的 Agent,想检查它是否按预期执行任务、选对了工具并正确调用参数,仓库中的 Foundry Evals 集成示例提供了一条可直接跑通的路径:把 Agent 的响应(或让它跑一批测试问题)提交给 Microsoft Foundry 的内置评估器,然后在本地拿到通过/失败统计,或打开 Foundry Portal 查看报告。以下内容基于 Foundry Evals 示例 README 和两个示例脚本整理,适用环境是仓库python/工作区加一个已部署模型的 Microsoft Foundry 项目。
准备条件
示例脚本在 文件头注释 中明确列出两项前置条件:
- 一个 Microsoft Foundry 项目,且项目中已部署模型;
- 在示例目录的
.env文件中设置FOUNDRY_PROJECT_ENDPOINT和FOUNDRY_MODEL。
具体做法:在python/samples/05-end-to-end/evaluation/foundry_evals/目录下,按同目录的 .env.example 创建.env文件。两个必填项的含义:
FOUNDRY_PROJECT_ENDPOINT:你的 Foundry 项目端点,脚本中通过os.environ["FOUNDRY_PROJECT_ENDPOINT"]读取,缺失会直接报错;FOUNDRY_MODEL:模型部署名,通过os.environ.get("FOUNDRY_MODEL", "gpt-4o")读取,缺失时回退为gpt-4o,所以如果你的模型部署名不是gpt-4o必须显式填写。
.env.example中的FOUNDRY_AGENT_NAME、FOUNDRY_AGENT_VERSION、FOUNDRY_RUBRIC_NAME、FOUNDRY_RUBRIC_VERSION只被evaluate_with_rubric_sample.py使用,本文主路径不需要配置。
示例脚本使用AzureCliCredential()认证,即依赖本地 Azure CLI 的登录凭据。依赖安装方面,仓库使用 uv 管理 Python 工作区,安装 uv 的步骤见 python/DEV_SETUP.md;示例命令统一用uv run执行,无需手动创建虚拟环境。
主路径:用 evaluate_agent_sample.py 评估行为与工具调用
evaluate_agent_sample.py 是 README 指定的开发内环(inner loop)示例。它构建了一个名为travel-assistant的Agent,绑定两个本地工具:get_weather(返回固定天气数据)和get_flight_price(返回固定票价),然后用FoundryEvals(client=chat_client)创建评估器,依次演示三种模式。
在python/目录下执行:
uv run samples/05-end-to-end/evaluation/foundry_evals/evaluate_agent_sample.py脚本依次运行三个部分:
- Pattern 1:评估已有响应—
evaluate_agent(agent=..., responses=response, queries=[query], ...)。先await agent.run(query)拿一次真实响应,再把agent=、responses=和queries=一起传入。注释里说明了参数用途:传agent=是为了让框架提取工具定义,传queries=提供评估条目上下文。此处显式指定evaluators=[FoundryEvals.RELEVANCE, FoundryEvals.TOOL_CALL_ACCURACY]。 - Pattern 2:批量跑测试问题— 只传
queries=[...]列表,evaluate_agent()内部会对每个 query 调用agent.run()再评估。传evaluators=evals(默认构造的FoundryEvals)时走智能默认:默认运行relevance、coherence、task_adherence,并且当条目包含工具定义时自动追加tool_call_accuracy。 - Pattern 3:Similarity 对比参考答案— 额外传
expected_output=[...](与queries一一对应的标准答案),评估器用FoundryEvals.SIMILARITY把 Agent 实际输出与参考答案对比。
脚本在 Pattern 2 中还演示了conversation_split=ConversationSplit.FULL:它覆盖各评估器的默认切分策略,让整个对话轨迹(而不仅是最后一轮)相对最初的 query 参与评估。
只评估工具调用:evaluate_tool_calls_sample.py
如果你只关心"Agent 是否选对了工具、调用参数对不对",用 evaluate_tool_calls_sample.py。它的区别在于不经过evaluate_agent(),而是自己构造EvalItem:
response = await agent.run(q) item = EvalItem( conversation=[Message("user", [q]), *response.messages], tools=[get_weather, get_flight_price], ) evals = FoundryEvals( client=chat_client, evaluators=[FoundryEvals.RELEVANCE, FoundryEvals.TOOL_CALL_ACCURACY], ) results = await evals.evaluate(items, eval_name="Tool Call Accuracy Eval")conversation是"用户消息 + Agent 响应中的全部消息",tools传入工具定义——工具评估器依赖工具 schema 才能判断调用是否准确。执行命令:
uv run samples/05-end-to-end/evaluation/foundry_evals/evaluate_tool_calls_sample.py如何选择评估器
README 列出了 Foundry 内置评估器的四类分组,可作为选型参考:
| 类别 | 评估器 |
|---|---|
| Agent 行为 | intent_resolution,task_adherence,task_completion,task_navigation_efficiency |
| 工具使用 | tool_call_accuracy,tool_selection,tool_input_accuracy,tool_output_utilization,tool_call_success |
| 质量 | coherence,fluency,relevance,groundedness,response_completeness,similarity |
| 安全 | violence,sexual,self_harm,hate_unfairness |
代码中通过FoundryEvals类常量(如FoundryEvals.RELEVANCE、FoundryEvals.TOOL_CALL_ACCURACY)或短名字符串传入。不指定时,默认组合是relevance+coherence+task_adherence,有工具定义时自动加上tool_call_accuracy。
如何判断结果
两个示例对结果的输出方式一致,围绕EvalResults对象打印四个字段:
print(f"Status: {r.status}") print(f"Results: {r.passed}/{r.total} passed") print(f"Portal: {r.report_url}")r.status:评估运行的状态;r.passed/r.total:通过数与总数,可配合r.all_passed/r.failed做本地判定;r.report_url:Foundry Portal 报告链接,用于在 Portal 中查看仪表板。
示例中r.all_passed为真时打印[PASS] All passed,否则打印[FAIL] {r.failed} failed——这就是本地判断是否通过的直接依据。evaluate_agent()返回的results是列表(每个评估器一份结果),FoundryEvals.evaluate()返回单个EvalResults。
架构细节(为什么能直接传EvalItem、核心与 Foundry 包各负责什么)可以在 python/packages/foundry/README.md 的 Evaluations 一节和 ADR-0023 中对照阅读。
限制与注意事项
- 工具评估器需要工具定义:ADR-0023 的 Known Limitations 明确,工具类评估器依赖 tool definition schema。因此用
evaluate_agent(responses=...)评估已有响应时,要同时提供queries=并传入带工具定义的agent=,工具评估器才有判断依据。 - 内置评估器依赖 Foundry 端点:
builtin.*评估器是 Foundry 能力,FoundryChatClient必须指向 Foundry 项目端点,任意指向其他端点的 OpenAI 客户端无法运行它们。 - 评估默认只看最后一轮:不指定
conversation_split时,评估器默认按"最后一个用户消息"切分,只看最后一轮输入输出;多轮轨迹评估需显式传ConversationSplit.FULL或ConversationSplit.PER_TURN。 - 同一目录还有 evaluate_traces_sample.py(评估历史 Responses/OTel 轨迹,无需改动 Agent 代码)和 evaluate_with_rubric_sample.py(使用在 Foundry Portal 中创建的自定义 rubric 评估器),分别对应"评估过去的运行"和"按自定义评分标准打分"两个独立目标,本文不展开。
【免费下载链接】agent-frameworkA framework for building, orchestrating and deploying AI agents and multi-agent workflows with support for Python and .NET.项目地址: https://gitcode.com/GitHub_Trending/age/agent-framework
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考