LangChain Agent与工具调用深度教程 - 构建智能助手完全指南 - LangChain入门教程 - 3

LangChain Agent与工具调用深度教程 - 构建智能助手完全指南

基础概念

  1. 本教程旨在帮助您深入了解LangChain Agent与工具调用的概念和实践。通过本教程,您将学习如何使用LangChain Agent与工具调用来构建智能助手,开发一些有趣的智能应用。
  2. LangChain中Tool和Agent是两个核心概念,但它们的关系需要进一步明确:
    Tool(工具): 是执行特定功能的函数封装,比如搜索、计算或API调用。工具本身是"无状态"的,只关注输入和输出。
    Agent(代理): 是决策单元,负责协调多个工具的使用顺序和时机。Agent包含状态管理、决策逻辑和执行控制。
    简言之,Tool是"做什么",Agent是"怎么做"和"何时做"。
  3. ReAct agent框架(Reasoning and Acting)框架是基于"思考-行动-观察"的循环:
    Reasoning(推理): LLM根据当前情况分析下一步行动
    Acting(行动): 执行选定的工具
    Observation(观察): 获取工具执行结果并更新状态
    ReAct让LLM将"思考过程"显式表达出来,通过"Thought:"前缀引导模型进行逐步推理,这大大提高了复杂任务的成功率
  4. 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 定义字段,包括描述和默认值,

  1. 定义工具
    * @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
  1. 我们需要在prompt中告诉大模型,我们有哪些工具可以使用,以及如何使用这些工具。
    {input}, {tools},{tool_names}, {agent_scratchpad} langchain会替换这些输入和工具描述和agent_scratchpad 工具执行过程记录。
  2. 使用 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=
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值