发布时间:2026/8/30 15:25:00
【Agent】6. 使用代理作为工具的多代理报告生成系统 在本案例中我们将探索如何创建一个多代理系统该系统使用顶级代理来协调一组作为工具的代理。具体来说我们将创建一个能够研究、撰写和审查关于给定主题报告的系统。1. 案例目标本案例的主要目标是演示如何使用LlamaIndex构建一个多代理系统其中子代理作为工具被顶级代理调用。具体来说我们将创建三个具有不同专业能力的子代理研究代理、写作代理和审查代理将这些子代理封装为工具使它们可以被顶级代理调用创建一个顶级协调代理负责协调子代理的执行顺序和交互实现状态共享使代理能够访问和修改共享数据展示如何通过流式输出监控多代理系统的执行过程2. 技术栈与核心依赖LlamaIndex- 用于构建多代理系统和工作流OpenAI API- 提供语言模型Tavily API- 提供网络搜索功能FunctionAgent- 用于构建可执行工具调用的代理Context- 用于在代理之间共享状态核心依赖包%pip install llama-index %pip install tavily-python3. 环境配置首先需要设置OpenAI API密钥from llama_index.llms.openai import OpenAI sub_agent_llm OpenAI(modelgpt-4.1-mini, api_keysk-...) orchestrator_llm OpenAI(modelo3-mini, api_keysk-...)4. 案例实现4.1 系统设计我们的系统将包含三个子代理ResearchAgent- 用于在网络上搜索给定主题的信息WriteAgent- 使用ResearchAgent找到的信息撰写报告ReviewAgent- 审查报告并提供反馈然后我们将使用一个顶级代理来协调其他代理撰写我们的报告。4.2 工具定义定义一个网络搜索工具from tavily import AsyncTavilyClient async def search_web(query: str) - str: Useful for using the web to answer questions. client AsyncTavilyClient(api_keytvly-...) return str(await client.search(query))4.3 子代理定义使用定义好的工具创建三个子代理from llama_index.core.agent.workflow import FunctionAgent, ReActAgent research_agent FunctionAgent( system_prompt( You are the ResearchAgent that can search the web for information on a given topic and record notes on the topic. You should output notes on the topic in a structured format. ), llmsub_agent_llm, tools[search_web], ) write_agent FunctionAgent( system_prompt( You are the WriteAgent that can write a report on a given topic. Your report should be in a markdown format. The content should be grounded in the research notes. Return your markdown report surrounded by ... tags. ), llmsub_agent_llm, tools[], ) review_agent FunctionAgent( system_prompt( You are the ReviewAgent that can review the write report and provide feedback. Your review should either approve the current report or request changes to be implemented. ), llmsub_agent_llm, tools[], )4.4 将子代理转换为工具将子代理封装为工具使它们可以被顶级代理调用import re from llama_index.core.workflow import Context async def call_research_agent(ctx: Context, prompt: str) - str: Useful for recording research notes based on a specific prompt. result await research_agent.run( user_msgfWrite some notes about the following: {prompt} ) async with ctx.store.edit_state() as ctx_state: ctx_state[state][research_notes].append(str(result)) return str(result) async def call_write_agent(ctx: Context) - str: Useful for writing a report based on the research notes or revising the report based on feedback. async with ctx.store.edit_state() as ctx_state: notes ctx_state[state].get(research_notes, None) if not notes: return No research notes to write from. user_msg fWrite a markdown report from the following notes. Be sure to output the report in the following format: ...:\n\n # Add the feedback to the user message if it exists feedback ctx_state[state].get(review, None) if feedback: user_msg f{feedback}\n\n # Add the research notes to the user message notes \n\n.join(notes) user_msg f{notes}\n\n # Run the write agent result await write_agent.run(user_msguser_msg) report re.search( r(.*), str(result), re.DOTALL ).group(1) ctx_state[state][report_content] str(report) return str(report) async def call_review_agent(ctx: Context) - str: Useful for reviewing the report and providing feedback. async with ctx.store.edit_state() as ctx_state: report ctx_state[state].get(report_content, None) if not report: return No report content to review. result await review_agent.run( user_msgfReview the following report: {report} ) ctx_state[state][review] result return result4.5 创建顶级协调代理使用封装好的工具创建顶级协调代理orchestrator FunctionAgent( system_prompt( You are an expert in the field of report writing. You are given a user request and a list of tools that can help with the request. You are to orchestrate the tools to research, write, and review a report on the given topic. Once the review is positive, you should notify the user that the report is ready to be accessed. ), llmorchestrator_llm, tools[ call_research_agent, call_write_agent, call_review_agent, ], initial_state{ research_notes: [], report_content: None, review: None, }, )4.6 运行代理运行代理并流式输出事件以便了解内部发生的情况from llama_index.core.agent.workflow import ( AgentInput, AgentOutput, ToolCall, ToolCallResult, AgentStream, ) from llama_index.core.workflow import Context # Create a context for the orchestrator to hold history/state ctx Context(orchestrator) async def run_orchestrator(ctx: Context, user_msg: str): handler orchestrator.run( user_msguser_msg, ctxctx, ) async for event in handler.stream_events(): if isinstance(event, AgentStream): if event.delta: print(event.delta, end, flushTrue) elif isinstance(event, AgentOutput): if event.tool_calls: print( ️ Planning to use tools:, [call.tool_name for call in event.tool_calls], ) elif isinstance(event, ToolCallResult): print(f Tool Result ({event.tool_name}):) print(f Arguments: {event.tool_kwargs}) print(f Output: {event.tool_output}) elif isinstance(event, ToolCall): print(f Calling Tool: {event.tool_name}) print(f With arguments: {event.tool_kwargs})4.7 执行示例await run_orchestrator( ctxctx, user_msg( Write me a report on the history of the internet. Briefly describe the history of the internet, including the development of the internet, the development of the web, and the development of the internet in the 21st century. ), )4.8 获取最终报告从系统状态中检索最终报告state await ctx.store.get(state) print(state[report_content])5. 案例效果5.1 多代理协作系统成功实现了三个代理的协作流程顶级协调代理首先调用研究代理搜索互联网历史相关信息研究代理返回研究笔记后协调代理调用写作代理写作代理基于研究笔记撰写报告协调代理调用审查代理审查报告审查代理提供反馈后协调代理再次调用写作代理修改报告最终生成高质量的报告5.2 代理作为工具通过将子代理封装为工具我们实现了代理的模块化和可重用性。每个子代理专注于特定任务而顶级代理负责协调这些任务的执行。这种设计使得系统更加灵活和可扩展。5.3 状态共享通过Context对象代理能够共享和修改状态。研究代理的研究笔记被写作代理用于撰写报告而写作代理撰写的报告被审查代理用于审查。这种状态共享机制使得代理能够协同工作共同完成任务。5.4 流式输出通过流式输出用户可以实时监控多代理系统的执行过程包括当前活动的代理、计划使用的工具、工具调用结果等。这种透明度使得系统行为更加可理解和可调试。5.5 迭代改进系统支持迭代改进过程。审查代理提供反馈后写作代理可以根据反馈修改报告直到报告满足要求。这种迭代机制确保了最终输出的高质量。6. 案例实现思路6.1 代理作为工具的设计模式本案例基于代理作为工具的设计模式将子代理封装为工具使它们可以被其他代理调用。这种模式的优势在于模块化每个代理专注于特定领域的任务提高执行质量可重用性代理可以在不同的工作流中重复使用层次化通过顶级代理协调子代理实现复杂的任务分解和执行6.2 代理协调机制顶级协调代理负责管理子代理的执行顺序和交互。它根据任务需求决定调用哪个子代理并处理子代理的返回结果。这种协调机制确保了工作流的有序执行和代理间的协作。6.3 状态共享Context对象提供了状态共享的机制使得代理能够访问和修改共享数据。通过Context.store.edit_state()方法代理可以安全地修改状态而其他代理可以访问这些状态。这种机制是实现代理协作的关键。6.4 工具封装通过将子代理封装为工具我们实现了代理的标准化接口。每个工具函数负责调用相应的子代理并处理返回结果。这种封装使得代理可以被其他代理无缝集成和使用。6.5 流式处理流式处理通过事件系统实现允许用户实时监控系统执行过程。系统会发出各种事件如AgentStream、ToolCall、ToolCallResult等用户可以监听这些事件并实时处理实现更好的用户体验和系统透明度。7. 扩展建议7.1 更复杂的代理网络设计更复杂的多层代理网络包含更多类型的代理和更复杂的交互模式实现代理间的直接通信机制使代理能够交换信息和协调行动添加动态代理创建和销毁功能使系统能够根据任务需求动态调整代理网络7.2 增强代理能力为代理添加更多专业工具如数据分析、图表生成、代码执行等实现代理学习能力使代理能够从过去的执行中学习和改进添加代理个性化设置使每个代理具有独特的风格和特点7.3 改进协调机制实现更智能的协调策略如基于任务优先级、代理负载和能力的动态调度添加并行执行支持使多个代理能够同时处理不同的子任务实现条件分支和循环使协调代理能够根据中间结果动态调整执行路径7.4 增强状态管理实现分层状态管理区分全局状态和局部状态添加状态版本控制和历史记录支持状态回滚和审计实现状态持久化和恢复使长时间运行的工作流能够从故障中恢复7.5 提高系统性能优化代理调用缓存减少重复的计算和网络请求实现智能调度策略根据代理负载和任务优先级动态分配资源添加性能监控和分析工具识别瓶颈并优化系统性能8. 总结本案例展示了如何使用LlamaIndex构建一个多代理系统其中子代理作为工具被顶级代理调用。通过这个案例我们了解了如何将子代理封装为工具实现代理的模块化和可重用性如何创建顶级协调代理负责管理子代理的执行顺序和交互如何使用Context对象在代理之间共享状态如何通过流式输出监控多代理系统的执行过程如何实现迭代改进机制确保最终输出的高质量代理作为工具的设计模式为构建复杂的AI应用提供了强大而灵活的框架。通过将复杂任务分解为多个子任务并让专门的代理负责每个子任务我们可以构建出更加智能、更加专业的系统。这种架构特别适合处理需要多种技能和知识的复杂任务。顶级协调代理作为系统的大脑负责管理和调度子代理的执行确保工作流的有序进行。这种层次化的代理架构使得系统更加灵活和可扩展能够适应各种复杂任务的需求。通过本案例的方法开发者可以快速构建各种多代理系统实现复杂任务的自动化处理。这些系统不仅能够提高工作效率还能够提供更加专业和高质量的结果为各行各业的数字化转型提供支持。

相关新闻

2026/8/30 15:25:00

AI Agent入门实战:从最小闭环到工程落地

第一次在 B 站刷到《AI Agent 零基础全套教程》的时候,我下意识做了一件事:先点收藏,再翻目录。748 集,标题写着“最全最细”,又标注“2026 最新版”,理性上知道大概率看不完,但收藏按钮还是比脑…

2026/8/30 15:19:59

Linux:进程的标识符、进程状态的认识

一、前言上篇文章我们简单的介绍了PCB(task_struct)的属性,下面讲一下标识符和状态以及在讲的过程中引出的的知识和命令二、标识符 2.1pidpid是标识进程唯一的标志,我们可以通过getpid();获取进程的id,返回值是pid_t(也就是int,只是typedef了) 比如我运行的一段C语言的简单死循…

2026/8/30 15:35:00

AI购物真实用指南:从部署到测试,手把手验证它到底香不香

这次我们来看一个被讨论得越来越多的话题:用 AI 购物,到底是真香,还是大可不必?我先不给结论,只给你一套可以自己验证的方法。从技术角度看,AI 购物并不是某一个产品,而是比价、导购、优惠券聚合…

2026/8/30 15:35:00

Java 注解真的只是“打个标签”吗?

目录 介绍 元注解 Target Retention Inherited Repeatable 演示使用 介绍 注解是什么:注解本质上是元数据,一种代码级别的注释。 用处:给类,方法,接口等添加额外的信息 原理:使用 interface 定义注…

2026/8/30 15:35:00

量化概念 14:过拟合与样本外(回测越漂亮,越要警惕)

回测年化 40%,实盘一年后只剩 5%——这种情况在量化里太常见了。问题往往不是策略不好,而是回测本身骗了你:策略在历史数据上过拟合了。 什么是过拟合 过拟合(overfitting),是模型把历史数据里的噪声当成了…

2026/8/30 15:35:00

复制:主从、多主、无主

每台机器只有「部分的真相」。复制是把同一份数据放到多台机器上,让系统在单机挂掉时还能继续服务。 为什么需要复制 单机有物理上限。数据量可能超过单机磁盘,请求量可能超过单机 CPU,还有机器故障、机房断电这些不可抗力。复制把数据拷贝到…

2026/8/30 15:35:00

微信DAT文件加密机制解析与Python批量解密工具实战

简介:这是一款专为微信电脑版用户设计的.dat文件解析工具,面向普通用户与轻度技术爱好者,解决微信本地存储的图片及表情包无法直接查看、导出的痛点。工具可精准提取WeChat Files目录下.dat文件中的原始图像资源,并批量转换为JPG、…

2026/8/30 15:30:00

x64dbg逆向实战:从反汇编指令还原C语言代码的方法论

如果你已经在 Windows 环境下做过反汇编分析,大概率会遇到这种场景:用 IDA 打开某个可执行文件,静态分析时看到了一堆 push、mov、cmp、jle 和 call,然后把寄存器翻来翻去,依然无法确认这段汇编对应源码里的哪一行 C 代…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/30 0:03:35

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/30 0:03:35

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/30 0:03:35

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/28 16:16:48

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/28 16:16:50

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/28 11:06:45

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…