Spring AI Alibaba EmbeddingModel使用
一、嵌入模型 (Embedding Model)简介
1、核心概念
嵌入模型(EmbeddingModel)是嵌入过程中采用的模型。
当前 EmbeddingModel的接口主要用于将文本转换为数值向量,接口的设计主要围绕这两个目标展开:
- 可移植性:
- 该接口确保在各种嵌入模型之间的轻松适配。
- 它允许开发者在不同的嵌入技术或模型之间切换,所需的代码更改最小化。
- 这一设计与 Spring 模块化和互换性的理念一致。
- 简单性:
- 嵌入模型简化了文本转换为嵌入的过程。
- 通过提供如 embed(String text)和 embed(Document document)这样简单的方法,它去除了处理原始文本数据和嵌入算法的复杂性。
- 这个设计选择使开发者,尤其是那些初次接触 AI 的开发者,更容易在他们的应用程序中使用嵌入,而无需深入了解其底层机制。
嵌入(Embedding)的工作原理是将文本、图像和视频转换为称为向量(Vectors)的浮点数数组。
这些向量旨在捕捉文本、图像和视频的含义。
嵌入数组的长度称为向量的维度(Dimensionality)。
2、EmbeddingModel简介
EmbeddingModel API提供多种选项,将文本转换为Embeddings,支持单个字符串、结构化的Document对象或文本批处理。
有多种快捷方式可以获得文本Embeddings。例如:embed(String text)方法,它接受单个字符串并返回相应的 Embedding 向量。
EmbeddingModel所有方法都围绕着call方法实现,这是调用 EmbeddingModel的主要方法。
通常,Embedding返回一个float数组,以数值向量格式表示Embeddings。
- embedForResponse方法:提供了更全面的输出,可能包括有关Embeddings的其他信息。
- dimensions方法:是开发人员快速确定 Embedding 向量大小的便利工具,这对于理解 Embedding space 和后续处理步骤非常重要。
涉及的几个重要类:
- EmbeddingRequest类:是一种ModelRequest,它接受文本对象列表和可选的Embedding请求选项。
- EmbeddingResponse类:保存了AI模型的输出,其中每个 Embedding 实例包含来自单个文本输入的结果向量数据。同时,它还携带了有关 AI 模型响应的 EmbeddingResponseMetadata元数据。
- Embedding类:表示一个 Embedding 向量。
二、嵌入模型 (Embedding Model)使用
Spring AI Alibaba 嵌入模型 (Embedding Model):https://java2ai.com/docs/1.0.0-M6.1/tutorials/embedding/
Spring AI Alibaba 支持以上 Model 抽象与通义系列模型的适配,并通过 spring-ai-alibaba-starter AutoConfiguration 自动初始化了默认实例,因此我们可以在应用程序中直接注入 ChatModel、ImageModel 等 bean,当然在需要的时候也可以自定义 Model 实例。
1、编写 Controller接口
示例需求:获取用户输入文本的数值向量Embeddings。
在普通 Controller Bean 中注入 EmbeddingModel 实例,并为 Prompt 指定函数,实现下面几个功能:
- 简单调用
- 流式调用
@Slf4j
@RestController
@RequestMapping("/dashscope/embedding-model")
public class DashScopeEmbeddingModelController {
private final EmbeddingModel embeddingModel;
/**
* 使用如下的方式自动注入 EmbeddingModel
*
* @param embeddingModel
*/
public DashScopeEmbeddingModelController(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
/**
* 简单调用
*/
@GetMapping("/simple/chat")
public Map simpleChat(@RequestParam(defaultValue = "西安未来5天天气状况") String userInputPrompt) {
EmbeddingResponse embeddingResponse = this.embeddingModel.embedForResponse(List.of(userInputPrompt));
float[] aiOutput = embeddingResponse.getResult().getOutput();
log.info("simpleChat --> userInputPrompt = {}, aiOutput = {}", userInputPrompt, aiOutput);
return Map.of("embeddingResponse", embeddingResponse);
}
/**
* 使用编程方式自定义 LLMs EmbeddingOptions 参数,
* {@link com.alibaba.cloud.ai.dashscope.embedding.DashScopeEmbeddingOptions}
* 优先级高于在 application.yml 中配置的 LLMs 参数!
*/
@GetMapping("/customOptions/embedding")
public float[] customOptionsEmbedding(@RequestParam(defaultValue = "西安未来5天天气状况") String userInputPrompt) {
// 自定义 LLMs Options 参数
DashScopeEmbeddingOptions customOptions = DashScopeEmbeddingOptions.builder()
// 默认使用的是 text-embedding-v1模型
.withModel("text-embedding-v2")
.build();
EmbeddingResponse embeddingResponse = embeddingModel.call(
new EmbeddingRequest(List.of(userInputPrompt), customOptions)
);
Embedding embedding = embeddingResponse.getResult();
float[] aiOutput = embedding.getOutput();
log.info("simpleChat --> userInputPrompt = {}, aiOutput = {}", userInputPrompt, aiOutput);
return aiOutput;
}
}
– 求知若饥,虚心若愚。