开源大语言模型作为 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)”结合的方式来构建智能体。在提示词中,我们阐述了模型能够利用哪些工具,并引导它“逐步”思考 (亦称为 思维链 行为),以规划并实施其后续动作,达成最终的目标。

d71c0cfef280e2f2f2ea80bf6a91dda2.png

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”

  1. 高效地吸收和利用过去观察到的信息,无论是初始上下文还是使用工具后返回的观察结果。

那么,完整的智能体设置会是怎样的呢?

使用 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%的量表以便阅读):

a98bde50a21939ce3959acaeb8fb39a2.png

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

👉 But Mixtral-8x7B performs really well: it even beats GPT-3.5! 🏆

👉 然而,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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用买糖果的方式来理解正交匹配追踪(OMP)算法

在信号处理领域,压缩感知(Compressed Sensing)是一种能够从远少于传统奈奎斯特采样定理所要求的样本数目中重建稀疏信号的技术。压缩感知的理论基础在于一个前提假设,即许多自然信号都含有稀疏的表示,换句话说&#xf…

【Python】OpenCV-图像轮廓检测初学

图像轮廓检测初学 在图像处理领域中,轮廓检测是一项重要的任务,用于寻找并标定图像中的物体边缘。本文将介绍如何使用OpenCV库进行图像轮廓检测,并展示一个简单的示例代码。代码中的注释将详细解释每一步的操作。 1. 引言 图像轮廓检测是图…

决策树算法

目录 谷歌笔记本(可选) 决策树 决策树的一般流程 信息增益 划分数据集 递归构建决策树 使用Matplotlib注解绘制树形图 Matplotlib注解 构造注解树 测试和存储分类器 测试算法:使用决策树执行分类 使用算法:决策树的存…

RISC-V知识总结 —— 指令集

资源1: RISC-V China – RISC-V International 资源2: RISC-V International – RISC-V: The Open Standard RISC Instruction Set Architecture 资源3: RV32I, RV64I Instructions — riscv-isa-pages documentation 1. 指令集架构的类型 在讨论RISC-V或任何处理器架构时&…

基于springboot+vue的图书进销存管理系统(前后端分离)

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【Vue3】学习computed计算属性

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢…

华清远见嵌入式学习——驱动开发——day9

目录 作业要求: 作业答案: 代码效果: ​编辑 Platform总线驱动代码: 应用程序代码: 设备树配置: 作业要求: 通过platform总线驱动框架编写LED灯的驱动,编写应用程序测试&…

JAVA代码审计之XSS漏洞

Part1 漏洞案例demo&#xff1a; 没有java代码审计XSS漏洞拿赏金的案例。 所以将就看看demo吧 漏洞原理&#xff1a;关于XSS漏洞的漏洞原理核心其实没啥好说的&#xff0c;网上一查一大堆 反射性XSS漏洞 <% page language"java" contentType"text/html; c…

C# OpenCvSharp 利用白平衡技术进行图像修复

目录 效果 灰度世界(GrayworldWB)-白平衡算法 完美反射(SimpleWB)-白平衡算法 基于学习的(LearningBasedWB)-白平衡算法 代码 下载 C# OpenCvSharp 利用白平衡技术进行图像修复 OpenCV xphoto模块中提供了三种不同的白平衡算法&#xff0c;分别是&#xff1a;灰度世界(G…

bat脚本进程停止与启动

在Windows操作系统中&#xff0c;批处理&#xff08;Batch&#xff09;脚本是一种常见的自动化脚本工具&#xff0c;通过BAT文件来执行一系列DOS命令。通过BAT脚本&#xff0c;我们可以轻松地控制进程的启动和停止。 一、进程停止 在BAT脚本中&#xff0c;要停止一个进程&…

基于Redis限流(固定窗口、滑动窗口、漏桶、令牌桶)(肝货!!!)

近期redis复习的比较多&#xff0c;在限流这方面发现好像之前理解的限流算法有问题&#xff0c;索性花了一天“带薪摸鱼”时间肝了一天&#xff0c;有问题可以评论区探讨。 废话不多说&#xff0c;正片开始 目录 Maven固定窗口滑动窗口算法漏桶算法令牌桶算法 Maven 有些不用的…

B树的介绍

R-B Tree 简介特性B树特性m阶B树的性质&#xff08;这些性质是B树规定的&#xff09; B树的搜索B树的添加B树的删除——非叶子结点 简介 R-B Tree又称为Red-Black Tree&#xff0c;红黑树。是一种特殊的二叉查找树&#xff0c;红黑树的每个节点上都有存储为表示结点的颜色&…

3-Bean的生命周期

Bean的生命周期 创建对象和初始化是在AbstractAutowireCapableBeanFactory.doCreateBean()中完成的 创建对象 实例化&#xff08;构造方法&#xff09;依赖注入 初始化 执行Aware接口回调执行BeanPostProcessor.postProcessBeforeInitialization执行InitializingBean回调&…

ShardingSphere 5.x 系列【15】分布式主键生成器

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.1.0 本系列ShardingSphere 版本 5.4.0 源码地址:https://gitee.com/pearl-organization/study-sharding-sphere-demo 文章目录 1. 概述2. 配置3. 内置算法3.1 UUID3.2 Snowflake3.3 NanoId3.4 CosId3.5 Co…

PostgreSQL教程(四):高级特性

一、简介 在之前的章节里我们已经涉及了使用SQL在PostgreSQL中存储和访问数据的基础知识。现在我们将要讨论SQL中一些更高级的特性&#xff0c;这些特性有助于简化管理和防止数据丢失或损坏。最后&#xff0c;我们还将介绍一些PostgreSQL扩展。 本章有时将引用教程&#xff0…

Rust之构建命令行程序(四):用TDD(测试-驱动-开发)模式来开发库的功能

开发环境 Windows 11Rust 1.75.0 VS Code 1.86.2 项目工程 这次创建了新的工程minigrep. 用测试-驱动模式来开发库的功能 既然我们已经将逻辑提取到src/lib.rs中&#xff0c;并将参数收集和错误处理留在src/main.rs中&#xff0c;那么为代码的核心功能编写测试就容易多了。我…

Opencv实战(2)绘图与图像操作

Opencv实战(2)绘图与图像操作 指路前文&#xff1a;Opencv实战(1)读取与像素操作 三、基本绘图 文章目录 Opencv实战(2)绘图与图像操作三、基本绘图(1).line(2).rectangle(3).circle 四、图像处理(1).颜色空间1.意义2.cvtColor()3.inRange()4.适应光线 (2).形态操作1.腐蚀2.膨…

【软件架构】01-架构的概述

1、定义 软件架构就是软件的顶层结构 RUP&#xff08;统一过程开发&#xff09;4 1 视图 1&#xff09;逻辑视图&#xff1a; 描述系统的功能、组件和它们之间的关系。它主要关注系统的静态结构&#xff0c;包括类、接口、包、模块等&#xff0c;并用于表示系统的组织结构…

unity hub (第一部)初学配置

1、安装Unity Hub 2、设置中文 3、安装编辑器 4、新建项目 5、新建完成后进入编辑器 6、 编辑器设置中文 editPreferencesLanguages选择中文

mysql的日志文件在哪?

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; MySQL的日志文件通常包括错误日志、查询日志、慢查询日志和二进制日志等。这些日志文件的位置取决于MySQL的安装和配置。以下是一些常见的日志文件位置和如何找到它们&#xff…