系列篇章💥
No. | 文章 |
---|---|
1 | 大模型之Spring AI实战系列(一):基础认知篇 - 开启智能应用开发之旅 |
2 | 大模型之Spring AI实战系列(二):Spring Boot + OpenAI 打造聊天应用全攻略 |
3 | 大模型之Spring AI实战系列(三):Spring Boot + OpenAI 实现聊天应用上下文记忆功能 |
4 | 大模型之Spring AI实战系列(四):Spring Boot + OpenAI 使用OpenAI Embedding实现文本向量化 |
前言
在当今人工智能和自然语言处理领域,文本嵌入(Embedding)技术如同基石般至关重要。它巧妙地将文本转化为固定维度的数值向量,使得机器能够跨越语言的障碍,深入理解语义,并精准地进行相似度计算、聚类分析以及语义搜索等复杂任务。
本篇文章作为《Spring AI 实战》专栏的第四篇,将带领大家深入探索 spring-ai-openai-embedding 示例项目。我们将详细解读如何借助 Spring AI 无缝集成 OpenAI 的 Embedding API,实现文本的高效向量化处理。不仅如此,我们还将深入剖析其在企业级应用中的多种典型用途,助力您在实际项目中挖掘文本数据的深层价值,开启智能应用的新篇章。
一、开发环境准备
(一)Java 版本要求
本项目采用Java 17进行编译和运行,请务必确保你的开发环境已成功安装JDK 17。你可以在命令行中输入以下命令进行检查:
java -version
输出应类似如下内容:
openjdk version "17.0.8" 2023-07-18
OpenJDK Runtime Environment (build 17.0.8+7)
OpenJDK 64-Bit Server VM (build 17.0.8+7, mixed mode, sharing)
(二)Maven 构建工具
确保你已安装 Maven 并配置好环境变量:
mvn -v
输出应类似如下内容:
Apache Maven 3.8.8 (4c87b05d9aedce574290d1acc98575ed5eb6cd39)
Maven home: D:\Program Files (x86)\apache-maven-3.8.8
Java version: 17.0.12, vendor: Oracle Corporation, runtime: D:\Program Files\jdk-17.0.12
Default locale: zh_CN, platform encoding: GBK
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"
(三)OpenAI API 密钥
你需要注册 OpenAI 官网 获取 API Key(国内可以直接使用中转地址),并设置为环境变量:
export OPENAI_API_KEY="your_openai_api_key"
export OPENAI_API_URL="https://api.openai.com/v1"
注意:出于安全考虑,不建议将密钥硬编码在代码中,推荐使用环境变量或配置中心进行管理。
二、POM依赖引入
(一)Spring AI与OpenAI集成依赖包
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-starter-model-openai</artifactId>
</dependency>
此依赖包用于实现Spring AI与OpenAI的集成,为后续与OpenAI API进行交互提供了必要的支持。
(二)SpringAI相关依赖包版本管理
版本管理
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-bom</artifactId>
<version>1.0.0-SNAPSHOT</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
部分通过引入spring-ai-bom,实现了对SpringAI相关依赖包版本的统一管理。这样,在项目中使用Spring AI相关依赖时,无需在每个依赖声明中单独指定版本号,只需遵循spring-ai-bom中定义的版本即可,极大地简化了依赖管理工作,同时确保了项目中依赖版本的一致性和稳定性。
三、配置文件详解
在配置文件application.yml
中我们需要进行Embedding 相关配置:
server:
port: 8883
spring:
ai:
openai:
base-url: ${OPENAI_API_URL}
api-key: ${OPENAI_API_KEY}
chat:
options:
model: gpt-3.5-turbo
temperature: 0.7
embedding:
model: text-embedding-ada-002
目前 OpenAI 提供了多个版本的 Embedding 模型,包括:
模型名称 | 描述 | 维度 |
---|---|---|
text-embedding-ada-002 | 最常用的通用嵌入模型 | 1536 |
text-embedding-3-small | 更小尺寸,适合轻量级场景 | 1536 或 3072 |
text-embedding-3-large | 高精度模型,适合复杂语义任务 | 1024、1536、2048、3072 |
开发者可根据实际需求选择合适的模型,并通过 EmbeddingOptionsBuilder
或 OpenAiEmbeddingOptions
进行动态配置。
四、核心代码详解
(一)Application启动类
这是 Spring Boot 的启动类,非常简洁:
@SpringBootApplication
public class SpringAiApplication {
public static void main(String[] args) {
SpringApplication.run(SpringAiApplication.class, args);
}
}
Spring Boot会自动扫描并加载所有的Controller、Service等Bean,为项目的启动和运行奠定基础。它通过@SpringBootApplication注解开启了Spring Boot的自动配置功能,使得项目能够快速搭建起一个完整的Spring应用环境。
(二)文本嵌入控制器
该类使用 EmbeddingModel
接口来构建通用的文本向量化服务。
@RestController
@RequestMapping("/embedding")
public class EmbeddingController {
private final EmbeddingModel embeddingModel;
public EmbeddingController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
// 方法实现省略...
}
该控制器类是实现文本向量化服务的核心组件。它通过 EmbeddingModel 接口与 OpenAI 的 Embedding 服务进行交互,从而将输入的文本转换为向量形式。
(三)基本嵌入接口 /embed
@GetMapping("/embed")
public String embed(@RequestParam String query) {
var embeddings = embeddingModel.embed(query);
return "Size of the embedding vector: " + embeddings.length;
}
- 调用 embed()方法生成指定文本的向量。
- 返回值为向量长度,用于验证是否成功获取到嵌入结果。
(四)带通用选项的嵌入 /embed/generic-options
@GetMapping("/embed/generic-options")
public String embedGenericOptions(@RequestParam String query) {
var embeddings = embeddingModel.call(new EmbeddingRequest(List.of(query), EmbeddingOptionsBuilder.builder()
.withModel(OpenAiApi.EmbeddingModel.TEXT_EMBEDDING_3_SMALL.getValue())
.build()))
.getResult().getOutput();
return "Size of the embedding vector: " + embeddings.length;
}
- 支持自定义模型(如
text-embedding-3-small
)。 - 适用于需要适配多个 Embedding 提供商的场景。
(五)带特定提供商选项的嵌入 /embed/provider-options
@GetMapping("/embed/provider-options")
public String embedProviderOptions(@RequestParam String query) {
var embeddings = embeddingModel.call(new EmbeddingRequest(List.of(query), OpenAiEmbeddingOptions.builder()
.encodingFormat("float")
.build()))
.getResult().getOutput();
return "Size of the embedding vector: " + embeddings.length;
}
- 使用
OpenAiEmbeddingOptions
设置 OpenAI 特有的参数,例如encodingFormat
。 - 适用于仅针对 OpenAI 的深度定制需求。
五、部署与测试
(一)启动应用
可以直接基于IntelliJ IDEA启动并运行Spring Boot应用程序,也可以进入项目根目录,执行 mvn clean package 进行打包,之后采用 java -jar xxx.jar 命令进行部署运行。运行成功后,应用将在 http://localhost:8882 启动。
(二)测试接口
你可以使用 Postman、curl 或浏览器访问以下接口:
- 基础嵌入:
GET /embedding/embed?query=人工智能
- 带通用选项嵌入:
GET /embedding/embed/generic-options?query=人工智能
- 带 OpenAI 特有参数嵌入:
GET /embedding/embed/provider-options?query=人工智能
返回示例:
Size of the embedding vector: 1536
六、应用场景与进阶思路
(一)语义相似度计算
通过计算 Embedding 向量之间的余弦相似度,可以精准地判断两个句子的语义相似性。这一技术在多个领域具有广泛的应用价值。例如,在问答系统中,它可以快速匹配用户问题与已有的答案库,从而提供准确的回复;在推荐系统中,能够根据用户的历史行为和偏好,推荐语义相关的内容;在意图识别中,通过分析用户输入的语义特征,准确判断其意图,从而提供相应的服务。
(二)向量数据库集成
结合高效的向量数据库(如 FAISS、Pinecone、Weaviate),可以构建强大的语义搜索引擎和知识库检索系统。这些数据库支持大规模数据存储和高效相似度检索,能够处理数百万甚至更多的向量。例如,通过向量数据库,可以实现快速的文档检索、问答系统中的上下文检索,以及知识图谱中的语义关联查询。此外,向量数据库还支持 API 级别的读写操作,方便与各种应用场景集成。
(三)多模态应用支持
Embedding 技术不仅局限于文本,还可以扩展到图像、音频等领域,构建统一的多模态表示空间。例如,在多模态智能助手中,用户可以通过语音、文字或上传图像的方式进行交互,系统能够结合多种模态信息提供精准反馈。此外,多模态技术还可以应用于跨模态检索(如通过文本搜索相关图像)和跨模态生成(如根据文本生成图像)。这种多模态融合不仅丰富了用户体验,也为智能应用的开发提供了更广阔的空间。
结语
通过本文的深入实践和详细讲解,我们成功掌握了在 Spring AI 中使用 EmbeddingModel 接口调用 OpenAI 的 Embedding API 的方法,实现了文本的向量化处理,并深入了解了不同配置方式的适用场景。这不仅为我们后续构建语义搜索、推荐系统、RAG 等高级 AI 应用奠定了坚实的技术基础,也为我们在人工智能领域探索更多创新应用场景提供了有力的支持和启发。
若您对本文介绍的技术内容感兴趣,希望进一步探索和实践,欢迎关注我,通过私信的方式与我联系,获取完整的项目代码
,开启您的 Spring AI 开发之旅。
🎯🔖更多专栏系列文章:AI大模型提示工程完全指南、AI大模型探索之路(零基础入门)、AI大模型预训练微调进阶、AI大模型开源精选实践、AI大模型RAG应用探索实践🔥🔥🔥 其他专栏可以查看博客主页📑
😎 作者介绍:资深程序老猿,从业10年+、互联网系统架构师,目前专注于AIGC的探索(CSDN博客之星|AIGC领域优质创作者)
📖专属社群:欢迎关注【小兵的AI视界】公众号或扫描下方👇二维码,回复‘入群’ 即刻上车,获取邀请链接。
💘领取三大专属福利:1️⃣免费赠送AI+编程📚500本,2️⃣AI技术教程副业资料1套,3️⃣DeepSeek资料教程1套🔥(限前500人)
如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我们,一起携手同行AI的探索之旅,开启智能时代的大门!