【Spring AI】02. 嵌入向量 API

嵌入向量 API

EmbeddingClient 接口旨在与人工智能和机器学习中的嵌入向量模型进行直接集成。其主要功能是将文本转换为数字向量,通常称为嵌入向量。这些嵌入向量对于诸如语义分析和文本分类等各种任务至关重要。
EmbeddingClient 接口的设计围绕着两个主要目标展开:

  • 可移植性:该接口确保在各种嵌入向量模型之间轻松适应。它允许开发人员在不进行大量代码更改的情况下,轻松切换不同的嵌入向量技术或模型。这种设计符合 Spring 的模块化和可互换性理念。
  • 简单性:EmbeddingClient 简化了将文本转换为嵌入向量的过程。通过提供像embed(String text)和embed(Document document)这样直接的方法,消除了处理原始文本数据和嵌入算法的复杂性。这种设计使开发人员在他们的应用程序中更容易地利用嵌入向量,特别是那些对人工智能新手而言,因为无需深入了解底层机制。

API 概述


嵌入向量 API 建立在通用的 Spring AI Model API 之上,这是 Spring AI 库的一部分。因此,EmbeddingClient 接口扩展了 ModelClient 接口,该接口提供了一套标准方法,用于与 AI 模型进行交互。 EmbeddingRequest 和 EmbeddingResponse 类分别扩展自 ModelRequest 和 ModelResponse ,用于分别封装嵌入向量模型的输入和输出。
嵌入向量 API 反过来被更高级的组件使用,为特定的嵌入向量模型实现嵌入向量客户端,例如 OpenAI、Titan、Azure OpenAI、Ollie 等。
以下图示了嵌入向量 API 与 Spring AI 模型 API 和嵌入客户端之间的关系:
在这里插入图片描述

EmbeddingClient

本节提供了有关 EmbeddingClient 接口及相关类的指南。

public interface EmbeddingClient extends ModelClient<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 是一个接受 文本对象列表 和 可选嵌入请求选项 的类。以下显示了 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<List<Double>> {
	private List<Double> embedding;
	private Integer index;
	private EmbeddingResultMetadata metadata;
	// other methods omitted
}

可用实现

在内部,各种EmbeddingClient实现使用不同的基础库和 API 来执行嵌入任务。以下是一些可用的EmbeddingClient实现:

  • Spring AI Azure OpenAI Embeddings
  • Spring AI Ollama Embeddings
  • Spring AI Transformers (ONNX) Embeddings
  • Spring AI PostgresML Embeddings
  • Spring AI Bedrock Cohere Embeddings
  • Spring AI Bedrock Titan Embeddings
  • Spring AI VertexAI PaLM2 Embeddings
  • Spring AI Mistral AI Embeddings

相关推荐

  1. SpringAI如何集成Ollama开发AI应用

    2024-05-02 17:46:04       36 阅读
  2. 2024-05-03AI: 在深度学习中,什么叫文字嵌入

    2024-05-02 17:46:04       35 阅读
  3. 02嵌入式面经

    2024-05-02 17:46:04       29 阅读
  4. 向量数据库,展望AGI时代

    2024-05-02 17:46:04       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-02 17:46:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-02 17:46:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-05-02 17:46:04       82 阅读
  4. Python语言-面向对象

    2024-05-02 17:46:04       91 阅读

热门阅读

  1. golang:atomic.Pointer

    2024-05-02 17:46:04       34 阅读
  2. 中文输入法导致的高频事件

    2024-05-02 17:46:04       29 阅读
  3. CUDA内存管理

    2024-05-02 17:46:04       29 阅读
  4. 鸿蒙应用开发中用到的持久化方案

    2024-05-02 17:46:04       32 阅读
  5. 每天学习一个Linux命令之sed

    2024-05-02 17:46:04       33 阅读
  6. 跟我学C++中级篇——零长度数组

    2024-05-02 17:46:04       24 阅读
  7. python生成随机字符串

    2024-05-02 17:46:04       31 阅读
  8. C++11数量不定的参数模板

    2024-05-02 17:46:04       31 阅读
  9. 若依前后端分离版 集成 腾讯云 COS

    2024-05-02 17:46:04       27 阅读
  10. 数据库----第五天(选择题)

    2024-05-02 17:46:04       31 阅读