智能Agent实战指南:从入门到精通(工具)
通用人工智能(AGI)将是AI的终极形态,已经成为业界的共识。同样的,构建智能体则是AI应用工程当下的终极形态。
Agent这个概念我们在之前很多文章都有提到,那么,他和Chain有什么区别呢?
在Chain中行动序列是硬编码的、固定流程的,就像是在流水线上工作,而Agent则是采用语言模型作为其推理引擎,具备一定的自主决策能力,确定以什么样的顺序采取什么样的行动。
1、Agent入门使用
1.1 创建Agent、AgentExecutor
| 环节一:创建Agent | 环节二:创建AgentExecutor代理执行器 | |
| 传统方式 | 使用 AgentType 指定 |
initialize_agent() |
| 通用方式 |
create_xxx_agent()例:create_tool_calling_agent() |
调用AgentExecutor()构造方法 |
1.2 Agent的类型
Agents的核心类型有以下两种:
(1)Function Call模式
- 基于结构化函数调用(OpenAI Function Calling);
- 直接生成工具调用参数(JSON格式);
- 效率高,特别适合于工具使用明确的场景。
典型的AgentType:
| 第一种 | AgentType.OPENAI_FUNCTIONS |
| 第二种 | AgentType.OPENAI_MULTI_FUNCTIONS |
(2)ReAct模式
- 基于文本推理的链式思考,具备反思和自我纠错能力(推理:分析当前状态,决定下一步行动;行动:调用工具并返回结果);
- 通过自然语言描述决策过程;
- 适用于需要明确推理步骤的场景(问答系统、智能客服)。
典型的AgentType:
| 零样本推理 | AgentType.ZERO_SHOT_REACT_DESCRIPTION |
| 无记忆对话 |
AgentType. STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION |
| 带记忆对话 | AgentType.CONVERSATIONAL_REACT_DESCRIPTION |
2、Agent中工具的使用
2.1 传统方式
示例:单工具使用(查询某地天气情况-Tavily搜索工具)
(1)使用ReAct模式
from langchain_classic.agents import AgentType, initialize_agent
from langchain_classic.tools import Tool
from langchain_community.tools import TavilySearchResults
from langchain_openai import ChatOpenAI
import os
import dotenv
dotenv.load_dotenv()
# 读取配置文件
os.environ["TAVILY_API_KEY"] = os.getenv("TAVILY_API_KEY")
# 获取Tavily搜索工具实例
search = TavilySearchResults(max_results = 3)
# 获取一个搜索的工具
# 方式一
# search_tool = StructuredTool.from_function(
# func = search.run,
# name = "search",
# description = "用于检索互联网上的信息",
# )
# 方式二
search_tool = Tool(
func = search.run,
name = "search",
description = "用于检索互联网上的信息",
)
# 获取大模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 创建agent示例
agent = AgentType.ZERO_SHOT_REACT_DESCRIPTION
# 创建agentExecutor实例
agent_execute = initialize_agent(
llm =llm,
agent = agent,
tools = [search_tool],
verbose = True,
)
# 通过agentExecutor调用invoke(),并得到响应
result = agent_execute.invoke("查询西安今天天气情况")
# 处理响应数据
print(result)
可以看到有文本推理的思考过程:

(2)使用Function_Call模式
from langchain_classic.agents import AgentType, initialize_agent
from langchain_classic.tools import Tool
from langchain_community.tools import TavilySearchResults
from langchain_openai import ChatOpenAI
import os
import dotenv
dotenv.load_dotenv()
# 读取配置文件
os.environ["TAVILY_API_KEY"] = os.getenv("TAVILY_API_KEY")
# 获取Tavily搜索工具实例
search = TavilySearchResults(max_results = 3)
# 获取一个搜索的工具
# 方式一
# search_tool = StructuredTool.from_function(
# func = search.run,
# name = "search",
# description = "用于检索互联网上的信息",
# )
# 方式二
search_tool = Tool(
func = search.run,
name = "search",
description = "用于检索互联网上的信息",
)
# 获取大模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 创建agent示例
agent = AgentType.OPENAI_FUNCTIONS
# 创建agentExecutor实例
agent_execute = initialize_agent(
llm =llm,
agent = agent,
tools = [search_tool],
verbose = True,
)
# 通过agentExecutor调用invoke(),并得到响应
result = agent_execute.invoke("查询西安今天天气情况")
# 处理响应数据
print(result)
上述两种AgentType对比:
| 对比角度 | ZERO_SHOT_REACT_DESCRIPTION | OPENAI_FUNCTIONS |
|---|---|---|
| 底层机制 | 模型生成文本指令,系统解析后调用工具 | 模型直接返回JSON格式工具调用 |
| 执行效率 | 较低(多轮文本交互) | 高(单步完成) |
| 输出可读性 | 直接显示人类可读的思考过程 | 需查看结构化日志 |
| 工具参数处理 | 依赖模型文本描述准确性 | 自动匹配工具参数结构 |
| 兼容模型 | 所有文本生成模型 | 仅GPT-4/Claude 3等新模型 |
| 复杂任务表现 | 可能因文本解析失败出错 | 可靠(结构化保证) |
示例:多工具使用(以ReAct模式为例)
# 1.导入相关依赖
from langchain_openai import ChatOpenAI
from langchain_classic.agents import initialize_agent, AgentType
from langchain_classic.tools import Tool
from langchain_community.tools.tavily_search import TavilySearchResults
from langchain_experimental.utilities.python import PythonREPL
# 2. 设置 TAVILY_API 密钥
os.environ["TAVILY_API_KEY"] = os.getenv("TAVILY_API_KEY")
# 3.定义搜索工具
search = TavilySearchResults(max_results=3)
search_tool = Tool(
name="Search",
func=search.run,
description="用于搜索互联网上的信息,特别是股票价格和新闻"
)
# 4.定义计算工具
python_repl = PythonREPL()
# LangChain封装的工具类可以进行数学计算
calc_tool = Tool(
name="Calculator",
func=python_repl.run,
description="用于执行数学计算,例如计算百分比变化"
)
# 5. 定义LLM
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 6. 创建AgentExecutor执行器对象
agent_executor = initialize_agent(
tools=[search_tool, calc_tool],
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True
)
# 7. 测试股票价格查询
query = "特斯拉当前股价是多少?比去年上涨了百分之几?"
result=agent_executor.invoke(query)
print(f"查询结果: {result}")

示例:自定义函数与工具
计算3的平方,Agent自动调用工具完成
from langchain_classic.agents import initialize_agent, AgentType, Tool
from langchain_openai import ChatOpenAI
# 1. 定义工具 - 计算器(要求字符串输入)
def simple_calculator(expression: str) -> str:
"""
基础数学计算工具,支持加减乘除和幂运算
参数:
expression: 数学表达式字符串,如 "3+5" 或 "2**3"
返回:
计算结果字符串或错误信息
"""
print(f"\n[工具调用] 计算表达式: {expression}")
print("只因为在人群中多看了你一眼,确认下你调用了我^_^")
return str(eval(expression)) # 实现的根本
# 2. 创建工具对象
math_calculator_tool = Tool(
name="Math_Calculator", # 工具名称(Agent将根据名称选择工具)
func=simple_calculator, # 工具调用的函数
description="用于数学计算,输入必须是纯数学表达式(如'3+5'或'3**2'表示平方)。不支持字母或特殊符号"# 关键:明确输入格式要求
)
# 3. 初始化大模型
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 4. 初始化AgentExecutor(使用零样本React模式、增加超时设置)
agent_executor = initialize_agent(
tools=[math_calculator_tool], # 可用的工具列表
llm=llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, # 简单指令模式
verbose=True # 关键参数!在控制台显示详细的推理过程
)
# 5. 测试工具调用(添加异常捕获)
print("=== 测试:正常工具调用 ===")
response = agent_executor.invoke(
"计算3的平方"
)
# 向Agent提问
print("最终答案:", response)

2.2 通用方式
(1)使用Function_Call模式
from langchain_core.prompts import ChatPromptTemplate
from langchain_classic.agents import create_tool_calling_agent, AgentExecutor
from langchain_classic.tools import Tool
from langchain_community.tools import TavilySearchResults
from langchain_openai import ChatOpenAI
import os
import dotenv
dotenv.load_dotenv()
# 读取配置文件
os.environ["TAVILY_API_KEY"] = os.getenv("TAVILY_API_KEY")
# 获取Tavily搜索工具实例
search = TavilySearchResults(max_results = 3)
# 2、获取对应工具实例
search_tool = Tool(
func = search.run,
name = "search",
description = "用于检索互联网上的信息",
)
# 3、获取大模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 4、提示词模版(ChatPromptTemplate为例)
prompt_template = ChatPromptTemplate.from_messages([
("system","你是一个乐于助人的ai助手,根据用户的提问,必要时调用search工具,使用互联网检索数据"),
("human","{input}"),
("system","{agent_scratchpad}") # agent_scratchpad必须声明
])
# 5、获取Agent实例:create_tool_calling_agent()
agent = create_tool_calling_agent(
llm = llm,
prompt = prompt_template,
tools = [search_tool],
)
# 6、获取AgentExecutor实例
agent_executor = AgentExecutor(
agent = agent,
tools = [search_tool],
verbose = True,
)
# 7、通过AgentExecutor实例调用invoke方法,得到响应
response = agent_executor.invoke({"input":"查询今天的西安天气情况"})
# 8、处理响应
print(response)

(2)使用ReAct模式
远程的提示词模版通过 https://smith.langchain.com/hub/hwchase17 获取,其中/react专门给ReAct模式设计的提示模版。

直接调用远程提示词模版实现:
from langchain_classic import hub
from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
from langchain_classic.agents import AgentType, initialize_agent, create_tool_calling_agent, AgentExecutor, create_react_agent
from langchain_core.tools import StructuredTool
from langchain_classic.tools import Tool
from langchain_community.tools import TavilySearchResults
from langchain_openai import ChatOpenAI
import os
import dotenv
dotenv.load_dotenv()
# 读取配置文件
os.environ["TAVILY_API_KEY"] = os.getenv("TAVILY_API_KEY")
# 获取Tavily搜索工具实例
search = TavilySearchResults(max_results = 3)
# 2、获取对应工具实例
search_tool = Tool(
func = search.run,
name = "search",
description = "用于检索互联网上的信息",
)
# 3、获取大模型
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
llm = ChatOpenAI(
model="gpt-4o-mini",
temperature=0,
)
# 4、使用LangChain Hub中的官方ReAct提示模板
prompt_template = hub.pull("hwchase17/react")
# 5、获取Agent实例:create_react_agent()
agent = create_react_agent(
llm = llm,
prompt = prompt_template,
tools = [search_tool],
)
# 6、获取AgentExecutor实例
agent_executor = AgentExecutor(
agent = agent,
tools = [search_tool],
verbose = True,
)
# 7、通过AgentExecutor实例调用invoke方法,得到响应
response = agent_executor.invoke({"input":"查询今天的西安天气情况"})
# 8、处理响应
print(response)

2.3 总结
传统方式相较通用方式来说不提供提示词模版
对于通用方式来说:
①FUNCTION_CALL模式:创建agent时,推荐使用ChatPromptTemplate
②ReAct模式:创建agent时,ChatPromptTemplate和PromptTemplate均可,更推荐第二个
| 组件 | 传统方式 | 通用方式 |
|---|---|---|
| Agent创建 | 通过AgentType枚举选择预设 | 通过create_xxx_agent显式构建 |
| AgentExecutor创 建 | 通过initialize_agent()创建 | 通过AgentExecutor()创建 |
| 提示词 | 内置不可见 | 可以自定义 |
| 工具集成 | AgentExecutor中显式传入 | Agent/AgentExecutor中需显式传入 |
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)