6 种 Agent 类型的完整可运行代码

1.ZERO_SHOT_REACT_DESCRIPTION

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_classic.agents import initialize_agent
import os
import re
from dotenv import load_dotenv
load_dotenv()

# 定义LLM
llm = ChatOpenAI(
    model="glm-4-flash",
    temperature=0.7,
    max_tokens=4096,
    api_key=os.getenv("ZHIPUAI_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

os.environ['SERPAPI_API_KEY'] = '723a13895923198c86b781d6a24803faa6db54ea823506acb006697df2cee910'

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """用于执行数学计算。输入是一个数学表达式,例如:'78 ** 2' 或 '81 * 81'"""
    try:
        clean_expr = re.sub(r'[^0-9+\-*/().** ]', '', expression)
        clean_expr = clean_expr.strip()
        result = eval(clean_expr)
        return str(result)
    except Exception as e:
        return f"计算错误: {e},请检查表达式格式"

# 加载工具
search_tools = load_tools(["serpapi"], llm=llm)
tools = search_tools + [calculator]

agent = initialize_agent(
    tools,
    llm,
    agent_type="zero-shot-react-description",
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=12,
    agent_kwargs={
        "prefix": "你是一个有用的中文助手,可以搜索信息和做数学计算。请始终用中文回答。当前日期是2026年5月7日。"
    }
)

result = agent.invoke({"input": "请问现任的美国总统的是谁,他的年龄的平方是多大"})
print(result["output"])

2.CHAT_ZERO_SHOT_REACT_DESCRIPTION

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_classic.agents import initialize_agent
import os
import re
from dotenv import load_dotenv
load_dotenv()

# 定义LLM
llm = ChatOpenAI(
    model="glm-4-flash",
    temperature=0.7,
    max_tokens=4096,
    api_key=os.getenv("ZHIPUAI_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

os.environ['SERPAPI_API_KEY'] = '723a13895923198c86b781d6a24803faa6db54ea823506acb006697df2cee910'

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """用于执行数学计算。输入是一个数学表达式,例如:'78 ** 2' 或 '81 * 81'"""
    try:
        clean_expr = re.sub(r'[^0-9+\-*/().** ]', '', expression)
        clean_expr = clean_expr.strip()
        result = eval(clean_expr)
        return str(result)
    except Exception as e:
        return f"计算错误: {e},请检查表达式格式"

# 加载工具
search_tools = load_tools(["serpapi"], llm=llm)
tools = search_tools + [calculator]

agent = initialize_agent(
    tools,
    llm,
    agent_type="chat-zero-shot-react-description",
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=12,
    agent_kwargs={
        "system_message": "你是一个有用的中文助手,可以搜索信息和做数学计算。请始终用中文回答。当前日期是2026年5月7日。"
    }
)

result = agent.invoke({"input": "请问现任的美国总统的是谁,他的年龄的平方是多大"})
print(result["output"])

3.CONVERSATIONAL_REACT_DESCRIPTION

python 复制代码
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaver
import os
import re
from dotenv import load_dotenv
load_dotenv()

# 定义LLM
llm = ChatOpenAI(
    model="glm-4-flash",
    temperature=0.7,
    max_tokens=4096,
    api_key=os.getenv("ZHIPUAI_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

os.environ['SERPAPI_API_KEY'] = '723a13895923198c86b781d6a24803faa6db54ea823506acb006697df2cee910'

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """用于执行数学计算。输入是一个数学表达式,例如:'78 ** 2' 或 '81 * 81'"""
    try:
        clean_expr = re.sub(r'[^0-9+\-*/().** ]', '', expression)
        clean_expr = clean_expr.strip()
        result = eval(clean_expr)
        return str(result)
    except Exception as e:
        return f"计算错误: {e},请检查表达式格式"

# 加载工具
search_tools = load_tools(["serpapi"], llm=llm)
tools = search_tools + [calculator]

# 创建记忆(新版方式)
checkpointer = InMemorySaver()

agent = create_agent(
    model=llm,
    tools=tools,
    system_prompt="""你是一个有用的中文助手,可以搜索信息和做数学计算。
规则:
1. 始终用中文回答
2. 如果用户问需要计算的问题,必须使用 calculator 工具进行计算
3. 当前日期是2026年5月7日
4. 如果用户问的是上一轮提到的人物,直接使用上一轮的信息,不需要重新搜索""",
    checkpointer=checkpointer,
)

# 使用 thread_id 来区分对话,同一个 thread_id 会记住之前的对话
config = {"configurable": {"thread_id": "1"}}

# 第一轮对话
result1 = agent.invoke(
    {"messages": [{"role": "user", "content": "请问现任的美国总统的是谁,他的年龄的平方是多大"}]},
    config=config
)
print("第一轮:", result1["messages"][-1].content)

# 第二轮对话(同一个 thread_id,会记住上一轮)
result2 = agent.invoke(
    {"messages": [{"role": "user", "content": "他的年龄是多大"}]},
    config=config
)
print("第二轮:", result2["messages"][-1].content)

4.CHAT_CONVERSATIONAL_REACT_DESCRIPTION(多轮对话)

python 复制代码
# CHAT_CONVERSATIONAL_REACT_DESCRIPTION.py
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain.agents import create_agent
from langgraph.checkpoint.memory import InMemorySaver
import os
import re
from dotenv import load_dotenv
load_dotenv()

# 定义LLM
llm = ChatOpenAI(
    model="glm-4-flash",
    temperature=0.7,
    max_tokens=4096,
    api_key=os.getenv("ZHIPUAI_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

os.environ['SERPAPI_API_KEY'] = '723a13895923198c86b781d6a24803faa6db54ea823506acb006697df2cee910'

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """用于执行数学计算。输入是一个数学表达式,例如:'78 ** 2' 或 '81 * 81'"""
    try:
        clean_expr = re.sub(r'[^0-9+\-*/().** ]', '', expression)
        clean_expr = clean_expr.strip()
        result = eval(clean_expr)
        return str(result)
    except Exception as e:
        return f"计算错误: {e},请检查表达式格式"

# 加载工具
search_tools = load_tools(["serpapi"], llm=llm)
tools = search_tools + [calculator]

# 创建记忆(新版方式)
checkpointer = InMemorySaver()

# 创建 Agent
agent = create_agent(
    model=llm,
    tools=tools,
    system_prompt="""你是一个有用的中文助手,可以搜索信息和做数学计算。

规则:
1. 始终用中文回答
2. 需要计算时,必须使用 calculator 工具
3. 当前日期是2026年5月7日
4. 用户提到"他""她"等代词时,指的是上一轮对话中提到的人物
5. 如果上一轮已经找到了人物信息(如年龄),直接使用,不需要重新搜索""",
    checkpointer=checkpointer,
)

# 使用 thread_id 来区分对话
config = {"configurable": {"thread_id": "1"}}

# 第一轮
print("=" * 50)
print("用户:请问现任的美国总统是谁")
print("=" * 50)
result1 = agent.invoke(
    {"messages": [{"role": "user", "content": "请问现任的美国总统是谁"}]},
    config
)
print("Agent:", result1["messages"][-1].content)

# 第二轮(测试记忆)
print("=" * 50)
print("用户:他的年龄的平方是多大")
print("=" * 50)
result2 = agent.invoke(
    {"messages": [{"role": "user", "content": "他的年龄的平方是多大"}]},
    config
)
print("Agent:", result2["messages"][-1].content)

# 第三轮(继续测试记忆)
print("=" * 50)
print("用户:他出生在哪一年")
print("=" * 50)
result3 = agent.invoke(
    {"messages": [{"role": "user", "content": "他出生在哪一年"}]},
    config
)
print("Agent:", result3["messages"][-1].content)

5.OPENAI_FUNCTIONS

python 复制代码
# OPENAI_FUNCTIONS.py
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_classic.agents import initialize_agent
import os
import re
from dotenv import load_dotenv
load_dotenv()

# 定义LLM
llm = ChatOpenAI(
    model="glm-4-flash",
    temperature=0.7,
    max_tokens=4096,
    api_key=os.getenv("ZHIPUAI_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

os.environ['SERPAPI_API_KEY'] = '723a13895923198c86b781d6a24803faa6db54ea823506acb006697df2cee910'

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """用于执行数学计算。输入是一个数学表达式,例如:'78 ** 2' 或 '81 * 81'"""
    try:
        clean_expr = re.sub(r'[^0-9+\-*/().** ]', '', expression)
        clean_expr = clean_expr.strip()
        result = eval(clean_expr)
        return str(result)
    except Exception as e:
        return f"计算错误: {e},请检查表达式格式"

# 加载工具
search_tools = load_tools(["serpapi"], llm=llm)
tools = search_tools + [calculator]

# 创建 Agent
agent = initialize_agent(
    tools,
    llm,
    agent_type="openai-functions",
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=8,
)

# 调用
print("=" * 50)
print("用户:请问现任的美国总统的是谁,他的年龄的平方是多大")
print("=" * 50)
result = agent.invoke({"input": "请问现任的美国总统的是谁,他的年龄的平方是多大"})
print("Agent:", result["output"])

6.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION

python 复制代码
# STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION.py
from langchain_openai import ChatOpenAI
from langchain_core.tools import tool
from langchain_community.agent_toolkits.load_tools import load_tools
from langchain_classic.agents import initialize_agent
import os
import re
from dotenv import load_dotenv
load_dotenv()

# 定义LLM
llm = ChatOpenAI(
    model="glm-4-flash",
    temperature=0.7,
    max_tokens=4096,
    api_key=os.getenv("ZHIPUAI_API_KEY"),
    base_url="https://open.bigmodel.cn/api/paas/v4/"
)

os.environ['SERPAPI_API_KEY'] = '723a13895923198c86b781d6a24803faa6db54ea823506acb006697df2cee910'

# 自定义计算器工具
@tool
def calculator(expression: str) -> str:
    """用于执行数学计算。输入是一个数学表达式,例如:'78 ** 2' 或 '81 * 81'"""
    try:
        clean_expr = re.sub(r'[^0-9+\-*/().** ]', '', expression)
        clean_expr = clean_expr.strip()
        result = eval(clean_expr)
        return str(result)
    except Exception as e:
        return f"计算错误: {e},请检查表达式格式"

# 加载工具
search_tools = load_tools(["serpapi"], llm=llm)
tools = search_tools + [calculator]

# 创建 Agent
agent = initialize_agent(
    tools,
    llm,
    agent_type="structured-chat-zero-shot-react-description",
    verbose=True,
    handle_parsing_errors=True,
    max_iterations=8,
)

# 调用(注意:输入格式需要嵌套一层)
print("=" * 50)
print("用户:请问现任的美国总统的是谁,他的年龄的平方是多大")
print("=" * 50)
result = agent.invoke({"input": {"input": "请问现任的美国总统的是谁,他的年龄的平方是多大"}})
print("Agent:", result["output"])

7.总结

第3个和第4个的区别

第3个 CONVERSATIONAL_REACT_DESCRIPTION 最初是为补全模型 (用 OpenAI 类调用的模型)设计的,它会把对话历史拼接成一段连续的文本喂给模型,比如把历史拼成 "用户:你好\n助手:你好\n用户:他多大了" 这样一整段文字,模型在此基础上续写回答。

第4个 CHAT_CONVERSATIONAL_REACT_DESCRIPTION 是为对话模型 (用 ChatOpenAI 类调用的模型)设计的,它会把对话历史按角色拆分成结构化的消息列表,比如 [{"role": "user", "content": "你好"}, {"role": "assistant", "content": "你好"}, {"role": "user", "content": "他多大了"}],模型按照系统、用户、助手的角色分别理解上下文。

但在实际使用中,如果你用的是 ChatOpenAI(不管是智谱、通义还是 OpenAI),两者的效果几乎没有区别。 因为新版 create_agent 会自动处理格式转换,不需要你手动区分。所以你只需要记住:需要多轮对话记忆就用 create_agent + InMemorySaver,不需要纠结选第3个还是第4个。

相关推荐
唐维康2 分钟前
昆工计算机408考研2027招285人,比去年少6人
人工智能·考研·昆明理工大学
Martina_03215 分钟前
AI生成的过山车轨道导入后频繁脱轨?用5步检查样条、轨距与碰撞
图像处理·人工智能·游戏·3d·材质·游戏策划·关卡设计
小猴子爱上树9 分钟前
跨马翻译:批量图片翻译+视频字幕+智能抠图,跨境电商在线图片翻译工具
大数据·人工智能·python·音视频
佳瑞Jarrett10 分钟前
从 0 到 1 手搓 AI 调解训练系统:双 NPC 实时语音 + AI 自动评分(FastAPI + Qwen-Audio Realtime 实战)
人工智能
W***259210 分钟前
2026 企业 AI 办公工具怎么选:选型框架与平台全景分析
大数据·人工智能
薛定e的猫咪13 分钟前
(AISTATS 2023)BaCaDI 逐章阅读
人工智能·深度学习·算法·机器学习
记得开心一点嘛16 分钟前
Trellora:基于 Electron、React 和本地知识库的 AI 知识工作台
人工智能·react.js·electron
桃西西呀24 分钟前
LangChain 之八:流式与透传
人工智能·langchain·llm
凡达Ai派26 分钟前
AI画布里的文字总是错位或乱码?把生成、排版和校对拆成三段
图像处理·人工智能·深度学习·神经网络·自然语言处理·知识图谱
桃西西呀30 分钟前
LangChain 之九:一个能检索又会调工具的流式问答助手
人工智能·langchain·llm