Partilhar via


Geração aumentada de recuperação (RAG) na Pesquisa de IA do Azure

Retrieval Augmented Generation (RAG) é uma arquitetura que aumenta os recursos de um Large Language Model (LLM) como o ChatGPT, adicionando um sistema de recuperação de informações que fornece dados de aterramento. Adicionar um sistema de recuperação de informações oferece controle sobre os dados de aterramento usados por um LLM quando ele formula uma resposta. Para uma solução empresarial, a arquitetura RAG significa que você pode restringir a IA generativa ao seu conteúdo corporativo proveniente de documentos e imagens vetorizados e outros formatos de dados se tiver modelos de incorporação para esse conteúdo.

A decisão sobre qual sistema de recuperação de informações usar é crítica porque determina as entradas para o LLM. O sistema de recuperação de informações deve fornecer:

  • Estratégias de indexação que carregam e atualizam em escala, para todo o seu conteúdo, na frequência que você precisa.

  • Recursos de consulta e ajuste de relevância. O sistema deve retornar resultados relevantes , nos formatos curtos necessários para atender aos requisitos de comprimento de token das entradas LLM.

  • Segurança, alcance global e confiabilidade para dados e operações.

  • Integração com modelos de incorporação para indexação e modelos de chat ou modelos de compreensão de linguagem para recuperação.

O Azure AI Search é uma solução comprovada para recuperação de informações em uma arquitetura RAG. Ele fornece recursos de indexação e consulta, com a infraestrutura e a segurança da nuvem do Azure. Através de código e outros componentes, você pode projetar uma solução RAG abrangente que inclui todos os elementos para IA generativa sobre seu conteúdo proprietário.

Nota

Novo nos conceitos de copiloto e RAG? Assista à pesquisa vetorial e à recuperação de última geração para aplicativos de IA generativa.

A Microsoft tem várias implementações internas para usar o Azure AI Search em uma solução RAG.

As abordagens com curadoria simplificam os primeiros passos, mas para ter mais controle sobre a arquitetura, você precisa de uma solução personalizada. Esses modelos criam soluções de ponta a ponta em:

Se as ferramentas e os modelos não satisfizerem os requisitos do seu aplicativo, você poderá criar uma solução RAG personalizada usando as APIs do Azure AI Search. O restante deste artigo explora como o Azure AI Search se encaixa em uma solução RAG personalizada.

Um resumo de alto nível do padrão tem esta aparência:

  • Comece com uma pergunta ou solicitação do usuário (prompt).
  • Envie-o para o Azure AI Search para encontrar informações relevantes.
  • Retorne os resultados de pesquisa mais bem classificados para um LLM.
  • Use os recursos de compreensão e raciocínio de linguagem natural do LLM para gerar uma resposta ao prompt inicial.

O Azure AI Search fornece entradas para o prompt LLM, mas não treina o modelo. Na arquitetura RAG, não há treinamento extra. O LLM é pré-treinado usando dados públicos, mas gera respostas que são aumentadas por informações do retriever, neste caso, o Azure AI Search.

Os padrões RAG que incluem o Azure AI Search têm os elementos indicados na ilustração a seguir.

Diagrama de arquitetura de recuperação de informações com busca e ChatGPT.

  • App UX (aplicativo web) para a experiência do usuário
  • Servidor de aplicativos ou orquestrador (camada de integração e coordenação)
  • Azure AI Search (sistema de recuperação de informações)
  • Azure OpenAI (LLM para IA generativa)

O aplicativo Web fornece a experiência do usuário, fornecendo a apresentação, o contexto e a interação do usuário. Perguntas ou solicitações de um usuário começam aqui. As entradas passam pela camada de integração, indo primeiro para a recuperação de informações para obter os resultados da pesquisa, mas também vão para o LLM para definir o contexto e a intenção.

O servidor de aplicativos ou orquestrador é o código de integração que coordena as transferências entre a recuperação de informações e o LLM. As soluções comuns incluem LangChain para coordenar o fluxo de trabalho. O LangChain integra-se com o Azure AI Search, facilitando a inclusão do Azure AI Search como um retriever no seu fluxo de trabalho. LlamaIndex e Semantic Kernel são outras opções.

O sistema de recuperação de informações fornece o índice pesquisável, a lógica de consulta e a carga útil (resposta da consulta). O índice de pesquisa pode conter vetores ou conteúdo não vetorial. Embora a maioria das amostras e demonstrações incluam campos vetoriais, isso não é um requisito. A consulta é executada usando o mecanismo de pesquisa existente no Azure AI Search, que pode lidar com consultas de palavra-chave (ou termo) e vetor. O índice é criado antecipadamente, com base em um esquema definido por você e carregado com seu conteúdo proveniente de arquivos, bancos de dados ou armazenamento.

O LLM recebe o prompt original, além dos resultados da Pesquisa de IA do Azure. O LLM analisa os resultados e formula uma resposta. Se o LLM for ChatGPT, a interação do usuário pode ser uma conversa de ida e volta. Se você estiver usando o Davinci, o prompt pode ser uma resposta totalmente composta. Uma solução do Azure provavelmente usa o Azure OpenAI, mas não há nenhuma dependência rígida desse serviço específico.

O Azure AI Search não fornece integração LLM nativa para fluxos de prompt ou preservação de bate-papo, portanto, você precisa escrever código que lida com orquestração e estado. Você pode revisar a fonte de demonstração (Azure-Samples/azure-search-openai-demo) para obter um plano do que uma solução completa implica. Também recomendamos que o Azure AI Studio crie soluções do Azure AI Search baseadas em RAG que se integrem a LLMs.

No Azure AI Search, todo o conteúdo pesquisável é armazenado em um índice de pesquisa hospedado em seu serviço de pesquisa. Um índice de pesquisa é projetado para consultas rápidas com tempos de resposta de milissegundos, portanto, suas estruturas de dados internas existem para dar suporte a esse objetivo. Para esse fim, um índice de pesquisa armazena conteúdo indexado e não arquivos de conteúdo inteiros, como PDFs ou imagens inteiras. Internamente, as estruturas de dados incluem índices invertidos de texto tokenizado, índices vetoriais para incorporações e texto inalterado para casos em que a correspondência literal é necessária (por exemplo, em filtros, pesquisa difusa, consultas de expressão regular).

Ao configurar os dados para sua solução RAG, você usa os recursos que criam e carregam um índice no Azure AI Search. Um índice inclui campos que duplicam ou representam o conteúdo de origem. Um campo de índice pode ser uma transferência simples (um título ou descrição em um documento de origem torna-se um título ou descrição em um índice de pesquisa), ou um campo pode conter a saída de um processo externo, como vetorização ou processamento de habilidades que gera uma representação ou descrição de texto de uma imagem.

Como você provavelmente sabe que tipo de conteúdo deseja pesquisar, considere os recursos de indexação aplicáveis a cada tipo de conteúdo:

Tipo do conteúdo Indexado como Funcionalidades
texto tokens, texto inalterado Os indexadores podem extrair texto sem formatação de outros recursos do Azure, como o Armazenamento do Azure e o Cosmos DB. Você também pode enviar qualquer conteúdo JSON para um índice. Para modificar o texto em voo, use analisadores e normalizadores para adicionar processamento lexical durante a indexação. Os mapas de sinónimos são úteis se faltar aos documentos-fonte terminologia que possa ser utilizada numa consulta.
texto vetores 1 O texto pode ser fragmentado e vetorizado em um pipeline de indexador ou manipulado externamente e, em seguida , indexado como campos vetoriais em seu índice.
image tokens, texto inalterado 2 Habilidades para OCR e Análise de Imagem podem processar imagens para reconhecimento de texto ou características de imagem. As informações da imagem são convertidas em texto pesquisável e adicionadas ao índice. As competências têm um requisito de indexador.
image vetores 1 As imagens podem ser vetorizadas em um pipeline de indexador ou manipuladas externamente para uma representação matemática do conteúdo da imagem e, em seguida , indexadas como campos vetoriais no índice. Você pode usar o Azure AI Vision multimodal ou um modelo de código aberto como o OpenAI CLIP para vetorizar texto e imagens no mesmo espaço de incorporação.

1 O Azure AI Search fornece fragmentação e vetorização de dados integradas, mas você deve depender de indexadores e conjuntos de habilidades. Se você não puder usar um indexador, o Kernel Semântico da Microsoft ou outras ofertas da comunidade podem ajudá-lo com uma solução full stack. Para obter exemplos de código mostrando ambas as abordagens, consulte azure-search-vectors repo.

2 As habilidades são suporte integrado para IA aplicada. Para OCR e Análise de Imagem, o pipeline de indexação faz uma chamada interna para as APIs do Azure AI Vision. Essas habilidades passam uma imagem extraída para a IA do Azure para processamento e recebem a saída como texto indexado pela Pesquisa de IA do Azure. As habilidades também são usadas para fragmentação de dados integrada (habilidade de Divisão de Texto) e incorporação integrada (habilidades que chamam o Azure AI Vision multimodal, Azure OpenAI e modelos no catálogo de modelos do Azure AI Studio.)

Os vetores fornecem a melhor acomodação para conteúdo diferente (vários formatos de arquivo e idiomas) porque o conteúdo é expresso universalmente em representações matemáticas. Os vetores também suportam pesquisa de similaridade: correspondência nas coordenadas que são mais semelhantes à consulta vetorial. Em comparação com a pesquisa de palavras-chave (ou pesquisa de termos) que corresponde em termos tokenizados, a pesquisa de semelhança é mais matizada. É uma escolha melhor se houver ambiguidade ou requisitos de interpretação no conteúdo ou nas consultas.

Quando seus dados estiverem em um índice de pesquisa, você usará os recursos de consulta da Pesquisa do Azure AI para recuperar conteúdo.

Em um padrão não-RAG, as consultas fazem uma viagem de ida e volta de um cliente de pesquisa. A consulta é enviada, é executada em um mecanismo de pesquisa e a resposta retornada para o aplicativo cliente. A resposta, ou os resultados da pesquisa, consistem exclusivamente no conteúdo literal encontrado no seu índice.

Em um padrão RAG, as consultas e respostas são coordenadas entre o mecanismo de pesquisa e o LLM. A pergunta ou consulta de um usuário é encaminhada para o mecanismo de pesquisa e para o LLM como um prompt. Os resultados da pesquisa voltam do mecanismo de pesquisa e são redirecionados para um LLM. A resposta que retorna ao usuário é a IA generativa, seja uma soma ou resposta do LLM.

Não há nenhum tipo de consulta no Azure AI Search - nem mesmo pesquisa semântica ou vetorial - que componha novas respostas. Apenas o LLM fornece IA generativa. Aqui estão os recursos no Azure AI Search que são usados para formular consultas:

Funcionalidade de consulta Propósito Porquê utilizar
Sintaxe Lucene simples ou completa Execução de consultas sobre texto e conteúdo numérico não vetorial A pesquisa de texto completo é melhor para correspondências exatas, em vez de correspondências semelhantes. As consultas de pesquisa de texto completo são classificadas usando o algoritmo BM25 e suportam o ajuste de relevância por meio de perfis de pontuação. Também suporta filtros e facetas.
Filtros e facetas Aplica-se apenas a campos de texto ou numéricos (não vetoriais). Reduz a área da superfície de pesquisa com base nos critérios de inclusão ou exclusão. Adiciona precisão às suas consultas.
Classificador semântico Reclassifica um conjunto de resultados BM25 usando modelos semânticos. Produz legendas curtas e respostas que são úteis como entradas LLM. Mais fácil do que pontuar perfis e, dependendo do seu conteúdo, uma técnica mais confiável para ajuste de relevância.
Pesquisa vetorial Execução de consulta em campos vetoriais para pesquisa de similaridade, onde a cadeia de caracteres de consulta é um ou mais vetores. Os vetores podem representar todos os tipos de conteúdo, em qualquer idioma.
Pesquisa híbrida Combina qualquer uma ou todas as técnicas de consulta acima. As consultas vetoriais e não vetoriais são executadas em paralelo e retornadas em um conjunto de resultados unificado. Os ganhos mais significativos em precisão e recall são através de consultas híbridas.

Estruturar a resposta da consulta

A resposta de uma consulta fornece a entrada para o LLM, portanto, a qualidade dos resultados da pesquisa é fundamental para o sucesso. Os resultados são um conjunto de linhas tabulares. A composição ou estrutura dos resultados depende:

  • Campos que determinam quais partes do índice são incluídas na resposta.
  • Linhas que representam uma correspondência do índice.

Os campos aparecem nos resultados da pesquisa quando o atributo é "recuperável". Uma definição de campo no esquema de índice tem atributos, e esses determinam se um campo é usado em uma resposta. Somente os campos "recuperáveis" são retornados em texto completo ou resultados de consulta vetorial. Por padrão, todos os campos "recuperáveis" são retornados, mas você pode usar "selecionar" para especificar um subconjunto. Além de "recuperável", não há restrições no campo. Os campos podem ser de qualquer comprimento ou tipo. Em relação ao comprimento, não há limite máximo de comprimento de campo no Azure AI Search, mas há limites para o tamanho de uma solicitação de API.

As linhas são correspondências com a consulta, classificadas por relevância, semelhança ou ambas. Por padrão, os resultados são limitados às 50 principais correspondências para pesquisa de texto completo ou k-nearest-neighbor matches para pesquisa vetorial. Você pode alterar os padrões para aumentar ou diminuir o limite até o máximo de 1.000 documentos. Você também pode usar os parâmetros de paginação superior e ignorar para recuperar resultados como uma série de resultados paginados.

Maximizar a relevância e a recuperação

Quando você está trabalhando com processos complexos, uma grande quantidade de dados e expectativas de respostas de milissegundos, é fundamental que cada etapa acrescente valor e melhore a qualidade do resultado final. Do lado da recuperação de informações, o ajuste de relevância é uma atividade que melhora a qualidade dos resultados enviados ao LLM. Apenas os documentos correspondentes mais relevantes ou mais semelhantes devem ser incluídos nos resultados.

Aqui estão algumas dicas para maximizar a relevância e a recordação:

  • As consultas híbridas que combinam pesquisa por palavra-chave (não vetorial) e pesquisa vetorial oferecem o máximo de lembrança quando as entradas são as mesmas. Em uma consulta híbrida, se você dobrar a mesma entrada, uma cadeia de texto e seu equivalente vetorial geram consultas paralelas para palavras-chave e pesquisa de similaridade, retornando as correspondências mais relevantes de cada tipo de consulta em um conjunto de resultados unificado.

  • As consultas híbridas também podem ser expansivas. Você pode executar a pesquisa de semelhança sobre conteúdo detalhado em partes e a pesquisa de palavras-chave sobre nomes, tudo na mesma solicitação.

  • O ajuste de relevância é suportado através de:

Em comparação e testes de benchmark, consultas híbridas com campos de texto e vetoriais, complementadas com classificação semântica, produzem os resultados mais relevantes.

Código de exemplo para um fluxo de trabalho RAG

O código Python a seguir demonstra os componentes essenciais de um fluxo de trabalho RAG no Azure AI Search. Você precisa configurar os clientes, definir um prompt do sistema e fornecer uma consulta. O prompt diz ao LLM para usar apenas os resultados da consulta e como retornar os resultados. Para obter mais etapas com base neste exemplo, consulte este início rápido do RAG.

Para a nuvem do Azure Government, modifique o ponto de extremidade da API no provedor de token para "https://cognitiveservices.azure.us/.default".

# Set up the query for generating responses
from azure.identity import DefaultAzureCredential
from azure.identity import get_bearer_token_provider
from azure.search.documents import SearchClient
from openai import AzureOpenAI

credential = DefaultAzureCredential()
token_provider = get_bearer_token_provider(credential, "https://cognitiveservices.azure.com/.default")
openai_client = AzureOpenAI(
    api_version="2024-06-01",
    azure_endpoint=AZURE_OPENAI_ACCOUNT,
    azure_ad_token_provider=token_provider
)

search_client = SearchClient(
    endpoint=AZURE_SEARCH_SERVICE,
    index_name="hotels-sample-index",
    credential=credential
)

# This prompt provides instructions to the model. 
# The prompt includes the query and the source, which are specified further down in the code.
GROUNDED_PROMPT="""
You are a friendly assistant that recommends hotels based on activities and amenities.
Answer the query using only the sources provided below in a friendly and concise bulleted manner.
Answer ONLY with the facts listed in the list of sources below.
If there isn't enough information below, say you don't know.
Do not generate answers that don't use the sources below.
Query: {query}
Sources:\n{sources}
"""

# The query is sent to the search engine, but it's also passed in the prompt
query="Can you recommend a few hotels near the ocean with beach access and good views"

# Retrieve the selected fields from the search index related to the question
search_results = search_client.search(
    search_text=query,
    top=5,
    select="Description,HotelName,Tags"
)
sources_formatted = "\n".join([f'{document["HotelName"]}:{document["Description"]}:{document["Tags"]}' for document in search_results])

response = openai_client.chat.completions.create(
    messages=[
        {
            "role": "user",
            "content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
        }
    ],
    model="gpt-35"
)

print(response.choices[0].message.content)

Código de integração e LLMs

Uma solução RAG que inclui o Azure AI Search pode aproveitar os recursos internos de fragmentação e vetorização de dados, ou você pode criar o seu próprio usando plataformas como Semantic Kernel, LangChain ou LlamaIndex.

Os notebooks no repositório de demonstração são um ótimo ponto de partida porque mostram padrões para integração LLM. Grande parte do código em uma solução RAG consiste em chamadas para o LLM, então você precisa desenvolver uma compreensão de como essas APIs funcionam, o que está fora do escopo deste artigo.

Como começar

Nota

Alguns recursos do Azure AI Search destinam-se à interação humana e não são úteis em um padrão RAG. Especificamente, você pode pular recursos como preenchimento automático e sugestões. Outros recursos como facetas e orderby podem ser úteis, mas seriam incomuns em um cenário RAG.

Consulte também