嵌入模型 API
嵌入(Embeddings)是文本、图像或视频的数值表示,用于捕捉输入之间的关系。
嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。这些向量旨在捕捉文本、图像和视频的含义。嵌入数组的长度称为向量的维度。
通过计算两段文本向量表示之间的数值距离,应用程序可以判断生成这些嵌入向量的对象之间的相似程度。
EmbeddingModel 接口专为在人工智能和机器学习中简化嵌入模型的集成而设计。其主要功能是将文本转换为数值向量,通常称为嵌入向量。这些嵌入向量在语义分析和文本分类等多种任务中至关重要。
EmbeddingModel 接口的设计主要围绕两大核心目标展开:
-
可移植性:该接口确保了在各种嵌入模型之间的轻松适配性。它允许开发者以最小的代码改动在不同的嵌入技术或模型之间切换。这一设计理念与Spring的模块化和可互换性哲学相契合。
-
简洁性:EmbeddingModel简化了将文本转换为嵌入向量的过程。通过提供像
embed(String text)和embed(Document document)这样直接的方法,它消除了处理原始文本数据和嵌入算法的复杂性。这一设计选择使开发者,特别是AI领域的新手,能够更容易地在他们的应用中使用嵌入向量,而无需深入研究底层机制。
API 概览
嵌入模型 API 构建于通用的 Spring AI 模型 API 之上,后者是 Spring AI 库的一部分。因此,EmbeddingModel 接口扩展了 Model 接口,该接口提供了一套用于与 AI 模型交互的标准方法。EmbeddingRequest 和 EmbeddingResponse 类分别继承自 ModelRequest 和 ModelResponse,用于封装嵌入模型的输入和输出。
Embedding API 进而被更高层级的组件所使用,用于实现针对特定嵌入模型的嵌入模型,例如 OpenAI、Titan、Azure OpenAI、Ollie 以及其他模型。
下图展示了 Embedding API 及其与 Spring AI 模型 API 和嵌入模型的关系:

EmbeddingModel
本节提供有关 EmbeddingModel 接口及相关类的使用指南。
public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {
@Override
EmbeddingResponse call(EmbeddingRequest request);
/**
* Embeds the given document's content into a vector.
* @param document the document to embed.
* @return the embedded vector.
*/
float[] embed(Document document);
/**
* Embeds the given text into a vector.
* @param text the text to embed.
* @return the embedded vector.
*/
default float[] embed(String text) {
Assert.notNull(text, "Text must not be null");
return this.embed(List.of(text)).iterator().next();
}
/**
* Embeds a batch of texts into vectors.
* @param texts list of texts to embed.
* @return list of list of embedded vectors.
*/
default List<float[]> embed(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY))
.getResults()
.stream()
.map(Embedding::getOutput)
.toList();
}
/**
* Embeds a batch of texts into vectors and returns the {@link EmbeddingResponse}.
* @param texts list of texts to embed.
* @return the embedding response.
*/
default EmbeddingResponse embedForResponse(List<String> texts) {
Assert.notNull(texts, "Texts must not be null");
return this.call(new EmbeddingRequest(texts, EmbeddingOptions.EMPTY));
}
/**
* @return the number of dimensions of the embedded vectors. It is generative
* specific.
*/
default int dimensions() {
return embed("Test String").size();
}
}
嵌入方法提供多种选项,用于将文本转换为嵌入向量,支持单个字符串、结构化的Document对象或批量文本的处理。
提供了多种快捷方法用于文本嵌入,包括 embed(String text) 方法,该方法接收单个字符串并返回对应的嵌入向量。所有快捷方法均围绕 call 方法实现,该方法是调用嵌入模型的主要方法。
通常,嵌入会返回一个浮点数列表,以数值向量格式表示嵌入。
embedForResponse 方法提供更全面的输出,可能包含关于嵌入的额外信息。
dimensions 方法是开发者快速确定嵌入向量大小的便捷工具,这对于理解嵌入空间以及后续处理步骤至关重要。
EmbeddingRequest
EmbeddingRequest 是一个 ModelRequest,它接收一个文本对象列表以及可选的嵌入请求选项。以下清单展示了 EmbeddingRequest 类的截断版本,其中不包含构造函数和其他实用方法:
public class EmbeddingRequest implements ModelRequest<List<String>> {
private final List<String> inputs;
private final EmbeddingOptions options;
// other methods omitted
}
EmbeddingResponse
EmbeddingResponse 类的结构如下:
public class EmbeddingResponse implements ModelResponse<Embedding> {
private List<Embedding> embeddings;
private EmbeddingResponseMetadata metadata = new EmbeddingResponseMetadata();
// other methods omitted
}
EmbeddingResponse 类承载AI模型的输出结果,其中每个 Embedding 实例包含来自单个文本输入的向量数据。
EmbeddingResponse类还包含一个关于AI模型响应的EmbeddingResponseMetadata元数据。
Embedding
Embedding 表示单个嵌入向量。
public class Embedding implements ModelResult<float[]> {
private float[] embedding;
private Integer index;
private EmbeddingResultMetadata metadata;
// other methods omitted
}
可用实现
在内部,各种 EmbeddingModel 实现使用不同的底层库和 API 来执行嵌入任务。以下是 EmbeddingModel 的一些可用实现:
章节总结
🗃️ Amazon Bedrock
2 个项目
📄️ Azure OpenAI
Azure 的 OpenAI 扩展了 OpenAI 的功能,为多种任务提供了安全的文本生成和嵌入计算模型:
1 个项目
📄️ Mistral AI
Spring AI 支持 Mistral AI 的文本嵌入模型。嵌入是文本的向量化表示,通过在高维向量空间中的位置来捕捉段落的语义信息。Mistral AI Embeddings API 为文本提供前沿、最先进的嵌入功能,可用于多种自然语言处理任务。
📄️ MiniMax
Spring AI 支持来自 MiniMax 的各类 AI 语言模型。您可以通过 Spring AI 与 MiniMax 的语言模型进行交互,并基于 MiniMax 模型创建一个多语言对话助手。
📄️ OCI GenAI
OCI GenAI服务提供文本嵌入功能,支持按需使用模型或部署专属AI集群。
📄️ Ollama
借助 Ollama,您可以在本地运行多种 AI 模型,并从中生成嵌入向量。嵌入向量是一个浮点数组成的向量(列表)。两个向量之间的距离衡量了它们的相关性。距离小表示相关性高,距离大则表示相关性低。
📄️ (ONNX) Transformers
TransformersEmbeddingModel 是一个 EmbeddingModel 实现,它使用选定的句子转换器在本地计算句子嵌入。
📄️ OpenAI SDK(官方版)
Spring AI通过OpenAI Java SDK支持OpenAI的文本嵌入模型,提供了与OpenAI服务(包括Microsoft Foundry和GitHub Models)之间稳健且官方维护的集成。
📄️ OpenAI
Spring AI 支持 OpenAI 的文本嵌入模型。OpenAI 的文本嵌入用于衡量文本字符串之间的相关性。嵌入是一个浮点数的向量(列表)。两个向量之间的距离衡量了它们的相关性:距离小表示相关性高,距离大表示相关性低。
📄️ PostgresML
Spring AI 支持 PostgresML 文本嵌入模型。
📄️ 千帆
此功能已迁移至 Spring AI 社区仓库。
🗃️ VertexAI
2 个项目
📄️ 智谱AI
Spring AI 支持智谱AI的文本嵌入模型。智谱AI的文本嵌入用于衡量文本字符串之间的相关性。嵌入是一个浮点数列表(向量)。两个向量之间的距离反映了它们之间的相关性:距离越小表示相关性越高,距离越大表示相关性越低。