LangChain Agent与工具调用深度教程 - 构建智能助手完全指南
基础概念
- 本教程旨在帮助您深入了解LangChain Agent与工具调用的概念和实践。通过本教程,您将学习如何使用LangChain Agent与工具调用来构建智能助手,开发一些有趣的智能应用。
- LangChain中Tool和Agent是两个核心概念,但它们的关系需要进一步明确:
Tool(工具): 是执行特定功能的函数封装,比如搜索、计算或API调用。工具本身是"无状态"的,只关注输入和输出。
Agent(代理): 是决策单元,负责协调多个工具的使用顺序和时机。Agent包含状态管理、决策逻辑和执行控制。
简言之,Tool是"做什么",Agent是"怎么做"和"何时做"。 - ReAct agent框架(Reasoning and Acting)框架是基于"思考-行动-观察"的循环:
Reasoning(推理): LLM根据当前情况分析下一步行动
Acting(行动): 执行选定的工具
Observation(观察): 获取工具执行结果并更新状态
ReAct让LLM将"思考过程"显式表达出来,通过"Thought:"前缀引导模型进行逐步推理,这大大提高了复杂任务的成功率 - agent 工作流程
用户输入
│
▼
┌───────────────┐
│ LangChain框架 │
└───────┬───────┘
│
▼
┌───────────────┐
│ Agent决策 │
└───────┬───────┘
│ (解析意图)
▼
┌───────────────┐
│ LLM推理 │
└───────┬───────┘
│ (工具选择)
▼
┌───────────────┐
│ 工具路由 │
└───────┬───────┘
├─────┼─────┐
▼ ▼ ▼
┌───┐ ┌───┐ ┌───┐
│工具1│ │工具2│ ...(工具N)
└─┬─┘ └─┬─┘ └─┬─┘
│ │ │
└──┬──┴──┬──┘
▼
┌───────────────┐
│ 结果整合 │
└───────┬───────┘
├─────────────┐
▼ │
┌───────────────┐ │
│ 最终响应 │◄────┘
└───────┬───────┘
▼
用户输出
1. 环境准备
pip install langchain langchain-openai langchain-deepseek langchain-chroma langchain-huggingface pydantic python-dotenv
2. 工具开发定义
在LangChain中,工具是Agent可以调用的功能。使用@tool装饰器可以轻松创建工具:
from langchain.tools import tool
from pydantic import BaseModel, Field
# 定义工具的输入模型
class SearchInput(BaseModel):
query: str = Field(description="搜索查询内容")
num_results: Optional[int] = Field(default=3, description="返回的搜索结果数量")
@tool("web_search", args_schema=SearchInput)
def web_search(query: str, num_results: int = 10) -> str:
"""使用DuckDuckGo搜索互联网获取信息"""
print(f"执行搜索: {
query},数量: {
num_results}")
search = DuckDuckGoSearchRun()
results = search.run(f"{
query}")
# ... 处理和保存结果 ...
return f"搜索完成,结果已保存。搜索结果摘要:\n{
results[:1024]}...(已截断)"
1.定义工具输入模型 SearchInput
* 使用 BaseModel
* 使用 Field 定义字段,包括描述和默认值,
- 定义工具
*@tool装饰器将函数转换为LangChain工具,指定工具名称和参数设置信息
* 在函数第一行文档字符串中提供工具的描述,Agent会使用这些信息提供给大模型
* 工具的描述是关键,LLM会使用它来理解工具功能
3. 创建agent
ReAct (Reasoning and Acting) 是一种流行的Agent框架,允许LLM交替进行推理和行动:
def create_name_generator_agent():
# 初始化LLM
callback_manager = create_callback_manager()
llm = ChatOpenAI(
model=os.getenv("MODEL", "Qwen/Qwen2.5-Coder-32B-Instruct"),
temperature=0.7,
callbacks=callback_manager.handlers,
)
# 创建工具列表
tools = [web_search, store_to_rag, load_web_content, generate_names]
# 创建ReAct提示模板, 用于提示LLM执行任务
react_template = """回答以下问题:{input}
你有这些工具可用:
{tools}
工具名称列表: {tool_names}
使用以下格式:
Thought: 你应该思考如何解决这个问题
Action: 工具名称,例如 "web_search"
Action Input: 工具的输入参数
Observation: 工具的输出结果
Final Answer: 最终答案
{agent_scratchpad}"""
react_prompt = PromptTemplate(
input_variables=['input', 'tools', 'tool_names', 'agent_scratchpad'],
template=react_template
)
# 创建ReAct agent
react_agent = create_react_agent(llm, tools, react_prompt)
agent_executor = AgentExecutor(agent=react_agent, tools=tools,
verbose=True, handle_parsing_errors=True, max_iterations=3)
# handle_parsing_errors=True:自动处理LLM输出解析错误,非常好用
# max_iterations=3:限制最大迭代次数,防止无限循环
# tool_input_fixers:自定义工具输入修复函数,例如自动添加缺失字段等
# 其他参数
# agent_executor = AgentExecutor(
# agent=react_agent, # Agent实例
# tools=tools, # 可用工具列表
# verbose=True, # 是否显示详细执行过程
# handle_parsing_errors=True, # 自动处理输出解析错误
# max_iterations=3, # 最大执行循环次数
# early_stopping_method="generate", # 提前停止方法:force/generate
# tool_input_fixers=[fix_function], # 参数修正函数
# return_intermediate_steps=True, # 是否返回中间步骤
# max_execution_time=None, # 最大执行时间(秒)
# timeout=120, # 单步超时时间
# )
return agent_executor
- 我们需要在prompt中告诉大模型,我们有哪些工具可以使用,以及如何使用这些工具。
{input}, {tools},{tool_names}, {agent_scratchpad} langchain会替换这些输入和工具描述和agent_scratchpad 工具执行过程记录。 - 使用 create_react_agent 创建 react agent。 传入llm, tools, react_prompt。langchain封装了多种类型的agent。
AGENT_TYPES = [
# 零样本 ReAct agent,适合简单任务,不需要示例就能执行
AgentType.ZERO_SHOT_REACT_DESCRIPTION,
# 结构化对话的零样本 ReAct agent,提供更好的对话控制
AgentType.STRUCTURED_CHAT_ZERO_SHOT_REACT_DESCRIPTION,
# 对话式 ReAct agent,适合需要上下文记忆的场景
AgentType.CONVERSATIONAL_REACT_DESCRIPTION,
# 基于聊天的零样本 ReAct agent,针对聊天场景优化
AgentType.CHAT_ZERO_SHOT_REACT_DESCRIPTION,
# 基于聊天的对话式 ReAct agent,结合了聊天和对话能力
AgentType.CHAT_CONVERSATIONAL_REACT_DESCRIPTION,
# OpenAI 函数调用 agent,专门与 OpenAI 模型配合使用
AgentType.OPENAI_FUNCTIONS,
# OpenAI 多函数调用 agent,支持同时调用多个函数
AgentType.OPENAI_MULTI_FUNCTIONS,
# 自问自答搜索 agent,适合需要分步推理的搜索任务
AgentType.SELF_ASK_WITH_SEARCH,
# XML 处理 agent,专门处理 XML 格式数据
AgentType.XML,
# JSON 处理 agent,专门处理 JSON 格式数据
AgentType.JSON,
# 结构化对话 agent,提供严格的对话结构控制
AgentType.STRUCTURED_CHAT,
# 计划执行 agent,先规划后执行,适合复杂任务
AgentType.PLAN_AND_EXECUTE
]
agent = initialize_agent(
tools,
llm,
agent=


1390

被折叠的 条评论
为什么被折叠?



