忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际

RAG(检索增强生成)设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。

然而,重点主要是改进检索工具的效率,如嵌入式搜索、混合搜索和微调嵌入,而不是智能搜索。

这篇文章介绍了一种新的方法,灵感来自人类研究方法,涉及多种搜索技术,观察中间结果,不断完善和重试,然后才提供回应。

通过利用智能代理设计,本文提出构建一个更智能、更扎实的ChatGPT,超越传统RAG模型的局限性。

RAG模式和限制

标准RAG模式实施概述:

  • 该过程始于用户的问题或对话的查询创建,通常是通过提示的语言模型(LLM)完成的。这通常被称为查询重述步骤。
  • 然后将此查询发送到搜索引擎,搜索引擎返回相关的知识(检索)。
  • 然后,检索到的信息会通过包含用户问题的提示进行增强,并转发到LLM(增强)。
  • 最后,LLM 对用户的查询做出了回应(生成)。

 RAG的限制

  • 在RAG模式中,检索、增强和生成由单独的流程管理。每个流程可能由具有不同提示的LLM来促进。

    然而,与用户直接交互的第1001代通常最清楚如何回答用户的问题。

    检索LLM可能不会像生成LLM那样解释用户意图,从而提供不必要的信息,可能会妨碍其做出回应的能力。
  • 检索是针对每个问题执行一次,没有来自生成LLM的任何反馈循环。

    如果检索结果不相关,可能是由于搜索查询或搜索词不佳等因素,生成LLM缺乏纠正的机制,可能会诉诸捏造答案。
  • 提供的检索上下文一经确定即不可更改,也无法扩展。

    例如,如果研究结果表明需要进一步调查,比如检索到一个提及需要进一步检索的文件,这方面没有规定。
  • RAG模式不支持多步骤研究。

智能代理模型

智能代理模型从人类研究方法中汲取灵感,当回答一个没有即时知识的问题时。在这个过程中,可能会进行一次或多次搜索,以收集有用的信息,然后提供最终答案。

每次搜索的结果都可以决定是否需要进一步调查,如果需要,还可以确定接下来搜索的方向。

这个迭代过程会持续进行,直到我们认为我们已经积累了足够的知识来回答,或者得出我们无法找到足够信息来回应的结论。

有时,研究结果可能会进一步澄清用户意图和查询范围。

为了复制这种方法,建议开发一个由语言模型(LLM)驱动的智能代理,用于与用户进行对话。

代理自主确定何时需要使用外部工具进行研究,制定一个或多个搜索查询,进行研究,审查结果,并决定是否继续进一步研究或向用户寻求澄清。

直到代理认为自己已经准备好向用户提供答案,这个过程才会持续进行。

 实施

使用Azure OpenAI的函数调用功能,实现一个能够自主使用搜索工具定位所需信息以协助用户请求的代理变得更加简单。

这一特性单独简化了RAG模式的传统实现,其中查询的改写、扩展和生成是分开处理的,如前所述。

代理人利用系统定义的角色和目标与用户互动,同时意识到可用的搜索工具。

当代理需要查找它所不具备的知识时,它会制定一个搜索查询,并向搜索引擎发出信号,以检索所需的答案。

这个过程不仅让人想起人类的行为,而且比RAG模式更高效,RAG模式中知识检索是一个单独的过程,无论是否需要,都会向聊天机器人提供信息。

实施这一能力:

  1. 定义人物角色、预期行为以及要使用的工具,何时使用它。

用 JSON 格式定义函数规范,包括函数和参数描述。

有趣的是,“用于搜索知识库的搜索查询”参数描述起着至关重要的作用。它指导LLMs根据对话中用户所需的帮助来制定合适的搜索查询。

此外,搜索查询参数可以描述并限制为遵循特定的工具格式,比如Lucene查询格式。还可以添加额外的参数用于诸如过滤等任务。

实现函数调用流程

在这个时刻,我们已经开发出一个能够进行独立搜索的智能代理。

然而,要真正创建一个能够执行更复杂的研究任务,如多步骤和自适应执行的智能代理,我们需要实现一些额外的能力。幸运的是,这个实施过程可以很简单直接。

创建智能研究代理的增强功能

在系统消息中添加代理计划、行动、观察和调整的能力

附加的指示表示,如果需要,机器人应该重试并更改问题。此外,它表示机器人应该审查搜索结果以指导下一次搜索,并在必要时采用多步骤方法。

这假设了搜索工具可以被多次调用。

由于LLM无法自行重复此过程,我们需要使用应用程序逻辑来管理。我们可以通过将整个过程放入循环中来实现这一点。当模型准备好给出最终答案时,循环退出:

这是智能代理在演示场景中的表现:

问题是比较两种产品之间的一个特性。每种产品的特性都存储在单独的文档中。为了做到这一点,我们的代理人执行两个搜索查询:

  • X100与Z200无线电0的功率配置文件
  • 无线电0的X100功率配置文件

第一个查询是一种贪婪的方法,因为代理希望有一个包含比较的文档。事实并非如此,因为搜索查询没有返回关于X100的足够信息,所以它添加了专门针对X100的第二个查询。

如果这个问题交给经典的RAG解决方案,它将无法找到一个好的答案,因为它会在第一个查询处停止。

 结束

实施代理模型可以大大增强基于ChatGPT的解决方案。这是因为该模型具有智能能力,可以测试各种策略,并根据观察到的结果改进其方法。

 参考文献

  • 这篇文章的完整代码实现可以在这里找到
  • 知识密集型自然语言处理任务的检索增强生成 arXiv:2005.11401 [cs.CL]
  • OpenAI的功能调用:Function calling — OpenAI API

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文献速递:肿瘤分割---- ALA-Net:用于3D结直肠肿瘤分割的自适应病变感知注意力网络

文献速递:肿瘤分割---- ALA-Net:用于3D结直肠肿瘤分割的自适应病变感知注意力网络 01 文献速递介绍 结直肠癌(CRC)在全球范围内与高发病率和死亡率相关,。肿瘤的预后高度依赖于诊断时疾病的阶段。准确检测和分割肿瘤…

【已解决】c++ qt选中该行为什么该列部分变色

笔者开启了QTableView中交替行改变颜色,发现笔者自定义绘制的水平滚动条,在选中后不发生颜色改变,这让笔者很疑惑。笔者查阅资料后发现,自定义绘制的控件,要自身设置颜色。当笔者解决了这个问题时,顺手就将…

2.5学习总结

2.5 1.传纸条 2.装箱问题 3.开心的金明 4.传球游戏 5.修改数组 6.对局匹配 7.刷题统计 传纸条https://www.luogu.com.cn/problem/P1006 题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排坐成一…

halcon圆形、残缺圆形检测

代码中关键知识: 1、循环读取图片 2、基本图像处理:开运算、二值化、内部填充、 3、获取图像边缘线,分割曲线,然后计算曲线的circularity_xld圆率范围,和area_center_xld的面积大小,做阈值筛选 4、然后…

Jmeter接口自动化测试 —— Jmeter断言之Json断言

json断言可以让我们很快的定位到响应数据中的某一字段,当然前提是响应数据是json格式的,所以如果响应数据为json格式的话,使用json断言还是相当方便的。 还是以之前的接口举例 Url: https://data.cma.cn/weatherGis/web/weather/weatherFcst…

代码生成器(新):mybatis-plus-generator使用指南

代码生成器(新)官网 后端代码:点击查看 LearnElementUiAndSpringBoot 提醒:LearnElementUiAndSpringBoot下载完后,在运行调试 Main.java里的main方法之前,除了utils包和Main.java文件,其他包需…

SpringBoot security 安全认证(三)——自定义注解实现接口放行配置

背景:通过Security实现了安全管理,可以配置哪些接口可以无token直接访问。但一个麻烦就是每增加一个匿名访问接口时都要去修改SecurityConfig配置,从程序设计上讲是不太让人接受的。 本节内容:即是解决以上问题,增加一…

初次认识和学习SEO

初探 SEO 初探 SEO SEO 的基本概念 搜索引擎优化(英语:search engine optimization,缩写为 SEO),是一种透过了解搜索引擎的运作规则来调整网站,以及提高目的网站在有关搜索引擎内排名的方式 一般的可以理…

使用Virt-Manager定制 Windows Server QCOW2镜像

使用Virt-Manager定制 Windows Server QCOW2镜像 前言 在云计算和虚拟化技术日益普及的今天,定制化的虚拟机镜像对于满足特定需求显得尤为重要。Virt-Manager是一个强大的工具,可以帮助用户轻松地创建和管理虚拟机镜像。本文将指导您如何使用Virt-Manag…

LoRA:语言模型微调的计算资源优化策略

编者按:随着数据量和计算能力的增加,大模型的参数量也在不断增加,同时进行大模型微调的成本也变得越来越高。全参数微调需要大量的计算资源和时间,且在进行切换下游任务时代价高昂。 本文作者介绍了一种新方法 LoRA,可…

C++杂选

#include <iostream> #include <regex>using namespace std;int main() { //它声明了一个 string 类型的变量 input&#xff0c;用于存储输入的字符串。然后使用 getline() 函数从标准输入中读取一行输入&#xff0c;并将其存储在 input 变量中。string input;getl…

【经典例子】Java实现2048小游戏(附带源码)

一、游戏回顾 2048游戏是一款数字益智游戏&#xff0c;目标是通过合并相同数字的方块来达到2048这个目标。游戏在一个4x4的方格上进行&#xff0c;每个方格上都有一个数字&#xff08;初始时为2或4&#xff09;。玩家可以通过滑动方向键&#xff08;上、下、左、右&#xff09;…