LangChain中的Agent(代理)| 豆包MarsCode AI 刷题

115 阅读5分钟

LangChain中的Agent(代理)

代理的作用

在 LangChain 中,Agent(代理) 是一个核心组件,用于动态调用工具并完成复杂任务。与固定流程的链(Chain)不同,Agent 能够基于输入内容和上下文,自主选择工具或方法,适配灵活多变的任务场景。

主要功能

  1. 动态决策:根据用户输入实时选择合适的工具。
  2. 多工具协作:支持多个工具的组合使用。
  3. 增强智能:通过逻辑推理和上下文理解,完成复杂任务。

代理的存在,使得应用不仅仅是被动响应,而是通过工具的灵活调用,具有更强的任务适应能力。


ReAct框架

ReAct(Reasoning + Acting) 是一种结合推理与行动的框架,广泛用于实现大语言模型的动态任务执行。通过 ReAct,代理可以先进行逻辑推理(Reasoning),然后基于推理结果采取行动(Acting),实现复杂任务的分步执行。

特点

  1. 逻辑推理:对任务进行分析,决定下一步动作。
  2. 工具调用:基于推理动态调用工具获取结果。
  3. 闭环执行:通过反馈循环调整任务执行路径。

如何通过代理实现ReAct框架

在 LangChain 中,通过代理实现 ReAct 框架需要以下步骤:

  1. 定义工具:注册代理可以调用的工具集。
  2. 配置提示:设计提示模板,指导代理结合推理与行动。
  3. 执行代理:使用代理接口动态完成任务。

示例代码

  from langchain.agents import Tool, initialize_agent
  from langchain.chat_models import ChatOpenAI
  from langchain.prompts import PromptTemplate
  ​
  # 定义工具
  def search_tool(query: str) -> str:
      return f"Searching for: {query}"  # 模拟搜索工具
  ​
  tools = [
      Tool(name="Search", func=search_tool, description="Search for information on the web.")
  ]
  ​
  # 初始化代理
  llm = ChatOpenAI(temperature=0)
  agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
  ​
  # 执行代理
  response = agent.run("What is the capital of France?")
  print(response)

Agent 的关键组件

  1. 工具(Tools) 工具是代理动态调用的核心。每个工具都包含名称、功能和描述,代理通过工具完成特定子任务。
  2. 提示模板(Prompt Template) 提示指导代理结合推理和行动,明确任务目标和执行逻辑。
  3. 代理执行器(AgentExecutor) AgentExecutor 是代理的运行引擎,负责解析输入、执行推理、调用工具,并返回最终结果。

深挖 AgentExecutor 的运行机制

AgentExecutor 的核心机制可以分为以下几步:

  1. 输入解析:将用户输入转换为适配工具的查询。
  2. 决策逻辑:根据输入和上下文推断下一步行动。
  3. 工具调用:选择并调用工具执行子任务。
  4. 结果整合:将工具返回的结果整理后作为输出。

通过 AgentExecutor,LangChain 能动态实现逻辑推理和工具调用的闭环操作。


什么是结构化工具?

结构化工具是指具有严格输入输出格式的工具,能够让代理更高效地解析数据和调用功能。与常规工具相比,结构化工具定义了明确的接口,适用于高精度任务。

示例

JSON 格式的 API 是一种常见的结构化工具,通过统一的字段规范,代理可以轻松解析和调用。


什么是 Playwright?

Playwright 是一个强大的浏览器自动化工具,支持多种编程语言。结合 LangChain,可以将 Playwright 作为工具,用于执行网页操作,例如模拟搜索、数据抓取等。

应用场景

  • 自动化表单填写
  • 网页数据抓取
  • 在线任务模拟

使用结构化工具对话代理

LangChain 提供了对话代理功能,通过结构化工具增强代理对话能力。例如,可以结合 API 接口实现动态信息查询或复杂数据操作。

示例

  
  from langchain.tools import StructuredTool
  ​
  # 定义结构化工具
  def api_query_tool(query: dict) -> dict:
      return {"response": f"Processed query: {query}"}
  ​
  structured_tool = StructuredTool.from_function(
      api_query_tool,
      name="API Query Tool",
      description="Query API with structured inputs."
  )
  ​
  # 使用结构化工具代理
  response = structured_tool({"key": "value"})
  print(response)  # 输出: {'response': 'Processed query: {"key": "value"}'}

使用 Self-Ask with Search 代理

Self-Ask with Search 是一种将自我提问与搜索工具结合的代理形式,通过提出子问题分步解决复杂任务。

实现原理

  1. 生成子问题:分析任务,拆解为多个子问题。
  2. 逐步解决:调用工具依次解决子问题。
  3. 整合结果:组合子问题的答案形成最终结果。

使用 Plan and Execute 代理

Plan and Execute 是一种规划与执行分离的代理框架。它先生成任务计划,然后逐步执行各子任务,适合复杂任务或长任务链场景。

工作流程

  1. 任务规划:生成完整计划,包括每步的具体操作。
  2. 分步执行:按计划顺序执行任务,并调整步骤。
  3. 结果汇总:整合各步骤的输出。

示例

  
  from langchain.agents import initialize_agent
  ​
  # 定义规划与执行工具
  tools = [Tool(name="Task1", func=lambda x: f"Task 1 completed with {x}!")]
  ​
  agent = initialize_agent(tools, llm, agent="plan-and-execute", verbose=True)
  result = agent.run("Complete the tasks in sequence.")
  print(result)

总结

LangChain 中的 Agent 提供了强大的工具调用和任务执行功能,通过 ReAct 框架和多种代理类型(如结构化工具代理、Self-Ask with Search、Plan and Execute),可以实现灵活的任务适配。通过深挖 AgentExecutor 的运行机制,开发者能够更高效地组织复杂任务逻辑,提升智能系统的表现能力。

关键点

  1. 动态决策:根据输入内容实时调用工具。
  2. 灵活适配:适合多变任务,支持复杂逻辑。
  3. 扩展性强:代理可嵌套、多任务处理,让应用智能化程度更高。

通过合理运用 LangChain 的代理功能,可以将大语言模型与实际应用无缝结合,构建高效且智能的系统。