Una vez que haya generado las inserciones para los fragmentos, el siguiente paso es generar el índice en la base de datos de vectores y experimentar para determinar las búsquedas óptimas que se deben realizar. Al experimentar con la recuperación de información, hay varias áreas que se deben tener en cuenta, incluidas las opciones de configuración para el índice de búsqueda, los tipos de búsquedas que debe realizar y la estrategia de reclasificación. En este artículo se tratan estos tres temas.
Este artículo forma parte de una serie. Lea la introducción.
Índice de búsqueda
Nota:
Búsqueda de Azure AI es un servicio de búsqueda de Azure de primera entidad. En esta sección se mencionarán algunos detalles de la búsqueda de IA. Si usa un almacén diferente, consulte la documentación para buscar la configuración de clave de ese servicio.
El índice de búsqueda del almacén tiene una columna para cada campo de los datos. Por lo general, los almacenes de búsqueda tienen compatibilidad con tipos de datos no vectoriales, como cadenas, booleanos, enteros, sencillos, dobles, de fecha y hora, y colecciones como Colección (única) y tipos de datos vectoriales, como Colección (única). Para cada columna, debe configurar información como el tipo de datos, si el campo se puede filtrar, recuperar o buscar.
A continuación se muestran algunas decisiones clave que debe tomar para la configuración del vector de búsqueda que se aplican a los campos vectoriales:
- Algoritmo de vector de búsqueda: algoritmo que se usa para buscar coincidencias relativas. Búsqueda de Azure AI tiene una opción de algoritmo de fuerza bruta que examina todo el espacio vectorial denominado KNN exhaustivo y una opción de algoritmo más eficaz que realiza una búsqueda aproximada de vecinos más cercanos (ANN) denominada Hierarchical Navigable Small World (HNSW).
- métrica: esta configuración es la métrica de similitud que usa el algoritmo para calcular la proximidad. Las opciones de Búsqueda de Azure AI son coseno, dotProduct y euclidiano. Si usa modelos de inserción de Azure OpenAI, elija
cosine
. - efConstruction: parámetro usado durante la construcción de índices de Hierarchical Navigable Small Worlds (HNSW) que establece el número de vecinos más cercanos que están conectados a un vector durante la indexación. Un valor de efConstruction mayor da como resultado un índice de mejor calidad que un número menor. El inconveniente es que un valor mayor requiere más tiempo, almacenamiento y proceso. efConstruction debe ser mayor para un gran número de fragmentos y menor para un número bajo de fragmentos. Determinar el valor óptimo requiere experimentar con los datos y las consultas esperadas.
- efSearch: parámetro que se usa en el momento de la consulta para establecer el número de vecinos más cercanos (es decir, fragmentos similares) usados durante la búsqueda.
- m: recuento de vínculos bidireccionales. El intervalo es de 4 a 10, donde los números inferiores devuelven menos ruido en los resultados.
En Búsqueda de Azure AI, las configuraciones de vectores se encapsulan en una configuración vectorSearch
. Al configurar las columnas vectoriales, se hace referencia a la configuración adecuada para esa columna vectorial y se establece el número de dimensiones. El atributo de dimensiones de la columna vectorial representa el número de dimensiones generadas por el modelo de inserción que eligió. Por ejemplo, el modelo text-embedding-3-small
optimizado para el almacenamiento genera 1536 dimensiones.
Búsquedas
Al ejecutar consultas desde el orquestador de mensajes en el almacén de búsqueda, tiene muchas opciones que tener en cuenta. Debe determinar:
- Qué tipo de búsqueda va a realizar: vectorial, por palabra clave o híbrida
- Si va a consultar una o varias columnas
- Si va a ejecutar manualmente varias consultas, como una consulta por palabras clave y un vector de búsqueda
- Si la consulta debe dividirse en subconsultas
- Si se debe usar el filtrado en las consultas
El orquestador de mensajes puede adoptar un enfoque estático o un enfoque dinámico que combine los enfoques en función de las pistas de contexto del mensaje. En las secciones siguientes se abordan estas opciones para ayudarle a experimentar a fin de encontrar el enfoque adecuado para la carga de trabajo.
Tipos de búsqueda
Las plataformas de búsqueda generalmente admiten búsquedas de texto completo y vector de búsqueda. Algunas plataformas, como Búsqueda de Azure AI, admiten búsquedas híbridas. Para ver las funcionalidades de varias ofertas de vector de búsqueda, consulte Elección de un servicio de Azure para el vector de búsqueda.
Búsqueda de vectores
Los vectores de búsqueda se basan en la similitud entre la consulta vectorizada (mensaje) y los campos vectoriales.
Importante
Debe realizar las mismas operaciones de limpieza que realizó en fragmentos antes de insertar las consultas. Por ejemplo, si escribe en minúsculas todas las palabras del fragmento incrustado, deberá escribir en minúsculas todas las palabras de la consulta antes de incrustarlas.
Nota:
Puede realizar un vector de búsqueda en varios campos vectoriales en la misma consulta. En Búsqueda de Azure AI, técnicamente es una búsqueda híbrida. Para obtener más información, consulte esa sección.
embedding = embedding_model.generate_embedding(
chunk=str(pre_process.preprocess(query))
)
vector = RawVectorQuery(
k=retrieve_num_of_documents,
fields="contentVector",
vector=embedding,
)
results = client.search(
search_text=None,
vector_queries=[vector],
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
El código de ejemplo realiza un vector de búsqueda en el campo contentVector
. Tenga en cuenta que el código que inserta la consulta preprocesa primero la consulta. Ese preproceso debe ser el mismo código que preprocesa los fragmentos antes de la inserción. El modelo de inserción debe ser el mismo modelo de inserción que insertó los fragmentos.
Búsqueda de texto completo
Las búsquedas de texto completo se basan en el texto sin formato almacenado en un índice. Es una práctica habitual extraer palabras clave de una consulta y usar esas palabras clave extraídas en una búsqueda de texto completo en una o varias columnas indexadas. Las búsquedas de texto completo se pueden configurar para devolver coincidencias en las que los términos o todos los términos coincidan.
Debe experimentar para determinar qué campos son eficaces para ejecutar búsquedas de texto completo. Como se mencionó en la fase de enriquecimiento, los campos de palabras clave y metadatos de entidad son buenos candidatos para plantearse la búsqueda de texto completo en escenarios en los que el contenido tiene un significado semántico similar, pero las entidades o palabras clave difieren. Otros campos comunes que se deben tener en cuenta para la búsqueda de texto completo son el título, el resumen y el texto del fragmento.
formatted_search_results = []
results = client.search(
search_text=query,
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
formatted_search_results = format_results(results)
El código de ejemplo realiza una búsqueda de texto completo en los campos de título, contenido y resumen.
Búsqueda híbrida
Búsqueda de Azure AI admite consultas híbridas en las que la consulta puede contener una o varias búsquedas de texto y uno o varios vectores de búsqueda. La plataforma realiza cada consulta, obtiene los resultados intermedios, vuelve a clasificar los resultados mediante la fusión de clasificación recíproca (RRF) y devuelve los N resultados principales.
embedding = embedding_model.generate_embedding(
chunk=str(pre_process.preprocess(query))
)
vector1 = RawVectorQuery(
k=retrieve_num_of_documents,
fields="contentVector",
vector=embedding,
)
vector2 = RawVectorQuery(
k=retrieve_num_of_documents,
fields="questionVector",
vector=embedding,
)
results = client.search(
search_text=query,
vector_queries=[vector1, vector2],
top=retrieve_num_of_documents,
select=["title", "content", "summary"],
)
El código de ejemplo realiza una búsqueda de texto completo en los campos de título, contenido y resumen, y vectores de búsqueda en los campos contentVector y questionVector. La plataforma Búsqueda de Azure AI ejecuta todas las consultas en paralelo, vuelve a clasificar los resultados y devuelve los retrieve_num_of_documents documentos principales.
Múltiple manual
Por supuesto, puede ejecutar varias consultas, como un vector de búsqueda y una búsqueda de texto completo por palabras clave, manualmente. Los resultados se agregan, se vuelven a clasificar manualmente y se devuelven los resultados principales. Los siguientes son casos de uso para la ejecución múltiple manual:
- Utiliza una plataforma de búsqueda que no admite búsquedas híbridas. Seguiría esta opción para realizar su propia búsqueda híbrida.
- Quiere ejecutar búsquedas de texto completo en distintas consultas. Por ejemplo, puede extraer palabras clave de la consulta y ejecutar una búsqueda de texto completo en el campo de metadatos de palabras clave. A continuación, puede extraer entidades y ejecutar una consulta en el campo de metadatos de entidades.
- Quiere controlar el proceso de reclasificación usted mismo.
- La consulta requiere que se ejecuten varias subconsultas para recuperar datos de base de varios orígenes.
Varias subconsultas
Algunos mensajes son complejos y requieren más de una colección de datos para establecer las bases del modelo. Por ejemplo, la consulta "¿Cómo funcionan los coches eléctricos y cómo se comparan con los vehículos ICE?" probablemente requieran datos de base de varios orígenes.
Se recomienda determinar si la consulta requiere varias búsquedas antes de ejecutar las búsquedas. Si considera que se requieren varias subconsultas, puede ejecutar varias consultas manuales para todas las consultas. Use un modelo de lenguaje de gran tamaño para determinar si se requieren varias subconsultas. El siguiente mensaje se toma del repositorio de GitHub de acelerador de experimento de RAG que se usa para clasificar una consulta como simple o compleja, donde las complejas requieren varias consultas:
Consider the given question to analyze and determine if it falls into one of these categories:
1. Simple, factual question
a. The question is asking for a straightforward fact or piece of information
b. The answer could likely be found stated directly in a single passage of a relevant document
c. Breaking the question down further is unlikely to be beneficial
Examples: "What year did World War 2 end?", "What is the capital of France?, "What is the features of productX?"
2. Complex, multi-part question
a. The question has multiple distinct components or is asking for information about several related topics
b. Different parts of the question would likely need to be answered by separate passages or documents
c. Breaking the question down into sub-questions for each component would allow for better results
d. The question is open-ended and likely to have a complex or nuanced answer
e. Answering it may require synthesizing information from multiple sources
f. The question may not have a single definitive answer and could warrant analysis from multiple angles
Examples: "What were the key causes, major battles, and outcomes of the American Revolutionary War?", "How do electric cars work and how do they compare to gas-powered vehicles?"
Based on this rubric, does the given question fall under category 1 (simple) or category 2 (complex)? The output should be in strict JSON format. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. There should not be any comma after last element in the JSON.
Example output:
{
"category": "simple"
}
También se puede usar un modelo de lenguaje de gran tamaño para extraer subconsultas de una consulta compleja. El siguiente mensaje se toma del repositorio de GitHub de acelerador de experimento de RAG, que convierte una consulta compleja en varias subconsultas.
Your task is to take a question as input and generate maximum 3 sub-questions that cover all aspects of the original question. The output should be in strict JSON format, with the sub-questions contained in an array.
Here are the requirements:
1. Analyze the original question and identify the key aspects or components.
2. Generate sub-questions that address each aspect of the original question.
3. Ensure that the sub-questions collectively cover the entire scope of the original question.
4. Format the output as a JSON object with a single key "questions" that contains an array of the generated sub-questions.
5. Each sub-question should be a string within the "questions" array.
6. The JSON output should be valid and strictly formatted.
7. Ensure that the generated JSON is 100 percent structurally correct, with proper nesting, comma placement, and quotation marks. The JSON should be formatted with proper indentation for readability.
8. There should not be any comma after last element in the array.
Example input question:
What are the main causes of deforestation, and how can it be mitigated?
Example output:
{
"questions": [
"What are the primary human activities that contribute to deforestation?",
"How does agriculture play a role in deforestation?",
"What is the impact of logging and timber harvesting on deforestation?",
"How do urbanization and infrastructure development contribute to deforestation?",
"What are the environmental consequences of deforestation?",
"What are some effective strategies for reducing deforestation?",
"How can reforestation and afforestation help mitigate the effects of deforestation?",
"What role can governments and policies play in preventing deforestation?",
"How can individuals and communities contribute to reducing deforestation?"
]
}
Paso de imágenes a consultas
Algunos modelos multimodales, como GPT-4V y GPT-4o, pueden interpretar imágenes. Si usa estos modelos, puede elegir si desea evitar fragmentar las imágenes y pasar la imagen como parte del símbolo del sistema al modelo multimodal. Debe experimentar para determinar cómo se realiza este enfoque en comparación con la fragmentación de las imágenes con y sin pasar contexto adicional. También debe comparar la diferencia de coste entre los distintos enfoques y hacer un análisis de costes y beneficios.
Filtros
Los campos del almacén de búsqueda configurados como filtrables se pueden usar para filtrar las consultas. Plantéese filtrar por palabras clave y entidades para las consultas que usan esos campos para ayudar a reducir el resultado. El filtrado permite recuperar solo los datos que satisfacen determinadas condiciones de un índice, ya que se eliminan datos irrelevantes. Esto mejora el rendimiento general de la consulta con resultados más relevantes. Al igual que con cada decisión, es importante experimentar y probar. Es posible que las consultas no tengan palabras clave o palabras clave incorrectas, abreviaturas o acrónimos. Debe tener en cuenta estos casos.
Reclasificación
La reclasificación permite ejecutar una o varias consultas, agregar los resultados y clasificar esos resultados. Plantéese las siguientes razones para reclasificar los resultados de la búsqueda:
- Ha realizado varias búsquedas manuales y desea agregar los resultados y clasificarlos.
- Las búsquedas de palabras clave y los vectores de búsqueda no siempre son precisos. Puede aumentar el recuento de documentos que devuelve la búsqueda, lo que podría incluir algunos resultados válidos que, de lo contrario, se omitirían, y usar la reclasificación para evaluar los resultados.
Puede usar un modelo de lenguaje de gran tamaño o un codificador cruzado para realizar la reclasificación. Algunas plataformas, como Búsqueda de Azure AI, tienen métodos propietarios propios reclasificar los resultados. Puede evaluar estas opciones para los datos para determinar qué funciona mejor para su escenario. En las secciones siguientes se proporcionan detalles sobre estos métodos.
Reclasificación de modelos de lenguaje de gran tamaño
A continuación se muestra un mensaje de modelo de lenguaje de gran tamaño de ejemplo del acelerador de experimento de RAG que reclasifica los resultados.
A list of documents is shown below. Each document has a number next to it along with a summary of the document. A question is also provided.
Respond with the numbers of the documents you should consult to answer the question, in order of relevance, as well as the relevance score as json string based on json format as shown in the schema section. The relevance score is a number from 1–10 based on how relevant you think the document is to the question. The relevance score can be repetitive. Don't output any additional text or explanation or metadata apart from json string. Just output the json string and strip rest every other text. Strictly remove any last comma from the nested json elements if it's present.
Don't include any documents that are not relevant to the question. There should exactly be one documents element.
Example format:
Document 1:
content of document 1
Document 2:
content of document 2
Document 3:
content of document 3
Document 4:
content of document 4
Document 5:
content of document 5
Document 6:
content of document 6
Question: user defined question
schema:
{
"documents": {
"document_1": "Relevance",
"document_2": "Relevance"
}
}
Reclasificación entre codificadores
En el ejemplo siguiente del repositorio de GitHub de acelerador de experimento de RAG se usa CrossEncoder que proporciona Hugging Face para cargar el modelo Roberta. A continuación, recorre en iteración cada fragmento y usa el modelo para calcular la similitud, lo que les proporciona un valor. Ordenamos los resultados y se devuelve el N superior.
from sentence_transformers import CrossEncoder
...
model_name = 'cross-encoder/stsb-roberta-base'
model = CrossEncoder(model_name)
cross_scores_ques = model.predict(
[[user_prompt, item] for item in documents],
apply_softmax=True,
convert_to_numpy=True,
)
top_indices_ques = cross_scores_ques.argsort()[-k:][::-1]
sub_context = []
for idx in list(top_indices_ques):
sub_context.append(documents[idx])
Clasificación semántica
Búsqueda de Azure AI tiene una característica propia denominada clasificación semántica. Esta característica utiliza modelos de aprendizaje profundo adaptados de Microsoft Bing que promueven los resultados más relevantes desde el punto de vista semántico. Lea lo siguiente para ver Cómo funciona el clasificador semántico.
Guía de búsqueda
Plantéese las siguientes instrucciones generales al implementar la solución de búsqueda:
- Título, resumen, origen y contenido sin procesar (no limpio) son buenos campos para devolver de una búsqueda.
- Determine antes si una consulta debe dividirse en subconsultas.
- En general, se recomienda ejecutar consultas en varios campos, tanto consultas de texto como vectores de búsqueda. Cuando recibe una consulta, no sabe si es mejor el vector de búsqueda o la búsqueda de texto. Además, no sabe en qué campos es mejor buscar por vector de búsqueda o por palabras clave. Puede buscar en varios campos, potencialmente con varias consultas, reclasificar los resultados y devolver los resultados con las puntuaciones más altas.
- Los campos de palabras clave y entidades son buenos candidatos para considerar el filtrado.
- Se recomienda usar palabras clave junto con vectores de búsqueda. Las palabras clave filtran los resultados en un subconjunto más pequeño. El almacén de vectores funciona con ese subconjunto para encontrar las mejores coincidencias.
Evaluación de la búsqueda
En la fase de preparación, debe haber recopilado consultas de prueba junto con la información del documento de prueba. Puede usar la siguiente información recopilada en esa fase para evaluar los resultados de la búsqueda:
- La consulta: la consulta de ejemplo
- Contexto: la colección de todo el texto de los documentos de prueba que abordan la consulta de ejemplo.
A continuación se muestran tres métodos de evaluación de recuperación bien establecidos que puede usar para evaluar la solución de búsqueda:
- Precisión en K: el porcentaje de elementos relevantes identificados correctamente del total de los resultados de la búsqueda. Esta métrica se centra en la precisión de los resultados de la búsqueda.
- Recordar en K: recordar en K mide el porcentaje de elementos relevantes de los K principales del total de los posibles elementos relativos. Esta métrica se centra en la cobertura de los resultados de búsqueda.
- Clasificación mutua media (MRR): MRR mide el promedio de las clasificaciones recíprocas de la primera respuesta relevante en los resultados de búsqueda clasificados. Esta métrica se centra en dónde se produce el primer resultado relevante en los resultados de la búsqueda.
Debe probar ejemplos positivos y negativos. En los ejemplos positivos, quiere que las métricas estén lo más cerca posible de 1. En los ejemplos negativos, donde los datos no deben poder abordar las consultas, quiere que las métricas estén lo más cerca posible de 0. Debe probar todas las consultas de prueba y promediar los resultados positivos y negativos de la consulta para comprender el rendimiento agregado de los resultados de la búsqueda.