Spring AI 中的嵌入模型 API 指南
1.概述
將人工智慧整合到應用程式中通常涉及處理文字資料。該領域的一項關鍵技術是嵌入模型,它將文字資訊轉換為應用程式可以處理的嵌入。
在本教程中,我們將探索 Spring AI 中的嵌入模型 API。這個強大的 API 提供了一種抽象,讓我們能夠以最小的努力輕鬆採用不同的嵌入模型,並方便我們的應用程式理解文字。
2. 嵌入簡介
為了訓練人工智慧模型學習文字和圖像的語義,我們通常將這些資料類型轉換為稱為嵌入的高維向量表示。
AI 模型透過計算相似度來理解嵌入之間的關係。當兩個嵌入具有較高的相似度得分時,意味著它們所代表的文本的上下文含義相似。
3. 嵌入模型 API
Spring AI 提供了一組 API 來簡化我們使用嵌入模型的工作。這些 API 是隱藏了所有實作細節的介面。
3.1. EmbeddingModel
嵌入模型是一種經過訓練的機器學習模型,它將不同類型的物件(例如段落和圖像)轉換為高維度向量空間。
不同的提供者提供不同的模型,例如 BERT。 Spring AI 嵌入 API 提供了一個介面EmbeddingModel
,它封裝了採用嵌入模型的細節:
public interface EmbeddingModel extends Model<EmbeddingRequest, EmbeddingResponse> {
EmbeddingResponse call(EmbeddingRequest request);
// constructors & other methods
}
call()
方法只是接受包含資料來源的EmbeddingRequest
並將其傳送給模型提供者,傳回包含Embedding
的EmbeddingResponse
。
3.2. EmbeddingRequest
EmbeddingRequest
包含有效負載,其中包含要轉換為嵌入的文字清單。除了文字之外,我們還可以新增專門針對EmbeddingModel
的其他選項:
public class EmbeddingRequest implements ModelRequest<List<String>> {
private final List<String> inputs;
private final EmbeddingOptions options;
// constructors & other methods
}
3.3. EmbeddingResponse
EmbeddingResponse
封裝了來自嵌入模型提供者的回應。它包含Embedding
物件列表以及其他元數據,例如令牌使用情況:
public class EmbeddingResponse implements ModelResponse<Embedding> {
private final List<Embedding> embeddings;
private final EmbeddingResponseMetadata metadata;
// constructors & other methods
}
3.4. Embedding
Embedding
包含float
組中的向量表示。維數取決於我們選擇的嵌入模型,通常在幾百到幾千之間變化:
public class Embedding implements ModelResult<float[]> {
private final float[] embedding;
private final Integer index;
private final EmbeddingResultMetadata metadata;
// constructors & other methods
}
4. 與 OpenAI 集成
Spring AI 支援 OpenAI 作為嵌入模型整合之一。在本節中,我們將採用 OpenAI 並建立一個 Spring 服務,將文字轉換為嵌入。
4.1. Maven依賴
讓我們先將以下 Spring AI Open AI依賴項加入我們的 pom.xml 中:
<dependency>
<groupId>org.springframework.ai</groupId>
<artifactId>spring-ai-openai-spring-boot-starter</artifactId>
<version>1.0.0-M6</version>
</dependency>
4.2. 開啟AI配置
為了完成 OpenAI 與 Spring AI 的集成,我們需要將用於身份驗證的 API 金鑰放入 OpenAI API:
spring:
ai:
openai:
api-key: "<YOUR-API-KEY>"
4.3. EmbeddingModel
的自動配置
Spring AI 能夠自動配置EmbeddingModel
。讓我們透過在application.yml
中新增一個附加屬性來定義嵌入模型來啟用它:
spring:
ai:
openai:
embedding:
options:
model: "text-embedding-3-small"
此model
屬性配置了我們將要使用的嵌入模型。 OpenAI 目前提供三種不同的模式。
定義好這個嵌入模型後,我們只需將EmbeddingModel
注入 Spring Boot 服務即可,而無需指定任何 OpenAI 細節。一切都依賴 Spring AI 嵌入 API:
@Service
public class EmbeddingService {
private final EmbeddingModel embeddingModel;
public EmbeddingService(EmbeddingModel embeddingModel) {
this.embeddingModel = embeddingModel;
}
public EmbeddingResponse getEmbeddings(String... texts) {
EmbeddingRequest request = new EmbeddingRequest(Arrays.asList(texts), null);
return embeddingModel.call(request);
}
}
自動配置為我們提供了便利,而無需暴露實際的嵌入實作。這使我們能夠透過僅更新application.yml
輕鬆切換到不同的實作。
4.4. 手動配置EmbeddingModel
雖然自動配置很方便,但在某些情況下它不能為我們提供靈活性,例如當我們的應用程式需要使用多個嵌入模型或不同的嵌入模型提供者產生嵌入時。
在這種情況下,我們在配置類別中手動定義嵌入模型生產者:
@Configuration
public class EmbeddingConfig {
@Bean
public OpenAiApi openAiApi(@Value("${spring.ai.openai.api-key}") String apiKey) {
return OpenAiApi.builder()
.apiKey(apiKey)
.build();
}
@Bean
public OpenAiEmbeddingModel openAiEmbeddingModel(OpenAiApi openAiApi) {
OpenAiEmbeddingOptions options = OpenAiEmbeddingOptions.builder()
.model("text-embedding-3-small")
.build();
return new OpenAiEmbeddingModel(openAiApi, MetadataMode.EMBED, options);
}
}
在我們的範例中,我們首先使用注入的 API 金鑰openAiApiKey
建立了一個 OpenAI 客戶端OpenAiApi,
。然後,我們將使用該客戶端建立 OpenAI 嵌入模型。
我們稍微更新了服務以注入OpenAIEmbeddingModel
實作而不是EmbeddingModel
介面:
@Service
public class ManualEmbeddingService {
private final OpenAiEmbeddingModel openAiEmbeddingModel;
public ManualEmbeddingService(OpenAiEmbeddingModel openAiEmbeddingModel) {
this.openAiEmbeddingModel = openAiEmbeddingModel;
}
public EmbeddingResponse getEmbeddings(String... texts) {
EmbeddingRequest request = new EmbeddingRequest(Arrays.asList(texts), null);
return openAiEmbeddingModel.call(request);
}
}
5. 測試嵌入服務
基於上一節中的自動配置服務實現,我們公開了一個 REST 端點,允許我們測試嵌入服務:
@RestController
public class EmbeddingController {
private final EmbeddingService embeddingService;
public EmbeddingController(EmbeddingService embeddingService) {
this.embeddingService = embeddingService;
}
@PostMapping("/embeddings")
public ResponseEntity<EmbeddingResponse> getEmbeddings(@RequestBody String text) {
EmbeddingResponse response = embeddingService.getEmbeddings(text);
return ResponseEntity.ok(response);
}
}
讓我們透過 curl 向該端點發出包含正文的請求:
$ curl -X POST http://localhost:8080/embeddings -H "Content-Type: text/plain" -d "Hello world"
我們收到以下回應:
{
"metadata": {
"model": "text-embedding-3-small",
"usage": {
"promptTokens": 2,
"completionTokens": 0,
"totalTokens": 2,
"nativeUsage": {
"prompt_tokens": 48,
"total_tokens": 48
}
},
"empty": true
},
"result": {
"index": 0,
"metadata": {
"modalityType": "TEXT",
"documentId": "",
"mimeType": {
"type": "text",
"subtype": "plain",
"parameters": {},
"charset": null,
"concrete": true,
"wildcardSubtype": false,
"subtypeSuffix": null,
"wildcardType": false
},
"documentData": null
},
"output": [
-0.0020785425,
-0.049085874,
...
]
}
}
值得注意的是,這不是完整的回應,因為它很長。我們對其進行了精簡,以描述 JSON 中的兩個主要頂級節點: metadata
和result
。
metadata
提供有關嵌入轉換期間使用的模型和資源使用情況的資訊。 model
表示我們選擇的 OpenAI 模型, totalTokens
顯示轉換所消耗的令牌數量。
result
保存嵌入結果。 result
中的output
包含一個float
組,這是嵌入模型從我們提供的文字轉換而來的嵌入。
6. 結論
Spring AI 中的嵌入模型 API 提供了抽象層和對 OpenAI 等模型提供者的支持,使我們能夠將其合併到我們的 Java 應用程式中。
在本文中,我們採用了 OpenAI 的參考嵌入模型,該模型採用自動配置以簡化操作,並採用手動配置以增強靈活性。嵌入 API 提供了將文字轉換為嵌入向量的功能。
與往常一樣,完整的程式碼範例可在 GitHub 上找到。