随着人工智能技术的不断发展,嵌入模型和矢量数据库已经成为 AI 应用中不可或缺的组成部分。SpringAI 提供了对这些技术的强大支持,允许开发者在 Spring 环境中轻松实现基于嵌入的模型和矢量数据库的应用。本文将介绍 SpringAI 如何实现嵌入模型和矢量数据库的集成及其应用场景
1. 嵌入模型简介
嵌入(Embedding)是将高维数据(如文本、图像等)映射到低维空间的过程,通常是通过神经网络模型学习到的表示。在 NLP(自然语言处理)领域,嵌入模型被广泛用于将单词、句子或段落转化为固定长度的向量,这些向量能更好地表示文本的语义特征。
例如,在 SpringAI 中,我们通过集成 OpenAI 的模型来实现文本的嵌入。嵌入模型通常通过模型训练将输入的文本数据转化为向量表示,这些向量可以用于进一步的文本分析、语义匹配或搜索等任务。
嵌入模型的常见应用场景
- 文本相似度计算:通过将文本转换为向量,可以计算不同文本之间的相似度,适用于推荐系统、搜索引擎等。
- 分类与聚类:使用嵌入模型进行数据的分类或聚类分析,可以帮助识别相似的主题或分组。
- 问答系统:将问题和答案转化为嵌入向量,通过比较向量的相似度来找到最相关的答案。
模型的获取
首先还是接上一篇的配置,我们先去申请一个推理模型,也是免费的

然后创建推理,在oneapi中添加,和上一篇文章一致,在渠道中添加新的向量推理key

然后更新令牌,填入推理key

2. 矢量数据库的介绍
矢量数据库(Vector Database)是专门用于存储和管理向量数据的数据库,通常用于高效的相似度搜索。矢量数据库通过存储经过嵌入模型处理后的向量,可以快速地进行相似度检索、最近邻搜索等操作。
在传统的数据库中,我们依赖于 SQL 查询来检索信息,但在矢量数据库中,我们使用基于 距离度量(如欧氏距离、余弦相似度等)的查询来进行检索。常见的矢量数据库包括 FAISS、Pinecone、RedisVector 等。
矢量数据库的核心特点
- 高效的相似度搜索:矢量数据库支持快速的向量搜索,能够在海量数据中高效地找到最相似的向量。
- 大规模向量存储:矢量数据库专门设计用来处理大规模的向量数据,支持存储和管理数百万甚至数亿个向量。
- 多样的距离度量:支持多种距离度量方式,如欧氏距离、余弦相似度等,适应不同类型的向量数据。
矢量数据库选型
这里推荐官网,上面有很多选型 -> springAi矢量数据库
我这里选择的Elasticsearch,因为网上大多数是redis作为矢量的,我这里介绍一篇Elasticsearch作为存储的数据库,这里面的坑我也会一步步带你走完
⚠️先决条件:对于3.3.0之前的spring-boot版本,有必要在> 8.13.3版本中显式添加elasticsearch-java依赖项,否则使用的旧版本将与执行的查询不兼容
⚠️必要条件:你的es版本必须>=8.13.3
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>8.13.3</version>
</dependency>
我这里是直接升级了springboot,添加核心依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-elasticsearch-store-spring-boot-starter</artifactId>
</dependency>
配置文件配置,具体参数参考官网

spring:
ai:
chat:
client:
enabled: true
vectorstore:
elasticsearch:
initialize-schema: true
index-name: es-ai
dimensions: 2560
openai:
api-key: ***
base-url: ***
chat:
options:
model: ***
embedding:
options:
model: ***
然后就可以快乐调试了,这是官方的代码
@Autowired VectorStore vectorStore;
// ...
List <Document> documents = List.of(
new Document("Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!! Spring AI rocks!!", Map.of("meta1", "meta1")),
new Document("The World is Big and Salvation Lurks Around the Corner"),
new Document("You walk forward facing the past and you turn back toward the future.", Map.of("meta2", "meta2")));
// Add the documents to Elasticsearch
vectorStore.add(documents);
// Retrieve documents similar to a query
List<Document> results = this.vectorStore.similaritySearch(SearchRequest.builder().query("Spring").topK(5).build());
文档嵌入
我这里使用了TikaDocumentReader,比较全能大部分文件都可以读取,添加依赖
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-tika-document-reader</artifactId>
</dependency>
调用实例
/**
* 嵌入文件
*
* @param file 待嵌入的文件
* @return 是否成功
*/
@SneakyThrows
@PostMapping("/api/ai/embedding")
public Result embedding(@RequestParam("file") MultipartFile file) {
// 从IO流中读取文件
TikaDocumentReader tikaDocumentReader = new TikaDocumentReader(new InputStreamResource(file.getInputStream()));
// 将文本内容划分成更小的块
List<Document> splitDocuments = new TokenTextSplitter()
.apply(tikaDocumentReader.read());
// 存入向量数据库,这个过程会自动调用embeddingModel,将文本变成向量再存入。
vectorStore.add(splitDocuments);
return Results.success();
}
添加完成后向量存储到数据库中

基于向量的相似度搜索
通过矢量数据库提供的相似度搜索功能,我们能够高效地查找与某一文本最相似的内容。在大规模数据集上,这种基于嵌入的搜索比传统的基于关键词的搜索要高效得多。
List<Document> results = vectorStore.similaritySearch(SearchRequest.query("Spring").withTopK(5));
此查询将返回与输入查询“Spring”最相关的前 5 个文档,通过向量的相似度计算来实现高效的匹配
提示词模式
我们可以结合向量数据库和用户提问达到想要的效果,比如用户想知道的知识在数据库找不到,这时候我们可以用预编译词去增强对话,告诉ai这时候提示用户抱歉查询不到,也可以让ai去联网检索
/**
* 从向量数据库中查找文档,并将查询的文档作为上下文回答。
*
* @return SSE流响应
*/
@GetMapping(value = "/api/ai/database", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> chatStreamWithDatabase(@RequestParam("message") String message) {
List<Document> vectorStoreResult =
vectorStore.doSimilaritySearch(SearchRequest.builder().query(message).topK(5).similarityThreshold(0.0).build());
String documents = vectorStoreResult.stream()
.map(Document::getContent)
.collect(Collectors.joining(System.lineSeparator()));
String prompts = """
Given context and provided historical information
, rather than prior knowledge, reply to user comments.
If the answer is not in the documentation,
answer the question close to the user's answer.
DOCUMENTS:
""" + documents
+ """
QUESTION:
""" + message;
return ChatClient.create(chatModel).prompt()
.user(prompts)
// 2. QuestionAnswerAdvisor会在运行时替换模板中的占位符`question_answer_context`,替换成向量数据库中查询到的文档。此时的query=用户的提问+替换完的提示词模板;
.stream()
// 3. query发送给大模型得到答案
.content()
.map(chatResponse -> ServerSentEvent.builder(chatResponse)
.event("message")
.build());
}
这个用例就是告诉ai在数据库中查询不到相关信息就让ai主动去回答它知道的东西,不仅仅依赖于知识库
3. SpringAI 在业务中的应用场景
结合嵌入模型与矢量数据库,SpringAI 可以帮助我们在多个领域实现智能化的解决方案:
- 推荐系统:通过将用户的历史行为和物品描述转化为向量,基于相似度匹配推荐相关内容。
- 智能搜索:实现基于语义的搜索,用户可以通过自然语言查询,系统返回与查询语义最相关的结果。
- 智能问答系统:根据用户提问,快速检索出最相关的答案或文档,提高用户的查询效率。
- 图像和文本结合的应用:通过图像生成模型和文本向量的结合,实现图像与文本之间的语义对齐,例如图文匹配、图文生成等。
总结
SpringAI 提供了强大的嵌入模型和矢量数据库功能,使得开发者能够轻松实现语义理解、相似度检索和智能推荐等功能。通过将文本、图像等数据转化为向量,并利用高效的向量数据库进行存储和检索,SpringAI 为各种 AI 应用场景提供了智能、高效的解决方案。无论是智能问答、推荐系统还是基于语义的搜索,嵌入模型和矢量数据库都为我们提供了强大的支持。后面会出ai智能体记忆篇
2955

被折叠的 条评论
为什么被折叠?



