一、LangChain中的代理与ReAct框架
1.1 思维链(CoT)与大模型的局限性
-
思维链(CoT)展示了LLMs执行推理轨迹的能力。
-
与少样本提示结合,LLMs能完成复杂推理任务。
-
大模型的固有问题:无法主动更新知识,导致事实幻觉。
1.2 解决方案:外部工具与代理
-
让大模型在本地知识库中搜索,检查信息真实性。
-
如果本地知识库找不到信息,调用外部搜索工具。
-
外部工具:本地知识库、搜索引擎等。
-
代理(Agent):多功能接口,决定调用哪些工具。
1.3 代理的作用
-
代理根据用户输入,决定调用哪些工具。
-
代理可以同时使用多种工具,并将一个工具的输出作为另一个工具的输入。
1.4 LangChain中的代理
-
理解三个元素:大模型、外部工具、控制交互的代理。
-
代理自主判断下一步行为,引导大模型进行操作。
1.5 ReAct框架
-
灵感来自“行动”和“推理”之间的协同作用。
-
引导模型生成任务解决轨迹:观察-思考-行动。
-
ReAct框架:推理(Reasoning)和行动(Acting)的协同。
1.6 ReAct框架的实现--通过代理实现
理解ReAct框架:
- ReAct框架是一种指导大语言模型(LLMs)进行推理和行动的思维框架,它强调“观察-思考-行动”的循环,即Reasoning-Acting。
- 该框架通过引导模型生成推理痕迹和任务特定行动,实现内部知识和外部信息的结合,提高模型的可解释性和可信度。
代理的作用:
- 代理(Agent)作为一个多功能接口,能够接触并使用一套工具,根据用户输入决定调用哪些工具。
- 代理可以同时使用多种工具,并将一个工具的输出作为另一个工具的输入。
LangChain中的代理:
- 在LangChain中,代理通过理解三个元素来工作:大模型、与之交互的外部工具、控制交互的代理本身。
- 代理负责调用适当的外部工具,并管理整个交互过程。
实现ReAct框架:
- 使用LangChain中的ZERO_SHOT_REACT_DESCRIPTION类型的代理来实现ReAct框架。
- 代理需要注册并获取Google搜索工具的API密钥,并安装必要的包。
设置和初始化:
- 设置OpenAI和SerpAPI的API密钥。
- 导入所需的库,并加载将用于控制代理的语言模型。
- 加载要使用的工具,如serpapi和llm-math。
- 使用工具、语言模型和代理类型来初始化代理。
代理执行任务:
- 代理根据任务需求,自动形成思考与行动链条,通过搜索和计算等操作完成任务。
- 代理的每一步推理过程都会被详细记录,以提高可解释性和可信度。
ReAct框架的优势:
- ReAct框架使得大模型能够自主判断下一步行为,提高了模型的自主性。
- 该框架在各种语言和决策任务中都得到了很好的效果,具有巨大的发展潜力。
二、AgentExecutor运行机制
2.1 代理与链的差异
-
链:操作硬编码在代码中。
-
代理:语言模型决定操作和执行顺序。
2.2 LangChain核心理念
- 操作序列由语言模型选择,而非硬编码。
2.3 代理的关键组件
-
代理(Agent):由语言模型和提示驱动,决定下一步操作。
-
工具(Tools):代理调用的函数,需要正确提供和描述。
-
工具包(Toolkits):完成特定目标的相关工具集合。
-
代理执行器(AgentExecutor):代理的运行环境,调用代理并执行选择的操作。
2.4 AgentExecutor运行机制
- 深入LangChain源代码,理解代理如何自动决策。
2.5 关键代码
llm = OpenAI(temperature=0) # 大语言模型
tools = load_tools(["serpapi", "llm-math"], llm=llm) # 工具-搜索和数学运算
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True) # 代理
agent.run("目前市场上玫瑰花的平均价格是多少?如果我在此基础上加价15%卖出,应该如何定价?") # 运行代理
2.6 Debug过程
① 第一轮思考:模型决定搜索
- AgentExecutor的_take_next_step方法控制下一步调用。
- self.agent.plan方法被调用,开始计划。
- LLMChain类的generate方法中提示的具体内容。
② 第二轮思考:模型决定计算
- 根据搜索结果,模型决定下一步行动是计算。
③ 第三轮思考:模型完成任务
- 模型判断任务完成,输出最终答案。
2.7 模型输出
- 模型根据提示进行搜索和计算,最终得出答案。
三、LangChain高级代理类型及应用
3.1 代理类型与介绍
-
Structured Tool Chat(结构化工具对话)代理:允许复杂交互,调用一系列复杂工具。
-
Self-Ask with Search(自主询问搜索)代理:使用追问和中间答案技巧,解决多跳问题。
-
Plan and Execute(计划与执行)代理:先计划再执行子任务,实现目标。
3.2 结构化工具对话代理
-
背景:LangChain 2023年初引入多操作代理框架,允许代理计划执行多个操作。
-
应用:文件管理、Web浏览器等工具集。
-
PlayWright工具包:模拟用户操作网页,自动化网页交互和测试。
3.3 PlayWright基本使用
from playwright.sync_api import sync_playwright
def run():
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto('https://langchain.com/')
title = page.title()
print(f"Page title is: {title}")
browser.close()
if __name__ == "__main__":
run()
3.4 自主询问搜索代理
-
特点:解决多跳问题,逐步逼近最终答案。
-
工具集合:包含搜索工具,查询和验证多个信息点。
3.5 计划与执行代理
-
特点:受Plan-and-Solve论文启发,分为计划和执行两个阶段。
-
应用:Planner和Executor可以是不同的模型。