第八章 Spring AI API中文版 - Embeddings API

SpringAI的嵌入式客户端接口提供了一种简便方式,将文本转换为数值向量,支持多种模型集成。它强调可移植性和简单性,便于开发者在不同技术间切换,特别适合AI新手。API包含了请求和响应类,以及各种嵌入实现,如OpenAI、AzureOpenAI等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://docs.spring.io/spring-ai/reference/api/embeddings.html

嵌入式API

嵌入式客户端接口旨在与人工智能和机器学习中的嵌入式模型进行直接集成。
其主要功能是将文本转换为数值向量,通常称为嵌入。
这些嵌入对于语义分析和文本分类等各种任务至关重要。

嵌入式客户端接口的设计围绕两个主要目标:

  • 可移植性:此接口确保易于适应各种嵌入模型。
    它允许开发人员在不同的嵌入技术或模型之间切换,代码更改最小。
    这种设计与Spring的模块化和可互换性的哲学相一致。

  • 简单性:EmbeddedClient简化了将文本转换为嵌入的过程。
    通过提供像embed(String text)和embed(Document document)这样的直接方法,它消除了处理原始文本数据和嵌入算法的复杂性。
    这个设计选择使得开发人员更容易,特别是那些对AI新手,能够在他们的应用程序中使用嵌入,而不需要深入研究底层机制。

API概览

嵌入式API建立在通用的Spring AI模型API之上,这是Spring AI库的一部分。
因此,嵌入式客户端接口扩展了模型客户端接口,提供了与AI模型交互的标准方法集。嵌入请求和响应类扩展了模型请求和模型响应,分别用于封装嵌入式模型的输入和输出。

嵌入式API反过来被更高层次的组件用来实现特定嵌入模型的嵌入客户端,如OpenAI、Titan、Azure OpenAI、Ollie等。

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

嵌入式客户端

本节提供了嵌入式客户端接口和相关类的指南。

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();
	}

}

嵌入方法提供了多种将文本转换为嵌入的选项,适应单个字符串、结构化文档对象或文本批次。

提供了多个嵌入文本的快捷方法,包括嵌入(String text)方法,它接受单个字符串并返回相应的嵌入向量。
所有快捷方法都是围绕调用方法实现的,这是调用嵌入模型的主要方法。

通常,嵌入返回的是表示数值向量格式嵌入的双精度列表。

嵌入ForResponse方法提供了更全面的输出,可能包括有关嵌入的附加信息。

维度方法是一个方便的工具,供开发人员快速确定嵌入向量的大小,这对于理解嵌入空间和后续处理步骤很重要。

嵌入请求

嵌入请求是一个模型请求,它接受一系列文本对象和可选的嵌入请求选项。
下面的列表显示了嵌入请求类的截断版本,不包括构造函数和其他实用方法:

public class EmbeddingRequest implements ModelRequest<List<String>> {
	private final List<String> inputs;
	private final EmbeddingOptions options;
	// other methods omitted
}

嵌入响应

嵌入响应类的结构如下:

public class EmbeddingResponse implements ModelResponse<Embedding> {

	private List<Embedding> embeddings;
	private EmbeddingResponseMetadata metadata = new EmbeddingResponseMetadata();
	// other methods omitted
}

嵌入响应类保存AI模型的输出,每个嵌入实例包含单个文本输入的结果向量数据。

嵌入响应类还携带有关AI模型响应的嵌入响应元数据。

嵌入

嵌入代表单个嵌入向量。

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

可用实现

内部地,各种嵌入客户端实现使用不同的低级库和API来执行嵌入任务。以下是一些可用的嵌入客户端实现:

  • 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 PaLM2嵌入
  • Spring AI Mistral AI嵌入
<think>好的,用户遇到了Git合并时本地更改会被覆盖的问题,需要解决方案。根据之前的引用资料,解决方法主要有commit、stash和revert三种。首先,我得确认用户的具体情况,比如他们的本地更改是否已经完成,是否需要保留,或者是否可以丢弃。用户可能不太清楚这三种方法的适用场景,需要详细解释每个选项的步骤和优缺点。比如,commit适用于需要保留更改的情况,stash适合临时保存以便后续恢复,而revert则是直接撤销更改,适用于不需要保留的情况。需要结构清晰,分点说明,每个方法都给出操作步骤和适用场景,帮助用户理解哪种情况最适合他们。还要注意使用中文,避免技术术语过于复杂,让用户容易理解。同时,生成相关问题,可能涉及如何恢复stash的内容,或者如何避免频繁冲突等,扩展用户的知识点。另外,要确保LaTeX格式正确,但在这个问题中可能用不上数学公式,所以主要关注代码块和引用标识。检查引用是否正确,比如引用[^1]和[^2]的来源是否相关,用户提供的引用内容是否准确对应解决方案。 最后,确保回答真实可靠,操作步骤准确无误,避免误导用户。可能还需要提醒用户根据具体情况选择方法,比如如果有未完成的实验性代码,stash可能是更好的选择,而如果是确定要保留的修改,则应该commit。</think>要解决Git合并时本地更改被覆盖的问题,可根据不同场景选择以下三种方法: ### 一、提交本地更改(commit) **适用场景**:当本地更改已测试通过且需要保留到版本历史中。 **操作步骤**: 1. 将改动添加到暂存区: ```bash git add . # 添加所有文件 # 或指定文件 git add file1.txt file2.py ``` 2. 提交更改并添加描述: ```bash git commit -m "完成用户登录模块优化" ``` 3. 执行合并操作: ```bash git merge origin/main ``` **优点**:保留完整的开发记录,便于后续追溯[^1]。 ### 二、暂存更改(stash) **适用场景**:需要临时保存未完成的修改(如调试代码),优先处理合并操作。 **操作步骤**: 1. 保存当前工作状态: ```bash git stash # 可选添加备注 git stash save "用户登录模块调试代码" ``` 2. 查看暂存记录列表: ```bash git stash list ``` 3. 合并远程分支: ```bash git merge origin/main ``` 4. 恢复暂存内容: ```bash git stash pop # 恢复并删除最近一次暂存 # 或指定特定暂存 git stash apply stash@{1} ``` **优点**:保持工作目录整洁,特别适合处理紧急合并任务[^2]。 ### 三、撤销本地更改(revert) **适用场景**:本地修改可丢弃(如实验性代码或错误修改)。 **操作步骤**: 1. 撤销所有未提交的修改: ```bash git checkout -- . # 全部文件 # 或指定文件 git checkout -- file1.txt ``` 2. 执行合并操作: ```bash git merge origin/main ``` **风险提示**:此操作不可逆,需确认文件无需保留。 --- ### 对比决策表 | 方法 | 保留记录 | 可恢复性 | 适用阶段 | |---------|----------|----------|------------------| | commit | ✅ | ✅ | 功能开发完成时 | | stash | ❌ | ✅ | 开发中途临时切换 | | revert | ❌ | ❌ | 放弃无效修改 | ### 扩展应用场景 - 当存在多个暂存时,可用`git stash list`查看记录,通过`git stash apply stash@{n}`精准恢复 - 合并后出现冲突时,可使用`git mergetool`可视化工具解决冲突 - 长期分支开发推荐使用`git rebase`保持提交历史线性
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明爷们儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值