autogen 教程
autogen的安装
pip install -U "autogen-agentchat" "autogen-ext[openai]"##
调用模型
1.openai的模型
from autogen_ext.models.openai import OpenAIChatCompletionClient
openai_model_client = OpenAIChatCompletionClient(
model="gpt-4o-2024-08-06",
# api_key="sk-...", # 如果环境变量中有可以从环境变量中调用.
)
2.ollama本地模型调用
pip install -U "autogen-ext[ollama]"
from autogen_core.models import UserMessage
from autogen_ext.models.ollama import OllamaChatCompletionClient
# Assuming your Ollama server is running locally on port 11434.
ollama_model_client = OllamaChatCompletionClient(model="llama3.2")
response = await ollama_model_client.create([UserMessage(content="What is the capital of France?", source="user")])
print(response)
await ollama_model_client.close()
4.其他模型 如过国内的模型 (参数model_info是必须需要的参数,ModelInfo内的参数都是需要填写的,
ModelInfo(vision=True, function_calling=True, json_output=True, family="unknown", structured_output=True))
ModelInfo 参数解析
参数名称 | 类型 | 描述 |
---|---|---|
| bool | 是否支持多模态视觉输入(如图像、视频分析)。 - |
| bool | 是否支持函数调用能力。 - |
| bool | 是否支持 JSON 格式输出。 - |
| str | 模型家族标识(如 GPT、LLaMA、BLOOM 等)。 - |
| bool | 是否支持结构化输出(如表格、列表、对象等)。 - |
实验代码
import os
import asyncio
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.models.openai._model_info import ModelInfo
from autogen_core import CancellationToken
from dotenv import load_dotenv
# 加载环境变量
load_dotenv()
api_key=os.getenv("api_key")
# 定义通义千问模型信息
async def main():
qwen_model_info = ModelInfo(
max_tokens=8192,
has_function_call_api=True,
vision=True,
function_calling=True,
json_output=True,
family="unkonwn",
structured_output=True
)
# 创建模型客户端
model_client = OpenAIChatCompletionClient(
model="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
model_info=qwen_model_info
)
# 创建助手代理
assistant = AssistantAgent(
name="assistant",
model_client=model_client,
system_message="你是一个乐于助人的助手,擅长写诗。",
)
# 发送消息并等待回复
response = await assistant.on_messages(
messages=[TextMessage(content="你好,请写一个关于秋天的三行诗", source="user")],
cancellation_token=CancellationToken()
)
# 打印回复
print("\n助手的回复:\n")
print(response.chat_message.content)
# 关闭客户端连接
await model_client.close()
if __name__ == "__main__":
asyncio.run(main())
消息
在 AutoGen AgentChat 中,消息有助于与其他代理、编排器和应用程序进行通信和信息交换。AgentChat 支持各种消息类型,每种类型都是为特定目的而设计的。
概括地说,AgentChat 中的消息可以分为两种类型:代理-代理消息和代理的内部事件和消息。
以下代码片段演示了如何创建接受字符串内容和字符串源的文本消息:
from autogen_agentchat.messages import TextMessage
text_message = TextMessage(content="Hello, world!", source="User")
同样,以下代码片段演示了如何创建多模式消息,该消息接受字符串或图片对象列表:
from io import BytesIO
import requests
from autogen_agentchat.messages import MultiModalMessage
from autogen_core import Image as AGImage
from PIL import Image
pil_image = Image.open(BytesIO(requests.get("https://picsum.photos/300/200").content))
img = AGImage(pil_image)
multi_modal_message = MultiModalMessage(content=["Can you describe the content of this image?", img], source="User")
img
代理(助手)
AutoGen AgentChat 提供了一组预设的 Agent,每个 Agent 的响应方式都有所不同。 所有代理共享以下属性和方法:
name:代理的唯一名称
description
:代理的文本描述
run(task)
:给定任务运行代理的方法
作用:接收任务(字符串或消息列表)并运行代理,返回 TaskResult
对象,代理维护对话上下文(有状态),调用时只需传入 新消息(非完整历史)
参数:task
为任务内容(字符串或 Message
对象列表)
返回值:TaskResult
(包含回复消息、工具调用指令等结果)
run_stream(task)
:流式运行代理的方法,与 run()
类似,但返回迭代器,按顺序生成:若干 BaseAgentEvent
或 BaseChatMessage
类型的消息(流式输出中间过程)最后一个元素为 TaskResult
(最终结果,适用于需要实时展示处理进度的场景(如前端界面逐行显示回复)
助理代理(AssistantAgent)
一个内置代理程序,它 使用语言模型,并具有使用工具的能力。
代码示例
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import StructuredMessage
from autogen_agentchat.ui import Console
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.models.openai._model_info import ModelInfo
from dotenv import load_dotenv
import os
import asyncio
# 加载环境变量
load_dotenv()
api_key=os.getenv("api_key")
async def web_search(query: str) -> str:
"""Find information on the web"""
return "AutoGen is a programming framework for building multi-agent applications."
#调用模型
qwen_model_info = ModelInfo(
max_tokens=8192,
has_function_call_api=True,
vision=True,
function_calling=True,
json_output=True,
family="unkonwn",
structured_output=True
)
# 创建模型客户端
model_client = OpenAIChatCompletionClient(
model="qwen-plus",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key=api_key,
model_info=qwen_model_info
)
#助手创建
agent = AssistantAgent(
name="assistant",
model_client=model_client,
tools=[web_search],
system_message="使用工具来解决问题.",
)
# 创建主函数
async def main():
result = await agent.run(task="帮我查找autogen相关资料")
print("\n对话过程:\n")
for msg in result.messages:
if msg.type == "TextMessage":
print(f"User: {msg.content}")
elif msg.type == "ToolCallSummaryMessage":
print(f"Assistant: {msg.content}")
# 使用 asyncio.run 来运行异步主函数
if __name__ == "__main__":
import asyncio
asyncio.run(main())
这部分如果我要求帮我写一首诗输出结果为:
对话过程:
User: 帮我写一首诗 User: 当然可以,下面是一首即兴创作的关于自然美景的诗:
春风拂面来,柳丝轻摆舞。 溪边碧草生,花簇拥中路。
白云悠然过,青天如海阔。 鸟鸣山更幽,林深时见鹿。
日暮西山下,炊烟起人家。 静享时光好,心随天地化。
希望你喜欢这首诗。如果你有特定的主题或者风格要求,请告诉我,我很乐意再创作一首符合你心意的诗。
如果为帮我查找autogen的相关资料结果为:
对话过程:
User: 帮我查找autogen相关资料 Assistant: AutoGen is a programming framework for building multi-agent applications.
当需要调用函数时助手自动调用了写的方法函数,而不需要调用的时候返回了模型的输出结果。可以直观的看出助手的作用。同时将run()改为run_stream可以实现流式输出.
多模态输入
可以照片和文字一起输入
from io import BytesIO
import PIL
import requests
from autogen_agentchat.messages import MultiModalMessage
from autogen_core import Image
# Create a multi-modal message with random image and text.
pil_image = PIL.Image.open(BytesIO(requests.get("https://picsum.photos/300/200").content))
img = Image(pil_image)
multi_modal_message = MultiModalMessage(content=["Can you describe the content of this image?", img], source="user")
img
# Use asyncio.run(...) when running in a script.
result = await agent.run(task=multi_modal_message)
print(result.messages[-1].content) # type: ignore
工具的调用
构建一个智能体,工具的调用最为关键可以是faction calling 也可以时mcp。大型语言模型(LLMs)通常局限于生成文本或代码响应。然而,许多复杂任务需要借助能执行特定操作的外部工具(如从 API 或数据库获取数据)来完成。
为解决这一局限,现代 LLM 如今可接受可用工具模式列表(工具及其参数的描述)并生成工具调用消息。这一能力被称为工具调用(Tool Calling)或函数调用(Function Calling),正成为构建基于智能代理的应用程序的流行模式。有关 LLM 中工具调用的更多信息,请参考 OpenAI 和 Anthropic 的文档。
在 AgentChat 中,**AssistantAgent(助手代理)** 可使用工具执行特定操作。web_search
工具就是其中之一,它允许助手代理通过网络搜索信息。单个自定义工具可以是 Python 函数,也可以是BaseTool
类的子类。
另一方面,**Workbench(工作台)** 是共享状态和资源的工具集合。
AssistantAgent 会自动将 Python 函数转换为 FunctionTool
,使其可作为代理使用的工具,并根据函数签名和文档字符串自动生成工具模式(tool schema)。
web_search_func
工具就是函数工具的一个示例,其模式由系统自动生成。
from autogen_core.tools import FunctionTool
# Define a tool using a Python function.
async def web_search_func(query: str) -> str:
"""Find information on the web"""
return "AutoGen is a programming framework for building multi-agent applications."
#如果该工具是一个 Python 函数,此步骤将在 AssistantAgent 内部自动执行。
web_search_function_tool = FunctionTool(web_search_func, description="Find information on the web")
#该模式在 AssistantAgent 的 on_messages 调用期间提供给模型。
web_search_function_tool.schema
输出为
{'name': 'web_search_func',
'description': 'Find information on the web',
'parameters': {'type': 'object',
'properties': {'query': {'description': 'query',
'title': 'Query',
'type': 'string'}},
'required': ['query'],
'additionalProperties': False},
'strict': False}
MCP工作台
AssistantAgent 还可以通过 McpWorkbench() 使用由 模型上下文协议(Model Context Protocol, MCP)服务器提供的工具。以下是对这一机制的详细说明:
from autogen_agentchat.agents import AssistantAgent
from autogen_agentchat.messages import TextMessage
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_ext.tools.mcp import McpWorkbench, StdioServerParams
#从 mcp-server-fetch 获取抓取工具。
fetch_mcp_server = StdioServerParams(command="uvx", args=["mcp-server-fetch"])
# 创建一个 MCP 工作台,为 MCP 服务器提供会话。
async with McpWorkbench(fetch_mcp_server) as workbench: # type: ignore
# 创建一个可以使用获取工具的智能体。
model_client = OpenAIChatCompletionClient(model="gpt-4.1-nano")
fetch_agent = AssistantAgent(
name="fetcher", model_client=model_client, workbench=workbench, reflect_on_tool_use=True
)
# 让智能体获取一个 URL 的内容并进行总结。
result = await fetch_agent.run(task="总结以下内容 https://en.wikipedia.org/wiki/Seattle")
assert isinstance(result.messages[-1], TextMessage)
print(result.messages[-1].content)
# 关闭与模型客户端的连接。
await model_client.close()
并行工具调用
一些模型支持并行工具调用,这对于需要同时调用多个工具的任务很有用。默认情况下,如果模型客户端生成多个工具调用,AssistantAgent 将并行调用这些工具。
当工具的副作用可能相互干扰,或者当代理行为需要在不同模型间保持一致时,你可能希望禁用并行工具调用。这应该在模型客户端级别完成。对于 OpenAIChatCompletionClient 和 AzureOpenAIChatCompletionClient,设置 parallel_tool_calls=False 来禁用并行工具调用。
model_client_no_parallel_tool_call = OpenAIChatCompletionClient(
model="gpt-4o",
parallel_tool_calls=False, # type: ignore
)
agent_no_parallel_tool_call = AssistantAgent(
name="assistant",
model_client=model_client_no_parallel_tool_call,
tools=[web_search],
system_message="Use tools to solve tasks.",
)
在循环中运行工具
AssistantAgent 一次执行一个步骤:一次模型调用,接着一次工具调用(或并行工具调用),然后是可选的反思。例如,要在循环中运行它,直到它不再生成工具调用,请参考 “单智能体团队”。
结构化输出
结构化输出允许模型返回具有应用程序提供的预定义模式的结构化 JSON 文本。与 JSON 模式不同,模式可以作为 Pydantic BaseModel 类提供,该类也可用于验证输出。一旦在 AssistantAgent 构造函数的参数中指定了基类模型,代理将以 StructuredMessage 进行响应,其 output_content_type 的类型为基类模型的类型。通过这种方式,你可以将代理的响应直接集成到你的应用程序中,并将模型的输出用作结构化对象。
注意:当设置时,默认情况下它要求智能体对工具使用情况进行反思,并根据工具调用结果返回结构化的输出消息。你可以通过显式设置 output_content_type.reflect_on_tool_use=False
来禁用此行为。
结构化输出对于在智能体的回复中融入思维链推理也很有用。关于如何在助手智能体中使用结构化输出,请参见以下示例。
from typing import Literal
from pydantic import BaseModel
# 代理的响应格式采用 Pydantic 基础模型。
class AgentResponse(BaseModel):
thoughts: str
response: Literal["happy", "sad", "neutral"]
# 创建一个使用 OpenAI GPT - 4o 模型的智能体。
model_client = OpenAIChatCompletionClient(model="gpt-4o")
agent = AssistantAgent(
"assistant",
model_client=model_client,
system_message="按照 JSON 格式将输入归类为开心、难过或中性。",
#定义代理的输出内容类型。
output_content_type=AgentResponse,
)
result = await Console(agent.run_stream(task="I am happy."))
# 检查结果中的最后一条消息,验证其类型,并打印思路和回复。
assert isinstance(result.messages[-1], StructuredMessage)
assert isinstance(result.messages[-1].content, AgentResponse)
print("Thought: ", result.messages[-1].content.thoughts)
print("Response: ", result.messages[-1].content.response)
await model_client.close()
---------- assistant ----------
{
"thoughts": "The user explicitly states they are happy.",
"response": "happy"
}
Thought: 用户明确表示他们很高兴。
Response: happy
流式传输 Tokens
你可以通过设置model_client_stream=True
来流式传输模型客户端生成的Tokens。这将使代理在run_stream()
中生成ModelClientStreamingChunkEvent
消息。基础模型 API 必须支持流式传输,此功能才能正常工作。请向你的模型提供商核实是否支持此功能。
model_client = OpenAIChatCompletionClient(model="gpt-4o")
streaming_assistant = AssistantAgent(
name="assistant",
model_client=model_client,
system_message="You are a helpful assistant.",
model_client_stream=True, # Enable streaming tokens.
)
# 在脚本中使用异步函数和 asyncio.run () 。
async for message in streaming_assistant.run_stream(task="Name two cities in South America"): # type: ignore
print(message)
source='user' models_usage=None metadata={} content='Name two cities in South America' type='TextMessage'
source='assistant' models_usage=None metadata={} content='Two' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' cities' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' South' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' America' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' are' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' Buenos' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' Aires' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' Argentina' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' and' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' São' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' Paulo' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' in' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content=' Brazil' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=None metadata={} content='.' type='ModelClientStreamingChunkEvent'
source='assistant' models_usage=RequestUsage(prompt_tokens=0, completion_tokens=0) metadata={} content='Two cities in South America are Buenos Aires in Argentina and São Paulo in Brazil.' type='TextMessage'
messages=[TextMessage(source='user', models_usage=None, metadata={}, content='Name two cities in South America', type='TextMessage'), TextMessage(source='assistant', models_usage=RequestUsage(prompt_tokens=0, completion_tokens=0), metadata={}, content='Two cities in South America are Buenos Aires in Argentina and São Paulo in Brazil.', type='TextMessage')] stop_reason=None
您可以在上面的输出中看到流数据块。 块由模型客户端生成,并在收到时由代理生成。 最终响应,即所有块的串联,在最后一个块之后生成。
使用模型上下文
++AssistantAgent
++ 有一个参数++model_context
++,可用于传入一个ChatCompletionContext
对象。这使得代理能够使用不同的模型上下文,例如BufferedChatCompletionContext
来限制发送到模型的上下文。
默认情况下,AssistantAgent
使用UnboundedChatCompletionContext
,它会将完整的对话历史发送给模型。要将上下文限制为最后几条消息,可以使用BufferedChatCompletionContext
。要通过令牌计数来限制上下文,可以使用TokenLimitedChatCompletionContext
。
from autogen_core.model_context import BufferedChatCompletionContext
# 创建一个仅使用上下文中最后 5 条消息来生成回复的智能体。
agent = AssistantAgent(
name="assistant",
model_client=model_client,
tools=[web_search],
system_message="Use tools to solve tasks.",
model_context=BufferedChatCompletionContext(buffer_size=5), # 仅使用上下文中的最后 5 条消息。
)
其他预设代理
The following preset agents are available:
-
•
UserProxyAgent
: 一种接受用户输入并将其作为回复返回的代理。 -
•
CodeExecutorAgent
: 一个可以执行代码的代理。 -
•
OpenAIAssistantAgent
: 一个由 OpenAI 助手支持的智能体,具备使用自定义工具的能力。 -
•
MultimodalWebSurfer
: 一种能够搜索网页并访问网页获取信息的多模态智能体。 -
•
FileSurfer
: 一种能够搜索和浏览本地文件以获取信息的代理。 -
•
VideoSurfer
: 一个可以观看视频获取信息的智能体。
详细可前往官网查看 代理 — AutoGen