用 Agno ReliabilityEval 验证 Team 级工具调用与委托可靠性:以 AI 新闻搜索团队为例
2026/9/11 2:42:03 网站建设 项目流程

用 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的完整流程可拆解为四个阶段:

  1. 创建一个带WebSearchTools(enable_news=True)的成员 Agent;
  2. 将该成员放入Team,让主控模型负责调度;
  3. 声明期望的工具调用列表expected_tool_calls
  4. 运行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.pytools.append(self.search_news)分支)。构造时还支持以下常用参数,可在实际项目中按需配置:

参数默认值说明
enable_searchTrue是否启用web_search
enable_newsTrue是否启用search_news
backend"auto"搜索后端,如"duckduckgo""google""bing""brave"
fixed_max_resultsNone固定返回结果数,覆盖每次调用传入的max_results
timelimitNone时间过滤,合法值为"d"/"w"/"m"/"y"(日/周/月/年),非法值会在构造时抛ValueError
regionNone搜索结果地域,如"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——一个同时携带toolsmessagesmember_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,把每一层(成员可以是嵌套团队)的toolsmessages全部合并。源码注释明确指出:委托产生的工具调用挂在成员响应上,若只做扁平读取,会把孙级成员的干净执行误判为缺失——这正是团队可靠性评估与单 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_callsallow_additional_tool_calls=True时的额外调用
failed_argument_checks/passed_argument_checks参数校验结果

调用print_eval()会以 rich 表格打印Reliability Summaryassert_passed()eval_status != "PASSED"时抛出AssertionError,并把完整结果拼进断言消息——CI 变红时能一眼看出是评估定义错了还是 Agent 行为错了。

七、评估结果的文件保存与数据库落盘

ReliabilityEval还支持两个实用的输出通道:

  • 保存到文件:设置file_path_to_save_results(支持{name}{run_id}占位符),结果会以 JSON 落盘;
  • 写入数据库:传入dbBaseDbAsyncBaseDb,如 06_storage 中的 PostgreSQL、SQLite 等),run()会把结果、eval_type=RELIABILITY、模型信息与eval_input一并写入评估表;目录下的 db_logging.py 就是"可靠性评估 + PostgreSQL 日志"的完整示例。

ReliabilityEval同时校验:必须且只能传入agent_responseteam_response之一;若db是异步实现,需改用arun()(异步版本见 reliability_async.py 的流程)。

八、运行方式与前置条件

python cookbook/09_evals/reliability/team/ai_news.py

运行前需满足:

  • 已安装agno及其依赖,并安装ddgspip 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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询