如何使用ElasticSearch搭建LLM-RAG系统

        在之前的案例视频中我们演示了使用Milvus向量数据库和腾讯向量数据库实现RAG的场景应用。今天我们演示下利用ES的向量数据存储能力来实现RAG,包括三个部分:连接ES数据库并建表;数据写入ES向量数据库流程;问答对话流程。具体操作可参照下面的视频:

《玩转数据之使用ElasticSearch搭建RAG》icon-default.png?t=N7T8https://www.bilibili.com/video/BV1mZ421E7ki/

【连接ES数据库并建表】

        这里我们没有展示连接ES数据库的过程,直接使用已经连接创建的ES7数据库03-es,相关操作可查看已发布的信息。

进入数据库操作页面,点

新建一个支持向量数据的数据表knnword3,分别添加两个字段:

  1. 名称=text,类型=keyword;
  2. 名称=embeddings,类型=Dense_vector,dims=1024,intex=true,similarity=I2_norm(相似度算法)。

        将dims设置为1024是因为Lucene最大支持长度是1024,若超过1024的长度会引发插入数据错误。

这样将向量数据表完成后,就可以在流程中使用了。

【数据写入ES向量数据库流程示例】

        这里我们将之前用Milvus数据库的流程示例进行改造,将Milvus的向量数据库替换为ES数据库。整个流程的其他创建过程可参考如下视频:

轻松玩儿转数据分析系列-低代码玩转LLM-RAG

        上图是用Milvus数据库实现的,现在将其替换为ES算子,如下

        选择ES写出算子替换掉Milvus写出算子后,需要配置下ES数据表的信息,如下:

  1. es连接配置:03-es;
  2. 索引名:keyword3;
  3. 表结构:embeddings=embeddings,text=textId。

保存并执行流程,查看效果。

         数据处理完成,可以看到我们已经把这个数据插到了向量库中,然后我们基于插入的这些数据进行下面对话示例的演示。

对话应答示例

关于对话应答的示例也请参照如下文章进行流程的设计。

HuggingFists-低代码玩转LLMRAG(2) Query

    在整个流程中,会用到如下的算子:

  1. 交互式数据算子用来接受输入的问题,绑定一个真实的问题;
  2. 混元文本嵌入算子用于将文本转换为向量数据并关联ES数据表中数据。
  3. es读取算子用于完成基于输入的向量问题检索向量表。
  4. Rerank算子用于对原来数据的重排序
  5. 列添加、聚合算子主要完成数据的整合。
  6. 大语言提示模型实现提示模版的输出。
  7. 阿里大语言模型完成问题的应答,

                整个流程中我们使用了腾讯的嵌入模型和阿里大语言模型,或者用混元大语言模型也可以。

这里需要修改ES的连接配置信息

  1. es连接配置:03-es;
  2. 索引名:knnword3;
  3. 查询模式:SQL模式;
  4. SQL查询语句:select * from hnnword3 where knn(‘embedding ’,‘@(embeddings)’,20,50) limit 10

配置完成后,先运行下看下效果,

        可以看出能够很好回答提示问题的数据排在第五个,假设后续语料增多,后续可能排位更低,所以,设计了这个rerank算子(重排算子)

        Reank算子的主要作用是语义的重排序,使其能够将跟问题最相关的语料筛选出来。加入这个算子后,重新运行下流程。发现能够准备回答问题的语料可以被筛选出来,通过Rerank算子的重新排序,精准的找到适合回答问题的语料。

最后我们整体运行下该流程,

        从输出结果来看,当前问题的应答输出与我们的几次测试,基本上这结论都是一致的。

以上就是基于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

百度网盘:百度网盘 请输入提取码

【Mac版】

百度网盘:https://pan.baidu.com/s/12WxZ-2GgMtbQeP7AcmsyHg?pwd=2024

【补充算子】

GitHub: https://github.com/Datayoo/Operators

百度网盘:https://pan.baidu.com/s/1iqX0f8xzCXMWVDA7eaqH6Q?pwd=2024

如果使用过程中遇到问题,可加入我们的交流群:

### 实现基于Java的Elasticsearch RAG 为了实现在Java中利用Elasticsearch执行检索增强生成(Retrieval-Augmented Generation, RAG),需构建一个流程来处理文档索引、复杂查询以及结果解析。此过程涉及设置Elasticsearch客户端连接,定义数据模型用于表示待索引文件结构,并编写服务逻辑以支持RAG操作。 #### 设置Elasticsearch Java High Level REST Client 首先,在项目依赖项中加入官方提供的`elasticsearch-rest-high-level-client`库。对于Maven工程而言,这意呸着更新`pom.xml`文件: ```xml <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>elasticsearch-rest-high-level-client</artifactId> <version>{es_version}</version> </dependency> ``` 其中`{es_version}`应替换为所使用的具体版本号[^1]。 接着初始化RESTHighLevelClient实例以便后续调用API方法: ```java RestHighLevelClient client = new RestHighLevelClient( RestClient.builder(new HttpHost("localhost", 9200, "http"))); ``` #### 定义实体类映射至Elasticsearch Index Mapping 创建POJO(Plain Old Java Object)对象作为文档模板,确保其字段名与目标索引中的mapping保持一致。例如针对审计日志记录可以设计如下类: ```java public class AuditLog { private String originalText; private List<String> keyPhrases; private List<String> potentialQuestions; private Map<String, Object> entities; // Getters & Setters omitted for brevity } ``` 上述属性名称应当对应于实际存储在Elasticsearch内的相应字段[^2]。 #### 构建并发送Multi-Match Query Request 通过组合多个条件形成布尔查询表达式,从而精确匹配所需信息片段。下面展示了一个多字段模糊查找的例子,它会尝试从指定域内寻找包含特定关键词条目的所有记录: ```java SearchRequest searchRequest = new SearchRequest("audit_logs"); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.must(QueryBuilders.multiMatchQuery( "audits Elastic Elastic auditing ... Elasticsearch security audit", Arrays.asList("original_text", "keyphrases", "potential_questions", "entities")) .type(TextQueryType.BEST_FIELDS).operator(Operator.OR)); SearchSourceBuilder sourceBuilder = new SearchSourceBuilder().query(boolQuery); searchRequest.source(sourceBuilder); try { SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); } catch (IOException e) { throw new RuntimeException(e); } ``` 此处采用的是`multi_match`类型的查询语句,允许跨不同字段进行相似度计算;同时设置了最佳字段模式(`best_fields`)及逻辑运算符为“或”,意味着只要任意单个词组出现在任一给定路径下即视为命中。 #### 解析响应内容并与预训练语言模型交互 获取到搜索返回的结果集之后,提取有用部分传递给下游NLP组件完成最终输出合成工作。通常情况下,这部分功能由外部微服务负责提供接口供调用方访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值