返回博客

如何用大模型 API 搭建智能体 Agent

2026/9/12 分钟阅读

如何用大模型 API 搭建智能体 Agent

搭建智能体 Agent 的核心在于让大模型具备「思考 - 行动 - 观察」的循环能力。通过函数调用(Function Calling)接口,模型可以决定调用哪个工具、传入什么参数,开发者只需实现工具逻辑并将结果返回给模型,即可构建出能处理复杂任务的自动化代理。

智能体的核心架构:ReAct 模式

目前最稳健的 Agent 实现模式是 ReAct(Reasoning + Acting)。它不是让模型一次性输出结果,而是让它以 JSON 格式输出思维链:先决定要调用什么工具,再根据返回结果决定下一步。这种结构比简单的 Prompt 工程更可靠,因为错误被限制在工具调用层面,而非幻觉层面。

一个标准的 Agent 循环包含三个状态:

  1. Think:模型分析当前上下文,决定是否需要工具。
  2. Act:模型输出工具调用指令。
  3. Observe:系统执行工具,将结果注入上下文。

最小可行实现:Python 代码示例

以下是基于 OpenAI 风格 API 的极简实现。重点在于 function_call 的处理循环。

import openai
import json

# 定义可用工具
TOOLS = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的当前天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {"type": "string", "description": "城市名称"}
                },
                "required": ["city"]
            }
        }
    }
]

def execute_tool(name, arguments):
    # 实际项目中这里应连接真实数据库或服务
    if name == "get_weather":
        return json.dumps({"city": arguments["city"], "temp": "25°C", "condition": "晴"})
    return "Unknown tool"

def run_agent(messages):
    while True:
        response = openai.chat.completions.create(
            model="gpt-4",
            messages=messages,
            tools=TOOLS,
            tool_choice="auto"
        )
        
        message = response.choices[0].message
        
        # 没有工具调用,直接返回最终答案
        if not message.tool_calls:
            return message.content
            
        # 处理工具调用
        for tool_call in message.tool_calls:
            func_name = tool_call.function.name
            func_args = json.loads(tool_call.function.arguments)
            result = execute_tool(func_name, func_args)
            
            # 将工具结果追加到对话历史,让模型继续推理
            messages.append(tool_call)  # 追加模型的工具调用消息
            messages.append({
                "role": "tool",
                "tool_call_id": tool_call.id,
                "content": result
            })

# 使用示例
messages = [{"role": "user", "content": "北京今天天气怎么样?"}]
answer = run_agent(messages)
print(answer)

常见陷阱与优化方向

1. 上下文溢出 随着工具调用次数增加,对话历史会迅速变长。务必实现上下文截断策略,只保留最近的 N 轮交互或关键摘要,否则 Token 成本会指数级上升。

2. 工具幂等性 确保你的工具函数是幂等的。模型可能会重试失败的工具调用,如果工具涉及数据库写入(如删除订单),重试可能导致数据重复。

3. 错误处理 当工具执行抛出异常时,不要直接中断。应将错误信息格式化后作为 content 返回给模型,让它有机会修正参数或换用其他工具。

下一步实践

建议从单工具场景开始验证 ReAct 循环的稳定性,再逐步引入多工具路由和记忆模块。你可以尝试将上述代码封装为类,并接入 LangChain 或 LlamaIndex 等框架以实现更复杂的链式调用。

推荐阅读《LLM Powered Autonomous Agents》论文,深入了解 ReAct 的理论基础与进阶变体。