代理学习笔记| 豆包MarsCode AI刷题

145 阅读4分钟

LangChain 学习笔记

一、整体介绍

LangChain 是一个围绕代理(Agent)和工具(Tools)使用构建的框架,旨在使大型语言模型能够更有效地完成复杂任务。它基于 ReAct 论文的设计理念,随着语言模型的发展而不断扩展其功能和应用场景。

二、核心概念与组件

(一)ReAct 框架

  • 原理:ReAct 框架通过“观察 - 思考 - 行动”的循环来引导模型生成任务解决轨迹。这个过程可以简化为推理(Reasoning)和行动(Acting)两个步骤。
  • 优势:这种方法改善了大模型解决问题时的可解释性和可信度,详细记录推理过程,使模型能够诱导、跟踪和更新操作计划,处理异常情况,还能与外部环境交互合并额外信息。

(二)代理(Agent)

  • 定义与作用:代理是一种系统,它使用语言模型来做出决策并调用工具执行具体操作,可以定制其行为以实现自动化任务处理。
  • 关键组件
    • 代理(Agent)类:由语言模型和提示驱动,决定下一步操作。
    • 工具(Tools):代理调用的函数,需要正确提供和描述。
    • 工具包(Toolkits):一组用于完成特定目标的彼此相关的工具集合。
    • 代理执行器(AgentExecutor):代理的运行环境,调用代理并执行其选择的操作。

三、不同代理类型及示例

(一)ZERO_SHOT_REACT_DESCRIPTION 代理

  • 示例任务:查找玫瑰的当前市场价格,然后计算加价 15%后的新价格。
  • 执行过程
    1. 模型判断需调用搜索工具查找玫瑰平均价格。
    2. 根据搜索结果,模型决定调用计算器工具进行加价计算。
    3. 模型判断任务完成,输出最终答案。
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

# 初始化语言模型
llm = OpenAI(temperature=0)

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化代理
agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)

# 运行代理
agent.run("查找玫瑰的当前市场价格,然后计算加价15%后的新价格。")

(二)结构化工具对话(Structured Tool Chat)代理

  • 示例任务:查询 python.langchain.com 网页中的标题目录。
  • 执行过程
    1. 使用 PlayWrightBrowserToolkit 工具箱中的 navigate_browser 工具访问网站。
    2. 使用 get_elements 工具获取各级标题文字。
    3. 给出最终答案,输出网页中各级标题的具体内容。
from langchain_experimental.playwright import PlayWrightBrowserToolkit
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

# 初始化语言模型
llm = OpenAI(temperature=0)

# 加载工具箱
toolkit = PlayWrightBrowserToolkit()
tools = toolkit.get_tools()

# 初始化代理
agent = initialize_agent(tools, llm, agent="structured-chat", verbose=True)

# 运行代理
agent.run("查询 python.langchain.com 网页中的标题目录。")

(三)Self-Ask with Search 代理

  • 适用场景:解决多跳问题,即需要多步推理或多次查询才能得到最终答案的问题。
  • 示例任务:查询使用玫瑰作为国花的国家的首都是哪里。
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

# 初始化语言模型
llm = OpenAI(temperature=0)

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

# 初始化代理
agent = initialize_agent(tools, llm, agent="self-ask-with-search", verbose=True)

# 运行代理
agent.run("查询使用玫瑰作为国花的国家的首都是哪里。")

(四)Plan and execute 代理

  • 原理特点:计划和执行分别由不同的大语言模型代理完成,计划由负责推理的代理完成,执行由负责调用工具的代理完成。
  • 示例任务:查询在纽约 100 美元能买几束玫瑰。
from langchain.agents import PlanAndExecute, load_tools
from langchain.agents import initialize_agent
from langchain.llms import OpenAI

# 初始化语言模型
llm = OpenAI(temperature=0)

# 加载工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 初始化计划代理和执行代理
plan_agent = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True)
execute_agent = initialize_agent(tools, llm, agent="structured-chat", verbose=True)

# 初始化 Plan and Execute 代理
agent = PlanAndExecute(plan_agent=plan_agent, execute_agent=execute_agent, verbose=True)

# 运行代理
agent.run("查询在纽约 100 美元能买几束玫瑰。")

四、相关代码操作及注意事项

(一)准备工作

部分代理使用需要安装相关包(如 SerpAPI、Playwright、langchain_experimental 等),并设置相应 API 密钥。

(二)代码示例中的关键步骤

以上代码示例涉及加载语言模型、工具、初始化代理以及运行代理等操作步骤。在实际应用中,需要根据具体任务选择合适的代理类型和工具,并根据任务需求调整语言模型的参数。