嵌入模型 API

EmbeddingModel 接口旨在简化 AI 和机器学习中嵌入模型的集成。其主要功能是将文本转换为数值向量,通常称为嵌入。这些嵌入对于语义分析和文本分类等各种任务至关重要。

EmbeddingModel 接口的设计围绕两个主要目标展开

  • 可移植性:此接口确保跨各种嵌入模型的轻松适应性。它允许开发人员在不同的嵌入技术或模型之间切换,而只需进行最少的代码更改。这种设计符合 Spring 的模块化和可互换性理念。

  • 简便性EmbeddingModel 简化了将文本转换为嵌入的过程。通过提供直观的 embed(String text)embed(Document document) 等方法,它消除了处理原始文本数据和嵌入算法的复杂性。这种设计选择使开发人员(尤其是那些刚接触 AI 的开发人员)更容易在他们的应用程序中使用嵌入,而无需深入了解底层机制。

API 概述

嵌入模型 API 建立在通用的 Spring AI 模型 API 之上,该 API 是 Spring AI 库的一部分。因此,EmbeddingModel 接口扩展了 Model 接口,该接口提供了一套标准方法来与 AI 模型进行交互。EmbeddingRequestEmbeddingResponse 类分别扩展自 ModelRequestModelResponse,用于封装嵌入模型的输入和输出。

嵌入 API 反过来被更高级别的组件用来实现针对特定嵌入模型的嵌入客户端,例如 OpenAI、Titan、Azure OpenAI、Ollie 等。

下图说明了嵌入 API 及其与 Spring AI 模型 API 和嵌入客户端的关系

embeddings 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.
	 */
	List<Double> embed(Document document);

	/**
	 * Embeds the given text into a vector.
	 * @param text the text to embed.
	 * @return the embedded vector.
	 */
	default List<Double> 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<List<Double>> 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 类还包含一个 EmbeddingResponseMetadata,其中包含有关 AI 模型响应的元数据。

Embedding

Embedding 代表单个嵌入向量。

public class Embedding implements ModelResult<List<Double>> {
	private List<Double> embedding;
	private Integer index;
	private EmbeddingResultMetadata metadata;
	// other methods omitted
}

可用实现