使用开源 LLM 充当 LangChain 智能体

news2024/12/24 0:54:38

太长不看版

开源 LLM 现已达到一定的性能水平,可堪作为智能体工作流的推理引擎。在我们的测试基准上,Mixtral 甚至已超越 GPT-3.5,而且我们还可以通过微调轻松地进一步提高其性能。

引言

经由因果语言建模任务训练出的大语言模型(LLM)可以处理很多任务,但在逻辑、计算及搜索等类型的任务上表现不尽人意。最糟糕的是,它们在数学等领域表现不佳而不自知,仍不自量力地想仅凭一己之力完成所有计算。

为了克服这一弱点,方法之一就是将 LLM 集成到一个含有若干可调用工具的系统中,我们称这样的系统为 LLM 智能体(agent)。

本文,我们首先解释了 ReAct 智能体的内在工作原理,然后展示了如何使用最近集成到 LangChain 中的 ChatHuggingFace 接口来构建自己的智能体。最后,我们把几个开源 LLM 与 GPT-3.5 和 GPT-4 一起在同一基准测试上进行了比较。

目录

  • 使用开源 LLM 充当 LangChain 智能体
    • 太长不看版
    • 引言
    • 目录
    • 什么是智能体?
      • ReAct 智能体内在机制示例
      • 智能体系统面临的挑战
    • 使用 LangChain 运行智能体
    • 智能体对决:开源 LLM 充当通用推理智能体的表现如何?
      • 评估
      • 模型
      • 结果

什么是智能体?

LLM 智能体的定义相当宽泛:LLM 智能体是所有使用 LLM 作为引擎并基于观察对环境采取相应行动的系统。其使用 感知⇒反思⇒行动 的多轮迭代来完成任务,也经常通过规划或知识管理系统来增强性能。如对该领域的全景感兴趣,可参考 Xi et al., 2023 这篇论文。

本文重点关注 ReAct 智能体。ReAct 用“推理”和“行动”这两个词串联起智能体的工作流。我们通过提示告诉模型可以使用哪些工具,并要求它“一步一步”(即思维链)思考并行动,直至获得最终答案。

ReAct 智能体

ReAct 智能体内在机制示例

上图看上去很高端,但实现起来其实非常简单。

可以参考一下这个 notebook,这里,我们用 transformers 库实现了一个简单的工具调用示例。

我们用下述提示模板循环调用 LLM:

Here is a question: "{question}" 
You have access to these tools: {tools_descriptions}. 
You should first reflect with ‘Thought: {your_thoughts}’, then you either:
- call a tool with the proper JSON formatting,
- or your print your final answer starting with the prefix ‘Final Answer:’

等 LLM 输出回答后,就用如下方式解析其回答:

  • 如果回答中包含字符串 ‘Final Answer:’,则结束循环并打印答案。
  • 否则,LLM 会输出一个工具调用。你可以解析此输出以获取工具名及参数,并使用所述参数调用所述工具。然后,将此次工具调用的输出附加到提示中,并把扩展后的提示输入给 LLM,直到它有足够的信息生成最终答案。

举个例子,当回答问题 How many seconds are in 1:23:45? 时,LLM 的输出可能如下所示:

Thought: I need to convert the time string into seconds.

Action:
{
    "action": "convert_time",
    "action_input": {
    "time": "1:23:45"
    }
}

由于此回答中不含字符串 ‘Final Answer:’,所以其输出的应该是一个工具调用。此时,我们解析此输出并获取工具调用参数:使用参数 {"time": "1:23:45"} 调用工具 convert_time

可以看到,工具返回了 {'seconds': '5025'}

此时,我们将整个过程及结果添加到提示中,新提示就变成了如下这样(比之前稍微复杂一些了):

Here is a question: "How many seconds are in 1:23:45?"
You have access to these tools:
    - convert_time: converts a time given in hours:minutes:seconds into seconds.

You should first reflect with ‘Thought: {your_thoughts}’, then you either:
- call a tool with the proper JSON formatting,
- or your print your final answer starting with the prefix ‘Final Answer:’

Thought: I need to convert the time string into seconds.

Action:
{
    "action": "convert_time",
    "action_input": {
    "time": "1:23:45"
    }
}
Observation: {'seconds': '5025'}

➡️ 我们再次调用 LLM,并将这个新提示输入给它。鉴于它在 Observation 字段中得到了工具返回的结果,这轮 LLM 很有可能输出如下:

Thought: I now have the information needed to answer the question.
Final Answer: There are 5025 seconds in 1:23:45.

至此,任务解决!

智能体系统面临的挑战

智能体系统中的 LLM 引擎需要克服以下几个难点:

  1. 从候选工具集中选出能实现预期目标的工具:例如当被问到“大于 30,000 的最小素数是多少?”时,智能体可以调用 Search 工具,并问它`“K2 的高度是多少”,但这么做无济于事。

  2. 以规定的参数格式调用工具:例如,当尝试计算 10 分钟内行驶了 3 公里的汽车的速度时,必须调用 Calculator 以让其执行“距离”除以“时间”的操作,假设 Calculator 工具能接受 JSON 格式的调用: {"tool": "Calculator", "args": "3km/10min"} ,看上去很简单,但其实会有很多小陷阱,一步不慎就前功尽弃,例如:

    • 工具名称拼写错误:“calculator”“Compute” 是无效的
    • 仅给出参数名而未给出参数值:“args”: “distance/time”
    • 参数格式未标准化:“args”:"3km in 10minutes”
  3. 有效吸收并使用历史信息,无论是原始上下文信息还是前面若干轮工具调用所返回的观察。

那么,在真实场景中如何设置并使用智能体呢?

使用 LangChain 运行智能体

我们最近封装了一个 ChatHuggingFace 接口,你可以利用它在 🦜🔗LangChain 中使用开源模型创建智能体。

要创建 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)

你可以通过给 chat_model 提供 ReAct 风格的提示和工具,将其变成智能体:

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

# setup tools
tools = load_tools(["serpapi", "llm-math"], llm=llm)

# setup ReAct style prompt
prompt = hub.pull("hwchase17/react-json")
prompt = prompt.partial(
    tools=render_text_description(tools),
    tool_names=", ".join([t.name for t in tools]),
)

# define the agent
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()
)

# instantiate 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?"
    }
)

智能体第一轮输出如下:

Thought: To answer this question, I need to find age of the current speedskating world record holder.  I will use the search tool to find this information.
Action:
{
    "action": "search",
    "action_input": "speed skating world record holder 500m age"
}
Observation: ...

智能体对决:开源 LLM 充当通用推理智能体的表现如何?

你可在此处找到我们使用的基准测试代码。

评估

我们想要度量开源 LLM 作为通用推理智能体时的表现。因此,我们选用的问题都是需要依赖逻辑推演以及一些基本工具的使用才能回答出来的。这里,我们将所需工具限制为计算器和互联网搜索。

最终数据集 结合了以下 3 个数据集的样本:

  • 为了测试互联网搜索能力,我们从HotpotQA中选择了一些问题,该数据集原本是一个检索数据集,但在可以访问互联网时,其可用于通用问答场景。有些问题原先需要结合多个不同来源的信息,对这类问题,我们可以执行多次互联网搜索来综合出最终结果。

  • 为了用上计算器,我们添加了来自 GSM8K 的一些问题,该数据集用于测试小学数学四则运算(加、减、乘、除)的能力。

  • 我们还从 GAIA 中挑选了一些问题,该数据集是面向通用人工智能助手的一个非常困难的基准测试集。原始数据集中的问题会需要用到很多不同的工具,如代码解释器或 pdf 阅读器,我们精心挑选了一些只需使用搜索和计算器的问题。

评估时,我们选用 Prometheus 格式作为提示格式,并请 GPT-4 对结果以 5 分制李克特量表(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 模型性能处于最佳水平。

结果

由于并没有专门针对给定调用函数格式进行微调,从这个角度讲,与 OpenAI 智能体相比,开源模型智能体稍有劣势。

尽管如此,还是有一些模型表现让人眼前一亮! 💪

下面给出了 Mixtral-8x7B 回答问题 “Which city has a larger population, Guiyang or Tacheng?” 的一个例子。

Thought: To answer this question, I need to find the current populations of both Guiyang and Tacheng. I will use the search tool to find this information.
Action:
{
    "action": "search",
    "action_input": "current population of Guiyang"
}
4.697 million (2016)

Thought: I have obtained the population of Guiyang, which is 4.697 million (as of 2016). Now, I will use the search tool again to find the population of Tacheng.
Action:
{
    "action": "search",
    "action_input": "current population of Tacheng"
}
Population: Xinjiang: Tacheng data was reported at 1,110.000 Persons in 2021. This records a decrease from the previous number of 1,138.638 Persons for 2020.
Population: Xinjiang: Tacheng data is updated yearly, averaging 1,023.000 Persons from Dec 2005 to 2021, with 17 observations.

I have obtained the population of Tacheng, which is approximately 1.11 million (as of 2021). Comparing the two populations, Guiyang has a larger population than Tacheng.

Thought: I now know the final answer
Final Answer: Guiyang has a larger population, which is approximately 4.697 million (as of 2016), compared to Tacheng's population of approximately 1.11 million (as of 2021).

以下给出了我们测得的各模型在各数据集上的表现(为了便于阅读,我们把 1-5 分制转换成了 0 - 100%):

智能体性能基准

如你所见,部分开源模型在智能体工作流中表现欠佳:虽然我们能预料到较小的 Zephyr-7b 可能不尽如人意,但 Llama2-70b 的表现却让我们大跌眼镜。

👉 但 Mixtral-8x7B 表现得非常好,甚至超越了 GPT-3.5! 🏆

而且这仅仅是开箱性能:与 GPT-3.5 不同,Mixtral 并没有针对智能体工作流场景微调过(据我们所知),这在一定程度上说明其性能还有进步空间。例如,在 GAIA 上,10% 的失败案例是因为 Mixtral 尝试使用错误的参数格式调用工具。通过针对函数调用和任务规划技能进行适当的微调,Mixtral 的分数有可能会进一步提高。

➡️我们强烈建议开源社区针对智能体场景微调 Mixtral,以超越 GPT-4! 🚀

最后的话:

  • 虽然本文仅使用了 GAIA 基准的一小部分问题和工具,但该基准似乎有潜力对智能体工作流整体性能进行可靠度量,因为其测例通常需要多步推理以及严格的逻辑。

  • 智能体工作流可以提高 LLM 的性能。例如,在 GSM8K 数据集上,GPT-4 的技术报告 表明 5-样本 CoT 提示的成功率为 92%;但一旦使用计算器工具,零样本的成功率就能提升到 95%。而对 Mixtral-8x7B,LLM 排行榜 测得其 5-样本成功率仅为 57.6%,但我们在智能体工作流中测得的零样本成功率为 73%。 (注意,我们只测试了 GSM8K 数据集中的 20 个问题。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙应用服务开发【华为支付服务】客户端

华为支付服务 介绍 本示例展示了使用华为支付服务提供的单次支付,签约代扣。 需要使用华为支付服务接口 kit.PaymentKit。 效果预览 Sample工程的配置与使用 在DevEco中配置Sample工程的步骤如下 [创建项目]及[应用]。打开Sample应用,使用[AppGall…

【JavaEE精炼宝库】网络原理基础——UDP详解

文章目录 一、应用层二、传输层2.1 端口号:2.2 UDP 协议:2.2.1 UDP 协议端格式:2.2.2 UDP 存在的问题: 2.3 UDP 特点:2.4 基于 UDP 的应用层协议: 一、应用层 我们 Java 程序员在日常开发中,最…

2024年大模型LLM还有哪些可研究细分领域?

Pretraining部分 Data Collection 整个pretrain阶段最重要的部分就是数据收集,尽管OpenAI已经给我们了一套标准化的数据收集流程并也有很多开源机构给予了预训练数据(例如common crawl [1],starcoder等网络数据 [2])&#xff0c…

清华大学终于把Python整理成了《漫画书》

前言 随着人工智能的发展,Python近两年也是大火,越来越多的人加入到Python学习大军,对于毫无基础的人该如何入门Python呢?小编这里整理了一套python编程零基础自学教程,清华大佬196小时讲完的,全程干货无废…

如何将avi格式转换为flv格式呢?

FLV是随着FLASH MX的推出发展而来的一种视频格式,目前被众多新一代视频分享网站所采用,是目前增长较快,也较为广泛的视频传播格式。 FLV格式可以轻松导入FLASH播放器中,另外它还能起到保护版权的作用,非常受欢迎。那么…

uniapp实现可视化图表(轻量、内存小)

图表官网:uCharts官网 - 秋云uCharts跨平台图表库 用原生组件: 选择自己需要的模块,以小程序为例: 把min.js下载下来 把min.js放到小程序代码中,引用即可,使用案例看官网, 在官网中选择想要的…

Embedding技术之Graph Embedding

Graph Embedding用于处理互联网中的图数据——社交网络、知识图谱、行为关系类型图数据。 1、DeepWalk——基于随机游走的Graph Embedding DeepWalk 是一种用于学习图(网络)中节点的低维向量表示(即节点嵌入)的算法。 DeepWalk …

51单片机-第八节-蜂鸣器

一、什么是蜂鸣器? 蜂鸣器是一种将电信号转换为声音信号的器件,常用来产生设备的按键音、报警音等提示信号。 蜂鸣器按驱动方式可分为有源蜂鸣器和无源蜂鸣器: 有源蜂鸣器:内部自带振荡源,将正负极接上直流电压即可…

供应商较多的汽车制造业如何选择供应商协同平台?

汽车制造业的供应商种类繁多,根据供应链的不同环节和产品特性,可以大致分为以下几类。 按供应链等级分包括: 一级供应商通常具有较高的技术水平和生产能力,能够满足汽车厂商对零部件的高品质、高性能和高可靠性的要求。 二级供应…

正点原子imx6ull-mini-Linux驱动之Linux CAN 驱动实验

CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车 领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。CAN 总线目前是自动化领 域发展的热点技术之一,由于其高可靠性,CAN 总线…

SpringBoot整合MyBatis-Plus实现多数据源数据迁移

SpringBoot整合MyBatis-Plus实现多数据源数据迁移(达梦数据库、mysql) 1. 相关pom <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.6</version> </dependency&g…

【python安装离线包】

python安装离线包 一、离线包下载1.1 离线包单个下载1.2 离线包批量下载 二、离线包安装2.1 离线包单个安装2.2 离线包批量安装 一、离线包下载 目的&#xff1a;我们在工作中可能会遇到内网环境、离线环境、或者python的源无法下载三方库的情况&#xff0c;此时就得需要我们自…

Can GPT-3 Perform Statutory Reasoning?

文章目录 题目摘要相关工作SARAGPT-3 对美国法典的了解GPT-3 在对合成法规进行简单推理时遇到困难结论 题目 GPT-3 可以进行法定推理吗&#xff1f; 论文地址&#xff1a;https://arxiv.org/abs/2302.06100 摘要 法定推理是用事实和法规进行推理的任务&#xff0c;法规是立法机…

音频应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

音频应用编程 Linux 下 ALSA 框架概述 ALSA 简介&#xff1a;ALSA 是 Advanced Linux Sound Architecture&#xff08;高级的 Linux 声音体系&#xff09;的缩写 地位与功能&#xff1a;现已成为 Linux 下的主流音频体系架构&#xff0c;提供音频和 MIDI 支持&#xff0c;替代…

无线网络工具Aircrack-ng使用大全(非常详细)零基础入门到精通,收藏这一篇就够了

Aircrack-ng是一个与802.11标准的无线网络分析有关的安全软件&#xff0c;主要功能有 网络侦测 。可以捕获无线网络数据包&#xff0c;并对其进行分析和处理&#xff0c;以便获取无线网络的关键信息和加密密钥。 数据包嗅探 。可以嗅探802.11a、802.11b、802.11g的数据。 WEP和…

腾讯云AI代码助手:智能编程的未来之窗

腾讯云AI代码助手&#xff1a;智能编程的未来之窗 智能编程的未来之窗 引言配置环境介绍腾讯云 AI 代码助手使用实例生成文档功能解释代码功能生成测试功能精准修复错误功能技术对话功能 智能编程获得的帮助与提升对腾讯云AI代码助手的建议结语 引言 今天七七给大家带来一款非常…

养老院人员定位系统组成部分包括哪些?

现代养老服务需要更高的精细化支持&#xff0c;养老院人员定位系统是一项非常重要的技术应用&#xff0c;该系统通常包括硬件设备、软件平台以及数据存储和处理模块等组成部分。 首先&#xff0c;养老院人员定位系统的核心就是硬件设备&#xff0c;一般由定位终端设备、传感器、…

逻辑数据平台,多源异构实时数据高效同步的新途径

多源异构数据库的实时数据同步&#xff0c;需要将不同来源、格式和结构的数据进行整合、清洗、转换、合并、分析&#xff0c;形成统一的、一致的视图。其中&#xff0c;数据清洗是将数据中的噪声、异常值、不一致和重复的数据去除&#xff0c;提高数据质量&#xff1b;数据整合…

正则表达式介绍与基础

正则表达式介绍与基础 首先是正则表达式的特殊符号&#xff1a; [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:]代表空格和 tab 键 [:cntrl:]键盘上的控制按键&#xff0c;如 CR,LF,TAB,DEL [:digit:]代表数字 [:graph:]代表空白字符以外的其…

SpringBoot MybatisPlus selectOne的坑

目录 一、问题 二、问题解决 三、其他方法 一、问题 selectOne在查询多条数据时会报错&#xff0c;查询语句并不会加 limit 1。 One record is expected, but the query result is multiple records。 二、问题解决 在QueryWrapper上添加如下&#xff1a; QueryWrapper&…