跳到主要内容

AI Agent 知识速查表

本页面汇总了 AI Agent 开发中最常用的概念、API 和最佳实践,方便快速查阅。

核心概念​

概念说明
Agent能够感知环境、做出决策并采取行动的智能系统
LLM大语言模型,Agent 的"大脑",负责推理和决策
Tool工具,Agent 与外部世界交互的桥梁
Memory记忆系统,存储对话历史和知识信息
Planning规划模块,将复杂任务分解为子任务
Task Decomposition任务分解,将大目标拆分为可执行的小步骤
ReAct推理与行动交替进行的执行模式
Function CallingLLM 调用外部函数的机制
LangGraph用于构建有状态 Agent 的图框架
Middleware中间件,用于扩展 Agent 能力
CoT (Chain of Thought)思维链,逐步推理的提示技术
ToT (Tree of Thoughts)思维树,探索多条推理路径的方法

Agent 公式​

经典公式​

AI Agent = LLM + Planning + Memory + Tools

LangChain 1.0 架构​

Agent = Model + Tools + System Prompt + State (+ Middleware)

LangChain 1.0 API(推荐)​

创建 Agent​

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool

@tool
def my_tool(param: str) -> str:
"""工具描述(LLM 会读取这个描述)"""
return f"结果:{param}"

llm = ChatOpenAI(model="gpt-4", temperature=0)

agent = create_agent(
model=llm,
tools=[my_tool],
system_prompt="你是一个智能助手。"
)

# 调用 Agent
result = agent.invoke({
"messages": [{"role": "user", "content": "用户输入"}]
})

print(result["messages"][-1].content)

流式输出​

for chunk in agent.stream({
"messages": [{"role": "user", "content": "用户输入"}]
}):
print(chunk)

带状态的 Agent​

from langchain.agents import AgentState
from typing import TypedDict

class MyState(AgentState):
user_id: str
preferences: dict

agent = create_agent(
model=llm,
tools=[...],
state_schema=MyState
)

中间件​

from langchain.agents.middleware import AgentMiddleware

class LoggingMiddleware(AgentMiddleware):
def before_model(self, state, context):
"""模型调用前执行"""
print(f"调用模型")
return {} # 返回空字典表示不更新状态

def after_model(self, state, context):
"""模型调用后执行"""
print(f"模型响应")
return {}

def wrap_tool_call(self, request, handler):
"""包装工具调用"""
try:
result = yield handler(request)
return result
except Exception as e:
print(f"工具错误:{e}")
return f"工具执行出错,请尝试其他方法。"

agent = create_agent(
model=llm,
tools=[...],
middleware=[LoggingMiddleware()]
)

结构化输出​

from pydantic import BaseModel, Field

class Answer(BaseModel):
summary: str = Field(description="摘要")
key_points: list[str] = Field(description="关键点")

agent = create_agent(
model=llm,
tools=[...],
response_format=Answer
)

result = agent.invoke({...})
# result 将是结构化的 Answer 对象

工具定义​

基本工具​

from langchain_core.tools import tool

@tool
def search(query: str) -> str:
"""搜索互联网获取信息"""
return f"搜索结果:{query}"

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

带参数验证的工具​

from langchain_core.tools import StructuredTool
from pydantic import BaseModel, Field, validator

class WeatherInput(BaseModel):
city: str = Field(description="城市名称")
unit: str = Field(default="celsius", description="温度单位")

@validator('city')
def validate_city(cls, v):
if len(v) < 2:
raise ValueError('城市名称太短')
return v

def get_weather(city: str, unit: str = "celsius") -> str:
return f"{city}:25°{unit[0].upper()}"

weather_tool = StructuredTool(
name="get_weather",
description="获取城市天气",
func=get_weather,
args_schema=WeatherInput
)

记忆类型​

类型说明适用场景
ConversationBufferMemory保存所有对话短对话
ConversationBufferWindowMemory保留最近 N 轮长对话
ConversationTokenBufferMemory按 token 限制控制上下文长度
ConversationSummaryMemory自动总结超长对话
VectorStoreRetrieverMemory向量检索长期记忆

LangChain 1.0 记忆​

# Agent 自动维护对话历史
agent = create_agent(model=llm, tools=[...])

# 第一次调用
agent.invoke({"messages": [{"role": "user", "content": "我叫张三"}]})

# 第二次调用(Agent 记得之前的对话)
agent.invoke({"messages": [{"role": "user", "content": "我叫什么名字?"}]})

OpenAI Function Calling​

工具定义格式​

tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取城市天气",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称"
}
},
"required": ["city"]
}
}
}
]

直接调用​

from openai import OpenAI
import json

client = OpenAI()

response = client.chat.completions.create(
model="gpt-4",
messages=[{"role": "user", "content": "北京天气"}],
tools=tools,
tool_choice="auto"
)

if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
function_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
# 执行函数...

LangGraph 状态图​

基本结构​

from typing import TypedDict, Annotated
from langgraph.graph import StateGraph, END
import operator

class State(TypedDict):
messages: Annotated[list, operator.add]

def agent_node(state: State) -> dict:
return {"messages": [response]}

workflow = StateGraph(State)
workflow.add_node("agent", agent_node)
workflow.set_entry_point("agent")
workflow.add_edge("agent", END)

app = workflow.compile()

条件路由​

def should_continue(state: State) -> str:
if state["messages"][-1].tool_calls:
return "tools"
return "end"

workflow.add_conditional_edges(
"agent",
should_continue,
{"tools": "tools", "end": END}
)

评估与测试​

LangSmith 配置​

import os

os.environ["LANGSMITH_API_KEY"] = "your-key"
os.environ["LANGSMITH_TRACING"] = "true"
os.environ["LANGSMITH_PROJECT"] = "my-project"

运行评估​

from langchain.smith import RunEvalConfig, run_on_dataset
from langsmith import Client

client = Client()

eval_config = RunEvalConfig(
evaluators=["exact_match", "contains"],
eval_llm=ChatOpenAI(model="gpt-4")
)

results = run_on_dataset(
client=client,
dataset_name="my-dataset",
llm_or_chain_factory=lambda: agent,
evaluation=eval_config
)

部署​

LangServe​

from langserve import add_routes
from fastapi import FastAPI
import uvicorn

app = FastAPI()
add_routes(app, agent, path="/agent")

if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", port=8000)

Docker​

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

常用提示词模板​

系统提示词​

SYSTEM_PROMPT = """
你是一个专业的助手,具备以下能力:
1. 信息搜索和分析
2. 任务规划和执行
3. 结果总结和报告

请根据用户需求,合理使用工具完成任务。
如果遇到问题,请说明原因并提供替代方案。
"""

ReAct 提示词​

问题:用户的问题
思考:你应该做什么
行动:工具名称
行动输入:工具参数
观察:工具返回结果
...(重复思考/行动/观察)
思考:我现在知道最终答案
最终答案:对原始问题的回答

错误处理模式​

重试机制​

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(min=4, max=10))
def call_agent_with_retry(agent, input_text):
return agent.invoke({"messages": [{"role": "user", "content": input_text}]})

错误处理中间件​

class ErrorHandlingMiddleware(AgentMiddleware):
def wrap_tool_call(self, request, handler):
"""包装工具调用,处理错误"""
try:
result = yield handler(request)
return result
except Exception as e:
tool_name = request.get("name", "unknown")
return f"工具 {tool_name} 执行失败,已记录日志。"

规划与任务分解​

任务分解示例​

from pydantic import BaseModel, Field
from typing import List

class TaskPlan(BaseModel):
"""任务计划"""
goal: str = Field(description="原始目标")
subtasks: List[str] = Field(description="子任务列表")

def decompose_task(goal: str) -> TaskPlan:
"""分解任务"""
llm = ChatOpenAI(model="gpt-4", temperature=0)

prompt = f"""请将以下目标分解为具体的执行步骤:
目标:{goal}

返回 JSON 格式的任务列表。"""

chain = llm.with_structured_output(TaskPlan)
return chain.invoke({"goal": goal})

Plan-and-Execute 模式​

from langgraph.graph import StateGraph, END

# 规划节点
def plan_node(state):
# 生成执行计划
return {"plan": [...]}

# 执行节点
def execute_node(state):
# 执行当前步骤
return {"current_step": state["current_step"] + 1}

# 构建工作流
workflow = StateGraph(State)
workflow.add_node("plan", plan_node)
workflow.add_node("execute", execute_node)
workflow.set_entry_point("plan")
workflow.add_edge("plan", "execute")
workflow.add_conditional_edges("execute", should_continue, {
"execute": "execute",
"end": END
})

思维链推理​

def chain_of_thought(question: str) -> str:
"""使用思维链进行推理"""
prompt = f"""请一步步思考解决以下问题:

问题:{question}

让我们一步步思考:"""

return llm.invoke(prompt).content

性能优化​

并行工具调用​

import asyncio

async def execute_parallel(tool_calls):
tasks = [execute_tool(call) for call in tool_calls]
return await asyncio.gather(*tasks)

缓存结果​

from functools import lru_cache

@lru_cache(maxsize=100)
def cached_search(query: str) -> str:
return search_api(query)

调试技巧​

启用详细日志​

import logging
logging.basicConfig(level=logging.DEBUG)

agent = create_agent(
model=llm,
tools=[...],
verbose=True
)

追踪执行​

# LangSmith 自动追踪
os.environ["LANGSMITH_TRACING"] = "true"

# 查看执行详情
for step in agent.stream({...}):
print(step)

常见问题解决​

问题解决方案
Agent 陷入循环设置迭代限制,添加终止条件
工具调用参数错误添加参数验证和默认值
上下文过长使用总结或滑动窗口记忆
响应太慢使用流式输出、并行执行
结果不稳定降低 temperature 参数
工具执行失败添加重试机制和错误处理

最佳实践清单​

  • 为每个工具编写清晰的描述
  • 实现健壮的错误处理
  • 添加输入验证
  • 设置合理的迭代限制
  • 使用 LangSmith 追踪执行
  • 对敏感信息进行脱敏
  • 编写单元测试和评估
  • 配置监控和告警

参考链接​