玩转数据之使用 ElasticSearch 搭建 RAG
![玩转数据之使用ElasticSearch搭建RAG](https://static001.geekbang.org/infoq/6f/6f36cf12d1ab3fd12d711104fa330806.jpeg)
在之前的案例视频中我们演示了使用 Milvus 向量数据库和腾讯向量数据库实现 RAG 的场景应用。今天我们演示下利用 ES 的向量数据存储能力来实现 RAG,包括三个部分:连接 ES 数据库并建表;数据写入 ES 向量数据库流程;问答对话流程。具体操作可参照下面的视频:
【连接 ES 数据库并建表】
这里我们没有展示连接 ES 数据库的过程,直接使用已经连接创建的 ES7 数据库 03-es,相关操作可查看已发布的信息。
![](https://static001.geekbang.org/infoq/fb/fbf3c36f2c4292bcde4c8d3c7b872ad9.png)
进入数据库操作页面,点击 新建一个支持向量数据的数据表 knnword3,分别添加两个字段:
名称=text,类型=keyword;
名称=embeddings,类型=Dense_vector,dims=1024,intex=true,similarity=I2_norm(相似度算法)。
![](https://static001.geekbang.org/infoq/61/6196736687cb00cbb43c3af0506ece8a.png)
![](https://static001.geekbang.org/infoq/47/472348b6753a52924126ef00c18e932b.png)
将 dims 设置为 1024 是因为 Lucene 最大支持长度是 1024,若超过 1024 的长度会引发插入数据错误。
![](https://static001.geekbang.org/infoq/fb/fb350e3bb950719b4a6c253575557273.png)
这样将向量数据表完成后,就可以在流程中使用了。
【数据写入 ES 向量数据库流程示例】
这里我们将之前用 Milvus 数据库的流程示例进行改造,将 Milvus 的向量数据库替换为 ES 数据库。整个流程的其他创建过程可参考如下视频:《轻松玩儿转数据分析系列-低代码玩转LLM-RAG》
![](https://static001.geekbang.org/infoq/0e/0e2b12d17a49304a852c9d7acc9b04db.png)
上图是用 Milvus 数据库实现的,现在将其替换为 ES 算子,如下
![](https://static001.geekbang.org/infoq/43/43e675c3e2182ff7cd641ab440819e6d.png)
选择 ES 写出算子替换掉 Milvus 写出算子后,需要配置下 ES 数据表的信息,如下:
es 连接配置:03-es;
索引名:keyword3;
表结构:embeddings=embeddings,text=textId。
![](https://static001.geekbang.org/infoq/b8/b863caf01087cb3c38759d746d5a86c7.png)
保存并执行流程,查看效果。
![](https://static001.geekbang.org/infoq/d6/d6e473b642a8430b847e1cc9545f43fd.png)
对话应答示例
关于对话应答的示例也请参照如下文章进行流程的设计。
HuggingFists-低代码玩转 LLMRAG(2) Query
![](https://static001.geekbang.org/infoq/13/13a5a465a8a6449a9ff5d6c820c01674.png)
在整个流程中,会用到如下的算子:
交互式数据算子用来接受输入的问题,绑定一个真实的问题;
混元文本嵌入算子用于将文本转换为向量数据并关联 ES 数据表中数据。
es 读取算子用于完成基于输入的向量问题检索向量表。
Rerank 算子用于对原来数据的重排序
列添加、聚合算子主要完成数据的整合。
大语言提示模型实现提示模版的输出。
阿里大语言模型完成问题的应答
整个流程中我们使用了腾讯的嵌入模型和阿里大语言模型,或者用混元大语言模型也可以。
![](https://static001.geekbang.org/infoq/b5/b5d9421f8ab612cf6b492cef2a10cb13.png)
这里需要修改 ES 的连接配置信息
es 连接配置:03-es;
索引名:knnword3;
查询模式:SQL 模式;
SQL 查询语句:select * from hnnword3 where knn(‘embedding ’,‘@(embeddings)’,20,50) limit 10
配置完成后,先运行下看下效果,
![](https://static001.geekbang.org/infoq/3d/3d6a7807d8ce7b13f950b865eb639da5.png)
可以看出能够很好回答提示问题的数据排在第五个,假设后续语料增多,后续可能排位更低,所以,设计了这个 rerank 算子(重排算子)
![](https://static001.geekbang.org/infoq/58/58969b2b1ca5b9cee8fdd080597495c2.png)
Reank 算子的主要作用是语义的重排序,使其能够将跟问题最相关的语料筛选出来。加入这个算子后,重新运行下流程。发现能够准备回答问题的语料可以被筛选出来,通过 Rerank 算子的重新排序,精准的找到适合回答问题的语料。
![](https://static001.geekbang.org/infoq/94/94e94b8654a4bb7b810f3b2ca73929e4.png)
最后我们整体运行下该流程,
![](https://static001.geekbang.org/infoq/27/27c3b8952d7bdcba44bc3993ebb1430f.png)
![](https://static001.geekbang.org/infoq/ee/ee929409340e0f4f9187cbca9ea08508.png)
从输出结果来看,当前问题的应答输出与我们的几次测试,基本上这结论都是一致的。以上就是基于 ES 向量数据库来实现检索增强生成应用的示例,欢迎下载 HuggingFists 试用。下载地址如下: 【Linux 版】 Github:https://github.com/Datayoo/HuggingFists 百度网盘:https://pan.baidu.com/s/1zV_ScCtLgFQSYEb0wLmXIQ?pwd=2024 【windows 版】 Github: https://github.com/Datayoo/HuggingFists4Win/tree/main 百度网盘:https://pan.baidu.com/s/1JXgd5bEfSX8RsDb0WTocdw?pwd=2024【Mac 版】百度网盘:https://pan.baidu.com/s/12WxZ-2GgMtbQeP7AcmsyHg?pwd=2024 【补充算子】 GitHub: https://github.com/Datayoo/Operators 百度网盘:https://pan.baidu.com/s/1iqX0f8xzCXMWVDA7eaqH6Q?pwd=2024
版权声明: 本文为 InfoQ 作者【数由科技】的原创文章。
原文链接:【http://xie.infoq.cn/article/b53bcf6fe46ea75bae28bda0a】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论