AI Agent 架构设计与实战:从 ReAct 到多智能体协作

85次阅读
没有评论

AI Agent 架构设计与实战:从 ReAct 到多智能体协作

2026年,AI Agent 已经从实验室概念走向生产环境。无论是自动化运维、智能客服,还是代码生成、数据分析,Agent 都在重新定义人与 AI 的协作方式。本文将深入剖析 Agent 的核心架构,并通过完整代码示例带你从零构建一个可落地的智能体系统。

1. 什么是 AI Agent?

简单来说,AI Agent 是一个能够自主感知环境、制定计划、调用工具并迭代完成目标的系统。与传统的大模型”一问一答”不同,Agent 具备以下核心能力:

  • 自主决策:根据上下文动态规划执行步骤
  • 工具调用:操作外部 API、数据库、文件系统等
  • 记忆能力:维护短期工作记忆和长期知识库
  • 多轮迭代:根据执行结果反馈修正策略

想象一下,你告诉 Agent “帮我分析本周的销售数据并生成报告”,它会自己读取数据、运行分析、生成图表、输出文档——整个过程无需逐步指令。

2. ReAct 框架:Agent 的基石

ReAct(Reason + Act)是当前最主流的 Agent 框架,核心思想是让模型交替进行”思考”和”行动”:

  • Thought:模型分析当前状态,决定下一步
  • Action:执行具体工具调用
  • Observation:获取执行结果,反馈给模型

下面是一个精简但完整的 ReAct Agent 实现:

from openai import OpenAI
import json

TOOLS = {
    "web_search": lambda q: f"[搜索结果] 关于 '{q}' 的模拟搜索结果...",
    "calculator": lambda expr: str(eval(expr)),
    "get_weather": lambda city: f"{city}: 晴, 22°C, 湿度 65%",
}

TOOL_SCHEMAS = [
    {"name": "web_search", "description": "搜索互联网获取信息", "parameters": {"query": "string"}},
    {"name": "calculator", "description": "执行数学计算", "parameters": {"expression": "string"}},
    {"name": "get_weather", "description": "查询城市天气", "parameters": {"city": "string"}},
]

SYSTEM_PROMPT = """你是一个具备工具调用能力的 AI Agent。
当需要调用工具时,严格按以下格式回复:
Action: {tool_name}
Action Input: {input_json}

当已获得足够信息回答时,按以下格式回复:
Final Answer: {你的回答}"""

def run_agent(user_query: str, max_rounds: int = 8):
    client = OpenAI()
    messages = [
        {"role": "system", "content": SYSTEM_PROMPT},
        {"role": "user", "content": user_query}
    ]

    for round_i in range(max_rounds):
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
            tools=[{"type": "function", "function": {
                "name": t["name"],
                "description": t["description"],
                "parameters": {
                    "type": "object",
                    "properties": {k: {"type": "string"} for k in t["parameters"].values()},
                    "required": list(t["parameters"].keys())
                }
            }} for t in TOOL_SCHEMAS]
        )

        msg = response.choices[0].message
        messages.append(msg)

        if msg.tool_calls:
            for call in msg.tool_calls:
                func_name = call.function.name
                args = json.loads(call.function.arguments)
                # 合并参数为简单输入
                args_str = " ".join(args.values()) if len(args) == 1 else json.dumps(args)
                result = TOOLS.get(func_name, lambda _: "未知工具")(args_str)
                messages.append({
                    "role": "tool",
                    "tool_call_id": call.id,
                    "content": result
                })
                print(f"[Round {round_i+1}] {func_name}({args_str}) → {result}")
        else:
            print(f"\n✅ 最终回答:\n{msg.content}")
            return msg.content

# 运行示例
run_agent("北京今天天气怎么样?气温适合穿什么?")

这个示例展示了 ReAct 的完整循环:模型思考 → 调用工具 → 观察结果 → 再次思考,直到得出最终答案。

3. 记忆系统:让 Agent 拥有”记忆力”

没有记忆的 Agent 每次对话都是”失忆状态”。一个实用的记忆系统通常包含两层:

from collections import deque
import time

class AgentMemory:
    def __init__(self, max_short=20, max_long=100):
        # 短期记忆:最近 N 轮对话
        self.short_term = deque(maxlen=max_short)
        # 长期记忆:重要信息持久化
        self.long_term = []
        self.max_long = max_long

    def add_short(self, role: str, content: str):
        self.short_term.append({
            "role": role,
            "content": content,
            "timestamp": time.time()
        })

    def add_long(self, key: str, value: str, importance: float = 0.8):
        """存储重要信息到长期记忆,importance 越高越不容易被淘汰"""
        self.long_term.append({
            "key": key,
            "value": value,
            "importance": importance,
            "timestamp": time.time()
        })
        # 超过容量时淘汰低重要度记忆
        if len(self.long_term) > self.max_long:
            self.long_term.sort(key=lambda x: x["importance"])
            self.long_term.pop(0)

    def get_short_context(self):
        return [{"role": m["role"], "content": m["content"]} for m in self.short_term]

    def search_long(self, query: str, top_k=3):
        """简单的关键词匹配,生产环境建议用向量搜索"""
        scored = []
        query_words = set(query.lower().split())
        for item in self.long_term:
            overlap = len(query_words & set(item["value"].lower().split()))
            score = overlap * item["importance"]
            scored.append((score, item))
        scored.sort(key=lambda x: -x[0])
        return [item for _, item in scored[:top_k]]

# 使用示例
memory = AgentMemory()
memory.add_short("user", "帮我分析销售数据")
memory.add_short("assistant", "好的,正在处理...")
memory.add_long("user_pref", "用户偏好使用柱状图展示数据", 0.9)
memory.add_long("data_source", "销售数据位于 /data/sales_2026.csv", 0.95)

print("短期记忆:", len(memory.get_short_context()), "条")
print("长期记忆搜索:", memory.search_long("数据图表"))

生产环境中,长期记忆应使用向量数据库(如 Chroma、Pinecone)替代关键词匹配,配合 Embedding 模型实现语义搜索。

4. 多智能体协作:1+1>2

单个 Agent 能力有限,复杂任务需要多智能体协作。常见模式包括:

  • 管道模式:A 的输出作为 B 的输入
  • 分工模式:不同 Agent 负责不同子任务
  • 辩论模式:多个 Agent 讨论后达成共识

以下是一个”研究员 + 编辑”双 Agent 协作系统:

class ResearchAgent:
    """负责信息搜集和分析"""
    def run(self, topic: str):
        print(f"🔍 研究员正在分析: {topic}")
        # 模拟深度研究过程
        return {
            "topic": topic,
            "findings": [
                f"{topic} 市场规模年增长率达 35%",
                f"头部玩家占据了 60% 市场份额",
                f"新兴技术正在重塑行业格局"
            ],
            "data": {"growth_rate": 0.35, "top3_share": 0.60}
        }

class EditorAgent:
    """负责将研究内容整理为成品报告"""
    def run(self, research_data: dict) -> str:
        print(f"✍️ 编辑正在整理报告: {research_data['topic']}")
        report = f"# {research_data['topic']} 深度报告\n\n"
        report += "## 核心发现\n"
        for i, finding in enumerate(research_data["findings"], 1):
            report += f"{i}. {finding}\n"
        report += f"\n## 关键指标\n"
        report += f"- 年增长率: {research_data['data']['growth_rate']*100}%\n"
        report += f"- Top3 市占率: {research_data['data']['top3_share']*100}%\n"
        return report

class Pipeline:
    """编排多 Agent 协作流程"""
    def __init__(self):
        self.agents = []

    def add_agent(self, agent):
        self.agents.append(agent)
        return self

    def execute(self, initial_input):
        data = initial_input
        for agent in self.agents:
            data = agent.run(data)
        return data

# 运行多 Agent 协作
pipeline = Pipeline()
pipeline.add_agent(ResearchAgent())
pipeline.add_agent(EditorAgent())

report = pipeline.execute("2026年AI Agent市场趋势")
print("\n" + "="*50)
print(report)

这个管道模式可以轻松扩展——加入审核 Agent、翻译 Agent、图表生成 Agent 等,构建完整的内容生产线。

5. 生产环境落地建议

将 Agent 从 Demo 推向生产,需要关注以下几个关键点:

  • 错误恢复:工具调用可能失败,Agent 需要优雅处理异常并重试。建议设置最大重试次数和降级策略。
  • 安全防护:Agent 拥有工具调用能力,必须做好权限控制。敏感操作(删除、支付、外发)需要人工确认。
  • 成本控制:每次工具调用都消耗 Token,合理设置 max_rounds 上限,避免 Agent 陷入无限循环。
  • 可观测性:记录每轮 Thought/Action/Observation,方便调试和优化。LangSmith、Langfuse 等工具是不错的选择。
  • 提示词工程:Agent 的行为高度依赖 System Prompt。建议用结构化的方式描述工具、约束和输出格式。

总结

AI Agent 正在从”能聊天的 AI”进化为”能干活 AI”。ReAct 框架提供了坚实的理论基础,记忆系统赋予 Agent 持续服务能力,多智能体协作则解锁了复杂场景的处理能力。

2026 年的 Agent 生态已经相当成熟——从 LangChain、LlamaIndex 这样的开发框架,到 AutoGPT、CrewAI 这样的编排平台,再到 Dify、Coze 这样的低代码工具,开发者可以根据需求灵活选择。

核心建议:从小场景切入,先让 Agent 在一个具体任务上跑通,再逐步扩展能力边界。 不要试图一步到位造一个全能 Agent,而是构建一个能真正解决痛点的专用智能体。

正文完
 0
评论(没有评论)