返回博客
人工智能 2025年4月10日 6 分钟阅读 · 1508 字

AI Agent 开发实战:从 ReAct 到 Multi-Agent 系统设计

掌握 AI Agent 的核心架构,用 LangChain 和 AutoGen 构建智能代理系统。

#AI Agent #LangChain #Multi-Agent #自动化
本文由 AI 辅助生成,经人工审核发布

什么是 AI Agent

AI Agent(智能代理)是能够自主感知环境、做出决策并执行行动以完成目标的系统。与传统的对话式 AI 不同,Agent 具备以下核心能力:

  • 自主规划:将复杂任务拆解为可执行的子步骤
  • 工具调用:调用外部 API、数据库、搜索引擎等
  • 记忆系统:存储和检索上下文信息
  • 反思修正:根据执行结果调整策略

ReAct 模式:Agent 的基础范式

ReAct(Reasoning + Acting)是 Agent 最经典的推理模式,交替进行”思考”和”行动”:

思考:用户想要查询北京明天的天气,我需要调用天气 API
行动:调用 weather_api(city="北京", date="tomorrow")
观察:北京明天晴,最高温 32°C,最低温 22°C
思考:我已经获得了天气信息,可以回答用户了
回答:北京明天天气晴朗,最高温度 32°C,最低温度 22°C,适合外出。

LangChain ReAct Agent 实现

from langchain.agents import create_react_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain.tools import tool

@tool
def search_web(query: str) -> str:
    """搜索互联网获取最新信息"""
    # 实际实现调用搜索 API
    return f"搜索结果:{query} 的相关信息..."

@tool
def calculate(expression: str) -> str:
    """数学计算"""
    try:
        return str(eval(expression))
    except:
        return "计算错误"

@tool
def write_file(filename: str, content: str) -> str:
    """将内容写入文件"""
    with open(filename, 'w') as f:
        f.write(content)
    return f"已写入 {filename}"

tools = [search_web, calculate, write_file]

llm = ChatOpenAI(model="gpt-4o", temperature=0)
agent = create_react_agent(llm, tools, prompt=None)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

# 执行任务
result = executor.invoke({
    "input": "搜索 Python 3.13 的新特性,总结要点并保存到 python313.txt"
})

工具调用(Tool Use)详解

自定义工具定义

from pydantic import BaseModel, Field
from langchain.tools import StructuredTool

class WeatherInput(BaseModel):
    city: str = Field(description="城市名称")
    date: str = Field(description="日期,格式 YYYY-MM-DD")

def get_weather(city: str, date: str) -> dict:
    """获取指定城市和日期的天气预报"""
    # 调用天气 API
    return {"city": city, "date": date, "weather": "晴", "temp": 25}

weather_tool = StructuredTool.from_function(
    func=get_weather,
    name="weather",
    description="获取天气预报",
    args_schema=WeatherInput
)

Function Calling vs ReAct

特性Function CallingReAct
推理方式模型直接决定调用文本推理后调用
可观测性较低高(可见思考过程)
速度较慢(多轮推理)
准确性高(原生支持)依赖 Prompt
适用模型GPT/Claude 等任何模型

记忆系统(Memory)

短期记忆

from langchain.memory import ConversationBufferMemory

memory = ConversationBufferMemory(
    memory_key="chat_history",
    return_messages=True,
    max_token_limit=2000  # 限制上下文长度
)

长期记忆:向量数据库

from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings

# 存储对话历史到向量数据库
vectorstore = Chroma(
    embedding_function=OpenAIEmbeddings(),
    persist_directory="./agent_memory"
)

# 检索相关记忆
def recall(query: str, k: int = 3):
    docs = vectorstore.similarity_search(query, k=k)
    return [doc.page_content for doc in docs]

记忆层级

层级存储方式容量检索速度用途
工作记忆上下文窗口即时当前对话
短期记忆缓冲区近期交互
长期记忆向量数据库历史知识
结构化记忆数据库用户画像

Multi-Agent 多智能体系统

AutoGen 框架

import autogen

config_list = [{
    "model": "gpt-4o",
    "api_key": "your-api-key"
}]

# 创建用户代理
user_proxy = autogen.UserProxyAgent(
    name="User",
    human_input_mode="NEVER",
    max_consecutive_auto_reply=10
)

# 创建研究员 Agent
researcher = autogen.AssistantAgent(
    name="Researcher",
    system_message="你是一个研究助手,负责搜索和整理信息。",
    llm_config={"config_list": config_list}
)

# 创建写手 Agent
writer = autogen.AssistantAgent(
    name="Writer",
    system_message="你是一个专业写手,将研究结果整理成文章。",
    llm_config={"config_list": config_list}
)

# 创建审查员 Agent
reviewer = autogen.AssistantAgent(
    name="Reviewer",
    system_message="你是内容审查员,检查文章质量和准确性。",
    llm_config={"config_list": config_list}
)

# 创建群聊
groupchat = autogen.GroupChat(
    agents=[user_proxy, researcher, writer, reviewer],
    messages=[],
    max_round=15
)

manager = autogen.GroupChatManager(
    groupchat=groupchat,
    llm_config={"config_list": config_list}
)

# 启动任务
user_proxy.initiate_chat(
    manager,
    message="写一篇关于 AI Agent 发展趋势的技术文章"
)

CrewAI 团队编排

from crewai import Agent, Task, Crew

researcher = Agent(
    role='研究员',
    goal='收集和整理 AI Agent 相关的最新信息',
    backstory='你是一位资深技术研究员,擅长快速收集和总结信息。',
    tools=[search_tool]
)

writer = Agent(
    role='技术写手',
    goal='将研究结果转化为清晰易懂的文章',
    backstory='你是一位经验丰富的技术写手,擅长将复杂概念简化。'
)

research_task = Task(
    description='研究 AI Agent 的最新发展趋势,包括 ReAct、Multi-Agent 等',
    agent=researcher,
    expected_output='一份包含关键发现的研究报告'
)

writing_task = Task(
    description='基于研究报告撰写一篇 2000 字的技术文章',
    agent=writer,
    expected_output='一篇完整的中文技术文章',
    context=[research_task]  # 依赖研究任务的输出
)

crew = Crew(
    agents=[researcher, writer],
    tasks=[research_task, writing_task],
    process=Process.sequential
)

result = crew.kickoff()

Agent 架构设计模式

模式描述适用场景
单 Agent一个 Agent 完成所有任务简单任务、快速原型
顺序流水线多个 Agent 依次处理内容创作、数据处理
并行协作多个 Agent 同时工作多角度分析、投票决策
层级管理主管 Agent 分配任务复杂项目管理
竞争选择多个 Agent 各自完成,选最优创意生成、方案比选

实战案例:自动研究助手

def research_assistant(topic: str):
    """自动研究助手:搜索→分析→总结→生成报告"""
    
    # 1. 规划研究步骤
    plan = agent.invoke(f"为主题'{topic}'制定研究计划")
    
    # 2. 并行搜索多个方面
    with ThreadPoolExecutor() as executor:
        futures = [executor.invoke(search_tool, q) for q in plan.questions]
        results = [f.result() for f in futures]
    
    # 3. 分析和综合
    analysis = agent.invoke(f"分析以下信息:{results}")
    
    # 4. 生成报告
    report = agent.invoke(f"基于分析结果撰写研究报告")
    
    # 5. 自动保存
    write_file(f"report_{topic}.md", report)
    
    return report

总结

AI Agent 是大模型从”对话工具”走向”生产力工具”的关键一步。从单 Agent 的 ReAct 推理到 Multi-Agent 的协作系统,Agent 的能力边界正在不断扩展。掌握 Agent 开发,意味着能让 AI 自主完成复杂的多步骤任务,这将是未来软件开发的重要范式。