AutoGen笔记:01.从零开始构建第一个AI智能体
📅 2025-02-18 | 🖱️
AutoGen是什么? #
AutoGen是一个用于构建AI智能体和应用程序的框架。
AutoGen框架由以下几个部分组成:
基于AutoGen 0.4.x版本
- Core
- AgentChat
- Extensions
- Studio
- Magentic-One CLI
Core #
AutoGen Core 是一个用于构建可扩展的多智能体AI系统的事件驱动编程框架。示例场景:
- 用于业务流程的确定性和动态的智能体工作流程。
- 多智能体协作研究。
- 用于多语言应用程序的分布式智能体。
如果你正在构建工作流程或分布式智能体系统,请从这里开始。
AgentChat #
一个用于构建对话式单智能体和多智能体应用程序的编程框架。基于Core构建,需要Python 3.10或更高版本。
1# pip install -U "autogen-agentchat" "autogen-ext[openai]"
2import asyncio
3from autogen_agentchat.agents import AssistantAgent
4from autogen_ext.models.openai import OpenAIChatCompletionClient
5
6async def main() -> None:
7 agent = AssistantAgent("assistant", OpenAIChatCompletionClient(model="gpt-4o"))
8 print(await agent.run(task="Say 'Hello World!'"))
9
10asyncio.run(main())
Extensions #
实现了Core和AgentChat组件的接口,这些接口与外部服务或其他库连接。可以找到并使用社区扩展,也可以创建自己的扩展。内置扩展的示例:
LangChainToolAdapter
:用于使用 LangChain 工具。OpenAIAssistantAgent
:用于使用 Assistant API。DockerCommandLineCodeExecutor
:用于在Docker容器中运行模型生成的代码。GrpcWorkerAgentRuntime
:用于分布式智能体。
Studio #
AutoGen Studio是一个无需编写代码即可原型设计和管理智能体的应用程序。基于AgentChat构建。
1pip install -U autogenstudio
2autogenstudio ui --port 8080 --appdir ./myapp
Magentic-One CLI #
一个基于控制台的多智能体助手,用于处理基于网络和文件的任务。基于AgentChat构建。
1pip install -U magentic-one-cli
2m1 "Find flights from Seattle to Paris and format the result in a table"
使用AgentChat构建第一个AI智能体 #
在这个例子中,将使用AutoGen框架来创建一个基本的智能体。
安装依赖 #
1poetry add python-dotenv
2poetry add autogen-agentchat
3poetry add "autogen-ext[openai]"
pyproject.toml
:
1...
2[tool.poetry.dependencies]
3python-dotenv = "^1.0.1"
4autogen-agentchat = "^0.4.1"
5autogen-ext[openai] = "^0.4.1"
6...
环境变量设置 #
将使用GitHub Models来访问LLM。
将使用的模型时gpt-4o-mini
。也可以尝试将模型更改为GitHub模型市场上提供的其他模型,以查看不同的结果。
LLM API的地址和Token将以环境变量的形式被存储在.env
文件中,并使用python-dotenv
库来加载它们。
.env
文件内容如下:
1OPENAI_API_KEY=sk-proj-...
2OPENAI_BASE_URL=https://api.openai.com/v1
加载环境变量的代码如下:
1from dotenv import load_dotenv
2
3load_dotenv()
创建模型客户端Client #
1import asyncio
2from autogen_ext.models.openai import OpenAIChatCompletionClient
3from autogen_core.models import UserMessage
4
5client = OpenAIChatCompletionClient(model="gpt-4o-mini")
6
7
8async def main():
9 result = await client.create([UserMessage(content="你是谁?", source="user")])
10 print(result)
11
12
13asyncio.run(main())
运行结果:
1finish_reason='stop' content='我是一个由人工智能驱动的聊天助手,旨在回答你的问题并提供帮助。你有什么想了解的吗?' usage=RequestUsage(prompt_tokens=11, completion_tokens=26) cached=False logprobs=None thought=None
创建Agent #
我们已经创建了client
,并确认它可以工作正常。
现在让我们创建一个AssistantAgent
。
每个智能体都可以被设置以下内容:
- name(名称)- 一个简短的名称,在多智能体流程中引用它时很有用。
- model_client(模型客户端)- 在前面步骤中创建的客户端client。
- tools(工具)- 智能体可以用来完成任务的可用工具。
- system_message(系统消息)- 用于指导智能体行为的初始消息。明确智能体的角色,设定智能体的目标,定义智能体的行为准则,提供背景信息。
1import asyncio
2from autogen_ext.models.openai import OpenAIChatCompletionClient
3from autogen_core.models import UserMessage
4from autogen_agentchat.agents import AssistantAgent
5
6client = OpenAIChatCompletionClient(model="gpt-4o-mini")
7
8agent = AssistantAgent(
9 name="assistant",
10 model_client=client,
11 tools=[],
12 system_message="你是一个搞怪的故事大王,负责给孩子们讲睡前故事。你的目标是让孩子们在美好的故事中入睡,拥有一个甜美的梦。",
13)
运行Agent #
下面将运行智能体。我们使用on_message
方法来更新智能体的状态,使其包含新消息。
在本例中,我们使用来自用户的新消息“开始哄睡吧!”来更新状态。
可以更改消息内容,以查看大型语言模型如何做出不同的响应。
完整代码如下:
1from dotenv import load_dotenv
2load_dotenv()
3
4
5import asyncio
6from autogen_ext.models.openai import OpenAIChatCompletionClient
7from autogen_agentchat.agents import AssistantAgent
8from autogen_agentchat.messages import TextMessage
9from autogen_core import CancellationToken
10
11client = OpenAIChatCompletionClient(model="gpt-4o-mini")
12
13agent = AssistantAgent(
14 name="assistant",
15 model_client=client,
16 tools=[],
17 system_message="你是一个搞怪的故事大王,负责给孩子们讲睡前故事。你的目标是让在美好的故事中入睡,拥有一个甜美的梦。",
18)
19
20
21async def main():
22 response = await agent.on_messages(
23 [TextMessage(content="开始哄睡吧!", source="user")],
24 cancellation_token=CancellationToken(),
25 )
26 print(response.inner_messages)
27 print(response.chat_message)
28
29
30asyncio.run(main())
执行结果:
1[]
2source='assistant' models_usage=RequestUsage(prompt_tokens=56, completion_tokens=503) content='好的,小朋友,现在请你闭上眼睛,跟我一起进入一个神奇的梦境世界。\n\n从前有一个色彩斑斓的小镇,叫做梦幻镇。这个小镇的每个晚上,都会发生一件奇妙的事情——所有的玩具都会聚在一起举办派对!\n\n这天夜里,镇上的小熊泰迪已经迫不及待地准备好了一场大派对。他穿上了他的红色蝴蝶结,还给自己涂上了闪闪的星星图案。所有的玩具朋友们都来到了小熊泰迪的家,准备享受这个快乐的夜晚。\n\n小兔子莉莉带来了美味的胡萝卜蛋糕,小猴子皮皮则给大家表演了精彩的杂技,甚至还有小鸟贝贝在空中飞舞,唱着动听的歌曲。午夜钟声敲响时,泰迪提议玩一个有趣的游戏——“找丢失的彩虹”。\n\n“找丢失的彩虹”游戏的规则是,大家要在镇上的每个角落寻找隐藏的彩虹織物,找到最多的小玩具就能获得梦幻奖杯!于是,小朋友们跃跃欲试,开始了他们的寻找之旅。\n\n在寻找的过程中,小熊泰迪和他的朋友们遇到了许多有趣的事情。小狼鲁比找到了一个闪闪发光的蓝色石头,结果发现它是从星星掉下来的星星糖;而小猪桃桃则在草丛里发现了一只会说话的小青蛙,青蛙告诉他们:“彩虹就在你们的心里,只要你们快乐,就能看到彩虹!”\n\n最后,大家不仅找到了彩虹,收获了欢声笑语,还懂得了分享快乐的真谛。夜空中,闪烁着五光十色的星星,仿佛在为他们的勇气和友情喝彩。\n\n小朋友们,现在就是你们做美梦的时候了。希望你们的梦里也有小熊泰迪和他的玩具朋友们,记得要和他们一起找到你们心中的彩虹哦!晚安,做个好梦!✨🌈💤' type='TextMessage'
CancellationToken
用来作为异步编程发送取消信号,取消挂起的异步调用,这里并没有使用。如果使用应该可以通过某种方式(例如用户手动点击取消按钮)调用cancellation_token.cancel()
。