内容来自极客时间-Langchain实战课,侵权请联系删除LangChain 实战课 - 掘金小册 - 掘金小册
仅仅应用思维链推理并不能解决大模型的固有问题:无法主动更新自己的知识,导致出现事实幻觉。
下面这张图就属于第二种情况,我制作的一个Prompt骗过了大模型,它会误以为我引述的很多虚构的东西是事实,而且它还会顺着这个思路继续胡编乱造。
对此,可以让大模型先在本地知识库中进行搜索,检查一下提示中的信息的真实性,如果真实,再进行输出;如果不真实,则进行修正。如果本地知识库找不到相应的信息,可以调用工具进行外部搜索,来检查提示信息的真实性。
上面所说的无论本地知识库还是搜索引擎,都不是封装在大模型内部的知识,我们把它们称为“外部工具”。
应用场景:需要模型做自主判断、自行调用工具、自行决定下一步行动
代理就像一个多功能的接口,它能够接触并使用一套工具。根据用户的输入,代理会决定调用哪些工具。它不仅可以同时使用多种工具,而且可以将一个工具的输出数据作为另一个工具的输入数据。
在LangChain中使用代理,我们只需要理解下面三个元素。
推理(Reasoning)过程,推理指导着你的行动(Acting)
这个思维框架是Shunyu Yao等人在ICLR 2023会议论文《ReAct: Synergizing Reasoning and Acting in Language Models》(ReAct:在语言模型中协同推理和行动)中提出的。这篇文章的一个关键启发在于:大语言模型可以通过生成推理痕迹和任务特定行动来实现更大的协同作用。
LangChain正是通过Agent类,将ReAct框架进行了完美封装和实现,这一下子就赋予了大模型极大的自主性(Autonomy),你的大模型现在从一个仅仅可以通过自己内部知识进行对话聊天的 Bot,飞升为了一个有手有脚能使用工具的智能代理。
下面,就让我们用LangChain中最为常用的 ZERO_SHOT_REACT_DESCRIPTION ——这种常用代理类型,来剖析一下LLM是如何在ReAct框架的指导之下进行推理的。
此处,我们要给代理一个任务,这个任务是找到玫瑰的当前市场价格,然后计算出加价15%后的新价格。
在开始之前,有一个准备工作,就是你需要在 serpapi.com 注册一个账号,并且拿到你的 SERPAPI_API_KEY,这个就是我们要为大模型提供的 Google 搜索工具。
先安装SerpAPI的包。
pip install google-search-results
设置好OpenAI和SerpAPI的API密钥。
# 设置OpenAI和SERPAPI的API密钥 import os os.environ["OPENAI_API_KEY"] = 'Your OpenAI API Key' os.environ["SERPAPI_API_KEY"] = 'Your SerpAPI API Key'
再导入所需的库。
from langchain.agents import load_tools from langchain.agents import initialize_agent from langchain.agents import AgentType from langchain.llms import OpenAI
然后加载将用于控制代理的语言模型。
llm = OpenAI(temperature=0)
接下来,加载一些要使用的工具,包括serpapi(这是调用Google搜索引擎的工具)以及llm-math(这是通过LLM进行数学计算的工具)。
tools = load_tools(["serpapi", "llm-math"], llm=llm)
最后,让我们使用工具、语言模型和代理类型来初始化代理。
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
好了,现在我们让代理来回答我刚才提出的问题了!目前市场上玫瑰花的平均价格是多少?如果我在此基础上加价15%卖出,应该如何定价?
agent.run("目前市场上玫瑰花的平均价格是多少?如果我在此基础上加价15%卖出,应该如何定价?")
大模型成功遵循了ReAct框架,它输出的思考与行动轨迹如下:
> Entering new chain... I need to find the current market price of roses and then calculate the new price with a 15% markup. Action: Search Action Input: "Average price of roses" Observation: According to the study, the average price for a dozen roses in the United States is $80.16. The Empire State hovers closer to that number than its neighbors, with a bouquet setting back your average New Yorker $78.33. Thought: I need to calculate the new price with a 15% markup. Action: Calculator Action Input: 80.16 * 1.15 Observation: Answer: 92.18399999999998 Thought: I now know the final answer. Final Answer: The new price with a 15% markup would be $92.18. > Finished chain.
可以看到,ZERO_SHOT_REACT_DESCRIPTION类型的智能代理在LangChain中,自动形成了一个完善的思考与行动链条,而且给出了正确的答案。
你可以对照下面这个表格,再巩固一下这个链条中的每一个环节。
这个思维链条中,智能代理有思考、有观察、有行动,成功通过搜索和计算两个操作,完成了任务。在下一讲中,我们将继续深入剖析LangChain中的不同类型的代理,并利用它完成更为复杂的任务。
这节课我们介绍了什么是LangChain中的代理,更重要的是,我们介绍了代理自主行动的驱动力—— ReAct框架。
通过ReAct框架,大模型将被引导生成一个任务解决轨迹,即观察环境-进行思考-采取行动。观察和思考阶段被统称为推理(Reasoning),而实施下一步行动的阶段被称为行动(Acting)。在每一步推理过程中,都会详细记录下来,这也改善了大模型解决问题时的可解释性和可信度。
ReAct框架的这些优点,使得它在未来的发展中具有巨大的潜力。随着技术的进步,我们可以期待ReAct框架将能够处理更多、更复杂的任务。特别是随着具身智能的发展,ReAct框架将能够使智能代理在虚拟或实际环境中进行更复杂的交互。例如,智能代理可能会在虚拟环境中进行导航,或者在实际环境中操作物理对象。这将大大扩展AI的应用范围,使得它们能够更好地服务于我们的生活和工作。