Tutorial: Buscar en sus datos mediante un modelo de chat (RAG en Búsqueda de Azure AI)
La característica que define una solución RAG en Búsqueda de Azure AI es el envío de consultas a un modelo de lenguaje grande (LLM) y proporcionar una experiencia de búsqueda conversacional sobre el contenido indexado. Puede ser sorprendentemente fácil si implementa solo los conceptos básicos.
En este tutorial ha:
- Configurar clientes
- Escribir instrucciones para el LLM
- Proporcionar una consulta diseñada como entrada del LLM
- Revisar los resultados y explorar los pasos siguientes
Este tutorial se basa en los tutoriales anteriores. Asume que tiene un índice de búsqueda creado por la canalización de indexación.
Requisitos previos
Visual Studio Code con la extensión de Python y el paquete Jupyter. Para obtener más información, consulte Python en Visual Studio Code.
Búsqueda de Azure AI, en una región compartida con Azure OpenAI.
Azure OpenAI, con una implementación de gpt-4o. Para más información, consulte Elección de modelos para RAG en Búsqueda de Azure AI
Descarga del ejemplo
Utilizará el mismo cuaderno del tutorial anterior de canalización de indexación. Los scripts para consultar el LLM siguen los pasos de creación de la canalización. Si aún no tiene el cuaderno, descárguelo desde GitHub.
Configurar clientes para enviar consultas
El patrón RAG de Búsqueda de Azure AI es una serie sincronizada de conexiones a un índice de búsqueda para obtener los datos de base, seguida de una conexión a un LLM para formular una respuesta a la pregunta del usuario. Ambos clientes usan la misma cadena de consulta.
Va a configurar dos clientes, por lo que necesita puntos de conexión y permisos en ambos recursos. En este tutorial se supone que configura las asignaciones de roles para las conexiones autorizadas, pero debe proporcionar los puntos de conexión en el cuaderno de ejemplo:
# 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 ejemplo para solicitud y consulta
Este es el script de Python que crea una instancia de los clientes, define la solicitud y configura la consulta. Puede ejecutar este script en el cuaderno para generar una respuesta a partir de la implementación del modelo de chat.
Para la nube de Azure Government, modifique el punto de conexión de API en el proveedor de tokens a "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)
Revisión de los resultados
En esta respuesta, la respuesta se basa en cinco entradas (top=5
) que constan de fragmentos determinados por el motor de búsqueda para que sea el más relevante. Las instrucciones de la solicitud le indican al LLM que use solo la información en sources
o los resultados de búsqueda con formato.
Los resultados de la primera consulta "What's the NASA earth book about?"
deberían ser similares al ejemplo siguiente.
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
Se espera que los LLM devuelvan respuestas diferentes, incluso si la solicitud y las consultas no se modifican. El resultado que obtiene podría ser muy diferente al ejemplo. Para más información, consulte Aprender a usar la salida reproducible.
Nota:
Al hacer la prueba de este tutorial, vimos una variedad de respuestas, algunas más relevantes que otras. En algunas ocasiones, repetir la misma solicitud provocó un deterioro en la respuesta, lo más probable es que se deba a la confusión en el historial de chat, posiblemente porque el modelo registra las solicitudes repetidas como insatisfacción con la respuesta generada. La administración del historial de chat está fuera del alcance de este tutorial, pero incluirlo en el código de su aplicación debería mitigar o incluso eliminar este comportamiento.
Agregar un filtro
Recuerde que ha creado un campo locations
mediante IA aplicada, rellenado con lugares reconocidos por la habilidad de Reconocimiento de entidades. La definición de campo para ubicaciones incluye el atributo filterable
. Vamos a repetir la solicitud anterior, pero esta vez agregaremos un filtro que selecciona el término hielo en el campo ubicaciones.
Un filtro presenta criterios de inclusión o exclusión. El motor de búsqueda sigue realizando una búsqueda vectorial en "What's the NASA earth book about?"
, pero ahora excluye las coincidencias que no incluyen hielo. Para obtener más información sobre el filtrado en colecciones de cadenas y en consultas vectoriales, vea Aspectos básicos del filtro de texto, Descripción de los filtros de recopilación y Adición de filtros a una consulta vectorial.
Reemplace la definición de search_results por el ejemplo siguiente que incluye un 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"
Los resultados de la consulta filtrada ahora deberían ser similares a la siguiente respuesta. Observe el énfasis en la cubierta de hielo.
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.
Cambiar las entradas
Aumentar o disminuir el número de entradas al LLM puede tener un gran impacto en la respuesta. Intente volver a ejecutar la misma consulta después de establecer top=8
. Al aumentar las entradas, el modelo devuelve resultados diferentes cada vez, incluso si la consulta no cambia.
Este es un ejemplo de lo que devuelve el modelo después de aumentar las entradas a 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.
Dado que el modelo está enlazado a los datos de base, la respuesta se vuelve más expansiva a medida que aumenta el tamaño de la entrada. Puede usar el ajuste de relevancia para generar respuestas potencialmente más específicas.
Cambiar la solicitud
También puede cambiar la solicitud para controlar el formato de la salida, el tono y si desea que el modelo complemente la respuesta con sus propios datos de entrenamiento mediante el cambio de la solicitud.
Este es otro ejemplo de salida del LLM si se cambia el enfoque de la solicitud en la identificación de ubicaciones para el estudio científico.
# 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}
"""
El resultado de cambiar solo la solicitud, conservando todos los aspectos de la consulta anterior, podría ser como el siguiente ejemplo.
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)
Sugerencia
Si continúa con el tutorial, recuerde restaurar la solicitud a su valor anterior (You are an AI assistant that helps users learn from the information found in the source material
).
El cambio de parámetros y solicitudes afecta a la respuesta de LLM. A medida que explore por su cuenta, tenga en cuenta los siguientes consejos:
Aumentar el valor de
top
puede agotar la cuota disponible en el modelo. Si no hay ninguna cuota, se devuelve un mensaje de error o el modelo podría devolver "No lo sé".Aumentar el valor de
top
no mejora necesariamente el resultado. En las pruebas superiores, a veces observamos que las respuestas no son drásticamente mejores.Entonces, ¿qué podría ayudar? Normalmente, la respuesta es la optimización de la relevancia. Mejorar la relevancia de los resultados de Búsqueda de Azure AI suele ser el enfoque más eficaz para maximizar la utilidad del LLM.
En la siguiente serie de tutoriales, nos enfocaremos en maximizar la relevancia y optimizar el rendimiento de las consultas en términos de velocidad y concisión. Revisamos la definición de esquema y la lógica de consulta para implementar las características de relevancia, pero el resto de la canalización y los modelos permanecen intactos.