用 Agno ReliabilityEval 验证 Team 级工具调用与委托可靠性:以 AI 新闻搜索团队为例
【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno
本篇技术指南基于仓库 cookbook/09_evals/reliability/team/README.md 与配套示例 cookbook/09_evals/reliability/team/ai_news.py 展开,介绍如何在 Agno 中对团队(Team)级工具调用与成员委托做可靠性评估。你将掌握:如何搭建一个带 Web 搜索能力的多 Agent 团队、如何声明"期望的工具调用序列"、如何用ReliabilityEval校验委托与新闻搜索调用是否真实发生并干净执行,以及如何将评估结果接入断言、日志与异步流程,形成可回归的可靠性门槛。
一、为什么需要团队级可靠性评估
在单 Agent 场景下,可靠性评估只需要检查该 Agent 是否正确调用了工具。但一旦升级为Team,情况就复杂了:团队中的主控模型需要通过delegate_task_to_member这类内置工具把任务委托给成员 Agent,而真正的业务工具(如新闻搜索search_news)是在**成员响应(member response)**里执行的。如果评估逻辑只盯着主控这一层的响应,就会漏掉成员内部发生的工具调用,得出"工具未调用"的错误结论。
仓库中 reliability 目录下的其他示例(single_tool_calls、multiple_tool_calls)都是单 Agent 场景,而 team/ai_news.py 专门演示了跨层(主控 + 成员)的工具调用证据收集,这正是本指南的核心。
二、示例总览:构建一个 AI 新闻搜索团队
ai_news.py的完整流程可拆解为四个阶段:
- 创建一个带
WebSearchTools(enable_news=True)的成员 Agent; - 将该成员放入
Team,让主控模型负责调度; - 声明期望的工具调用列表
expected_tool_calls; - 运行
ReliabilityEval并对结果执行断言。
from typing import Optional from agno.agent import Agent from agno.eval.reliability import ReliabilityEval, ReliabilityResult from agno.models.openai import OpenAIChat from agno.run.team import TeamRunOutput from agno.team.team import Team from agno.tools.websearch import WebSearchTools其中ReliabilityEval/ReliabilityResult来自 libs/agno/agno/eval/reliability.py,TeamRunOutput是团队运行返回的结果类型,定义于 libs/agno/agno/run/team.py。
三、搭建团队:成员 Agent 与 Team 主控
team_member = Agent( name="News Searcher", model=OpenAIChat("gpt-5.6-luna"), role="Searches the web for the latest news.", tools=[WebSearchTools(enable_news=True)], ) team = Team( name="News Research Team", model=OpenAIChat("gpt-5.6-luna"), members=[team_member], markdown=True, show_members_responses=True, )3.1 成员 Agent:挂载新闻搜索工具
WebSearchTools是 Agno 提供的 Web 搜索工具集,位于 libs/agno/agno/tools/websearch.py,底层使用ddgs(DuckDuckGo Search 的元搜索库)。它默认同时注册两个函数:
web_search(query, max_results=5):普通网页搜索;search_news(query, max_results=5):新闻搜索。
enable_news=True确保search_news被注册进工具列表(源码见websearch.py中tools.append(self.search_news)分支)。构造时还支持以下常用参数,可在实际项目中按需配置:
| 参数 | 默认值 | 说明 |
|---|---|---|
enable_search | True | 是否启用web_search |
enable_news | True | 是否启用search_news |
backend | "auto" | 搜索后端,如"duckduckgo"、"google"、"bing"、"brave"等 |
fixed_max_results | None | 固定返回结果数,覆盖每次调用传入的max_results |
timelimit | None | 时间过滤,合法值为"d"/"w"/"m"/"y"(日/周/月/年),非法值会在构造时抛ValueError |
region | None | 搜索结果地域,如"us-en"、"uk-en" |
proxy/timeout/verify_ssl | — | 代理、超时与 SSL 校验 |
依赖方面,WebSearchTools要求安装ddgs(未安装时导入会抛出ImportError提示pip install ddgs)。
3.2 Team:主控调度委托
Team负责编排成员。示例开启了markdown=True(输出渲染为 Markdown)与show_members_responses=True(回显成员响应)。运行后team.run("What is the latest news on AI?")返回的是TeamRunOutput——一个同时携带tools、messages与member_responses的数据结构(见 libs/agno/agno/run/team.py):
- 主控层执行
delegate_task_to_member委托成员; - 成员层执行
search_news完成真实搜索; - 成员产生的工具证据会嵌套在
member_responses中。
四、声明期望的工具调用序列
expected_tool_calls = [ "delegate_task_to_member", "search_news", ]这份清单是评估的"金标准":
delegate_task_to_member是团队主控模型的内置委托工具,用于把子任务派发给合适的成员;search_news是成员通过WebSearchTools(enable_news=True)暴露的新闻搜索函数。
ReliabilityEval会对expected_tool_calls做无序的按名集合匹配:只要每个期望名称都存在一次"干净执行"(clean execution),顺序并不重要。
五、运行评估:ReliabilityEval 的判定机制
def evaluate_team_reliability(): response: TeamRunOutput = team.run("What is the latest news on AI?") evaluation = ReliabilityEval( name="Team Reliability Evaluation", team_response=response, expected_tool_calls=expected_tool_calls, ) result: Optional[ReliabilityResult] = evaluation.run(print_results=True) if result: result.assert_passed()5.1 成员证据的跨层收集
对于团队评估,ReliabilityEval._evaluate会调用_collect_member_evidence(reliability.py),递归遍历TeamRunOutput.member_responses,把每一层(成员可以是嵌套团队)的tools与messages全部合并。源码注释明确指出:委托产生的工具调用挂在成员响应上,若只做扁平读取,会把孙级成员的干净执行误判为缺失——这正是团队可靠性评估与单 Agent 评估的关键差异。
5.2 以"执行"为准的严格匹配(2.8.0 起的语义)
从 2.8.0 起,ReliabilityEval的判定依据从"消息侧请求"切换为"执行侧证据"(ToolExecution),核心规则如下:
- 干净执行才算通过:期望工具只有在
tools中存在一条tool_call_error不为真(None视为干净,兼容从存储还原的响应)且未处于暂停(is_paused)状态的执行时才计入passed_tool_calls; - 被拒绝/报错的调用不再通过:例如因
tool_call_limit被拒绝的调用只会出现在消息侧,不会产生执行记录,此类调用会在missing_tool_calls中以"search (requested but refused/errored — execution matching, new in 2.8.0)"的形式标注; - 重试语义:期望工具先报错后重试成功,最终仍判定通过,失败执行不会"毒化"评估;
- 严格模式:
allow_additional_tool_calls=False(默认)时,任何未声明的工具调用都会导致失败;设为True则放宽为子集匹配,多余调用记入additional_tool_calls; - 历史消息隔离:由
add_history_to_context注入的上轮消息带from_history标记,会被排除,避免"昨天的工具调用导致今天的评估失败"。
这些语义均有对应的单元测试覆盖,见 libs/agno/tests/unit/eval/test_reliability_eval.py,例如test_team_member_executions_matched验证了委托调用与成员执行都能被匹配。
5.3 参数校验:expected_tool_call_arguments
除工具名称外,ReliabilityEval还支持校验工具参数。单次校验写法为{"multiply": {"a": 10, "b": 5}},多次校验写法为{"add": [{"a": 2, "b": 2}, {"a": 3, "b": 3}]}(列表内每个 spec 只需被至少一次调用匹配)。参数读取自ToolExecution.tool_args(已解析,None视为空字典),同样只以干净执行为准。
六、理解 ReliabilityResult 与断言
run()返回的ReliabilityResult(reliability.py)包含以下字段:
| 字段 | 含义 |
|---|---|
eval_status | "PASSED"或"FAILED" |
passed_tool_calls | 干净执行的期望工具 |
failed_tool_calls | 未声明且未放行的工具调用 |
missing_tool_calls | 期望但未出现干净执行的工具(含"已请求但被拒/报错"注解) |
additional_tool_calls | allow_additional_tool_calls=True时的额外调用 |
failed_argument_checks/passed_argument_checks | 参数校验结果 |
调用print_eval()会以 rich 表格打印Reliability Summary。assert_passed()在eval_status != "PASSED"时抛出AssertionError,并把完整结果拼进断言消息——CI 变红时能一眼看出是评估定义错了还是 Agent 行为错了。
七、评估结果的文件保存与数据库落盘
ReliabilityEval还支持两个实用的输出通道:
- 保存到文件:设置
file_path_to_save_results(支持{name}与{run_id}占位符),结果会以 JSON 落盘; - 写入数据库:传入
db(BaseDb或AsyncBaseDb,如 06_storage 中的 PostgreSQL、SQLite 等),run()会把结果、eval_type=RELIABILITY、模型信息与eval_input一并写入评估表;目录下的 db_logging.py 就是"可靠性评估 + PostgreSQL 日志"的完整示例。
ReliabilityEval同时校验:必须且只能传入agent_response或team_response之一;若db是异步实现,需改用arun()(异步版本见 reliability_async.py 的流程)。
八、运行方式与前置条件
python cookbook/09_evals/reliability/team/ai_news.py运行前需满足:
- 已安装
agno及其依赖,并安装ddgs(pip install ddgs); - 配置可用的
OpenAIChat凭据(如OPENAI_API_KEY),示例中的模型标识请以当前可用模型为准并按需替换; - 网络可访问搜索后端。
仓库中的 TEST_LOG.md 为待填写的测试记录模板,可参照 09_evals 目录下其他TEST_LOG.md的格式登记运行状态。
九、扩展:从"名称匹配"到"参数匹配"的实战建议
若你的团队业务工具依赖特定参数(例如新闻搜索必须携带关键词AI),可在expected_tool_call_arguments中追加校验:
evaluation = ReliabilityEval( name="Team Reliability Evaluation", team_response=response, expected_tool_calls=expected_tool_calls, expected_tool_call_arguments={ "search_news": {"query": "AI"} }, )这样评估就从"工具是否被调用"升级为"工具是否以正确的参数被调用",结合执行侧匹配与团队跨层证据收集,可以为多 Agent 编排提供一层贴近生产行为的可靠性回归保障。
【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考