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