好的,这是技术文章的逐行中文翻译:
嵌入模型 API
嵌入是文本、图像或视频的数值表示,它们捕捉输入之间的关系。
嵌入通过将文本、图像和视频转换为浮点数数组(称为向量)来工作。
这些向量旨在捕捉文本、图像和视频的含义。
嵌入数组的长度称为向量的维度。
通过计算两段文本向量表示之间的数值距离,应用程序可以确定用于生成嵌入向量的对象之间的相似性。
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,用于封装嵌入模型的输入和输出。
嵌入 API 进而被更高级别的组件用来为特定的嵌入模型(如 OpenAI、Titan、Azure OpenAI、Ollie 等)实现嵌入模型。
下图说明了嵌入 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();
}
}
embed
方法提供了多种将文本转换为嵌入的选项,适应单个字符串、结构化的 Document
对象或批量文本。
提供了多个嵌入文本的快捷方法,包括 embed(String text)
方法,它接收单个字符串并返回相应的嵌入向量。
所有快捷方法都围绕 call
方法实现,该方法是调用嵌入模型的主要方法。
通常,嵌入返回一个浮点数列表,以数值向量格式表示嵌入。
embedForResponse
方法提供更全面的输出,可能包含有关嵌入的额外信息。
dimensions
方法是一个方便的工具,供开发人员快速确定嵌入向量的大小,这对于理解嵌入空间和后续处理步骤非常重要。
EmbeddingRequest
EmbeddingRequest
是一个 ModelRequest
,它接收一个文本对象列表和可选的嵌入请求选项。以下清单显示了 EmbeddingRequest
类的截断版本(省略了构造函数和其他实用方法):
```java
public class EmbeddingRequest implements ModelRequest<List<String>> {
private final List<String> inputs;
private final EmbeddingOptions options;
// 其他方法已省略
}
```
EmbeddingResponse
EmbeddingResponse
类的结构如下:
```java
public class EmbeddingResponse implements ModelResponse<Embedding> {
private List<Embedding> embeddings;
private EmbeddingResponseMetadata metadata = new EmbeddingResponseMetadata();
// 其他方法已省略
}
```
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
可用实现的一些示例:
Spring AI OpenAI 嵌入
Spring AI Azure OpenAI 嵌入
Spring AI Ollama 嵌入
Spring AI Transformers (ONNX) 嵌入
Spring AI PostgresML 嵌入
Spring AI Bedrock Cohere 嵌入
Spring AI Bedrock Titan 嵌入
Spring AI VertexAI 嵌入
Spring AI Mistral AI 嵌入
Spring AI Oracle Cloud Infrastructure GenAI 嵌入
评论区