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:

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.
  • Envie os resultados de pesquisa mais bem classificados para o 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.

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. Uma opção é usar 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. O Kernel Semântico é outra opção.

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 o Azure AI Studio ou o Azure OpenAI Studio para criar 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 externamente e, em seguida, indexado como campos vetoriais no í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 externamente para uma representação matemática do conteúdo da imagem e, em seguida, indexadas como campos vetoriais no seu índice. Você pode usar um modelo de código aberto como o OpenAI CLIP para vetorizar texto e imagens no mesmo espaço de incorporação.

1 A funcionalidade geralmente disponível do suporte a vetores requer que você chame outras bibliotecas ou modelos para fragmentação e vetorização de dados. No entanto, a vetorização integrada (visualização) incorpora essas etapas. Para obter exemplos de código mostrando ambas as abordagens, consulte azure-search-vectors repo.

2 As habilidades são suporte integrado para enriquecimento de IA. 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.

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.
Classificação semântica 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.

Classificação por relevância

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.

A relevância aplica-se à pesquisa por palavra-chave (não vetorial) e às consultas híbridas (sobre os campos não vetoriais). Na Pesquisa de IA do Azure, não há ajuste de relevância para pesquisa de semelhança e consultas vetoriais. BM25 ranking é o algoritmo de classificação para pesquisa de texto completo.

O ajuste de relevância é suportado por meio de recursos que melhoram a classificação BM25. Estas abordagens incluem:

  • Perfis de pontuação que aumentam a pontuação da pesquisa se forem encontradas correspondências em um campo de pesquisa específico ou em outros critérios.
  • Classificação semântica que reclassifica um conjunto de resultados BM25, usando modelos semânticos do Bing para reordenar os resultados para um melhor ajuste semântico à consulta original.

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

Código de exemplo de uma consulta do Azure AI Search para cenários RAG

O código a seguir é copiado do arquivo retrievethenread.py de um site de demonstração. Ele produz content para o LLM a partir de resultados de pesquisa de consulta híbrida. Você pode escrever uma consulta mais simples, mas este exemplo inclui pesquisa vetorial e pesquisa por palavra-chave com reclassificação semântica e verificação ortográfica. Na demonstração, essa consulta é usada para obter o conteúdo inicial.

# Use semantic ranker if requested and if retrieval mode is text or hybrid (vectors + text)
if overrides.get("semantic_ranker") and has_text:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  query_type=QueryType.SEMANTIC,
                                  query_language="en-us",
                                  query_speller="lexicon",
                                  semantic_configuration_name="default",
                                  top=top,
                                  query_caption="extractive|highlight-false" if use_semantic_captions else None,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
else:
    r = await self.search_client.search(query_text,
                                  filter=filter,
                                  top=top,
                                  vector=query_vector,
                                  top_k=50 if query_vector else None,
                                  vector_fields="embedding" if query_vector else None)
if use_semantic_captions:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(" . ".join([c.text for c in doc['@search.captions']])) async for doc in r]
else:
    results = [doc[self.sourcepage_field] + ": " + nonewlines(doc[self.content_field]) async for doc in r]
content = "\n".join(results)

Código de integração e LLMs

Uma solução RAG que inclui o Azure AI Search requer outros componentes e código para criar uma solução completa. Enquanto as seções anteriores abordavam a recuperação de informações por meio do Azure AI Search e quais recursos são usados para criar e consultar conteúdo pesquisável, esta seção apresenta a integração e a interação do LLM.

Os blocos de anotações nos repositórios de demonstração são um ótimo ponto de partida porque mostram padrões para passar os resultados da pesquisa para um LLM. A maioria do código em uma solução RAG consiste em chamadas para o LLM, portanto, você precisa desenvolver uma compreensão de como essas APIs funcionam, o que está fora do escopo deste artigo.

O seguinte bloco de células no bloco de anotações chat-read-retrieve-read.ipynb mostra chamadas de pesquisa no contexto de uma sessão de chat:

# Execute this cell multiple times updating user_input to accumulate chat history
user_input = "Does my plan cover annual eye exams?"

# Exclude category, to simulate scenarios where there's a set of docs you can't see
exclude_category = None

if len(history) > 0:
    completion = openai.Completion.create(
        engine=AZURE_OPENAI_GPT_DEPLOYMENT,
        prompt=summary_prompt_template.format(summary="\n".join(history), question=user_input),
        temperature=0.7,
        max_tokens=32,
        stop=["\n"])
    search = completion.choices[0].text
else:
    search = user_input

# Alternatively simply use search_client.search(q, top=3) if not using semantic ranking
print("Searching:", search)
print("-------------------")
filter = "category ne '{}'".format(exclude_category.replace("'", "''")) if exclude_category else None
r = search_client.search(search, 
                         filter=filter,
                         query_type=QueryType.SEMANTIC, 
                         query_language="en-us", 
                         query_speller="lexicon", 
                         semantic_configuration_name="default", 
                         top=3)
results = [doc[KB_FIELDS_SOURCEPAGE] + ": " + doc[KB_FIELDS_CONTENT].replace("\n", "").replace("\r", "") for doc in r]
content = "\n".join(results)

prompt = prompt_prefix.format(sources=content) + prompt_history + user_input + turn_suffix

completion = openai.Completion.create(
    engine=AZURE_OPENAI_CHATGPT_DEPLOYMENT, 
    prompt=prompt, 
    temperature=0.7, 
    max_tokens=1024,
    stop=["<|im_end|>", "<|im_start|>"])

prompt_history += user_input + turn_suffix + completion.choices[0].text + "\n<|im_end|>" + turn_prefix
history.append("user: " + user_input)
history.append("assistant: " + completion.choices[0].text)

print("\n-------------------\n".join(history))
print("\n-------------------\nPrompt:\n" + prompt)

Como começar

  • Use o Azure AI Studio para criar um índice de pesquisa.

  • Use o Azure OpenAI Studio e "traga seus próprios dados" para experimentar prompts em um índice de pesquisa existente em um playground. Esta etapa ajuda você a decidir qual modelo usar e mostra como seu índice existente funciona em um cenário RAG.

  • O acelerador de solução "Conversar com seus dados", criado pela equipe do Azure AI Search, ajuda você a criar sua própria solução RAG personalizada.

  • Os modelos de aplicativo de chat corporativo implantam recursos, código e dados de aterramento de exemplo do Azure usando documentos de plano de integridade fictícios para Contoso e Northwind. Esta solução completa oferece um aplicativo de bate-papo operacional em apenas 15 minutos. O código para esses modelos é o azure-search-openai-demo apresentado em várias apresentações. Os links a seguir fornecem versões específicas do idioma:

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 o 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