一,ReAct框架 及其在 LangChain 中的实现
1. ReAct框架(Reasoning-Acting框架)
ReAct框架的核心思想在于结合推理和行动。它模拟了人类决策过程中的两步:推理(Reasoning)和行动(Acting)。
- 推理阶段:模型观察当前环境,进行思考,推理出下一步需要做什么。这一阶段帮助模型整理信息、验证假设,并预测行动的后果。
- 行动阶段:根据推理结果,模型执行下一步操作,这可能是调用外部工具、与其他系统交互,或是做出具体决策。
2. 为什么ReAct框架有用
在没有这个框架的情况下,模型只会根据给定的提示信息(输入)生成结果,可能会忽略外部世界的变化或事实的真实性。ReAct框架的优势在于:
- 协同推理和行动:模型能够根据环境的反馈调整自己的思考过程,及时做出合理的决策。
- 外部工具调用:模型可以主动调用外部工具(如搜索引擎、计算工具等)来获得最新的信息,从而提高回答的准确性和可靠性。
- 提高模型的可解释性:推理和行动过程会记录下来,用户可以清晰地看到模型是如何得出结论的,增强了决策过程的透明度。
3. LangChain中的代理(Agent)和ReAct框架
LangChain通过代理(Agent)类封装了ReAct框架,使得语言模型能够自主决策并执行任务。代理的工作流程包括:
- 工具选择:代理根据任务选择合适的外部工具(如知识库、搜索引擎、数学计算工具等)。
- 任务执行:根据任务需求,代理会启动推理-行动循环,执行相应的操作。
- 推理轨迹:代理在执行任务的过程中会产生推理轨迹(思考过程),并通过工具的调用来实现任务目标。
4. 应用示例:LangChain中的代理使用
在实际的应用中,我们可以让代理根据具体任务进行推理和行动。例如:
任务:查找玫瑰花的市场价格,并加价15%
-
推理阶段:代理首先分析任务,明确目标是查找玫瑰花的当前市场价格,然后计算出加价后的新价格。
-
行动阶段:代理执行以下操作:
- 使用SerpAPI(Google搜索工具)进行搜索,找出玫瑰花的市场价格。
- 使用数学计算工具计算出加价后的新价格。
代理在执行任务时的推理和行动过程如下:
思考:我需要找到玫瑰花的市场价格,并计算加价后的新价格。
行动:搜索“玫瑰花市场平均价格”
观察:根据搜索结果,一打玫瑰花的平均价格是80.16美元。
思考:我需要计算80.16美元加15%的新价格。
行动:计算 80.16 * 1.15 = 92.18
最终答案:加价后的价格是92.18美元。
5. ReAct框架如何实现自主决策
在ReAct框架的指导下,代理不仅能执行单一任务,而且能够在执行任务时根据实时反馈调整策略。例如:
- 如果模型在执行任务时遇到问题(如无法找到足够信息),它会主动调整,重新搜索或尝试其他工具。
- 代理能够综合不同来源的信息,做出更准确、更合理的决策。
6. ReAct框架的优势
- 自动化的推理和决策:大模型不再只是机械地根据输入输出,而是能够根据任务需要,主动进行推理和决策。
- 灵活应对复杂任务:代理能够处理复杂的任务,如跨工具的数据获取、数据处理与计算等操作,极大增强了大模型的实用性。
- 透明的推理过程:每一个推理步骤和决策过程都有详细的记录,用户能够清晰了解模型是如何做出每个决策的。
7. ReAct框架的未来应用
随着技术的发展,ReAct框架能够帮助智能代理在更多复杂的场景下执行任务,尤其是在具身智能领域,比如虚拟环境中的物品搜寻或物理环境中的物体操作。ReAct框架的灵活性和可扩展性使得它能够适应各种应用场景,极大扩展AI的应用范围。
二,
1. LangChain中的"链"和"代理"的差异
- 链(Chain)是预定义的操作顺序,通常通过硬编码的方式决定要执行的每个步骤的顺序。这些操作顺序是固定的,开发者在代码中明确定义了每一步应该做什么。
- 代理(Agent)则是更具灵活性的决策引擎。在代理中,语言模型(如GPT-3或GPT-4)充当推理引擎,动态决定下一步应该采取什么操作,并且根据上下文生成合适的行动。与链不同,代理并不需要预先硬编码一系列操作,它依赖模型的推理来决定执行的步骤和顺序。
这两者的关键区别在于操作的灵活性和决策的动态性:链遵循固定的步骤,而代理在每一步都通过推理来决定接下来的操作,形成一个灵活的、响应式的任务执行流程。
2. LangChain中代理的工作原理
LangChain中的代理在执行时需要依赖以下几个关键组件:
- 代理(Agent) :负责做出下一步的决策。它利用语言模型和提示(prompt)来决定要执行哪些操作。
- 工具(Tools) :代理调用的功能组件。例如搜索、计算等,工具帮助代理完成具体的任务。
- 工具包(Toolkits) :是一些相关工具的集合,通常是针对特定任务的工具集合。
- 代理执行器(AgentExecutor) :代理的执行环境,它负责管理代理的任务流,处理工具调用,记录日志,和异常处理等。
3. 代理执行过程:ReAct框架的应用
LangChain代理的执行过程依赖于ReAct(Reasoning and Acting)框架:
- 思考(Thought) :代理根据当前任务进行思考,分析并决定下一步行动。
- 行动(Action) :代理决定调用的具体工具,执行某个操作。
- 观察(Observation) :工具执行后返回的结果,代理根据这些结果进行后续推理。
- 最终答案:经过若干次的思考、行动、观察后,代理最终得出问题的解答。
4. 具体的执行过程:以玫瑰价格计算为例
在代码示例中,我们可以看到一个实际的代理执行过程:
任务:
- 问题:市场上玫瑰花的平均价格是多少?如果加价15%,应该如何定价?
步骤:
-
代理开始:代理的任务是回答这个问题,并且需要用到工具(搜索和计算器)。
-
模型的提示:系统会构建一个复杂的提示框架,包含工具的介绍(搜索和计算器)、任务格式(问题、思考、行动、观察),并提供给语言模型。
-
模型的推理:
- 第一步:模型决定使用搜索工具来查找玫瑰花的平均价格,并返回搜索结果。
- 第二步:模型决定使用计算工具对玫瑰花的价格加价15%,然后调用计算器工具进行计算。
- 第三步:通过计算得到的结果,模型判断任务已经完成,给出最终答案。
-
每个环节的提示和返回值:
- 第一次推理,模型决定搜索“玫瑰花的平均价格”并得到结果。
- 第二次推理,模型计算80.16(玫瑰花的价格)加价15%,得出92.18(加价后的价格)。
- 最终,模型得出结论并认为任务完成,给出最终答案。
三,
1. 结构化工具(Structured Tools)
结构化工具是LangChain中一种用于提高任务复杂度和交互能力的设计。通过结构化工具,代理可以调用多个工具并组合使用它们来完成复杂任务。常见的结构化工具包括:
- 文件管理工具集:如读写文件、搜索文件等。
- Web浏览器工具集(如Playwright):允许代理访问和交互网页,从而完成任务。
例如,Playwright作为一个自动化框架,可以模拟用户浏览网页、点击按钮、获取页面内容等,常用于自动化网页测试和数据抓取。
2. 代理类型
LangChain通过不同的代理类型来处理各种任务。我们详细介绍了以下几种代理类型:
(1) Structured Chat Zero-Shot React Description
该代理允许模型通过多个工具实现结构化任务处理。例如,利用Playwright工具包来浏览网页并获取网页中的元素,如标题。这种代理非常适合需要多轮思考和决策的任务。
- 示例任务:通过Playwright访问指定网址,获取网页的所有标题。代理先导航到网页,接着提取网页中所有的标题元素,最后汇总并返回结果。
(2) Self-Ask with Search
这种代理适合多跳问题(multi-hop questions),通过在问题之间进行推理和逐步查询来获得最终答案。模型会首先搜索一个中间答案,然后根据该答案继续搜索,直到找到最终的答案。
- 示例任务:查询“使用玫瑰作为国花的国家的首都是哪里?”该问题需要先找到使用玫瑰作为国花的国家(英国),然后查询英国的首都(伦敦)。
(3) Plan and Execute
这种代理将任务拆解为计划和执行两个阶段:模型首先制定一个计划,然后执行该计划中的具体任务。与其他代理不同,Plan and Execute将计划和执行分开,使得执行代理可以独立调用工具并执行任务。
- 示例任务:计算纽约100美元能买几束玫瑰。这个任务首先由代理进行计划,确定涉及的步骤(如搜索玫瑰价格、计算预算等),然后执行这些子任务。
3. Playwright工具包的使用
Playwright是一个自动化工具,用于在浏览器中执行操作,如打开页面、点击元素、提取内容等。在LangChain中,Playwright被封装为工具集,允许代理使用它来执行自动化任务。
-
使用流程:
- 初始化Playwright:通过
sync_playwright()或create_async_playwright_browser()等函数启动浏览器。 - 导航至页面:代理通过Playwright导航到指定URL。
- 执行操作:例如,获取网页标题、提取页面内容、模拟用户点击等。
- 完成任务:将结果返回给用户或继续执行后续任务。
- 初始化Playwright:通过
4. 代理执行的思考过程
每个代理类型都有自己的思考和决策流程:
- 第一轮思考:代理判断问题是否能够直接回答,若不能,则决定使用工具(如Playwright浏览器工具)进行进一步的操作。
- 第二轮思考:代理根据第一次操作的结果(例如,成功加载网页),决定接下来的操作(如提取页面内容)。
- 第三轮思考:根据操作结果给出最终答案。
5. 多跳问题与Self-Ask with Search
Self-Ask with Search代理适合用于处理多跳问题,其中一个问题的答案依赖于多个子问题。代理会根据初步查询得出中间结果,然后提出进一步的问题,逐步接近最终答案。
- 示例:“使用玫瑰作为国花的国家的首都是哪里?”这个问题需要多轮推理:首先确定国家(英国),然后查询该国的首都(伦敦)。