《史上最简单的SpringAI+Llama3.x教程》-04-RAG核心Embedding及向量检索Retrieval

上一节咱们顺利从本地读取了文件内容,并且可以使用transform工具对文件进行内容处理,下面咱们继续看看如何将文件进行向量化,并且存储到向量数据库中。

Embedding 知识扩展

Embeddings是一种将高维数据映射到低维空间的技术,它能够捕捉数据之间的语义关系和相似性,使得模型能够更好地理解和处理这些数据。

在自然语言处理(NLP)中,Embeddings通常用于将文本转换为连续向量,基于分布式假设捕捉语义信息。

例如,Word2Vec、GloVe和BERT等模型通过学习上下文和语义信息,将单词映射到连续的向量空间。

Embeddings在多个领域都有广泛的应用,包括但不限于:

  • 自然语言处理:Embeddings可以帮助计算机更好地理解单词之间的语义关系,这对于机器翻译、情感分析等任务非常有益.
  • 图像处理:在计算机视觉领域,图像Embeddings被用于图像分类、相似性匹配等任务。通过将图像映射到低维向量空间,我们可以比较和分析图像之间的相似性.
  • 推荐系统:在推荐系统中,Embeddings被用于表示用户和商品。这种表示能够捕捉用户和商品之间的潜在关系,从而提高推荐的准确性.

简单来说,embedding向量就是一个N维的实值向量,它将输入的数据表示成一个连续的数值空间中的点。

在这里插入图片描述

如图 通俗易懂的描述:嵌入就相当于给文本穿上了“数字化”的外衣,目的是让机器更好的理解和处理。

Embedding 起源于 Word Embedding,从横向发展上看: Word Embedding -> Item Embedding -> Entity Embedding -> Graph Embedding -> Position Embedding -> Segment Embedding

从纵向发展看:

  • 由静态的Word Embedding(如Word2Vec、GloVe和FastText)
  • 动态预训练模型(如ELMo、BERT、GPT、GPT-2、GPT-3、ALBERT、XLNet等)。

大型语言模型可以生成上下文相关的 embedding 表示,可以更好地捕捉单词的语义和上下文信息。

Spring AI是如何支持Embedding

在 Spring AI中通过EmbeddingModel来实现,EmbeddingModel接口旨在简化AI和机器学习中的嵌入模型的集成。

其主要作用是将文本转换为数值向量,即嵌入。这些嵌入对于执行语义分析和文本分类等任务至关重要。EmbeddingModel接口的设计主要追求两个目标:

  • 可移植性**:**确保在不同嵌入模型间的高度适应性。开发者可以轻松地在各种嵌入技术或模型之间进行切换,只需进行极小的代码更改。这与Spring框架强调的模块化和可互换性原则一致。
  • 简洁性:EmbeddingModel使得文本到嵌入的转换过程更为简单。通过提供embed(String text)embed(Document document)等直观方法,它减少了处理原始文本和嵌入算法的复杂性。这样的设计让开发者,尤其是AI领域的新手,能够更容易地在他们的应用中使用嵌入技术,无需深入了解其背后的工作原理。

实现设计

EmbeddingModel API基于Spring AI库中的通用AI模型API构建。因此,EmbeddingModel接口继承了Model接口,后者提供了一系列与AI模型交互的标准方法。EmbeddingRequestEmbeddingResponse类分别继承自ModelRequestModelResponse类,用于封装嵌入模型的输入和输出数据。

嵌入API随后被用于实现特定嵌入模型的高级组件,例如OpenAITitanAzure OpenAIOllama等。

下图展示了Embedding API与Spring AI模型API以及嵌入模型之间的关系:

在这里插入图片描述

现在Spring AI 已经支持了很多Embedding模型,如下:

  • Spring AI OpenAI Embeddings
  • Spring AI Azure OpenAI Embeddings
  • Spring AI Ollama Embeddings
  • Spring AI Transformers (ONNX) Embeddings
  • Spring AI PostgresML Embeddings
  • Spring AI Bedrock Cohere Embeddings
  • Spring AI Bedrock Titan Embeddings
  • Spring AI VertexAI PaLM2 Embeddings
  • Spring AI Mistral AI Embeddings

文本向量化(使用Ollama Embedding)

要计算向量数据库的嵌入向量,需要选择与 AI 模型匹配的嵌入模型,比如,openai的模型text-embedding-ada-002,咱们这次使用的Embedding是llama3.1模型进行数据向量化。

通过Ollama,可以在本地运行多种大型语言模型(LLMs),并利用这些模型生成文本嵌入。Spring AI通过OllamaEmbeddingModel支持Ollama文本嵌入功能。

嵌入实质上是浮点数构成的向量。两个向量之间的距离可以反映它们之间的相关性:

  • 距离越近,相关性越高;
  • 距离越远,相关性越低。

以下案例通过llama3.1模型实现。

项目embedding模型配置信息

spring:ai:ollama:base-url: http://localhost:11434embedding:model: llama3.1

将文本进行向量化实现

@RestController
@AllArgsConstructor
@RequestMapping("/embedding")
public class EmbeddingController {private final OllamaEmbeddingModel ollamaEmbeddingModel;/*** 将文本内容向量化** @param message 文本* @return 向量化数据*/@GetMapping("/text")public Map<String, ?> embed(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {EmbeddingResponse embeddingResponse = ollamaEmbeddingModel.embedForResponse(List.of(message));return Map.of("embedding", embeddingResponse);}
}

关于向量数据库

向量数据库技术是一种专门用于存储和处理向量数据的数据库系统,它以向量为基本数据类型,旨在处理和存储大规模向量数据。

向量数据库和传统关系型数据库在数据模型上的主要区别体现在数据的表示和组织方式上。

  • 向量数据库将数据表示为多维空间中的矢量,强调数据之间的相似性和距离关系,这种模型适合处理大规模的非结构化数据,侧重于数据的相似性搜索和模式匹配。
  • 传统关系型数据库基于表格形式,数据以行和列的结构组织,通过明确的关系和约束来关联不同的表,更适用于结构化数据,重点在于精确的数据查询、更新和事务处理。

向量数据库由于其在处理高维数据和相似性搜索方面的优势,常被用于图像识别、自然语言处理、推荐系统等领域,而关系型数据库则广泛应用于企业资源规划(ERP)、客户关系管理(CRM)等具有结构化数据和事务处理需求的系统。

文本向量存储(基于Chroma DB)

SpringAI支持了很多向量数据接入,如下:

  • Apache Cassandra - Apache Cassandra 矢量存储。
  • Chroma Vector Store - Chroma 矢量存储。
  • Elasticsearch Vector Store - Elasticsearch 矢量存储。
  • Milvus Vector Store - Milvus 矢量存储。
  • MongoDB Atlas Vector Store -MongoDB Atlas矢量存储。
  • Neo4j Vector Store - Neo4j 矢量存储。
  • PgVector Store - PostgreSQL/PGVector 向量存储。
  • Qdrant Vector Store - Qdrant 矢量存储。
  • Redis Vector Store - Redis 矢量存储。
  • SimpleVectorStore -持久向量存储的简单实现,适用于教育目的.
  • 等等。

本次案例使用 Chroma VectorStore 来存储文档嵌入并执行相似性搜索。

Chroma 是开源嵌入数据库。它为您提供了用于存储文档嵌入、内容和元数据以及搜索这些嵌入(包括元数据过滤)的工具。

使用docker安装Chroma

# 加载镜像
docker pull chromadb/chroma
# 启动container
docker run -d --rm --name chromadb -p 8000:8000 chromadb/chroma:latest

Chroma项目配置

spring:ai:ollama:chat:options:model: llama3.1temperature: 0.5base-url: http://localhost:11434embedding:model: llama3.1vectorstore:chroma:client:host: http://localhostport: 8000collection-name: "jingyu-spring-ai"initialize-schema: true     # 如果chromadb中没有collection-name,那么此处需要设置为true,否者会404报错

pom配置

<dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-chroma-store-spring-boot-starter</artifactId>
</dependency>

向量化的代码很简单如下:

@RestController
@RequestMapping("/vector")
@AllArgsConstructor
public class VectorController {private final VectorStore vectorStore;/*** 将向量化数据存储到向量数据库** @param message 文本内容* @return 向量化存储结果*/@GetMapping("/msg/vector")public Boolean embedAndOptions(@RequestParam(value = "message", defaultValue = "Tell me a joke") String message) {// 将文本内容向量化到chromaDB中vectorStore.add(List.of(new Document(message)));return Boolean.TRUE;}
}

第一次使用向量化存储的API时,很诧异,为啥这么简单,竟然向量化也不需要配置,直接add()就可以实现了。

打开其源码才发现,大善人在add()都已经完成了,咱们来一起看一下ChromaVectorStore的实现:

public class ChromaVectorStore implements VectorStore, InitializingBean {// 其他代码省略// 构造方法中自动注入了一个Embedding模型public ChromaVectorStore(EmbeddingModel embeddingModel, ChromaApi chromaApi, String collectionName, boolean initializeSchema) {this.embeddingModel = embeddingModel;this.chromaApi = chromaApi;this.collectionName = collectionName;this.initializeSchema = initializeSchema;this.filterExpressionConverter = new ChromaFilterExpressionConverter();}public void add(List<Document> documents) {Assert.notNull(documents, "Documents must not be null");if (!CollectionUtils.isEmpty(documents)) {List<String> ids = new ArrayList();List<Map<String, Object>> metadatas = new ArrayList();List<String> contents = new ArrayList();List<float[]> embeddings = new ArrayList();Iterator var6 = documents.iterator();while(var6.hasNext()) {Document document = (Document)var6.next();ids.add(document.getId());metadatas.add(document.getMetadata());contents.add(document.getContent());document.setEmbedding(this.embeddingModel.embed(document));embeddings.add(JsonUtils.toFloatArray(document.getEmbedding()));}this.chromaApi.upsertEmbeddings(this.collectionId, new ChromaApi.AddEmbeddingsRequest(ids, embeddings, metadatas, contents));}}
}

向量检索

存储数据只是咱们得第一步,目的还是为了咱们能够更好的根据语义去检索到咱们得数据。

向量数据库的检索也挺简单,咱们可以只需要设置部分参数,底层会自动帮助我们做问题的Embedding,然后再到向量数据库中进行匹配查询。

向量化检索

@GetMapping("/retrieval")
public Object queryVector(@RequestParam("query") String query) {SearchRequest searchRequest = SearchRequest.defaults().withQuery(query).withTopK(5).withSimilarityThreshold(SearchRequest.SIMILARITY_THRESHOLD_ACCEPT_ALL);
//           .withFilterExpression();return vectorStore.similaritySearch(searchRequest);
}

这里需要注意的有两点:

  1. SearchRequest中设置的参数:
    1. query:用于嵌入相似性比较的文本。
    2. topK:指定要返回的相似文档的最大数量。这通常被称为“前 K”搜索,或“K 最近邻”(KNN)。
    3. similarityThreshold:相似度检索阈值。阈值值为0.0表示接受任何相似度或禁用相似度阈值过滤。阈值值为1.0表示需要完全匹配。例如,默认情况下,如果将阈值设置为 0.75,则仅返回相似度高于此值的文档。
    4. filterExpression:基于 ANTLR4 的外部 DSL,接受过滤器表达式作为字符串。例如,对于 country、year 和 等元数据键,可以使用如下表达式:isActivecountry == 'UK' && year >= 2020 && isActive == true.
  2. Chroma查询过滤语法:🧪 Chromadb Querying a Collection

以上就是本节所有的内容了,下面我将继续研究一下,在数据有限的情况下,如何通过Function Calling来获取外部数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280770.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Webpack 踩坑】img 标签图片加载不出来

问题&#xff1a;在html的img标签路径解析错误&#xff0c;导致加载不出来 一直用框架开发&#xff0c;好久没用过webpack写原生代码&#xff0c;一下子踩了好多坑… 图片位置&#xff1a; 其中一个就是在html中写了图片地址&#xff1a; <!-- src/pages/index.html --&…

实战:ElasticSearch 索引操作命令(补充)

四.ElasticSearch 操作命令 4.1 集群信息操作命令 4.1.1 查询集群状态 &#xff08;1&#xff09;使用 Postman 客户端直接向 ES 服务器发 GET 请求 http://hlink1:9200/_cat/health?v &#xff08;2&#xff09;使用服务端进行查询 curl -XGET "hlink1:9200/_cat/h…

2024.07纪念一 debezium : spring-boot结合debezium

使用前提&#xff1a; 一、mysql开启了logibin 在mysql的安装路径下的my.ini中 【mysqlid】下 添加 log-binmysql-bin # 开启 binlog binlog-formatROW # 选择 ROW 模式 server_id1 # 配置 MySQL replaction 需要定义&#xff0c;不要和 canal 的 slaveId 重复 参考gitee的项目…

收藏!国内外GPU算力厂商详细盘点

如今&#xff0c;图形处理器&#xff08;GPU&#xff09;作为计算领域的核心部件&#xff0c;其算力性能直接决定了诸多应用场景的效率和效果。从深度学习、科学计算到视频处理&#xff0c;GPU的算力已成为衡量技术实力的重要指标。本文将详细盘点当前市场上GPU算力领先的厂商&…

iOS开发-图片上涂鸦绘制撤销功能

iOS开发-图片上涂鸦绘制撤销功能 当我们需要重新在图片上进行绘制涂鸦生成新的图&#xff0c;这里使用到了Graphics中的API功能。 Graphics Framework是一套基于C的API框架&#xff0c;使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。 微信搜索小游戏…

单线程 和多线程区别,看打印输出1000个数字效果

执⾏过程: 加载func() -> 执⾏main -> 创建⼦线程t -> ⼦线程t启动 -> 执⾏func中的内容 |-> 继续执⾏main from threading import Thread #此线程不用安装自带。T是大写注意哟 def func():for i in range(1000):print(func,i) #定义一个函数打印 if __name__ …

<数据集>DOTA v1.0遥感航拍目标识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;1869张&#xff08;训练集1411&#xff0c;验证集458&#xff09; 标注数量(xml文件个数)&#xff1a;1869 标注数量(txt文件个数)&#xff1a;1869 标注类别数&#xff1a;15 标注类别名称&#xff1a;[plane, ba…

基于Python的哔哩哔哩国产动画排行数据分析系统

需要本项目的可以私信博主&#xff0c;提供完整的部署、讲解、文档、代码服务 随着经济社会的快速发展&#xff0c;中国影视产业迎来了蓬勃发展的契机&#xff0c;其中动漫产业发展尤为突出。中国拥有古老而又璀璨的文明&#xff0c;仅仅从中提取一部分就足以催生出大量精彩的…

python——joblib进行缓存记忆化-对计算结果缓存

问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行&#xff0c;通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序&#xff0c;但由于数据包的特性&#xff0c;这一操作很占用性能和时…

碰撞检测 | 矩形增量膨胀安全走廊模型(附C++/Python仿真)

目录 0 专栏介绍1 安全走廊建模的动机2 矩形增量膨胀算法3 算法仿真3.1 C实现3.2 Python实现 0 专栏介绍 &#x1f525;课设、毕设、创新竞赛必备&#xff01;&#x1f525;本专栏涉及更高阶的运动规划算法轨迹优化实战&#xff0c;包括&#xff1a;曲线生成、碰撞检测、安全走…

哪个牌子的眼镜清洗机好?买超声波清洗机有必要吗

生活中&#xff0c;我们经常忽视眼镜的清洁。你知道吗&#xff1f;眼镜如果长时间不清洁的话&#xff0c;镜片上的污垢和油脂会让视线变得模糊不清&#xff0c;甚至油污滋生的细菌还可能伤害到我们的眼睛&#xff0c;比如引起眼睛疲劳或炎症。为了保持眼镜干净&#xff0c;现在…

生鲜 52 周 MD如何助力业绩提升

生鲜 52 周 MD &#xff0c;顾名思义&#xff0c;就是以一年 52 周为周期&#xff0c;对生鲜商品进行精细化、动态化的营销规划。它不再是传统的固定化、模式化的销售方式&#xff0c;而是根据每周的季节特点、节日氛围、消费趋势以及市场变化&#xff0c;精心策划生鲜商品的种…

11 优化器

目录 1. 随机梯度下降系优化器&#xff1a;SGD 1.1 算法种类 1.2 优缺点 2 SGDM 即为SGD with momentum 动量 2.1 公式 2.2 动量的优缺点 优点 缺点 2.3 使用场景 3 AdaGrad 3.1 公式 3.2 AdaGrad的优缺点 优点 缺点 3.3 使用场景 3.4 Adam 3.4.1 Adam优化器的…

计算机网络01

文章目录 浏览器输入URL后发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;Linux 网络协议栈Linux 接收网络包的流程Linux 发送网络包的流程 浏览器输入URL后发生了什么&#xff1f; URL解析 当在浏览器中输入URL后&#xff0c;浏览器首先对拿到的URL进行识别…

2024最全RabbitMQ集群方案汇总

之前在网上找rabbitmq集群方案有哪几种时&#xff0c;基本上看到的答案都不太一样&#xff0c;所以此文的主要目的是梳理一下rabbitmq集群方案&#xff0c;对rabbitmq集群方案的笔记并不是搭建的笔记。 总结了一些文章&#xff0c;rabbitmq集群大概有五种方案&#xff1a;普通…

[Linux安全运维] iptables包过滤

前言 防火墙是网络安全中非常重要的设备&#xff0c;是一种将内部网络和外部网络隔离开的技术。简单来说&#xff0c;防火墙技术就是访问控制技术&#xff0c;由规则和动作组成。 1. Linux 包过滤防火墙 1 .1 概述 iptables&#xff1a; 指的是管理Linux防火墙的命令程序&a…

Windows 下后台启动 jar 包,UTF-8 启动 jar 包_windows启动jar

转自:https://blog.csdn.net/2401_83817971/article/details/137514739 本文介绍了如何使用javaw.exe后台启动Javajar包&#xff0c;如何在Windows中管理和设置cmd编码&#xff0c;以及与Python开发相关的学习资源。包括UTF-8编码启动jar包的方法和Windows下关闭后台服务的技…

superset 不显示mysql的选项问题

superset不显示mysql的选项 数据库驱动未安装&#xff1a;确保你已经安装了Python的MySQL数据库驱动&#xff0c;比如mysqlclient。 pip install mysqlclient

vue一些npm i 时报错问题解决【JAVA前后端分离】

前端vue npm i 安装时出现 作为一个懂些前端得 JAVA开发自然是要粗暴解决这个问题了 问题解决 使用命令 npx -p npm6 npm i 即可编译 原因&#xff1a; ERESOLVE与npm版本有关&#xff0c;因为npm版本高对某些事情比npm6.x更严格。通常&#xff0c;最简单的解决方法是将--…

【机器学习基础】机器学习概述与实践基础

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科&#xff0c;通过算法和模型让计算机从数据中学习&#xff0c;进行模型训练和优化&#xff0c;做出预测、分类和决策支持。Python成为机器学习的首选语言&#xff0c;…