AutoGen智能体开发实战:让AI不仅会聊天,还能用工具和结构化输出!

前言

大语言模型(LLM)如GPT-4、Qwen等,已经能实现非常强大的自然语言对话能力。但你是否发现,直接用AI模型只能做简单的问答和闲聊,一旦涉及到调用外部API、数据处理、自动化操作等复杂任务,模型就"无能为力"了?

AutoGen AgentChat 框架为我们提供了"智能体壳子"——Agent,让AI不仅能对话,还能像人一样"用工具",甚至能输出结构化数据,极大拓展了AI的应用边界。本文将带你深入理解AutoGen智能体的核心机制,并手把手教你如何让AI输出你想要的格式!


1. 为什么要给AI套上"Agent壳子"?

直接用大模型(如OpenAI、Qwen等)只能做"纯文本对话",无法主动调用外部工具、API、数据库等。

Agent壳子的作用:

  • 让AI具备"用工具"的能力(如自动查资料、发HTTP请求、调用自定义函数等)
  • 支持多智能体协作(如专家团队讨论、流程自动化)
  • 支持结构化输出(如JSON、Pydantic模型等)

举例:

from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.ollama import OllamaChatCompletionClient

model_client = OllamaChatCompletionClient(model="qwen2.5-coder:latest")
agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],  # 这里传入了一个Python函数
    system_message="Use tools to solve tasks.",
)

此时,assistant 不再只是"会聊天的AI",而是一个能用工具的智能体


2. AssistantAgent类参数详解与实用技巧

要让AI真正"聪明"起来,理解和灵活运用 AssistantAgent的各个参数非常关键。下面我们详细讲解常用参数的含义、作用及实战用法。

2.1 tools —— 工具参数

作用:让AI能够主动调用你自定义的Python函数,实现查资料、发请求、数据处理等能力。

本质:你传入的每个Python函数,都会被自动包装成"工具",AI会根据函数签名和文档字符串自动学会怎么用。

如何创建工具?

  1. 定义函数(支持同步和异步):
def web_search(query: str) -> str:
    """在网络上查找信息"""
    return "AutoGen是一个多智能体开发框架"
  1. 传递给tools参数
agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],
    system_message="Use tools to solve tasks.",
)

实用场景

  • 自动查找资料、天气、股票等
  • 数据库/接口查询
  • 代码自动生成与执行

进阶技巧

  • 支持多个工具,直接传入函数列表
  • 支持异步函数(async def …)
  • 工具函数可以返回结构化数据(如Pydantic模型)

2.2 model_client —— 模型客户端

作用:指定底层大语言模型(如OpenAI、Qwen、Ollama等),决定AI的"智力水平"。

用法示例

from autogen_ext.models.ollama import OllamaChatCompletionClient
model_client = OllamaChatCompletionClient(model="qwen2.5-coder:latest")

实用场景

  • 需要指定不同模型能力、版本、API密钥等
  • 支持本地模型、云端模型灵活切换

2.3 system_message —— 系统消息

作用:为AI设定"角色"和"行为准则",影响其整体风格和输出内容。

用法示例

agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],
    system_message="你是一个专业的知识助手,善于用工具解决问题。",
)

实用场景

  • 设定AI为"专家"、“客服”、"编程助手"等不同身份
  • 明确要求输出格式、风格、语言等

2.4 output_content_type —— 结构化输出类型

作用:让AI输出你自定义的数据结构(如Pydantic模型、JSON等),方便后续自动化处理。

用法示例

from typing import Literal
from pydantic import BaseModel

class AgentResponse(BaseModel):
    thoughts: str
    response: Literal["happy", "sad", "neutral"]

agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],
    system_message="请用JSON格式输出,包含thoughts和response字段。",
    output_content_type=AgentResponse,
)

实用场景

  • 需要AI输出结构化数据,便于前端/后端自动处理
  • 复杂业务流程、表单、报表等自动生成

2.5 其他常用参数

  • name:智能体名称,团队协作时需唯一
  • reflect_on_tool_use:是否让AI对工具调用结果进行反思,提升输出质量,默认情况True
    • 该参数控制Agent在调用工具后,是否会对工具的执行结果进行"反思"并生成更符合用户需求的最终回复。
    • 典型场景:如AI调用web_search工具查到一段资料后,会自动总结、归纳或用更友好的方式输出给用户,而不是直接返回原始结果。
    • 关闭时的影响:如果将其设为False,Agent会直接返回工具的原始输出,适合需要极致性能或只关心原始数据的场景。
    • 举例
      agent = AssistantAgent(
          name="assistant",
          model_client=model_client,
          tools=[web_search],
          reflect_on_tool_use=False,  # 关闭反思,直接返回工具结果
      )
      
  • workbench:用于集成MCP等高级工具协议
  • output_stats:是否输出统计信息,便于调试和优化

通过灵活配置这些参数,你可以让AI不仅"会聊天",还能"用工具"、“懂业务”、“输出结构化数据”,真正成为你的智能助手!


3. AssistantAgent自动工具化机制

看到这里你是否会有一个疑问,Agent是怎么调用工具,它是怎么了解用什么方式使用工具的?接下来我就为你讲解

实际上,AssistantAgent的自动工具化机制非常智能:

  • 函数签名:指的是函数的参数名、类型、返回值类型等。例如:

    def web_search(query: str) -> str:
        """Find information on the web"""
        return "AutoGen is a programming framework for building multi-agent applications."
    
    • query: str 就是参数签名,告诉AI这个工具需要一个字符串类型的参数
  • 文档字符串(docstring):就是函数体下方的三引号注释,描述了函数的用途和用法。AI会用它来理解工具的功能。

    • """Find information on the web""" 让AI知道这个工具是"查找网络信息"
  • 函数签名解析:Agent会自动读取你传入函数的参数名、类型、返回值类型(即函数签名),并据此生成工具的参数协议。例如,def web_search(query: str) -> str 会被解析为"需要一个字符串类型的query参数"。

  • 文档字符串(docstring)提取:Agent还会读取函数体下方的三引号注释(docstring),将其作为工具的用途和用法说明,帮助大模型理解工具的功能和使用场景。

  • 协议转化:框架会将这些信息自动转化为标准的工具调用协议(如OpenAI Function Calling、JSON Schema等),并传递给底层大模型。

  • LLM自动推理:大模型在收到用户请求时,会自动判断是否需要调用工具,并根据协议自动生成调用指令(如函数名、参数、调用顺序等),无需开发者手动干预。

  • 开发者优化建议:你可以通过完善函数的类型注解和docstring,让Agent更好地理解工具的能力和边界,从而提升工具调用的准确率和智能体的整体表现。

小结:只要你写好函数签名和注释,Agent就能自动学会怎么用你的工具,极大降低了AI与外部系统集成的门槛!


4. 结构化输出是什么?怎么让Agent输出自定义格式?

4.1 结构化输出的意义

传统AI回复都是"纯文本",但在实际开发中,我们常常需要AI输出结构化数据,比如JSON、Pydantic模型等,方便后续程序处理。

AutoGen支持让Agent直接输出结构化内容,极大提升了AI的可控性和可用性

4.2 如何让Agent输出自定义格式?

步骤一:定义结构化数据模型

推荐用Pydantic定义输出格式。例如:

from typing import Literal
from pydantic import BaseModel

class AgentResponse(BaseModel):
    thoughts: str
    response: Literal["happy", "sad", "neutral"]
步骤二:在AssistantAgent中指定输出类型
from autogen_ext.models.openai import OpenAIChatCompletionClient
from autogen_agentchat.agents import AssistantAgent

model_client = OpenAIChatCompletionClient(model="gpt-4o")
agent = AssistantAgent(
    "assistant",
    model_client=model_client,
    system_message="Categorize the input as happy, sad, or neutral following the JSON format.",
    output_content_type=AgentResponse,  # 关键:指定结构化输出类型
)
步骤三:运行并获取结构化结果
result = await agent.run(task="I am happy.")
assert isinstance(result.messages[-1].content, AgentResponse)
print("Thought: ", result.messages[-1].content.thoughts)
print("Response: ", result.messages[-1].content.response)

实际输出:

{
  "thoughts": "The user explicitly states they are happy.",
  "response": "happy"
}

4.3 让Agent输出你想要的格式的技巧

  • 定义好Pydantic模型,字段名、类型要清晰
  • system_message里明确要求格式,如"请用JSON格式输出,字段包括…"
  • output_content_type参数一定要传,否则AI只会输出纯文本
  • 可以用Literal/Enum限制字段取值,提升可控性
  • 多轮对话时,建议每轮都要求结构化输出

5. run 和 run_stream 有什么区别?

在AutoGen中,所有Agent都支持两种运行方式:

  • run:一次性运行,返回最终结果(适合脚本/批处理)
  • run_stream:流式运行,每生成一条消息就返回一次(适合实时交互、控制台输出)

示例代码:

result = await agent.run(task="Find information on AutoGen")
print(result.messages)
  • run 方法会把整个任务的"思考过程"和最终回复都放在 result.messages 里,一次性返回。

如果你想边生成边显示,可以用 run_stream

async def assistant_run_stream() -> None:
    await Console(
        agent.run_stream(task="Find information on AutoGen"),
        output_stats=True,
    )
await assistant_run_stream()
  • run_stream 方法会在每条消息生成时就 yield 出来,适合做实时展示、进度条等。

总结:

  • run 适合拿到最终结果后统一处理
  • run_stream 适合需要"边生成边看"的场景

6. 实战案例:让AI自动查资料并结构化输出

from autogen_agentchat.agents import AssistantAgent
from autogen_ext.models.ollama import OllamaChatCompletionClient
from pydantic import BaseModel

# 定义结构化输出模型
class SearchResult(BaseModel):
    summary: str
    url: str

# 定义工具函数
async def web_search(query: str) -> SearchResult:
    # 实际开发中可调用API
    return SearchResult(summary="AutoGen是一个多智能体开发框架", url="https://github.com/microsoft/autogen")

model_client = OllamaChatCompletionClient(model="qwen2.5-coder:latest")
agent = AssistantAgent(
    name="assistant",
    model_client=model_client,
    tools=[web_search],
    system_message="请根据用户问题自动查找资料,并用JSON格式输出结果,包含summary和url字段。",
    output_content_type=SearchResult,
)

result = await agent.run(task="AutoGen是什么?")
print(result.messages[-1].content.summary)
print(result.messages[-1].content.url)

7. 总结

  • Agent壳子:让AI具备用工具、结构化输出、多智能体协作等能力
  • AssistantAgent自动工具化:只需写好函数签名和注释,AI自动学会用
  • 结构化输出:用Pydantic定义格式,output_content_type参数指定,AI即可输出你想要的结构化数据
  • run/run_stream:分别适合一次性结果和流式输出

AutoGen让AI从"会聊天"进化到"能用工具、能结构化输出、能协作"的超级智能体,极大拓展了AI的应用边界。赶快试试吧!


如果你觉得有用,欢迎点赞、收藏、关注我,后续会持续分享AI开发干货!

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐