
这是一个完全重写且不向后兼容的AutoGen版本,所以本篇学习不依赖旧版本v0.2的学习基础。此外,由于AutoGen更专注Agent应用,完全可与LangGraph/LlamaIndex Workflows配合使用,因此学习AutoGen将给你带来更灵活的开发组合选择。
我们将分多期来循序渐进认识新版本中AutoGen-Core与AutoGen-AgentChat这两个不同的框架层次。其中AutoGen-Core部分内容包括:
初识AutoGen 0.4与AutoGen-Core AutoGen-Core:使用Tools与代码执行器 AutoGen-Core:多Agent工作范式与实例 -
AutoGen-Core:与LangGraph/LlamaIndex的集成
1
认识AutoGen0.4整体架构
-
Core(核心框架):提供基础组件与运行环境。包括消息通信、消息驱动的Agent、Tools、日志等基础抽象,以及对分布式Agent系统的运行支持。 -
AgentChat(高级API层):在Core之上的高层API。包括多种预构建的Agent类型、Agent团队类型、Message类型等。这是最接近AutoGen旧版本的层次,可方便旧版本的迁移。 -
Extentions(扩展):第三方扩展组件,用于完善生态。比如第三方LLM组件、代码执行器、Tools、更多的预置Agent等。你也可以自己开发Extension并提交到社区。 Magentic-One:一个通用的多智能体应用程序。可用于网页浏览、代码执行、文件处理等自动任务。其构建在在Extentions层的magentic_one组件之上。
-
AutoGen Studio:用于低代码开发多Agent应用的UI程序。可以想象成基于AutoGen底层框架之上的Coze。 -
AutoGen Bench:用于评估Agent性能与基准测试套件。工程化平台的一部分。
尽管AutoGen0.4有着清晰的分层设计,但并不意味着使用时的绝对隔离。比如你可能在使用Core开发的时候用到Extentsions中的组件;或者用到AgentChat中某个封装Agent类型等,后面例子中会看到。
2
AutoGen-Core:核心概念
管理Agent的注册、创建与销毁等生命周期管理 提供Agent间的消息通信机制
Agent Type:代表这个Agent实例的类型。 -
Agent Key:代表这个Agent实例的标识符。
直接消息:即直接向某个Agent实例发送消息,发送者可以是Agent实例,也可以是Runtime。 广播与订阅:广播者向某个主题(topic)发布消息,则订阅该主题的所有Agent实例都会收到到消息。
3
AutoGen-Core:Hello World!
from dataclasses import dataclass
@dataclass
class MyTextMessage:
content: str
from autogen_core import AgentId, MessageContext, RoutedAgent, message_handler
class MyWorkerAgent(RoutedAgent):
def __init__(self) -> None:
super().__init__("MyWorkerAgent")
@message_handler
async def handle_my_message(self, message: MyTextMessage, ctx: MessageContext) -> MyTextMessage:
print(f"{self.id.key} 收到来自 {ctx.sender} 的消息: {message.content}\n")
return MyTextMessage(content="OK, Got it!")
接收到任务消息,通常是由Runtime发送 将消息转发给WorkerAgent(借助AgentId) -
等待WorkerAgent的响应消息并输出
class MyManagerAgent(RoutedAgent):
def __init__(self) -> None:
super().__init__("MyManagerAgent")
self.worker_agent_id = AgentId('my_worker_agent', 'worker')
@message_handler
async def handle_my_message(self, message: MyTextMessage, ctx: MessageContext) -> None:
print(f"{self.id.key} 收到消息: {message.content}\n")
print(f"{self.id.key} 发送消息给 {self.worker_agent_id}...\n")
response = await self.send_message(message, self.worker_agent_id)
print(f"{self.id.key} 收到来自 {self.worker_agent_id} 的消息: {response.content}\n")
创建Runtime,并负责启动与停止 注册定义好的Agent类型,并指定工厂函数用于实例化 通过Runtime发送任务消息给入口Agent实例,这里是ManagerAgent
from autogen_core import SingleThreadedAgentRuntime
import asyncio
async def main():
#创建runtime,并注册agent类型
runtime = SingleThreadedAgentRuntime()
await MyManagerAgent.register(runtime, "my_manager_agent", lambda: MyManagerAgent())
await MyWorkerAgent.register(runtime, "my_worker_agent", lambda: MyWorkerAgent())
#启动runtime,发送消息,关闭runtime
runtime.start()
#创建agent_id,发送消息
agent_id = AgentId("my_manager_agent", "manager")
await runtime.send_message(MyTextMessage(content="Hello World!"),agent_id)
#关闭runtime
await runtime.stop_when_idle()
asyncio.run(main())
注册Agent使用类方法register(),注册时设定Agent类名称以及工厂方法 初始的任务消息通过Runtime.send_message()发送 send_message发送直接消息只需要指定接受消息的AgentId即可,无需关注其真实的实例是否存在,Runtime会自动管理
4
AutoGen-Core:第一个AI Agent
......
@dataclass
class Message:
content: str
class MyAgent(RoutedAgent):
def __init__(self) -> None:
super().__init__("A simple agent")
self._system_messages = [SystemMessage(content="You are a helpful AI assistant.Pls answer using Chinese.")]
self._model_client = OpenAIChatCompletionClient(model="gpt-4o-mini")
self._model_context = BufferedChatCompletionContext(buffer_size=5)
@message_handler
async def handle_user_message(self, message: Message, ctx: MessageContext) -> Message:
user_message = UserMessage(content=message.content, source="user")
await self._model_context.add_message(user_message)
response = await self._model_client.create(
self._system_messages + (await self._model_context.get_messages()), cancellation_token=ctx.cancellation_token
)
await self._model_context.add_message(AssistantMessage(content=response.content, source=self.metadata["type"]))
return Message(content=response.content)
使用model_clien访问LLM;使用model_context来保存对话历史; 每次收到新消息,则将新消息添加到对话历史,并交给LLM做输出 将LLM输出消息添加到对话历史后,返回本次响应内容
...
# 创建agent_id,发送消息
message = Message("中国的首都是哪个城市?")
response = await runtime.send_message(message, AgentId("my_agent", "default")) print(response.content)
就这样,一个极简版本的、基于AutoGen-Core的Agent就完成了。
事实上这只是一个简单的LLM应用,没有外部工具使用、长期记忆、ReAct等多方面能力。我们将在下一篇继续介绍如何使用AutoGen-Core开发带有工具能力的AI Agent。
end
福利时间
为了帮助LLM开发人员更系统性与更深入的学习RAG应用,特别是企业级的RAG应用场景下,当前主流的优化方法与技术实现,我们编写了《基于大模型的RAG应用开发与优化 — 构建企业级LLM应用》这本长达500页的开发与优化指南,与大家一起来深入到LLM应用开发的全新世界。
更多细节,点击链接了解
此处购买享5折优惠
