乐趣区

关于人工智能:开源大语言模型作为-LangChain-智能体

概要

开源大型语言模型 (LLMs) 现已达到一种性能程度,使它们适宜作为推动智能体工作流的推理引擎: Mixtral 甚至在咱们的基准测试中 超过了 GPT-3.5,并且通过微调,其性能能够轻易的失去进一步加强。

引言

针对 因果语言建模 训练的大型语言模型 (LLMs) 能够解决宽泛的工作,但它们常常在逻辑、计算和搜寻等根本工作上遇到困难。最蹩脚的状况是,它们在某个畛域,比方数学,体现不佳,却依然试图本人解决所有计算。

为了克服这一弱点,除其余办法外,能够将 LLM 整合到一个零碎中,在该零碎中,它能够调用工具: 这样的零碎称为 LLM 智能体。

在这篇文章中,咱们将解释 ReAct 智能体的外部工作原理,而后展现如何应用最近在 LangChain 中集成的 ChatHuggingFace 类来构建它们。最初,咱们将几个开源 LLM 与 GPT-3.5 和 GPT-4 进行基准测试。

什么是智能体?

LLM 智能体的定义十分宽泛: 它们指的是所有将 LLMs 作为外围引擎,并可能依据察看对其环境施加影响的零碎。这些零碎可能通过屡次迭代“感知 ⇒ 思考 ⇒ 口头”的循环来实现既定工作,并经常融入布局或常识管理系统以晋升其体现效力。你能够在 Xi et al., 2023 的钻研中找到对智能体畛域综述的精彩评述。

明天,咱们将重点放在 ReAct 智能体 上。ReAct 采纳一种基于“ 推理 (Reasoning)”与“ 口头 (Acting)”联合的形式来构建智能体。在提醒词中,咱们论述了模型可能利用哪些工具,并疏导它“逐渐”思考 (亦称为 思维链 行为),以布局并施行其后续动作,达成最终的指标。

ReAct 智能体外部工作原理示例

上述图解虽显得有些形象,但其外围原理其实相当间接。

参见 此笔记本: 咱们借助 Transformers 库展现了一个最根底的工具调用实例。

实质上,LLM 通过一个循环被调用,循环中的提醒蕴含如下内容:

这里是一个问题:“{question}”你能够应用这些工具: {tools_descriptions}。首先,你须要进行‘思考: {your_thoughts}’,接下来你能够:
- 以正确的 JSON 格局发动工具调用,- 或者,以‘最终答案:’为前缀来输入你的答案。

接下来,你须要解析 LLM 的输入:

  • 如果输入中蕴含‘最终答案:’ 字符串,循环便完结,并输入该答案;
  • 若不蕴含,则示意 LLM 进行了工具调用: 你需解析此输入以取得工具的名称及其参数,随后依据这些参数执行相应工具的调用。此工具调用的后果将被追加至提示信息中,而后你将带有这些新增信息的提醒再次传递给 LLM,直至它取得足够的信息来给出问题的最终答案。

例如,LLM 的输入在答复问题: 1:23:45 中有多少秒? 时可能看起来像这样:

思考: 我须要将工夫字符串转换成秒。动作:
{
    "action": "convert_time",
    "action_input": {"time": "1:23:45"}
}

鉴于此输入未蕴含 ‘最终答案:’ 字符串,它代表进行了工具调用。因而咱们解析该输入,获取工具调用的参数: 以参数 {"time": "1:23:45"} 调用 convert_time 工具,执行该工具调用后返回 {'seconds': '5025'}

于是,咱们将这整个信息块追加至提醒词中。

更新后的提醒词当初变为 (更为详尽的版本):

这是一个问题:“1:23:45 蕴含多少秒?”你能够应用以下工具:
    - convert_time: 将小时、分钟、秒格局的工夫转换为秒。首先,进行“思考: {your_thoughts}”,之后你能够:
- 应用正确的 JSON 格局调用工具,- 或以“最终答案:”为前缀输入你的答案。思考: 我须要把工夫字符串转换成秒数。口头:
{
    "action": "convert_time",
    "action_input": {"time": "1:23:45"}
}
观测后果: {'seconds': '5025'}

➡️ 咱们用这个新的提醒再次调用 LLM,鉴于它能够拜访工具调用后果中的 观测后果,LLM 当初最有可能输入:

思考: 我当初有了答复问题所需的信息。最终答案: 1:23:45 中有 5025 秒。

工作就这样实现了!

智能体零碎的挑战

一般来说,运行 LLM 引擎的智能体零碎的难点包含:

  1. 从提供的工具中抉择一个可能帮忙实现目标的工具: 例如,当询问“大于 30,000 的最小质数是什么?” 时,智能体可能会调用“K2 的高度是多少?”Search 工具,但这并无帮忙。
  2. 以严格的参数格局调用工具: 例如,在尝试计算一辆汽车 10 分钟内行驶 3 公里的速度时,你必须调用Calculator 工具,通过distance 除以time 来计算: 即使你的 Calculator 工具承受 JSON 格局的调用{“tool”:“Calculator”,“args”:“3km/10min”},也存在许多陷阱,例如:

    • 工具名称拼写错误: “calculator”“Compute” 是有效的
    • 提供的是参数名称而非其值: “args”:“distance/time”
    • 格局非标准化: “args":"3km in 10minutes”
  3. 高效地排汇和利用过来察看到的信息,无论是初始上下文还是应用工具后返回的察看后果。

那么,残缺的智能体设置会是怎么的呢?

应用 LangChain 运行智能体

咱们刚刚在 🦜🔗LangChain 中集成了一个 ChatHuggingFace 封装器,使你可能基于开源模型创立智能体。

创立 ChatModel 并为其装备工具的代码非常简单,你能够在 Langchain 文档 中查看所有相干代码。

from langchain_community.llms import HuggingFaceHub
from langchain_community.chat_models.huggingface import ChatHuggingFace

llm = HuggingFaceHub(
    repo_id="HuggingFaceH4/zephyr-7b-beta",
    task="text-generation",
)

chat_model = ChatHuggingFace(llm=llm)

你能够通过为其提供 ReAct 格调的提醒词和工具,将 chat_model 转化为一个智能体:

from langchain import hub
from langchain.agents import AgentExecutor, load_tools
from langchain.agents.format_scratchpad import format_log_to_str
from langchain.agents.output_parsers import (ReActJsonSingleInputOutputParser,)
from langchain.tools.render import render_text_description
from langchain_community.utilities import SerpAPIWrapper

# 设置工具
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# 设置 ReAct 格调的提醒词
prompt = hub.pull("hwchase17/react-json")
prompt = prompt.partial(tools=render_text_description(tools),
    tool_names=",".join([t.name for t in tools]),
)

# 定义智能体
chat_model_with_stop = chat_model.bind(stop=["\nObservation"])
agent = (
    {"input": lambda x: x["input"],
        "agent_scratchpad": lambda x: format_log_to_str(x["intermediate_steps"]),
    }
    | prompt
    | chat_model_with_stop
    | ReActJsonSingleInputOutputParser())

# 实例化 AgentExecutor
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)

agent_executor.invoke(
    {"input": "Who is the current holder of the speed skating world record on 500 meters? What is her current age raised to the 0.43 power?"}
)

智能体将解决如下输出:

思考: 为了答复这个问题,我须要找出以后速滑世界纪录保持者的年龄。我将应用搜寻工具来获取这些信息。口头:
{
"action": "search",
"action_input": "速滑 500 米世界纪录保持者的年龄"
}
察看: ...

智能体对决: 开源 LLM 作为通用推理智能体的体现如何?

你能够在 这里 找到这个基准测试的代码。

评估

咱们旨在评估开源大型语言模型 (LLMs) 作为通用推理智能体的体现。因而,咱们抉择了须要使用逻辑和应用根本工具 (如计算器和互联网搜寻拜访) 的问题。

最终数据集 是从其余三个数据集中选取样本的组合:

  • 为了测试互联网搜寻能力,咱们选取了 HotpotQA 中的问题: 尽管这是一个检索型数据集,但它也可用于须要互联网拜访的通用问题解答。有些问题本来须要联合来自不同起源的信息: 在咱们的设置中,这意味着须要进行多步互联网搜寻以整合后果。
  • 对于计算器的利用,咱们退出了来自 GSM8K 的问题: 这个数据集测试小学数学能力,并且齐全能够通过正确利用 4 个运算符 (加、减、乘、除) 来解决。
  • 咱们还从 GAIA 中筛选了问题,这是一个对通用 AI 助理来说极具挑战性的基准测试。原始数据集中的问题可能须要许多其余不同的工具,如代码解释器或 PDF 阅读器: 咱们精选了那些仅需搜寻和计算器的问题。

评估采纳了 GPT-4 作为评判员,基于 Prometheus 提醒格局 的提醒进行,后果以 5 点李克特量表 (5-point Likert Scale) 示意: 具体的提醒内容可在 此处 查看。

模型

咱们评估了一些弱小的开源模型:

  • Llama2-70b-chat
  • Mixtral-8x7B-Instruct-v0.1
  • OpenHermes-2.5-Mistral-7B
  • Zephyr-7b-beta
  • SOLAR-10.7B-Instruct-v1.0

这些模型通过 LangChain 的 ReAct 实现 进行了评估

这意味着咱们疏导它们依照以下格局输入函数调用:

{
  "action": $TOOL_NAME,
  "action_input": $INPUT
}

作为比拟,咱们还利用 LangChain 的 专为 OpenAI 设计的智能体 对 GPT-3.5 和 GPT-4 在雷同的例子上进行了评估。

因为这波及到它们本人的函数调用模板,并在此基础上进行了微调,这意味着 OpenAI 模型该当展现出最佳性能。

后果

鉴于开源模型并没有针对特定的输入格局进行特地的函数调用微调,相较于 OpenAI 智能体,它们处于略微不利的地位。

只管存在这样的不利条件,某些模型的体现仍然十分优良!💪

这是 Mixtral-8x7B 答复“贵阳和塔城哪个城市人口更多?”问题的示例:

思考: 为了答复这个问题,我须要找到贵阳和塔城以后的人口数。我将利用搜寻工具来查问这些信息。操作:
{
    "action": "search",
    "action_input": "贵阳以后人口"
}
4.697 百万 (2016 年)

思考: 我已取得贵阳的人口数,为 4.697 百万 (截至 2016 年)。当初,我将再次应用搜寻工具来确定塔城的人口数。操作:
{
    "action": "search",
    "action_input": "塔城以后人口"
}
人口: 新疆: 塔城的数据在 2021 年报告为 1,110,000 人。这比 2020 年的 1,138,638 人有所降落。人口: 新疆: 塔城的数据每年更新,从 2005 年 12 月到 2021 年,均匀人口为 1,023,000 人,共 17 次察看。我已确定塔城的人口约为 1.11 百万 (截至 2021 年)。比照两地人口,贵阳的人口超过塔城。思考: 我当初分明最终答案了
最终答案: 贵阳的人口更多,约为 4.697 百万 (截至 2016 年),而塔城的人口约为 1.11 百万 (截至 2021 年)。

这是各模型在咱们的评估数据集上的基准测试后果 (原始平均分按 1-5 的评分量表,已转换为 0-100% 的量表以便浏览):

正如所见,一些开源模型在推动智能体工作流程方面体现欠佳: 尽管对于小型的 Zephyr-7b 而言这是预期之中的,但令人诧异的是 Llama2-70b 的体现相当差。

👉 然而,Mixtral-8x7B 的体现十分杰出: 它甚至超过了 GPT-3.5!🏆

这是即开即用的性能: 与 GPT-3.5 不同的是,据咱们所知,Mixtral 没有针对智能体工作流程进行过微调 ,这在肯定水平上影响了其性能。例如,在 GAIA 上,因为 Mixtral 尝试应用格局不正确的参数调用工具,导致 10% 的问题失败。 如果对性能调用和工作布局技能进行适当的微调,Mixtral 的得分可能会更高。

➡️ 咱们强烈建议开源开发者开始针对智能体对 Mixtral 进行微调,以超过下一个挑战者: GPT-4!🚀

结语:

  • 尽管 GAIA 基准测试仅在一小部分问题和多数工具上进行了尝试,但它仿佛是智能体工作流程整体模型性能的一个十分弱小的指标,因为它通常波及多个推理步骤和严格的逻辑。
  • 智能体工作流程使 LLMs 可能晋升性能: 例如,在 GSM8K 上,GPT-4 的技术报告 显示,应用 5 次 CoT 提醒的状况下得分为 92%: 通过提供一个计算器,咱们可能在零次提醒的状况下达到 95%。对于 Mixtral-8x7B,LLM 排行榜 报告了应用 5 次提醒的状况下为 57.6%,而咱们在零次提醒的状况下达到了 73%。(记住,咱们仅测试了 GSM8K 的 20 个问题)

英文原文: https://hf.co/blog/open-source-llms-as-agents

作者: Aymeric Roucher, Joffrey THOMAS, Andrew Reed

译者: Evinci

退出移动版