使用 Spring AI 和 Azure OpenAI 開發 RAG 應用程式

已完成

在本單元中,您將瞭解如何使用 PostgreSQL 資料庫中延伸模組所提供的 pgvector 向量相似性搜尋,在 Spring Boot 應用程式中實作擷取增強式產生 (RAG)。 我們介紹相關的 RAG 概念,例如內嵌、內嵌模型和向量存放區。 在本單元結束時,您應該瞭解如何套用這些工具,以進階搜尋和擷取功能增強您的應用程式。

什麼是內嵌?

內嵌 是數據的密集向量表示法。 在更簡單的詞彙中,內嵌是一種將複雜數據,例如文字或影像轉換成一組數位-向量的方法,計算機可以輕鬆地處理。 在自然語言處理中,內嵌表示高維度空間中的單字、句子或檔為向量。 在這些向量中,每個單字或句子都會以數位清單表示。 這些數位不是隨機的,其設計目的是擷取單字之間的意義和關聯性。

這些向量會擷取語意關聯性,以啟用進階搜尋和分析。 例如,如果您在資料庫中搜尋 「queen」,系統也可以找到相關詞彙,例如 「king」 或 「royalty」,因為它們的向量彼此接近。 這項功能可讓內嵌成為搜尋引擎、建議系統和語言翻譯等工作的強大工具。

使用 Azure OpenAI 內嵌模型

內嵌模型是自然語言處理 (NLP) 和其他 AI 應用程式的基本工具。 它們會將複雜數據,例如文字轉換成密集向量表示法,以擷取數據的語意意義。 然後,這些向量可用於各種工作,包括搜尋、建議和叢集。

Azure OpenAI 提供功能強大的內嵌模型,可讓您輕鬆地整合到應用程式。 這些模型可以針對各種類型的數據產生內嵌,以啟用進階搜尋和擷取功能。 OpenAI 中最常用的文字內嵌模型之一是 text-embedding-ada-002 模型。 您可以針對各種應用程式使用此模型,包括搜尋、叢集和建議系統,因為它能夠瞭解及代表複雜的文字數據。 搭配 ChatGPT 模型使用時, text-embedding-ada-002 可增強聊天機器人瞭解內容、擷取相關信息的能力,並提供更精確且內容適當的回應。 藉由搭配 ChatGPT 使用 text-embedding-ada-002 ,您可以建立更智慧且回應性更高的應用程式,以提供更佳的用戶體驗。

在 Spring AI 中實作 VectorStore

VectorStore 是 Spring AI pgvector Store Spring Boot 入門版所提供的類別。 它可簡化向量儲存和搜尋功能整合到 Spring Boot 應用程式中。 它會使用PostgreSQL的 pgvector 擴充功能,有效率地儲存和查詢文件內嵌。

您可以使用下列相依性,將 VectorStore Spring Boot 入門相依性新增至專案:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-pgvector-store-spring-boot-starter</artifactId>
</dependency>

啟動時, pgvector Spring Boot 啟動程式會嘗試安裝必要的資料庫延伸模組,並在不存在時建立具有索引的必要 vector_store 數據表。

或者,您可以使用下列 SQL 語句手動執行這項工作:

CREATE EXTENSION IF NOT EXISTS vector;
CREATE EXTENSION IF NOT EXISTS hstore;
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";

CREATE TABLE IF NOT EXISTS vector_store (
    id uuid DEFAULT uuid_generate_v4() PRIMARY KEY,
    content text,
    metadata json,
    embedding vector(1536) // 1536 is the default embedding dimension
);

CREATE INDEX ON vector_store USING HNSW (embedding vector_cosine_ops);

VectorStore也需要 EmbeddingModel 實例來計算文件的嵌入。 若要使用 Azure OpenAI 內嵌模型,請將下列相依性新增至您的專案:

<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-azure-openai-spring-boot-starter</artifactId>
</dependency>

在應用程式啟動時,Spring Boot 會使用下列 Azure OpenAI 應用程式屬性自動設定 VectorStore

spring.ai.azure.openai.api-key=${AZURE_OPENAI_API_KEY}
spring.ai.azure.openai.endpoint=${AZURE_OPENAI_ENDPOINT}
spring.ai.azure.openai.chat.model=gpt-4o
spring.ai.azure.openai.embedding.model=text-embedding-ada-002

將檔新增至向量存放區

若要將檔新增至向量存放區,您需要產生內嵌專案,並將它們連同原始內容一起儲存。 下列程式代碼範例示範如何使用 Spring Boot 應用程式中的 VectorStore 類別來儲存和管理檔:

@Autowired
private VectorStore vectorStore;

List<Document> documents = List.of(
    new Document("A vector store is a specialized database designed to store and manage high-dimensional vectors. ", Map.of("prompt", "What is Vector Store")),
    new Document("PGVectorStore is a Spring Boot starter that simplifies the integration of vector storage and search capabilities into your Spring Boot applications.", Map.of("prompt","Why Use PGVectorStore?"))
);
vectorStore.add(documents);

下列清單提供此程式碼運作方式的詳細說明:

  • Spring 的 @Autowired 註釋會將 類別的 VectorStore 實例插入您的元件中。
  • 已建立Document物件的清單。 每個 Document 都包含內容和元數據,例如提示。
  • 檔案清單會新增至 vectorStoreVectorStore 使用所設定的 EmbeddingModel 生成內嵌,並將內容和內嵌儲存到資料庫中。

查詢文件

儲存文件之後,您可以執行相似度搜尋,以尋找語意上類似於指定查詢的檔。 下列程式代碼範例會使用 VectorStore 類別執行相似度搜尋:

List<Document> results = vectorStore.similaritySearch(
    SearchRequest.builder()
        .query("Spring")
        .topK(5)
        .build()
);

下列清單提供此範例的詳細說明:

  • 類別 similaritySearchVectorStore 方法可用來尋找類似指定查詢的檔。
  • 建造者模式會建立 SearchRequest 物件。
  • query 方法設定搜尋字串。
  • 方法 topK(5) 呼叫會指定搜尋會傳回前五個最類似的檔。

單元摘要

在本單元中,您已瞭解使用 Spring Boot 和 VectorStore Azure OpenAI Spring Boot Starter 來管理和查詢檔內嵌背後的概念。 您已探索內嵌的重要性、如何產生和儲存它們,以及如何執行相似度搜尋。