最近经过了一段时间的学习,察觉到自己本身对于RAG的掌控还只停留在运用,但还不太懂其中的底层逻辑,换言之,就跟我们平时用智能体平台一样,使用者只需要将文件上传,就会看到有分块的设置选项,知识库节点会显示用的是倒排索引、重排等方法,虽然这看起来不会影响使用,但是从长远来看却是会降低使用的效率。
主要是因为,许多智能体平台的开发初衷是为了让初学者也可以自如地通过配置工作流、chatflow、agent来实现各种不同的功能,但实际上,节点里agent的配置(提示词工程),知识检索这些内容,都需要用户来完成,或许一些简单的功能可以实现,但是只要稍微复杂一些,没有基础的用户变会一头雾水。
基于打下坚实基础的目的,打算重新温习agent的相关知识,并梳理、记录一些关键的要点
核心思想
RAG的核心思想,主要就是在其流程上:分块-检索-增强-生成。
-
分块:核心在于分块的策略,一般是用正则去区分符号,将不同的段落分成块,但核心点是,不同的文本,并不是简单地用段落去分就行的,本质是在保证语义完整、检索精准的前提下,避免检索到大量的不相关文本。像学术类文本这种架构清晰,概念可能跨越多个段落的,就很适合用递归分块,如果是邮件类,或者产品描述这类自然语言居多的,就比较适合用语义分块
-
检索:将用户问题转为向量在向量数据库中进行检索,检索的方式一般是关键词匹配+语义相似度检索。但是这里很容易漏掉一个知识点:为什么用向量数据库,向量数据库是如何高效匹配的。实际上,类比为生活中的例子,普通的数据库匹配可以看作是一页一页地去做匹配,但是向量数据库则是会先看目录,定位到具体的位置再去匹配,效率会显著提升。这是因为向量数据库在匹配时,会用到许多索引,起到可以"跳着匹配"的作用。比如,倒排索引便是这样,将不同分词与文档块像字典对应那样,这样在匹配时,就可以先看分词对应哪些文档块,再进行匹配,并进一步通过RRF评分进行重排、筛选,从而提高效率
-
增强:将检索到的文档块,用户原始问题,系统指令(规则,执行步骤等)打包成一个结构化的提示词,让模型知道可以参考什么来回答,回答时要注重什么,必要的时候可以给出一些例子供模型学习
-
生成:LLM根据提示词来生成答案