尽管CoT推理非常有效,但它并不能完全解决大模型的固有问题,特别是无法主动更新其知识,导致事实幻觉的发生。换句话说,如果你向大模型询问一个超出其知识范围的问题,它要么会告诉你知识的截止时间,要么就会开始胡编乱造。
例如,某些时候大模型会接受虚构的信息并且误认为它们是真实的,进而继续按这个错误思路进行推理和回答。这就是所谓的“事实幻觉”问题。
如何解决这个问题?
一种有效的解决方法是让大模型在执行任务之前先检查提示中的信息是否真实。我们可以让大模型首先在本地知识库中搜索、验证信息的真实性,如果信息是准确的,就输出结果;如果信息不准确,则进行修正。更进一步,当本地知识库无法提供足够的信息时,可以调用外部工具(如搜索引擎)来进行信息验证。
这些本地知识库和外部工具并不是大模型本身的一部分,而是被称为“外部工具”。在LangChain框架中,代理(Agent)是控制模型使用这些外部工具的关键。
代理的作用
代理是一个多功能接口,它能够根据用户输入判断应该调用哪些工具。代理不仅可以同时调用多种工具,还可以将一个工具的输出作为另一个工具的输入。
在LangChain中,代理的核心结构包括三个主要组件:
- 大模型:提供推理引擎,负责生成预测和处理输入。
- 外部工具:可能是数据清洗工具、搜索引擎、应用程序等,用于为模型提供额外的信息或进行实际操作。
- 代理:负责控制大模型与外部工具的交互,决定如何调度和管理任务执行的流程。
代理如何自主决定下一步行动?
在LangChain的代理模型中,有许多操作需要大模型自主判断,哪些操作应该优先执行,以及如何在任务中进行调整。例如,代理需要决定:
- 何时开始在本地知识库中进行搜索?
- 如何确定搜索已完成,进入下一步?
- 需要调用哪些外部工具进行信息验证(如Google搜索引擎)?
- 如何判断搜索结果的真实性?
为了实现这些复杂的自主决策,LangChain引入了ReAct框架,这是本节课的核心。
ReAct框架:推理与行动的协同
ReAct框架的灵感来源于人类的决策过程。例如,在运营花店时,我们通常会根据外部因素(如天气变化)来调整鲜花的售价。我们首先观察外部环境(天气变化)、思考(根据进货成本和市场需求来定价),然后采取行动(给出新的售价)。这个过程包含了观察、思考、行动三个步骤,我们将其统称为推理(Reasoning)和行动(Acting)的协同。
ReAct框架正是通过模拟这一过程,让大语言模型在面对任务时能够生成推理轨迹并做出任务特定的操作。这个框架使得大模型能够像智能代理一样,主动、连续地生成推理路径,并根据推理结果执行任务。
具体来说,ReAct框架包括两个阶段:
- 推理(Reasoning) :模型观察当前环境和状态,并生成推理轨迹。推理帮助模型分析问题、调整操作计划,甚至处理异常情况。
- 行动(Acting) :根据推理结果,模型采取具体行动,如与外部资源进行交互或直接给出答案。
如何在LangChain中应用ReAct框架?
ReAct框架与思维链(CoT)结合使用,可以提升大模型的推理能力和可信度。例如,我们可以在LangChain中实现一个任务:查找玫瑰的市场价格,并根据此价格计算加价后的售价。
首先,我们需要使用SerpAPI工具来搜索玫瑰花的市场价格,然后通过LLM进行数学计算来确定加价后的价格。以下是实现步骤:
- 注册SerpAPI账号,获取API密钥。
- 安装所需的工具包,如
google-search-results和llm-math。 - 初始化代理并加载工具(如SerpAPI和LLM数学工具)。
- 调用代理运行任务。
代码示例如下:
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
import os
# 设置API密钥
os.environ["OPENAI_API_KEY"] = 'Your OpenAI API Key'
os.environ["SERPAPI_API_KEY"] = 'Your SerpAPI API Key'
# 加载工具和大模型
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)
# 运行代理
result = agent.run("目前市场上玫瑰花的平均价格是多少?如果我在此基础上加价15%卖出,应该如何定价?")
print(result)
通过运行上面的代码,代理会自动按照ReAct框架进行推理和行动,首先搜索玫瑰花的市场价格,然后计算加价后的售价。 代理允许大模型通过与外部工具的交互,实现自主决策和任务执行。ReAct框架通过推理和行动的协同作用,使得模型能够更智能地执行任务。
LangChain的关键理念是操作顺序不再硬编码在代码中,而是由大模型根据任务需求自主选择执行的步骤。这种方式为大模型赋予了极大的自主性和灵活性,使得它不仅能够完成简单的对话任务,还能处理复杂的决策任务。