Desenvolver um aplicativo RAG com a IA do Spring e o Azure OpenAI

Concluído

Nesta unidade, você aprenderá a implementar RAG (geração aumentada de recuperação) em um aplicativo Spring Boot usando a pesquisa de similaridade de vetor fornecida pela pgvector extensão em um banco de dados PostgreSQL. Apresentamos conceitos relevantes do RAG, como inserções, modelos de inserção e repositórios de vetores. Ao final desta unidade, você deve entender como aplicar essas ferramentas para aprimorar seus aplicativos com recursos avançados de pesquisa e recuperação.

O que são inserções?

As inserções são representações de vetores densas de dados. Em termos mais simples, as inserções são uma maneira de converter dados complexos, como palavras ou imagens, em um conjunto de números - vetores - que um computador pode processar facilmente. No NLP (processamento de linguagem natural), as inserções representam palavras, frases ou documentos como vetores em um espaço de alta dimensão. Nesses vetores, cada palavra ou frase é representada como uma lista de números. Esses números não são aleatórios, são projetados para capturar o significado e as relações entre as palavras.

Esses vetores capturam relações semânticas, habilitando a pesquisa e a análise avançadas. Por exemplo, se você procurar "rainha" em um banco de dados, o sistema também poderá encontrar termos relacionados como "rei" ou "royalties" porque seus vetores estão próximos uns dos outros. Essa funcionalidade torna as inserções uma ferramenta poderosa para tarefas como mecanismos de pesquisa, sistemas de recomendação e tradução de idioma.

Usar modelos de inserção do Azure OpenAI

Os modelos de inserção são ferramentas essenciais no NLP (processamento de linguagem natural) e em outros aplicativos de IA. Eles convertem dados complexos, como texto, em representações vetoriais densas que capturam o significado semântico dos dados. Esses vetores podem ser usados para várias tarefas, incluindo pesquisa, recomendação e clustering.

O Azure OpenAI fornece modelos de inserção avançados que você pode integrar facilmente aos seus aplicativos. Esses modelos podem gerar inserções para vários tipos de dados, permitindo recursos avançados de pesquisa e recuperação. Um dos modelos de inserção de texto mais usados do OpenAI é o text-embedding-ada-002 modelo. Você pode usar esse modelo para vários aplicativos, incluindo sistemas de pesquisa, clustering e recomendação, devido à sua capacidade de entender e representar dados de texto complexos. Quando usado com modelos chatGPT, text-embedding-ada-002 aprimora a capacidade do chatbot de entender o contexto, recuperar informações relevantes e fornecer respostas mais precisas e contextualmente apropriadas. text-embedding-ada-002 Usando o ChatGPT, você pode criar aplicativos mais inteligentes e responsivos que oferecem melhores experiências do usuário.

Implementar o VectorStore na IA do Spring

VectorStore é uma classe fornecida pelo iniciador spring boot da Spring Boot da Spring AI pgvector Store. Ele simplifica a integração de recursos de armazenamento de vetor e pesquisa em seus aplicativos Spring Boot. Ele usa a extensão do pgvector PostgreSQL para armazenar e consultar inserções de documentos com eficiência.

Você pode adicionar a dependência inicial do VectorStore Spring Boot ao seu projeto usando a seguinte dependência:

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

Na inicialização, o iniciador do pgvector Spring Boot tenta instalar as extensões de banco de dados necessárias e criar a tabela necessária vector_store com um índice se ela ainda não existir.

Opcionalmente, você pode fazer essa tarefa manualmente usando as seguintes instruções 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);

O VectorStore também requer uma EmbeddingModel instância para calcular inserções para os documentos. Para usar o modelo de inserção do Azure OpenAI, adicione a seguinte dependência ao seu projeto:

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

Na inicialização do aplicativo, as configurações automáticas do Spring Boot usam as seguintes VectorStore propriedades do aplicativo Azure OpenAI:

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

Adicionar documentos ao repositório de vetores

Para adicionar documentos ao repositório de vetores, você precisa gerar inserções e armazená-los junto com o conteúdo original. O exemplo de código a seguir mostra como usar a VectorStore classe em um aplicativo Spring Boot para armazenar e gerenciar documentos:

@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);

A lista a seguir fornece uma explicação detalhada de como esse código funciona:

  • A anotação de @Autowired Spring injeta uma instância da VectorStore classe em seu componente.
  • Uma lista de Document objetos é criada. Cada Document um contém conteúdo e metadados – por exemplo, um prompt.
  • A lista de documentos é adicionada ao vectorStore. O VectorStore gera inserções usando o configurado EmbeddingModel e armazena o conteúdo e as inserções no banco de dados.

Consultar documentos

Depois que seus documentos são armazenados, você pode executar pesquisas de similaridade para encontrar documentos semanticamente semelhantes a uma determinada consulta. O exemplo de código a seguir executa uma pesquisa de similaridade usando a VectorStore classe:

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

A lista a seguir fornece uma explicação detalhada deste exemplo:

  • O similaritySearch método da VectorStore classe é usado para localizar documentos semelhantes a uma determinada consulta.
  • O padrão do construtor cria um SearchRequest objeto.
  • O query método define a cadeia de caracteres de pesquisa.
  • A topK(5) chamada de método especifica que a pesquisa retorna os cinco documentos mais semelhantes.

Resumo da unidade

Nesta unidade, você aprendeu os conceitos por trás do uso do Spring Boot's e do Spring Boot Starter do VectorStore Azure OpenAI para gerenciar e consultar inserções de documentos. Você explorou a importância das inserções, como gerá-las e armazená-las e como executar pesquisas de similaridade.