用 LangChain 构建基于资料库的问答机器人(三):ReAct

news2024/11/24 23:01:29

大家好,我是 Jambo。我们已经学习了如何使用 LangChain 的一些基本功能,解下我们就应该要结合这些功能来做一些复杂的东西了。但在这之前,为了让同学们更好的理解 LangChain 在这其中做了什么,我想先介绍一下关于 GPT 使用方面的一些知识。

在 ChatGPT 开放之初,除了各大公司在 AI 算法方面竞争,还有许多人在研究如何仅通过修改 prompt 就能让 GPT-3 做出更好的回答,这种方法被称为“提示工程(Prompt Engineering)”。如果把 LLM 比喻成一个拥有一般常识的大脑,那么提示工程就是在教它如何思考,从而更有效的结合知识得出答案。像 AutoGPT 就是这样,他通过精心设计的 prompt,就能让 GPT-4 自行完成各种任务。为了让同学们了解这其中的思想,我们先从“思维链”开始介绍。

思维链(Chain of Thought)

思维链(Chain of Thought)在 ChatGPT 推出后不久就被提出,具体来说就是通过手动编写示例的方式让 GPT-3 将问题的思考过程也生成出来,通过这种方式 GPT-3 回答的效果会有大幅提升。就像我们在写比较复杂的计算题,将过程一步一步写出来的正确率会比直接写出答案要高。

Alt text

后来有人发现,只需要加上 “Let’s think step by step.” 这一魔法提示,就能达到一样的效果,还不需要写示例。并且他还在这基础上,额外让 GPT 根据它前面附带思考过程的回答,再总结出一个更简洁的答案,相当于把思考过程隐藏起来。

Alt text

我这里想强调的是,我们用 LLM 构建应用时,完全可以在输出最终答案前多次用 LLM 分析、拆解、解决问题。就像深度学习网络中的介于输入和输出之间的隐藏层,我们可以在这里加入更多的逻辑,让 LLM 能够更好的理解问题,从而得出更好的答案。

ReAct

无论我们如何调整 prompt,但 LLM 仍然存在一个重大缺陷:它始终基于训练时的数据集和 prompt 中提供的信息生成回答。如果提问有关天气、新闻或内部文件等问题,LLM 将无法回答或会产生虚假回答(“幻觉”)。

当然,我们可以在用户提出问题后,先使用搜索引擎或内部资料库来搜索问题,然后将搜索结果作为 prompt 的一部分。但在实际应用中,这种方法的效果并不总是好的,甚至在某些情况下会产生误导。例如,如果我们想让 LLM 帮助我们修改一篇文章,在这种流程下,程序会首先使用搜索引擎搜索文章,但很可能搜索不到相关结果。这样一来,LLM 就会直接罢工,因为我们通常要求 LLM 仅根据 prompt 提供的信息生成内容,以确保准确性。

为了解决这个问题,我们可以让 LLM 自己决定是否要进行搜索,要搜索什么内容,就和上一篇教程中提到的用 LLM 优化搜索语句一样。于是 ReAct 系统就被提出来了,通过 prompt 中的示例告诉 LLM 可以使用哪些工具,然后让 LLM 自己决定是否要使用这些工具,以及如何使用这些工具。ReAct 总共有三个部分:

  1. 思考:根据当前的信息思考需要做什么动作。
  2. 行动:根据思考结果做出相应的行动,如调用工具。程序可以分析这一步生成的字符串,来调用相应的工具,类似 Python 的 eval 函数。
  3. 观察:存放行动的结果,如搜索的内容,以便下一次思考时使用。

这三个步骤会不断循环,直到思考步骤判断已经找到答案,并在下面的行动中给出最终答案。

Alt text

其实你仔细回想一下,这个过程和我们人类思考的过程是类似的。我们在思考时,会根据当前的信息判断是否需要做出某些行动,然后根据行动的结果来判断是否已经找到答案,如果没有就继续思考,直到找到答案为止。

AutoGPT 的行为模式实际上和 ReAct 一样,只是相比提出 ReAct 的论文中的步骤,AutoGPT 的 prompt 更加详细,并且提供了更多的工具给 LLM 使用。但不管哪种方式,都需要编写大量的示例来告诉 LLM 如何思考、行动,并且根据提供工具的不同,效果也会有所不同,并且 ReAct 的思考流程会有很多步骤。而 LangChain 帮我们把这些步骤都隐藏起来了,将这一系列动作都封装成 “代理”,而这就是我们下一章要介绍的内容了。

上一篇:用 LangChain 构建基于资料库的问答机器人(二):从资料源中提取文本信息

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

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

相关文章

记录--关于前端的音频可视化-Web Audio

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 最近听音乐的时候,看到各种动效,突然好奇这些音频数据是如何获取并展示出来的,于是花了几天功夫去研究相关的内容,这里只是给大家一些代码实例&…

Vue组件的概念及其创建和使用

一、Vue组件概念,创建和使用 🚀(一)以前遇到重复的结构代码,怎么做?复制粘贴?可维护性高吗? 🚀(1)为什么要使用组件? 组件的好处&a…

编程小白的自学笔记十一(python爬虫入门三Selenium的使用+实例详解)

系列文章目录 编程小白的自学笔记十(python爬虫入门二实例代码详解 编程小白的自学笔记九(python爬虫入门代码详解) 编程小白的自学笔记八(python中的多线程) 编程小白的自学笔记七(python中类的继承…

phpstudy伪静态

html静态网址在文件目录真实存在就是真的html,把动态经过转换伪造成把html就是伪静态,可以用order by 和 union select验证一下 apache的伪静态网址搭建 找到apache的LoadModule rewrite_module modules/mod_rewrite.so把前面的#删除掉,开启伪静态 All…

Unity 实用插件篇 | Tutorial Master 2 游戏引导教程 功能深入学习

前言【Unity 实用插件篇】 | Tutorial Master 2 游戏引导教程 功能深入学习一、Tutorial Master Manager 面板二、Tutorial Master Manager 面板详细介绍2.1 Debug mode 调试模式2.2 Localization 本地化2.3 Pooling Settings 对象池设置2.4 Start Up Setting2.5 Tutorial List…

Python案例实现|租房网站数据表的处理与分析

在综合实战项目中,“北京链家网”租房数据的抓取任务已在 上一篇 完成,得到了数据表bj_lianJia.csv,如图1所示。该数据表包含ID、城区名(district)、街道名(street)、小区名(communi…

【从删库到跑路】MySQL数据库的索引(二)——索引的使用和选择

🎊专栏【MySQL】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【The Right Path】 🥰欢迎并且感谢大家指出小吉的问题 文章目录 🍔索引的使用⭐验证索引效率🎈细节 ⭐最左前缀法则…

Linux系统之安装MySQL8.0版本

Linux系统之安装MySQL8.0版本 一、MySQL介绍1.1 MySQL简介1.2 MySQL特点 二、本次实践介绍2.1 环境规划2.2 本次实践目的 三、卸载mariadb数据库3.1 卸载mariadb数据库3.2 卸载mysql数据库 四、配置yum仓库4.1 下载rpm文件4.2 配置yum仓库4.3 检查yum仓库状态4.4 检查mysql版本…

香橙派Zero2基于wiringPi外设库的实验(超声波测距)

超声波测距原理&#xff0c;原理可以查看下面的文章&#xff0c;这里就不赘述了 [51单片机超声波测距](http://t.csdn.cn/eYbod)在Linux中使用超声波测距会用到的时间相关的API和结构体 包含的头文件以及函数原型和时间结构体timveal原型#include<sys/time.h>int getti…

windows部署安装redis安装教程

1、下载redishttps://github.com/tporadowski/redis/releases 2、下载完然后双击安装 比较简单 略过 3、测试是否安装成功 提示bug Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf …

ffplay播放器剖析(8)----逐帧/音量调节/快进快退/倍数分析

文章目录 1.逐帧播放2. 音量调节3. seek 快进 快退4.倍速 1.逐帧播放 逐帧播放就是按s键触发的,调用step_to_next_frame触发 static void step_to_next_frame(VideoState *is) {/* if the stream is paused unpause it, then step */if (is->paused)stream_toggle_pause(i…

jmeter随记2:压测

jmeter随记1:压测 简述一、压测步骤二、观察cpu和内存占用情况三、查看磁盘占用情况 简述 关于压测&#xff0c;jmeter更直观的作用是用来编写压测脚本【请求和压测策略】&#xff0c;然后在linux服务器上执行&#xff0c;也可以在本地执行&#xff0c;压测执行脚本在启动jmet…

PHP注册/登录/发邮件--【强撸项目】

强撸项目系列总目录在000集 PHP要怎么学–【思维导图知识范围】 文章目录 本系列校训本项目使用技术 上效果图phpStudy 设置导数据库程序基本流程项目目录如图&#xff1a;注册zhuce.html配套资源作业&#xff1a; 本系列校训 用免费公开视频&#xff0c;卷飞培训班哈人&…

Oracle物化视图刷新和物化视图日志

Oracle物化视图刷新和物化视图日志 Oracle的物化视图是包括一个查询结果的数据库对像&#xff0c;它是远程数据的的本地副本&#xff0c;或者用来生成基于数据表求和的汇总表。 测试物化视图的刷新&#xff0c;参考物化视图日志&#xff0c;一个源表对应多个物化视图刷新。 物…

【Linux工具篇】项目自动构建化工具-make/Makefile

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 &#x1f4ab…

matlab cross()函数叉乘 计算过程详解

向量叉乘 在数学上&#xff0c;两向量的叉乘是一个过两相交向量的交点且垂直于两向量所在平面的向量。在Matlab中&#xff0c;用函数cross实现。 函数 cross() 格式 C cross(A,B) %若A、B为向量&#xff0c;则返回A与B的叉乘&#xff0c;即CAB&#xff0c;A、B必须是3个…

c#封装bool到cpp

c#那边传一个结构体&#xff0c;结构体里包含两个bool&#xff0c;封送到cpp&#xff0c;结果发现cpp那边读取有问题。一看cpp接收变量的内存&#xff0c;两个bool占的内存都不是一个字节了&#xff0c;再次记录原因。 封送的时候&#xff0c;默认是占4个字节&#xff0c;如果…

Pycharm----导入库文件夹不在py文件的目录下

问题描述&#xff1a; 想在不同目录下导入根目录的包&#xff0c;直接写会报错。如下边object_detect.py在function文件夹下&#xff0c;导入包默认在这个文件下&#xff0c;但我想导入根目录models和utils下的包 解决方法&#xff1a; 将根目录设置为源代码根目录&#xff0…

linux静态库,动态库总结

1.介绍 使用GNU的工具我们如何在Linux下创建自己的程序函数库?一个“程序函数库”简单的说就是一个文件包含了一些编译好的代码和数据&#xff0c;这些编译好的代码和数据可以在事后供其他的程序使用。程序函数库可以使整个程序更加模块化&#xff0c;更容易重新编译&#xff…

【Spring Cloud】Hystrix熔断机制

文章目录 前言什么是hystrix的熔断&#xff1f;使用hystrix熔断功能的配置Hystrix 工作原理Hystrix工作流 前言 什么是hystrix的熔断&#xff1f; hystrix熔断主要是指在一定的时间窗口内&#xff0c;当请求的次数达到一定的失败比率后&#xff0c;hystrix就会主动拒绝服务&a…