Tutorial: pesquisar seus dados usando um modelo de chat (RAG na Pesquisa de IA do Azure)
A característica definidora de uma solução RAG na Pesquisa de IA do Azure é enviar consultas para um LLM (Modelo de Linguagem Grande) para uma experiência de pesquisa de conversa em seu conteúdo indexado. Pode ser surpreendentemente fácil se você implementar apenas as noções básicas.
Neste tutorial, você:
- Configurar clientes
- Instruções de gravação para o LLM
- Fornecer uma consulta projetada para entradas de LLM
- Examinar os resultados e explorar as próximas etapas
Este tutorial se baseia no tutoriais anteriores. Ele pressupõe que você tenha um índice de pesquisa criado pelo pipeline de indexação.
Pré-requisitos
Visual Studio Code com a extensão do Python e o pacote do Jupyter. Para mais informações, Python no Visual Studio Code.
Pesquisa de IA do Azure, em uma região compartilhada com o OpenAI do Azure.
OpenAI do Azure, com uma implantação de gpt-4o. Para obter mais informações, consulte Escolher modelos para RAG na Pesquisa de IA do Azure
Baixar o exemplo
Você usa o mesmo notebook do tutorial anterior do pipeline de indexação. Os scripts para consultar o LLM seguem as etapas de criação do pipeline. Caso ainda não tenha o notebook, baixe-o do GitHub.
Configurar clientes para enviar consultas
O padrão RAG na Pesquisa de IA do Azur é uma série sincronizada de conexões com um índice de pesquisa para obter os dados de fundamentação, seguido por uma conexão com um LLM para formular uma resposta à pergunta do usuário. A mesma cadeia de caracteres de consulta é usada por ambos os clientes.
Você está configurando dois clientes, portanto, precisa de pontos de extremidade e permissões em ambos os recursos. Este tutorial pressupõe que você configurou atribuições de função para conexões autorizadas, mas deve fornecer os pontos de extremidade no notebook de exemplo:
# Set endpoints and API keys for Azure services
AZURE_SEARCH_SERVICE: str = "PUT YOUR SEARCH SERVICE ENDPOINT HERE"
# AZURE_SEARCH_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR SEARCH SERVICE ADMIN KEY HERE"
AZURE_OPENAI_ACCOUNT: str = "PUR YOUR AZURE OPENAI ENDPOINT HERE"
# AZURE_OPENAI_KEY: str = "DELETE IF USING ROLES, OTHERWISE PUT YOUR AZURE OPENAI KEY HERE"
Script de exemplo para solicitação e consulta
Aqui está o script do Python que cria uma instância dos clientes, define a solicitação e configura a consulta. Execute esse script no notebook para gerar uma resposta da implantação do modelo de chat.
Ao usar a nuvem Azure Government, modifique o ponto de extremidade da API no provedor de token para "https://cognitiveservices.azure.us/.default"
.
# Import libraries
from azure.search.documents import SearchClient
from openai import AzureOpenAI
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
)
deployment_name = "gpt-4o"
search_client = SearchClient(
endpoint=AZURE_SEARCH_SERVICE,
index_name=index_name,
credential=credential
)
# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps users learn from the information found in the source material.
Answer the query using only the sources provided below.
Use bullets if the answer has multiple points.
If the answer is longer than 3 sentences, provide a summary.
Answer ONLY with the facts listed in the list of sources below. Cite your source when you answer the question
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}
"""
# Provide the search query.
# It's hybrid: a keyword search on "query", with text-to-vector conversion for "vector_query".
# The vector query finds 50 nearest neighbor matches in the search index
query="What's the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
# Set up the search results and the chat thread.
# Retrieve the selected fields from the search index related to the question.
# Search results are limited to the top 5 matches. Limiting top can help you stay under LLM quotas.
search_results = search_client.search(
search_text=query,
vector_queries= [vector_query],
select=["title", "chunk", "locations"],
top=5,
)
# Newlines could be in the OCR'd content or in PDFs, as is the case for the sample PDFs used for this tutorial.
# Use a unique separator to make the sources distinct.
# We chose repeated equal signs (=) followed by a newline because it's unlikely the source documents contain this sequence.
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])
response = openai_client.chat.completions.create(
messages=[
{
"role": "user",
"content": GROUNDED_PROMPT.format(query=query, sources=sources_formatted)
}
],
model=deployment_name
)
print(response.choices[0].message.content)
Analisar resultados
Nesta resposta, a resposta é baseada em cinco entradas (top=5
) que consistem em partes determinadas pelo mecanismo de pesquisa como sendo a mais relevante. As instruções na solicitação dizem ao LLM para usar apenas as informações nos sources
ou resultados da pesquisa formatados.
Os resultados da primeira consulta "What's the NASA earth book about?"
devem ser semelhantes ao exemplo a seguir.
The NASA Earth book is about the intricate and captivating science of our planet, studied
through NASA's unique perspective and tools. It presents Earth as a dynamic and complex
system, observed through various cycles and processes such as the water cycle and ocean
circulation. The book combines stunning satellite images with detailed scientific insights,
portraying Earth’s beauty and the continuous interaction of land, wind, water, ice, and
air seen from above. It aims to inspire and demonstrate that the truth of our planet is
as compelling as any fiction.
Source: page-8.pdf
Espera-se que os LLMs retornem respostas diferentes, mesmo que a solicitação e as consultas não sejam alterados. Seu resultado pode parecer muito diferente do exemplo. Para obter mais informações, consulte Saiba como usar a saída reproduzível.
Observação
Ao testar este tutorial, vimos uma variedade de respostas, algumas mais relevantes do que outras. Algumas vezes, repetir a mesma solicitação causou uma deterioração na resposta, provavelmente devido à confusão no histórico de chat, possivelmente com o modelo registrando as solicitações repetidas como insatisfação com a resposta gerada. O gerenciamento do histórico de chat está fora do escopo deste tutorial, mas incluí-lo no código do aplicativo deve atenuar ou até mesmo eliminar esse comportamento.
Adicionar um filtro
Lembre-se de que você criou um campo locations
usando a IA aplicada, preenchido com locais reconhecidos pela habilidade de Reconhecimento de Entidade. A definição de campo para locais inclui o atributo filterable
. Vamos repetir a solicitação anterior, mas desta vez adicionando um filtro que seleciona no termo gelo no campo locais.
Um filtro introduz critérios de inclusão ou exclusão. O mecanismo de busca ainda está fazendo uma busca vetorial em "What's the NASA earth book about?"
, mas agora está excluindo correspondências que não incluem ice. Para obter mais informações sobre filtragem em coleções de cadeias de caracteres e em consultas de vetor, confira Noções básicas do filtro de texto,Noções básicas de filtros de coleção e Adicionar filtros a uma consulta de vetor.
Substitua a definição de search_results pelo exemplo a seguir que inclui um filtro:
query="what is the NASA earth book about?"
vector_query = VectorizableTextQuery(text=query, k_nearest_neighbors=50, fields="text_vector")
# Add a filter that selects documents based on whether locations includes the term "ice".
search_results = search_client.search(
search_text=query,
vector_queries= [vector_query],
filter="search.ismatch('ice*', 'locations', 'full', 'any')",
select=["title", "chunk", "locations"],
top=5,
)
sources_formatted = "=================\n".join([f'TITLE: {document["title"]}, CONTENT: {document["chunk"]}, LOCATIONS: {document["locations"]}' for document in search_results])
search_results = search_client.search(
search_text=query,
top=10,
filter="search.ismatch('ice*', 'locations', 'full', 'any')",
select="title, chunk, locations"
Os resultados da consulta filtrada agora devem ser semelhantes à resposta a seguir. Observe a ênfase na cobertura de gelo.
The NASA Earth book showcases various geographic and environmental features of Earth through
satellite imagery, highlighting remarkable landscapes and natural phenomena.
- It features extraordinary views like the Holuhraun Lava Field in Iceland, captured by
Landsat 8 during an eruption in 2014, with false-color images illustrating different elements
such as ice, steam, sulfur dioxide, and fresh lava ([source](page-43.pdf)).
- Other examples include the North Patagonian Icefield in South America, depicted through
clear satellite images showing glaciers and their changes over time ([source](page-147.pdf)).
- It documents melt ponds in the Arctic, exploring their effects on ice melting and
- heat absorption ([source](page-153.pdf)).
Overall, the book uses satellite imagery to give insights into Earth's dynamic systems
and natural changes.
Alterar as entradas
Aumentar ou diminuir o número de entradas para o LLM pode ter um grande efeito na resposta. Tente executar a mesma consulta novamente após a configuração top=8
. Ao aumentar as entradas, o modelo retorna resultados diferentes a cada vez, mesmo que a consulta não seja alterada.
Aqui está um exemplo do que o modelo retorna depois de aumentar as entradas para 8.
The NASA Earth book features a range of satellite images capturing various natural phenomena
across the globe. These include:
- The Holuhraun Lava Field in Iceland documented by Landsat 8 during a 2014 volcanic
eruption (Source: page-43.pdf).
- The North Patagonian Icefield in South America, highlighting glacial landscapes
captured in a rare cloud-free view in 2017 (Source: page-147.pdf).
- The impact of melt ponds on ice sheets and sea ice in the Arctic, with images from
an airborne research campaign in Alaska during July 2014 (Source: page-153.pdf).
- Sea ice formations at Shikotan, Japan, and other notable geographic features in various
locations recorded by different Landsat missions (Source: page-168.pdf).
Summary: The book showcases satellite images of diverse Earth phenomena, such as volcanic
eruptions, icefields, and sea ice, to provide insights into natural processes and landscapes.
Como o modelo está associado aos dados de fundamentação, a resposta se torna mais expansiva à medida que você aumenta o tamanho da entrada. Use o ajuste de relevância para potencialmente gerar respostas mais focadas.
Alterar a solicitação
Também é possível alterar a solicitação para controlar o formato da saída, tom e se deseja que o modelo complemente a resposta com seus próprios dados de treinamento alterando a solicitação.
Aqui está outro exemplo de saída de LLM se mudamos o foco do prompt sobre como identificar locais para estudos científicos.
# Provide instructions to the model
GROUNDED_PROMPT="""
You are an AI assistant that helps scientists identify locations for future study.
Answer the query cocisely, using bulleted points.
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.
Do not exceed 5 bullets.
Query: {query}
Sources:\n{sources}
"""
A saída de alterar apenas o prompt, retendo todos os outros aspectos da consulta anterior, pode ser semelhante a este exemplo.
The NASA Earth book appears to showcase various locations on Earth captured through satellite imagery,
highlighting natural phenomena and geographic features. For instance, the book includes:
- The Holuhraun Lava Field in Iceland, detailing volcanic activity and its observation via Landsat 8.
- The North Patagonian Icefield in South America, covering its glaciers and changes over time as seen by Landsat 8.
- Melt ponds in the Arctic and their impacts on the heat balance and ice melting.
- Iceberg A-56 in the South Atlantic Ocean and its interaction with cloud formations.
(Source: page-43.pdf, page-147.pdf, page-153.pdf, page-39.pdf)
Dica
Se você continuar com o tutorial, lembre-se de restaurar o prompt para o valor anterior dele (You are an AI assistant that helps users learn from the information found in the source material
).
A alteração de parâmetros e prompts afeta a resposta da LLM. Ao explorar por conta própria, tenha em mente as seguintes dicas:
Aumentar o valor
top
pode esgotar a cota disponível no modelo. Se não houver cota, uma mensagem de erro será retornada ou o modelo poderá retornar "Eu não sei".Aumentar o valor
top
não necessariamente melhora o resultado. Em testes com top, às vezes notamos que as respostas não são dramaticamente melhores.Então, o que pode ajudar? Normalmente, a resposta é ajuste de relevância. Melhorar a relevância dos resultados da pesquisa da Pesquisa de IA do Azure geralmente é a abordagem mais eficaz para maximizar o utilitário do LLM.
Na próxima série de tutoriais, o foco muda para maximizar a relevância e otimizar o desempenho da consulta para velocidade e concisão. Revisitamos a definição de esquema e a lógica de consulta para implementar recursos de relevância, mas o restante do pipeline e dos modelos permanecem intactos.