忘记 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模式中知识检索是一个单独的过程,无论是否需要,都会向聊天机器人提供信息。
实施这一能力:
- 定义人物角色、预期行为以及要使用的工具,何时使用它。

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

有趣的是,“用于搜索知识库的搜索查询”参数描述起着至关重要的作用。它指导LLMs根据对话中用户所需的帮助来制定合适的搜索查询。
此外,搜索查询参数可以描述并限制为遵循特定的工具格式,比如Lucene查询格式。还可以添加额外的参数用于诸如过滤等任务。
实现函数调用流程

在这个时刻,我们已经开发出一个能够进行独立搜索的智能代理。
然而,要真正创建一个能够执行更复杂的研究任务,如多步骤和自适应执行的智能代理,我们需要实现一些额外的能力。幸运的是,这个实施过程可以很简单直接。
创建智能研究代理的增强功能
在系统消息中添加代理计划、行动、观察和调整的能力

附加的指示表示,如果需要,机器人应该重试并更改问题。此外,它表示机器人应该审查搜索结果以指导下一次搜索,并在必要时采用多步骤方法。
这假设了搜索工具可以被多次调用。
由于LLM无法自行重复此过程,我们需要使用应用程序逻辑来管理。我们可以通过将整个过程放入循环中来实现这一点。当模型准备好给出最终答案时,循环退出:


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

问题是比较两种产品之间的一个特性。每种产品的特性都存储在单独的文档中。为了做到这一点,我们的代理人执行两个搜索查询:
- X100与Z200无线电0的功率配置文件
- 无线电0的X100功率配置文件
第一个查询是一种贪婪的方法,因为代理希望有一个包含比较的文档。事实并非如此,因为搜索查询没有返回关于X100的足够信息,所以它添加了专门针对X100的第二个查询。
如果这个问题交给经典的RAG解决方案,它将无法找到一个好的答案,因为它会在第一个查询处停止。
结束
实施代理模型可以大大增强基于ChatGPT的解决方案。这是因为该模型具有智能能力,可以测试各种策略,并根据观察到的结果改进其方法。
参考文献
- 这篇文章的完整代码实现可以在这里找到
- 知识密集型自然语言处理任务的检索增强生成 arXiv:2005.11401 [cs.CL]
- OpenAI的功能调用:Function calling — OpenAI API
相关文章:
忘记 RAG:拥抱Agent设计,让 ChatGPT 更智能更贴近实际
RAG(检索增强生成)设计模式通常用于开发特定数据领域的基于实际情况的ChatGPT。 然而,重点主要是改进检索工具的效率,如嵌入式搜索、混合搜索和微调嵌入,而不是智能搜索。 这篇文章介绍了一种新的方法,灵感…...
利用路由懒加载和CDN分发策略,对Vue项目进行性能优化
目录 一、Vue项目 二、路由懒加载 三、CDN分发策略 四、如何对Vue项目进行性能优化 一、Vue项目 Vue是一种用于构建用户界面的JavaScript框架,它是一种渐进式框架,可以用于构建单页应用(SPA)和多页应用。Vue具有简单易学、灵…...
【Scala】1. 变量和数据类型
1. 变量和数据类型 1.1 for begining —— hello world 新建hello.scala文件,注意object名字与文件名一致。 object hello { def main(args:Array[String]): Unit { println("hello world!") } }运行后打印结果如下: hello world!Pr…...
何时以及如何选择制动电阻
制动电阻的选择是优化变频器应用的关键因素 制动电阻器在变频器中是如何工作的? 制动电阻器在 VFD 应用中的工作原理是将电机减速到驱动器设定的精确速度。它们对于电机的快速减速特别有用。制动电阻还可以将任何多余的能量馈入 VFD,以提升直流母线上的…...
消息中间件:Puslar、Kafka、RabbigMQ、ActiveMQ
消息队列 消息队列:它主要用来暂存生产者生产的消息,供后续其他消费者来消费。 它的功能主要有两个: 暂存(存储)队列(有序:先进先出 从目前互联网应用中使用消息队列的场景来看,…...
Rust开发WASM,浏览器运行WASM
首先需要安装wasm-pack cargo install wasm-pack 使用cargo创建工程 cargo new --lib mywasm 编辑Cargo.toml文件,修改lib的类型为cdylib,并且添加依赖wasm-bindgen [package] name "mywasm" version "0.1.0" edition "…...
Vue3编写简单的App组件(二)
一、Vue3页面渲染基本流程 1、入口文件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><link rel"icon" href"/favicon.ico"><meta name"viewport" content"widthde…...
java Servlet 云平台教学系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc
一、源码特点 JSP 云平台教学系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助 系统采用serlvet dao bean,系统具有完整的源代码和数据库 ,系统主要采用B/S模式开发。开发 环境为TOMCAT7.0,Myeclipse8.5开发,数据…...
QT初始程序
#include "widget.h"#include <QApplication>int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();} 解释: Qt系统提供的类头文件没有.h后缀Qt一个类对应一个头文件,类名和头文件名一致QA…...
ubuntu22.04@laptop OpenCV Get Started: 001_reading_displaying_write_image
ubuntu22.04laptop OpenCV Get Started: 001_reading_displaying_write_image 1. 源由2. Read/Display/Write应用Demo2.1 C应用Demo2.2 Python应用Demo 3. 过程分析3.1 导入OpenCV库3.2 读取图像文件3.3 显示图像3.4 保存图像文件 4. 总结5. 参考资料 1. 源由 读、写、显示图像…...
51单片机之LED灯模块篇
御风以翔 破浪以飏 🎥个人主页 🔥个人专栏 目录 点亮一盏LED灯 LED的组成原理 LED的硬件模型 点亮一盏LED灯的程序设计 LED灯闪烁 LED流水灯 独立按键控制LED灯亮灭 独立按键的组成原理 独立按键的硬件模型 独立按键控制LED灯状态 按键的抖动 独立按键…...
springboo冬奥会科普平台源码和论文
随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理平台应运而生,各行各业相继进入信息管理时代…...
改进神经网络
Improve NN 文章目录 Improve NNtrain/dev/test setBias/Variancebasic recipeRegularizationLogistic RegressionNeural networkother ways optimization problemNormalizing inputsvanishing/exploding gradientsweight initializegradient checkNumerical approximationgrad…...
HarmonyOS 开发学习笔记
HarmonyOS 开发学习笔记 一、开发准备1.1、了解ArkTs语言1.2、TypeScript语法1.2.1、变量声明1.2.2、条件控制1.2.3、函数1.2.4、类和接口1.2.5、模块开发 1.3、快速入门 二、ArkUI组件2.1、Image组件2.2、Text文本显示组件2.3、TextInput文本输入框组件2.4、Button按钮组件2.5…...
maven java 如何打纯源码zip包
一、背景 打纯源码包给第三方进行安全漏洞扫描 二、maven插件 项目中加入下面的maven 插件 <!-- 要将源码放上去,需要加入这个插件 --><plugin><artifactId>maven-source-plugin</artifactId><version>2.4</version><con…...
Altium Designer(AD)原理图库添加阵列管脚图文教程及视频演示
🏡《专栏目录》 目录 视频演示1,概述2,添加方法3,总结视频演示 Altium Designer(AD24)原理图库添加阵列管脚 欢迎点击浏览更多高清视频演示 1,概述...
P3647 题解
文章目录 P3647 题解OverviewDescriptionSolutionLemmaProof Main Code P3647 题解 Overview 很好的题,但是难度较大。 模拟小数据!——【数据删除】 Description 给定一颗树,有边权,已知这棵树是由这两个操作得到的࿱…...
Vivado Tri-MAC IP的例化配置(三速以太网IP)
目录 1 Tri-MAC IP使用RGMII接口的例化配置1.1 Data Rate1.2 interface配置1.3 Shared Logic配置1.4 Features 2 配置完成IP例化视图 1 Tri-MAC IP使用RGMII接口的例化配置 在网络设计中,使用的IP核一般为三速以太网IP核,使用时在大多数场景下为配置为三…...
交友系统---让陌生人变成熟悉人的过程。APP小程序H5三端源码交付,支持二开。
随着社交网络的发展和普及,人们之间的社交模式正在发生着深刻的变革。传统的线下交友方式已经逐渐被线上交友取而代之。而同城交友正是这一趋势的产物,它利用移动互联网的便利性,将同城内的人们连接在一起,打破了时空的限制&#…...
uni-app 经验分享,从入门到离职(三)——关于 uni-app 生命周期快速了解上手
文章目录 📋前言⏬关于专栏 🎯什么是生命周期🧩应用生命周期📌 关于 App.vue/App.uvue 🧩页面生命周期📌关于 onShow 与 onLoad 的区别 🧩组件生命周期 📝最后 📋前言 这…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
