LangChain4j与Elasticsearch:构建高效的语义嵌入存储
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依赖:
<dependency><groupId>dev.langchain4j</groupId><artifactId>langchain4j-elasticsearch</artifactId><version>${langchain4j.version}</version>
</dependency>
<dependency><groupId>org.testcontainers</groupId><artifactId>elasticsearch</artifactId><version>1.20.1</version><scope>test</scope>
</dependency>
这些依赖包括LangChain4j的Elasticsearch集成模块和TestContainers模块,后者用于在测试中启动Elasticsearch实例。
三、配置和使用Elasticsearch嵌入存储
3.1 启动Elasticsearch容器
使用TestContainers模块启动Elasticsearch实例:
ElasticsearchContainer container =new ElasticsearchContainer("docker.elastic.co/elasticsearch/elasticsearch:8.15.0").withPassword("changeme");
container.start();
final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("elastic", "changeme"));
client = RestClient.builder(HttpHost.create("https://" + container.getHttpHostAddress())).setHttpClientConfigCallback(httpClientBuilder -> {httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);httpClientBuilder.setSSLContext(container.createSslContextFromCa());return httpClientBuilder;}).build();
client.performRequest(new Request("GET", "/"));
这段代码创建并启动了一个Elasticsearch容器,并配置了客户端以连接到该容器。
3.2 使用Elasticsearch作为嵌入存储
将Elasticsearch设置为LangChain4j的嵌入存储:
EmbeddingStore<TextSegment> embeddingStore =ElasticsearchEmbeddingStore.builder().restClient(client).build();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);
这段代码将向量存储在Elasticsearch的默认索引中。也可以指定一个更有意义的索引名称:
EmbeddingStore<TextSegment> embeddingStore =ElasticsearchEmbeddingStore.builder().indexName("games").restClient(client).build();
embeddingStore.add(response1.content(), game1);
embeddingStore.add(response2.content(), game2);
四、搜索相似向量
4.1 向量化查询
要搜索相似向量,首先需要使用模型将查询转换为向量表示:
String question = "I want to pilot a car";
Embedding questionAsVector = model.embed(question).content();
4.2 执行相似性搜索
使用嵌入存储执行相似性搜索:
EmbeddingSearchResult<TextSegment> result = embeddingStore.search(EmbeddingSearchRequest.builder().queryEmbedding(questionAsVector).build());
这段代码在Elasticsearch中搜索与查询向量相似的向量。
五、总结
LangChain4j与Elasticsearch的集成提供了一个强大的解决方案,用于处理和检索语义嵌入向量。通过将Elasticsearch作为嵌入存储,可以有效地扩展处理大数据集的能力,并提高搜索相关性。这种方法结合了LangChain4j的灵活性和Elasticsearch的可扩展性,为构建高效的语义搜索应用提供了坚实的基础。
相关文章:
LangChain4j与Elasticsearch:构建高效的语义嵌入存储
LangChain4j与Elasticsearch:构建高效的语义嵌入存储 一、LangChain4j与Elasticsearch集成概述 1.1 LangChain4j简介 LangChain4j是一个为Java开发者设计的开源库,旨在简化大型语言模型(LLM)在Java应用程序中的集成。它提供了与…...
黄河小浪底水利枢纽泄洪预警广播系统正式上线
24小时站岗、危险自动报警、远程喊话驱离……近日,小浪底水利枢纽和西霞院水利枢纽的泄洪预警广播系统正式上线,通过数字化设施赋能管控水域日常监管,将危险水域各个角落“尽收眼底”,涉水危险行为“无处可藏”。 “前方船只请注意…...
理解生成协同促进?华为诺亚提出ILLUME,15M数据实现多模态理解生成一体化
多模态理解与生成一体化模型,致力于将视觉理解与生成能力融入同一框架,不仅推动了任务协同与泛化能力的突破,更重要的是,它代表着对类人智能(AGI)的一种深层探索。通过在单一模型中统一理解与生成ÿ…...
[文献阅读]ReAct: Synergizing Reasoning and Acting in Language Models
文章目录 摘要Abstract:思考与行为协同化Reason(Chain of thought)ReAct ReAct如何协同推理 响应Action(动作空间)协同推理 结果总结 摘要 ReAct: Synergizing Reasoning and Acting in Language Models [2210.03629] ReAct: Synergizing Reasoning an…...
摄像头监视脚本
摄像头监视脚本,若检测到摄像头画面有变化,保存这一段视频 一、使用方法 1.运行脚本 默认参数Threshold3, Period3, path./recordings python cam.py --threshold30 --period3 --path./recordings 2.参数说明 threshold:摄像头捕获到的画面变化量阈值…...
FreeRTOS的内存管理(选择heap4.c文件的理由)
目录 1. 了解FreeRTOS内存管理 2. 了解内存碎片 3.了解各个heap.c的内存分配方法 1.heap1.c 2.heap2.c 3.heap3.c 4.heap4.c 5.heap5.c 总结: 内存管理是一个系统基本组成部分,FreeRTOS 中大量使用到了内存管理,比如创建任务、信号量…...
SQL-leetcode-183. 从不订购的客户
183. 从不订购的客户 Customers 表: -------------------- | Column Name | Type | -------------------- | id | int | | name | varchar | -------------------- 在 SQL 中,id 是该表的主键。 该表的每一行都表示客户的 ID 和名称。 Orders 表&#…...
苹果系统MacOS下ObjectC建立的App程序访问opencv加载图片程序
前言 苹果系统下使用opencv感觉还是有些不太方便,总是感觉有点受到限制。本博客描述的是在MacOS下建立App程序然后调用opencv显示图片时出现的一些问题并最后解决的一个过程。 一、程序的建立 选择程序的类型: 选择界面模式和编程语言: 其余…...
《代码随想录》Day21打卡!
写在前面:祝大家新年快乐!!!2025年快乐,2024年拜拜~~~ 《代码随想录》二叉树:修剪二叉搜索树 本题的完整题目如下: 本题的完整思路如下: 1.本题使用递归进行求解,所以分…...
Dell服务器升级ubuntu 22.04失败解决
ubuntu系统原版本20.04,服务器dell T40. 执行apt update后,再执行apt upgrade。 apt update执行成功,但apt upgrade执行中断,提示如下: Checking package manager Reading package lists... Done Building dependen…...
构建全志 T113 Tina SDK
1、环境配置: 准备一个 Ubuntu 系统,可以是 WSL,虚拟机等,建议版本是 20.04。 1.1、安装必要的软件 进入系统后,输入下方命令安装需要的工具 : sudo apt update -y sudo apt full-upgrade -y sudo apt i…...
(推荐)【通用业务分发架构】1.业务分发 2.rpc调用 3.Event事件系统
一.Reflections和SpringUtil完成扫描包的(反射缓存) 二.id与class的映射泛型上下文(玩家是否登录,rpc调用SeqId,class类名)反射调用 1.netty层的 AccountMsgParam // 登录前 OnlineMsgParam // 登录后 SceneMsgParam // 发到场景层的 2.跨进程rpc调用的…...
最近的一些事情
正义不会缺席 这家公司违法辞退不给工资乱开离职证明。严重影响个人发展。 今天终于收到法院的判决书。 警醒自身发展与社会之间密切交流,敲响警钟。 虽然最终得到的法院的支持,但过程举步维艰。 这其中的过程,也让我对律师、法院和中国…...
CP AUTOSAR标准之FlexRayDriver(AUTOSAR_SWS_FlexRayDriver)(更新中……)
1 简介和功能概述 FlexRay驱动程序(Fr)抽象了特定FlexRay通信控制器(CC)的硬件相关实现细节。本规范主要依赖于符合FlexRay规范[13]的FlexRay CC。此外,本规范还支持符合FlexRay规范[14]的旧版FlexRay控制器。本SWS中因支持的FlexRay规范不同而导致的不同行为在适用的情况下以…...
Cesium 实战 27 - 三维视频融合(视频投影)
Cesium 实战 27 - 三维视频融合(视频投影) 核心代码完整代码在线示例在 Cesium 中有几种展示视频的方式,比如墙体使用视频材质,还有地面多边形使用视频材质,都可以实现视频功能。 但是随着摄像头和无人机的流行,需要视频和场景深度融合,简单的实现方式则不能满足需求。…...
GraphRAG实践:docker部署neo4j
概述 随着图数据库(Graph Database)的流行,越来越多的应用场景开始采用图数据库来处理复杂的关系数据。Neo4j作为领先的图数据库之一,提供了强大的图形查询语言Cypher、高效的存储结构和丰富的生态系统,使得它成为开发…...
常用的数据库类型都有哪些
在Java开发和信息系统架构中,数据库扮演着存储和管理数据的关键角色。数据库种类繁多,各有特色,适用于不同的应用场景。 1. 关系型数据库(RDBMS): • 关系型数据库是最为人熟知的数据库类型,数据…...
swiftui开发页面加载发送请求初始化@State变量
在SwiftUI中,你不能直接在init中更新State变量,因为State是由SwiftUI框架管理的,初始化时不允许直接修改。所以需要在onAppear发送请求然后修改State状态。 在SwiftUI中,如果希望在页面加载时立即发送网络请求,可以使…...
Ribbon和Eureka的集成
Ribbon和Eureka的集成是Spring Cloud Netflix生态系统的一部分,通常用于微服务架构中,以实现客户端负载均衡和服务发现。以下是更详细的集成步骤: 1. 引入依赖 在你的Spring Boot项目的pom.xml文件中添加Eureka客户端和Ribbon的依赖&#x…...
关于UE加载osgb数据的研究(一)
最近关于倾斜数据在UE中加载显示的问题,直接转换格式本地加载的方式避免了数据延迟加载、缓存加载,动态刷新等问题,但是也暴露了突出的问题:常规的模型格式会丢失掉倾斜数据的lod,致使效果缺失。 故而需要深入研究一下UE加载osgb数据的方式方法。 首先,我们需得学习一下…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
从面试角度回答Android中ContentProvider启动原理
Android中ContentProvider原理的面试角度解析,分为已启动和未启动两种场景: 一、ContentProvider已启动的情况 1. 核心流程 触发条件:当其他组件(如Activity、Service)通过ContentR…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
webpack面试题
面试题:webpack介绍和简单使用 一、webpack(模块化打包工具)1. webpack是把项目当作一个整体,通过给定的一个主文件,webpack将从这个主文件开始找到你项目当中的所有依赖文件,使用loaders来处理它们&#x…...
Linux-进程间的通信
1、IPC: Inter Process Communication(进程间通信): 由于每个进程在操作系统中有独立的地址空间,它们不能像线程那样直接访问彼此的内存,所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...
