继上一篇文章我们探讨了如何使用HuggingFists实现文本的Embedding后。这一次我们将介绍如何使用HuggingFists实现LLM RAG的查询部分。
首先我们回顾一下RAG的结构,如下图:
基于向量数据库的RAG结构图
我们在上篇文章中介绍了如何使用HuggingFists实现结构图右半部分的文档向量化入库的过程。本文我们将着重介绍如何使用HuggingFists从向量库检索数据并交由大模型根据跟定数据回答问题的过程。由图可知,实现用户的检索过程主要由以下几步组成:
-
获取用户输入检索条件
-
对检索条件进行向量化
-
用向量化条件查询向量库
-
将用户问题、检索结果合并构成Prompt
-
将Prompt输入LLM等待LLM返回结果
-
向用户返回结果
基于以上过程,我们使用HuggingFists构建了如下流程:
问题检索流程图
这个流程由8个算子组成,下面我们详细阐述一下各算子的用途及我们在落地实现时的思考。
- 交互式数据输入:该算子用于模拟用户的输入,如上图,我们设定用户输入的问题为"数据安全治理有哪些框架?特点是什么?"。由于真实情况下,用户提出的问题是变化的,所以我们可以在这里将问题写成变量的形式。HuggingFists支持的变量格式为"${varName}"。在驱动流程运行时,HuggingFists会将变量替换为运行时指定的具体值,从而可以将不同的问题带入流程。配置如下图:
交互式数据输入
阿里文本Embedding
- 阿里文本Embedding:选取向量类型为"查询向量",将输入的问题按查询向量进行向量化。需要特别注意的是,这里的向量类型必须为"查询向量",在进行文本向量入库时选择的类型为"底库向量"。
Milvus读取
- Milvus读取:根据输入的向量,从Milvus向量库中查询匹配的数据。这里使用SQL语句方式访问。由于Milvus本身不支持SQL的访问方式,所以这里使用的是基于开源项目MOQL对Milvus支持的语法格式。在SQL语句中我们使用了@{embeddings}变量,该变量表示上下文变量,上下文变量可以与算子的输入列做绑定映射。该算子有一个名为embeddings的输入列,所以从配置中可以看到,变量embeddings与embeddings列做了映射绑定。运行时,变量会被输入列的值替换掉,从而生成可运行的SQL语句。当输入为多条记录时,每条记录都会驱动一次SQL的生成与检索。
过滤
- 过滤:通过过滤,获得与问题相关度较高的数据。流程里过滤条件设定为只保留相关度值<5000的数据。为什么将值设置为5000,主要是因为在这个示例中,我们发现打分在5000以下的内容跟问题的相关度最高。另外,需要注意的是,问题的长短,陈述方式会对检索出的结果有一定的影响。如果需要更精准的检索问题相关内容,此时可以加入一个步骤,让大语言模型帮忙聚焦问题,然后再对问题进行检索。
列添加
- 列添加:列添加在这里是一个技巧型的应用。主要是因为流程后面的"大语言模型提示"算子使用的提示模板中需要将内容和问题一起组合成为一个提示。而在上一步通过过滤获得的输出信息中只有数据信息,没有问题信息。所以,在这里为数据添加一个问题列。问题列的值使用${question}变量描述,该值与算子1中的变量值一致,会一同被替换。
聚合
- 聚合:将过滤后符合条件的文本数据合并在一起,形成一个大的文本。关于如何构造Prompt,有两种不同的实现策略。一是合并所有文本然后构造一个完整的Prompt,一次性提交给大语言模型处理,这种方式相对更节省tokens,但很容易超出大语言模型的tokens限制;二是以会话方式,将数据一点、一点输送给大语言模型。该方式由于需要多次提交,且每次提交都保持会话历史,所以消耗的tokens数量比较大。但该方式可以采用些技巧,比如定期总结之前的历史输入,从而降低历史会话总量,实现较大信息的输入。由于HuggingFists目前还不支持会话模式的大语言模型访问,故此我们采用了第一条技术路线,向大模型发一个完整的Prompt。
大语言模型提示
- 大语言模型提示:从提示库中选择合适的提示模板。HuggingFists内置了提示模板库,方便使用者积累提示模板。提示模板库的功能在"资源"菜单下。它支持对提示模板增、删、改、查以及分组管理。以下是我们在本流程中使用的提示模板的截图:
提示模板
模板内容为:"请根据以下内容回答问题:\n @{text} \n问题: @{question} "。需要为模板中的变量设定列映射。运行时,HuggingFists用列值替换模板中的变量,从而生成最终输入到大语言模型的提示。
阿里大语言模型
- 阿里大语言模型:根据提示信息回答问题。
最终的运行效果如下图:
运行结果
Prompt列输出的是输入到大模型的提示信息;mooOutput列输出的是大模型回答的答案。经确认答案无误,是基于输入的提示信息生成的,不含模型学到的通用知识。
结语
以上展示了如何使用HuggingFist实现RAG的查询。与上一篇文章一起,全面介绍了RAG的低代码实现。但作为一个完整的项目落地实践,目前还没有结束。因为尚缺用户的问答系统界面与HuggingFists整合没有介绍。目前,HuggingFists正在研发对外的API访问接口。当该接口部分开发完成,使用者就可以通过这些接口驱动流程的执行,实现查询界面与HuggingFists的整合了。下一篇文章,我们就将介绍如何使用开源的聊天界面与HuggingFists整合,实现完整的RAG落地实现。