LangChain 学习笔记
一、整体介绍
LangChain 是一个围绕代理(Agent)和工具(Tools)使用构建的框架,旨在使大型语言模型能够更有效地完成复杂任务。它基于 ReAct 论文的设计理念,随着语言模型的发展而不断扩展其功能和应用场景。
二、核心概念与组件
(一)ReAct 框架
- 原理:ReAct 框架通过“观察 - 思考 - 行动”的循环来引导模型生成任务解决轨迹。这个过程可以简化为推理(Reasoning)和行动(Acting)两个步骤。
- 优势:这种方法改善了大模型解决问题时的可解释性和可信度,详细记录推理过程,使模型能够诱导、跟踪和更新操作计划,处理异常情况,还能与外部环境交互合并额外信息。
(二)代理(Agent)
- 定义与作用:代理是一种系统,它使用语言模型来做出决策并调用工具执行具体操作,可以定制其行为以实现自动化任务处理。
- 关键组件:
- 代理(Agent)类:由语言模型和提示驱动,决定下一步操作。
- 工具(Tools):代理调用的函数,需要正确提供和描述。
- 工具包(Toolkits):一组用于完成特定目标的彼此相关的工具集合。
- 代理执行器(AgentExecutor):代理的运行环境,调用代理并执行其选择的操作。
三、不同代理类型及示例
(一)ZERO_SHOT_REACT_DESCRIPTION 代理
- 示例任务:查找玫瑰的当前市场价格,然后计算加价 15%后的新价格。
- 执行过程:
- 模型判断需调用搜索工具查找玫瑰平均价格。
- 根据搜索结果,模型决定调用计算器工具进行加价计算。
- 模型判断任务完成,输出最终答案。
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 网页中的标题目录。
- 执行过程:
- 使用 PlayWrightBrowserToolkit 工具箱中的
navigate_browser工具访问网站。 - 使用
get_elements工具获取各级标题文字。 - 给出最终答案,输出网页中各级标题的具体内容。
- 使用 PlayWrightBrowserToolkit 工具箱中的
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 密钥。
(二)代码示例中的关键步骤
以上代码示例涉及加载语言模型、工具、初始化代理以及运行代理等操作步骤。在实际应用中,需要根据具体任务选择合适的代理类型和工具,并根据任务需求调整语言模型的参数。