LangChain4j与Elasticsearch:构建高效的语义嵌入存储

打印 上一主题 下一主题

主题 803|帖子 803|积分 2409

LangChain4j与Elasticsearch:构建高效的语义嵌入存储

一、LangChain4j与Elasticsearch集成概述

1.1 LangChain4j简介

LangChain4j是一个为Java开发者筹划的开源库,旨在简化大型语言模型(LLM)在Java应用程序中的集成。它提供了与多个LLM提供商、嵌入存储、嵌入模型等的集成,支持文本和图像输入,以及AI服务的高级API。
1.2 Elasticsearch在LangChain4j中的作用

Elasticsearch是一个基于Lucene的搜刮引擎,提供了全文搜刮和分析功能。在LangChain4j中,Elasticsearch被用作嵌入存储,用于存储和检索语义嵌入向量,从而提高搜刮和检索的效率。
二、Elasticsearch作为嵌入存储的集成

2.1 为什么选择Elasticsearch

LangChain4j提供了内存嵌入存储,但对于更大的数据集,内存存储不适用,因为服务器内存有限。Elasticsearch的“弹性”特性使其能够根据数据量进行扩展,因此,将嵌入存储到Elasticsearch中是一个理想的选择。
2.2 添加Elasticsearch依赖

要在项目中集成Elasticsearch,需要添加以下Maven依赖:
  1. <dependency>
  2.     <groupId>dev.langchain4j</groupId>
  3.     <artifactId>langchain4j-elasticsearch</artifactId>
  4.     <version>${langchain4j.version}</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.testcontainers</groupId>
  8.     <artifactId>elasticsearch</artifactId>
  9.     <version>1.20.1</version>
  10.     <scope>test</scope>
  11. </dependency>
复制代码
这些依赖包罗LangChain4j的Elasticsearch集成模块和TestContainers模块,后者用于在测试中启动Elasticsearch实例。
三、配置和使用Elasticsearch嵌入存储

3.1 启动Elasticsearch容器

使用TestContainers模块启动Elasticsearch实例:
  1. ElasticsearchContainer container =
  2.     new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:8.15.0")
  3.         .withPassword("changeme");
  4. container.start();
  5. final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  6. credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "changeme"));
  7. client = RestClient.builder(HttpHost.create("https://" + container.getHttpHostAddress()))
  8.     .setHttpClientConfigCallback(httpClientBuilder -> {
  9.         httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
  10.         httpClientBuilder.setSSLContext(container.createSslContextFromCa());
  11.         return httpClientBuilder;
  12.     })
  13.     .build();
  14. client.performRequest(new Request("GET", "/"));
复制代码
这段代码创建并启动了一个Elasticsearch容器,并配置了客户端以连接到该容器。
3.2 使用Elasticsearch作为嵌入存储

将Elasticsearch设置为LangChain4j的嵌入存储:
  1. EmbeddingStore<TextSegment> embeddingStore =
  2.     ElasticsearchEmbeddingStore.builder()
  3.         .restClient(client)
  4.         .build();
  5. embeddingStore.add(response1.content(), game1);
  6. embeddingStore.add(response2.content(), game2);
复制代码
这段代码将向量存储在Elasticsearch的默认索引中。也可以指定一个更故意义的索引名称:
  1. EmbeddingStore<TextSegment> embeddingStore =
  2.     ElasticsearchEmbeddingStore.builder()
  3.         .indexName("games")
  4.         .restClient(client)
  5.         .build();
  6. embeddingStore.add(response1.content(), game1);
  7. embeddingStore.add(response2.content(), game2);
复制代码
四、搜刮相似向量

4.1 向量化查询

要搜刮相似向量,首先需要使用模型将查询转换为向量表示:
  1. String question = "I want to pilot a car";
  2. Embedding questionAsVector = model.embed(question).content();
复制代码

4.2 实行相似性搜刮

使用嵌入存储实行相似性搜刮:
  1. EmbeddingSearchResult<TextSegment> result = embeddingStore.search(
  2.     EmbeddingSearchRequest.builder()
  3.         .queryEmbedding(questionAsVector)
  4.         .build());
复制代码
这段代码在Elasticsearch中搜刮与查询向量相似的向量。
五、总结

LangChain4j与Elasticsearch的集成提供了一个强盛的办理方案,用于处理和检索语义嵌入向量。通过将Elasticsearch作为嵌入存储,可以有用地扩展处理大数据集的能力,并提高搜刮相干性。这种方法联合了LangChain4j的灵活性和Elasticsearch的可扩展性,为构建高效的语义搜刮应用提供了坚固的底子。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表