AI Agent 开发完全教程

从零到一构建智能体系统 · 2026年版

涵盖核心概念、框架选型、实战代码、部署最佳实践


目录

  1. 什么是 AI Agent
  2. Agent 核心架构解析
  3. 主流开发框架对比与选型
  4. 开发环境搭建
  5. 实战:从零构建 ReAct Agent
  6. 进阶:多 Agent 协作系统
  7. Agent 记忆系统设计与实现
  8. 工具调用系统
  9. 部署与生产化
  10. 最佳实践与常见坑

1. 什么是 AI Agent

1.1 定义

AI Agent(智能体) 是一个以大语言模型(LLM)为核心控制器,能够自主感知环境、制定计划、调用工具、执行行动并记忆经验的软件系统。它不只是"问答机器人",而是一个目标驱动的自主执行系统

“LLM is the brain, but the agent is the body.”

1.2 Agent vs 传统 Chatbot

维度 传统 Chatbot AI Agent
交互方式 一问一答 多步推理 + 自主执行
工具使用 调用 API/代码/数据库等
记忆能力 当前对话 长期记忆 + 向量检索
规划能力 任务分解 + 自我反思
自主性 被动响应 主动推进目标

1.3 典型应用场景

  • 代码开发助手:理解需求 → 写代码 → 调试 → 提 PR
  • 自动化数据分析:连接数据源 → 清洗 → 分析 → 出报告
  • 客服系统:理解问题 → 查知识库 → 调用工单系统 → 回复
  • 研究助手:搜索文献 → 摘要 → 关联分析 → 生成综述
  • 自动化运维:监控告警 → 排查 → 执行修复 → 验证

2. Agent 核心架构解析

一个完整的 AI Agent 系统由三大核心组件构成:

┌─────────────────────────────────────────────┐
│                 AI Agent                     │
│                                              │
│   ┌──────────┐    ┌──────────┐              │
│   │  Planning │    │  Memory  │              │
│   │  (规划)   │    │  (记忆)  │              │
│   │  · 任务分解 │    │  · 短期   │              │
│   │  · 反思    │    │  · 长期   │              │
│   │  · 自评   │    │  · 向量   │              │
│   └──────────┘    └──────────┘              │
│                                              │
│   ┌──────────┐    ┌──────────┐              │
│   │  Tool Use │    │  感知     │              │
│   │  (工具)   │    │ (Perception)│            │
│   │  · API    │    │  · 环境输入│             │
│   │  · 代码   │    │  · 用户输入│             │
│   │  · 搜索   │    │  · 反馈   │              │
│   └──────────┘    └──────────┘              │
│                                              │
│         ┌──────────────────┐                │
│         │   LLM Core (大脑) │                │
│         └──────────────────┘                │
└─────────────────────────────────────────────┘

2.1 Planning(规划系统)

任务分解(Task Decomposition)

Agent 将复杂任务拆解为可执行的子步骤。常用方法:

  • Chain of Thought (CoT):引导模型逐步思考
  • Tree of Thoughts (ToT):在每一步探索多个推理分支
  • Plan-and-Execute:先制定完整计划,再逐步执行
# 任务分解示例(伪代码)
prompt = f"""
用户目标: {user_goal}

请将上述目标分解为可执行的步骤,每一步应包含:
1. 步骤描述
2. 需要使用的工具
3. 预期输出

输出格式:
步骤1: ...
步骤2: ...
...
"""
自我反思(Self-Reflection)

Agent 在执行过程中不断评估自身行为并修正:

def reflect(history, last_action, last_result):
    prompt = f"""
    你刚刚执行了: {last_action}
    得到结果: {last_result}
    
    请评估:
    1. 这个结果是否符合预期?
    2. 是否有更好的执行方式?
    3. 下一步应该做什么?
    """
    return llm.invoke(prompt)

2.2 Memory(记忆系统)

记忆类型 实现方式 生命周期 用途
短期记忆 In-Context(上下文窗口) 单轮对话 当前任务上下文
长期记忆 向量数据库(如 Chroma/Pinecone) 持久化 跨会话知识
工作记忆 文件 / Redis 任务期间 中间结果暂存

2.3 Tool Use(工具使用)

Agent 通过工具与外部世界交互。工具的本质是一个函数 + Schema 描述

class Tool:
    name: str          # 工具名称
    description: str   # 工具描述(LLM 理解用)
    parameters: dict   # 参数 JSON Schema
    fn: Callable       # 实际执行函数

3. 主流开发框架对比与选型

3.1 框架全景图

框架 开发者 星标 核心思想 适合场景
LangChain LangChain 100k+ 链式组合 + 工具集成 通用 Agent 开发
LangGraph LangChain 15k+ 有向图状态机 复杂状态、长任务
CrewAI CrewAI 25k+ 角色化多 Agent 团队 多角色协作
AutoGen Microsoft 60k+ 多 Agent 对话编排 研究、代码生成
MetaGPT 开源 45k+ 软件公司模拟 自动化软件开发
OpenAI Agents SDK OpenAI 少量 轻量 Agent 实现 快速原型
Semantic Kernel Microsoft 25k+ 企业级 .NET/Python 企业集成

3.2 详细对比

维度 LangChain LangGraph CrewAI AutoGen
上手难度 ⭐⭐⭐ 中等 ⭐⭐⭐⭐ 较难 ⭐⭐ 简单 ⭐⭐⭐ 中等
灵活性 极高
多 Agent 有限 原生支持 原生支持 原生支持
状态管理 简单链 图状态机 流程控制 对话轮次
工具生态 最丰富 同 LangChain 中等 中等
企业级 部分
适合场景 快速开发 生产级 团队协作 研究探索

3.3 选型决策树

你的任务是什么?
├── 单个 Agent + 工具调用 → LangChain / OpenAI SDK
├── 复杂状态/长任务流程 → LangGraph
├── 多角色团队协作 → CrewAI
├── 自动化软件开发 → MetaGPT
└── 研究性多 Agent 对话 → AutoGen

3.4 生态评分(2026 实测)

框架 上手难度(10分制) 工具生态 部署友好度 社区活跃度
CrewAI 9.2 ⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐
LangGraph 6.5 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐
AutoGen 7.0 ⭐⭐⭐ ⭐⭐⭐ ⭐⭐⭐⭐
LangChain 7.5 ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐⭐

4. 开发环境搭建

4.1 基础环境

# Python 3.10+
python -m venv agent_env
source agent_env/bin/activate

# 安装核心依赖
pip install openai          # LLM 调用
pip install langchain       # LangChain 框架
pip install langgraph       # LangGraph(可选)
pip install crewai          # CrewAI(可选)
pip install pyautogen       # AutoGen(可选)

4.2 LLM 配置

# config.py
import os
from openai import OpenAI

# OpenAI API
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

# 或使用本地模型(Ollama)
# client = OpenAI(
#     base_url="http://localhost:11434/v1",
#     api_key="ollama"
# )

4.3 向量数据库(记忆用)

# 轻量方案:ChromaDB
pip install chromadb

# 生产方案:Qdrant / Pinecone / Weaviate

5. 实战:从零构建 ReAct Agent

ReAct(Reasoning + Acting)是最经典的 Agent 模式,让模型交替进行推理行动

5.1 定义工具集

# tools.py
import json
import requests
from datetime import datetime

class Tool:
    def __init__(self, name, description, parameters, fn):
        self.name = name
        self.description = description
        self.parameters = parameters  # JSON Schema
        self.fn = fn

    def run(self, **kwargs):
        return self.fn(**kwargs)

# 工具1:获取当前时间
def get_current_time():
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

time_tool = Tool(
    name="get_time",
    description="获取当前日期和时间",
    parameters={
        "type": "object",
        "properties": {},
        "required": []
    },
    fn=get_current_time
)

# 工具2:网页搜索
def web_search(query: str):
    response = requests.get(
        f"https://api.duckduckgo.com/?q={query}&format=json"
    )
    return response.text[:2000]

search_tool = Tool(
    name="web_search",
    description="搜索网络信息,参数为搜索关键词",
    parameters={
        "type": "object",
        "properties": {
            "query": {"type": "string", "description": "搜索关键词"}
        },
        "required": ["query"]
    },
    fn=web_search
)

# 工具3:计算器
def calculator(expression: str):
    return str(eval(expression))

calc_tool = Tool(
    name="calculator",
    description="执行数学计算,传入数学表达式字符串",
    parameters={
        "type": "object",
        "properties": {
            "expression": {"type": "string", "description": "数学表达式"}
        },
        "required": ["expression"]
    },
    fn=calculator
)

# 注册所有工具
TOOLS = [time_tool, search_tool, calc_tool]
TOOL_MAP = {t.name: t for t in TOOLS}

5.2 构建 Agent 核心循环

# agent.py
import json
from openai import OpenAI

client = OpenAI()

def build_system_prompt(tools):
    """构建系统提示词"""
    tool_descriptions = "\n".join([
        f"- {t.name}: {t.description}\n  参数: {json.dumps(t.parameters, indent=2)}"
        for t in tools
    ])
    
    return f"""你是一个 AI Agent,拥有以下工具可以使用:

{tool_descriptions}

工作流程:
1. 分析用户请求,决定是否需要使用工具
2. 如果需要工具,输出格式为:
   THOUGHT: 思考当前情况
   ACTION: {{"name": "工具名", "args": {{...}}}}
3. 得到工具结果后,继续推理
4. 最终输出答案给用户

规则:
- 一次只能调用一个工具
- 信息足够时直接回答,不要继续调用工具
- 如果工具返回错误,尝试其他方式解决
"""

def parse_action(text):
    """从模型输出中解析工具调用"""
    if "ACTION:" not in text:
        return None
    
    action_part = text.split("ACTION:")[-1].strip()
    try:
        return json.loads(action_part)
    except:
        return None

def run_agent(user_input, max_steps=10):
    """运行 Agent 主循环"""
    messages = [
        {"role": "system", "content": build_system_prompt(TOOLS)},
        {"role": "user", "content": user_input}
    ]
    
    for step in range(max_steps):
        # 调用 LLM
        response = client.chat.completions.create(
            model="gpt-4o",
            messages=messages,
            temperature=0.2
        )
        content = response.choices[0].message.content
        print(f"\n[Step {step}] LLM:\n{content}")
        
        # 检查是否需要调用工具
        action = parse_action(content)
        if action is None:
            # 没有工具调用,直接返回最终答案
            return content
        
        # 执行工具调用
        tool_name = action["name"]
        tool_args = action.get("args", {})
        
        if tool_name in TOOL_MAP:
            try:
                result = TOOL_MAP[tool_name].run(**tool_args)
                print(f"  → 工具 '{tool_name}' 返回: {result[:200]}")
            except Exception as e:
                result = f"工具调用失败: {str(e)}"
        else:
            result = f"工具 '{tool_name}' 不存在"
        
        # 将推理过程和工具结果加入对话
        messages.append({"role": "assistant", "content": content})
        messages.append({"role": "user", "content": f"工具 '{tool_name}' 返回结果: {result}"})
    
    return "达到最大步数限制,任务结束。"

5.3 运行示例

# main.py
from agent import run_agent

# 示例1:多步推理
result = run_agent("今天是几号?搜索一下今天AI圈有什么大事")
print(f"\n最终结果:\n{result}")

# 示例2:复杂计算
result = run_agent("计算 (1452 * 378) + 89234 等于多少")
print(f"\n最终结果:\n{result}")

5.4 使用 LangChain 快速实现(16 行代码)

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

@tool
def get_time() -> str:
    """获取当前日期时间"""
    from datetime import datetime
    return datetime.now().strftime("%Y-%m-%d %H:%M:%S")

@tool
def calculator(expression: str) -> str:
    """执行数学计算"""
    return str(eval(expression))

llm = ChatOpenAI(model="gpt-4o", temperature=0)
tools = [get_time, calculator]
agent = create_react_agent(llm, tools, prompt)
executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({"input": "今天几号?1452*378+89234等于多少?"})
print(result["output"])

6. 进阶:多 Agent 协作系统

6.1 多 Agent 架构模式

┌──────────────────────────────────────────┐
│           Orchestrator(协调者)           │
│  分解任务 → 分配 → 聚合结果 → 输出        │
└──────┬──────────┬──────────┬────────────┘
       │          │          │
  ┌────▼───┐ ┌────▼───┐ ┌────▼───┐
  │ Agent A │ │ Agent B │ │ Agent C │
  │ 搜索专家 │ │ 分析专家 │ │ 写作专家 │
  └────────┘ └────────┘ └────────┘

6.2 CrewAI 实现(推荐入门)

from crewai import Agent, Task, Crew, Process

# 定义 Agent
researcher = Agent(
    role="研究员",
    goal="搜索和收集相关信息",
    backstory="你是一名专业研究员,擅长从网络中快速找到准确信息",
    tools=[search_tool],
    verbose=True
)

analyst = Agent(
    role="分析师",
    goal="分析数据并得出结论",
    backstory="你是一名资深分析师,擅长从数据中发现洞察",
    verbose=True
)

writer = Agent(
    role="写作者",
    goal="撰写清晰易懂的报告",
    backstory="你是一名专业撰稿人,擅长将复杂信息转化为易懂的文字",
    verbose=True
)

# 定义任务
research_task = Task(
    description="搜索并整理关于'{topic}'的最新信息",
    agent=researcher,
    expected_output="一份包含关键事实和数据的摘要"
)

analysis_task = Task(
    description="基于搜索结果进行分析,给出核心洞察",
    agent=analyst,
    expected_output="一份包含分析和建议的报告"
)

writing_task = Task(
    description="将分析结果写成一篇完整的文章",
    agent=writer,
    expected_output="一篇结构清晰、内容完整的文章"
)

# 组建 Crew
crew = Crew(
    agents=[researcher, analyst, writer],
    tasks=[research_task, analysis_task, writing_task],
    process=Process.sequential  # 顺序执行
)

# 启动
result = crew.kickoff(inputs={"topic": "2026年AI Agent发展趋势"})
print(result)

6.3 LangGraph 实现(生产级)

from typing import TypedDict, List
from langgraph.graph import StateGraph, END
from langchain_openai import ChatOpenAI

# 定义状态
class AgentState(TypedDict):
    messages: List
    next_agent: str

# 定义 Agent 节点
def researcher_node(state: AgentState):
    llm = ChatOpenAI(model="gpt-4o")
    # ... 研究逻辑
    return {"messages": state["messages"] + [new_msg], "next_agent": "analyst"}

def analyst_node(state: AgentState):
    # ... 分析逻辑
    return {"messages": state["messages"] + [new_msg], "next_agent": "writer"}

def writer_node(state: AgentState):
    # ... 写作逻辑
    return {"messages": state["messages"] + [new_msg], "next_agent": "END"}

# 构建图
workflow = StateGraph(AgentState)
workflow.add_node("researcher", researcher_node)
workflow.add_node("analyst", analyst_node)
workflow.add_node("writer", writer_node)

workflow.set_entry_point("researcher")
workflow.add_conditional_edges("researcher", lambda s: s["next_agent"])
workflow.add_conditional_edges("analyst", lambda s: s["next_agent"])
workflow.add_edge("writer", END)

app = workflow.compile()

6.4 AutoGen 实现(研究型)

from autogen import AssistantAgent, UserProxyAgent, GroupChat, GroupChatManager

# 定义 Agent
researcher = AssistantAgent(
    name="Researcher",
    system_message="你是研究专家,负责搜索和收集信息。",
    llm_config={"config_list": [{"model": "gpt-4o", "api_key": "..."}]}
)

analyst = AssistantAgent(
    name="Analyst",
    system_message="你是分析专家,负责分析数据。",
    llm_config={"config_list": [{"model": "gpt-4o", "api_key": "..."}]}
)

writer = AssistantAgent(
    name="Writer",
    system_message="你是写作专家,负责撰写报告。",
    llm_config={"config_list": [{"model": "gpt-4o", "api_key": "..."}]}
)

# 构建群聊
group_chat = GroupChat(
    agents=[researcher, analyst, writer],
    messages=[],
    max_round=10
)
manager = GroupChatManager(groupchat=group_chat)

# 启动
user = UserProxyAgent(name="User", human_input_mode="NEVER")
user.initiate_chat(manager, message="分析2026年AI Agent发展趋势")

7. Agent 记忆系统设计与实现

7.1 记忆架构

短期记忆(上下文窗口)
    ↓ 重要信息提取
工作记忆(当前任务缓存)
    ↓ 持久化
长期记忆(向量数据库)

7.2 使用 ChromaDB 实现长期记忆

# memory.py
import chromadb
from chromadb.utils import embedding_functions

class AgentMemory:
    def __init__(self, collection_name="agent_memory"):
        self.client = chromadb.Client()
        self.collection = self.client.get_or_create_collection(
            name=collection_name,
            embedding_function=embedding_functions.DefaultEmbeddingFunction()
        )
    
    def remember(self, content: str, metadata: dict = None):
        """存储记忆"""
        self.collection.add(
            documents=[content],
            metadatas=[metadata or {}],
            ids=[f"mem_{int(time.time())}_{hash(content) % 10000}"]
        )
    
    def recall(self, query: str, n_results: int = 5):
        """根据查询召回相关记忆"""
        results = self.collection.query(
            query_texts=[query],
            n_results=n_results
        )
        return results['documents'][0] if results['documents'] else []
    
    def forget(self, older_than_days: int = 30):
        """清理过期记忆"""
        # 可按时间戳过滤删除
        pass

# 使用示例
memory = AgentMemory()
memory.remember("用户偏好Python语言", {"type": "preference"})
memory.remember("已完成项目:数据分析Agent", {"type": "project"})

# 召回
relevant = memory.recall("用户喜欢什么语言")
print(relevant)

7.3 记忆增强的 Agent

class MemoryAgent:
    def __init__(self):
        self.memory = AgentMemory()
        self.short_term = []  # 短期记忆
    
    def process(self, user_input: str):
        # 1. 检索相关长期记忆
        past_memories = self.memory.recall(user_input)
        
        # 2. 构建上下文(短期 + 长期)
        context = {
            "short_term": self.short_term[-5:],
            "long_term": past_memories
        }
        
        # 3. 执行推理(略)
        response = self._llm_inference(user_input, context)
        
        # 4. 更新记忆
        self.short_term.append({"role": "user", "content": user_input})
        self.short_term.append({"role": "assistant", "content": response})
        self.memory.remember(f"对话: {user_input} -> {response}")
        
        return response

8. 工具调用系统

8.1 工具注册模式

# tool_registry.py
from functools import wraps

class ToolRegistry:
    """全局工具注册器"""
    _tools = {}
    
    @classmethod
    def register(cls, name=None, description=None, schema=None):
        def decorator(func):
            tool_name = name or func.__name__
            cls._tools[tool_name] = {
                "fn": func,
                "name": tool_name,
                "description": description or func.__doc__ or "",
                "parameters": schema or cls._infer_schema(func)
            }
            @wraps(func)
            def wrapper(*args, **kwargs):
                return func(*args, **kwargs)
            return wrapper
        return decorator
    
    @classmethod
    def get_all(cls):
        return list(cls._tools.values())
    
    @classmethod
    def call(cls, name, **kwargs):
        if name not in cls._tools:
            raise ValueError(f"工具 '{name}' 未注册")
        return cls._tools[name]["fn"](**kwargs)

# 使用
@ToolRegistry.register(description="发送HTTP GET请求")
def http_get(url: str) -> str:
    import requests
    return requests.get(url, timeout=10).text

@ToolRegistry.register(description="执行Python代码")
def run_python(code: str) -> str:
    try:
        exec_globals = {}
        exec(code, exec_globals)
        return str(exec_globals.get("result", "执行完成"))
    except Exception as e:
        return f"执行错误: {e}"

8.2 工具安全沙箱

# safe_executor.py
import ast
import sys

class SandboxedExecutor:
    """安全执行环境"""
    ALLOWED_MODULES = {"math", "datetime", "json", "random", "statistics"}
    
    @classmethod
    def execute(cls, code: str, timeout: int = 5):
        # 1. AST 安全检查
        try:
            tree = ast.parse(code)
            for node in ast.walk(tree):
                if isinstance(node, ast.Call):
                    if isinstance(node.func, ast.Attribute):
                        if 'system' in node.func.attr.lower() or 'exec' in node.func.attr.lower():
                            return "安全限制:禁止调用系统相关函数"
        except SyntaxError as e:
            return f"语法错误: {e}"
        
        # 2. 受限环境执行
        restricted_globals = {
            "__builtins__": {
                "print": print, "len": len, "range": range,
                "int": int, "float": float, "str": str, "list": list,
                "dict": dict, "tuple": tuple, "set": set, "bool": bool,
                "max": max, "min": min, "sum": sum, "abs": abs,
                "sorted": sorted, "reversed": reversed, "enumerate": enumerate,
                "zip": zip, "map": map, "filter": filter, "type": type,
                "isinstance": isinstance, "hasattr": hasattr, "getattr": getattr,
                "True": True, "False": False, "None": None,
            }
        }
        
        try:
            exec(code, restricted_globals)
            return restricted_globals.get("result", "执行完成")
        except Exception as e:
            return f"执行错误: {e}"

9. 部署与生产化

9.1 项目结构

agent_project/
├── agent/
│   ├── __init__.py
│   ├── core.py          # Agent 主循环
│   ├── tools/           # 工具模块
│   │   ├── __init__.py
│   │   ├── search.py
│   │   ├── code_exec.py
│   │   └── database.py
│   ├── memory/          # 记忆模块
│   │   ├── __init__.py
│   │   ├── short_term.py
│   │   └── long_term.py
│   └── llm/             # LLM 客户端
│       ├── __init__.py
│       └── client.py
├── api/                 # API 服务
│   ├── __init__.py
│   ├── routes.py
│   └── schemas.py
├── config/
│   ├── settings.py
│   └── .env.example
├── tests/
├── Dockerfile
├── docker-compose.yml
└── requirements.txt

9.2 API 服务(FastAPI)

# api/routes.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from agent.core import Agent

app = FastAPI(title="Agent API")
agent = Agent()

class ChatRequest(BaseModel):
    message: str
    session_id: str = "default"
    stream: bool = False

class ChatResponse(BaseModel):
    response: str
    steps: list = []

@app.post("/chat", response_model=ChatResponse)
async def chat(request: ChatRequest):
    try:
        result = agent.run(
            request.message,
            session_id=request.session_id
        )
        return ChatResponse(response=result["output"])
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.post("/reset")
async def reset_session(session_id: str = "default"):
    agent.clear_memory(session_id)
    return {"status": "ok"}

@app.get("/tools")
async def list_tools():
    return agent.get_available_tools()

9.3 Docker 部署

# Dockerfile
FROM python:3.11-slim

WORKDIR /app

# 安装依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 复制代码
COPY . .

# 暴露端口
EXPOSE 8000

# 启动
CMD ["uvicorn", "api.routes:app", "--host", "0.0.0.0", "--port", "8000"]
# docker-compose.yml
version: '3.8'

services:
  agent-api:
    build: .
    ports:
      - "8000:8000"
    environment:
      - OPENAI_API_KEY=${OPENAI_API_KEY}
      - CHROMA_DB_URL=http://chromadb:8000
    depends_on:
      - chromadb
  
  chromadb:
    image: chromadb/chroma:latest
    ports:
      - "8001:8000"
    volumes:
      - chroma_data:/chroma/data

volumes:
  chroma_data:

9.4 监控与日志

# monitoring.py
import logging
import time
from datetime import datetime

class AgentMonitor:
    """Agent 监控器"""
    
    def __init__(self):
        self.logger = logging.getLogger("agent")
        self.metrics = {
            "total_calls": 0,
            "total_tokens": 0,
            "tool_calls": {},
            "errors": []
        }
    
    def log_call(self, func_name: str, duration: float, tokens: int):
        self.metrics["total_calls"] += 1
        self.metrics["total_tokens"] += tokens
        self.metrics["tool_calls"][func_name] = \
            self.metrics["tool_calls"].get(func_name, 0) + 1
    
    def log_error(self, error: str):
        self.metrics["errors"].append({
            "time": datetime.now().isoformat(),
            "error": error
        })
        self.logger.error(error)
    
    def report(self):
        return {
            **self.metrics,
            "avg_tokens_per_call": 
                self.metrics["total_tokens"] / max(self.metrics["total_calls"], 1)
        }

10. 最佳实践与常见坑

✅ 最佳实践

10.1 提示词工程
✅ 好的 Agent 提示词模板:

[角色定义]
你是一个 [具体角色],擅长 [具体能力]。

[工作流程]
1. 分析:理解用户真实需求
2. 计划:制定执行步骤
3. 执行:调用合适的工具
4. 综合:整合所有结果

[工具说明]
工具列表及使用规则...

[约束条件]
- 一次只调用一个工具
- 信息足够时直接回答
- 出错时尝试其他方案
10.2 错误处理
def robust_tool_call(tool_fn, max_retries=3, **kwargs):
    """带重试机制的工具调用"""
    for i in range(max_retries):
        try:
            return tool_fn(**kwargs)
        except RateLimitError:
            wait = 2 ** i
            time.sleep(wait)
        except TemporaryError:
            time.sleep(1)
        except PermanentError:
            return f"工具不可用: {kwargs}"
    return "多次重试后仍然失败"
10.3 成本控制
class CostManager:
    """Token 成本管理"""
    PRICING = {
        "gpt-4o": {"input": 2.5/1e6, "output": 10/1e6},
        "gpt-4o-mini": {"input": 0.15/1e6, "output": 0.6/1e6},
    }
    
    def __init__(self, model="gpt-4o"):
        self.model = model
        self.total_input = 0
        self.total_output = 0
    
    def track(self, input_tokens: int, output_tokens: int):
        self.total_input += input_tokens
        self.total_output += output_tokens
    
    @property
    def cost(self):
        p = self.PRICING[self.model]
        return self.total_input * p["input"] + self.total_output * p["output"]
    
    def summary(self):
        return {
            "model": self.model,
            "input_tokens": self.total_input,
            "output_tokens": self.total_output,
            "total_cost_usd": round(self.cost, 4)
        }
10.4 安全清单
项目 检查项 优先级
提示词注入 过滤用户输入中的系统指令覆盖 🔴 必做
工具沙箱 代码执行使用隔离环境 🔴 必做
速率限制 防止 API 滥用 🟡 建议
日志审计 记录所有 Agent 操作 🟡 建议
权限控制 工具最小权限原则 🔴 必做
数据脱敏 用户敏感信息过滤 🔴 必做

❌ 常见坑

表现 解决方案
循环调用 Agent 不停调用工具停不下来 设置最大步数 + 循环检测
幻觉工具 LLM 调用不存在的工具 strict tool binding + schema 校验
上下文爆炸 Token 用尽,丢失上下文 窗口滑动 + 摘要压缩
提示词注入 用户让 Agent 忽略指令 输入过滤 + 系统提示加固
工具死锁 多 Agent 互相等待 设置超时 + 协调者仲裁
成本失控 复杂任务消耗大量 Token 预算限制 + 模型分级

附录

A. 推荐学习资源

资源 类型 链接
Lilian Weng Agent 综述 博客 lilianweng.github.io
LangChain 官方教程 文档 python.langchain.com
CrewAI 文档 文档 docs.crewai.com
AutoGen 示例 GitHub github.com/microsoft/autogen
LangGraph 教程 文档 langchain-ai.github.io/langgraph
OpenAI Function Calling 文档 platform.openai.com

B. 常用工具模板

# 文件操作工具
@ToolRegistry.register(description="读取文件内容")
def read_file(path: str) -> str:
    with open(path, 'r') as f:
        return f.read()

# 数据库查询工具
@ToolRegistry.register(description="执行 SQL 查询")
def query_database(sql: str) -> list:
    import sqlite3
    conn = sqlite3.connect("data.db")
    return conn.execute(sql).fetchall()

# 图像理解工具
@ToolRegistry.register(description="分析图片内容")
def analyze_image(url: str) -> str:
    # 调用多模态模型
    pass

C. 框架速查表

需要做什么?                    → 选什么框架?
─────────────────────────────────────────────
单 Agent + 工具链              → LangChain / OpenAI SDK
复杂状态机 + 长任务             → LangGraph
多角色团队协作                 → CrewAI
多 Agent 自由对话              → AutoGen
自动化软件开发                 → MetaGPT
企业 .NET 集成                 → Semantic Kernel
简单快速原型                   → OpenAI Agents SDK

文档版本: v1.0 | 最后更新: 2026-07-15

本教程涵盖了从 Agent 基础概念到生产部署的完整链路。建议按照章节顺序学习,每章都配有可直接运行的代码示例。如有问题,欢迎交流。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐