¿Problemas con la IA o el desarrollo full-stack? Nuestros expertos están aquí para guiarle: asesoramiento personalizado, integración técnica y mucho más. Contacte con nosotros en [email protected].

Creación de un modelo de búsqueda semántica con transformadores de frases para una aplicación RAG

Poner en práctica un proceso de generación de recuperación aumentada (RAG) ajustando su propio modelo de búsqueda semántica es un potente método para mejorar la precisión y pertinencia de los sistemas de respuesta a preguntas.

Esta técnica combina los puntos fuertes de la búsqueda semántica y la IA generativa, lo que permite al sistema comprender mejor las preguntas de los usuarios y generar respuestas más precisas y contextualmente relevantes. Al ajustar un modelo de búsqueda semántica mediante transformadores de frases, los desarrolladores pueden adaptar el modelo a su dominio específico, lo que mejora el rendimiento general de la canalización RAG.

Búsqueda semántica

¿Qué es la búsqueda semántica?

La búsqueda semántica es una técnica de búsqueda de datos que va más allá de los métodos tradicionales basados en palabras clave. Utiliza el procesamiento del lenguaje natural y algoritmos de aprendizaje automático para mejorar la precisión de los resultados de búsqueda teniendo en cuenta la intención del buscador y el significado contextual de los términos utilizados en su consulta. Su objetivo es comprender el significado subyacente de la consulta y el contenido de las páginas web, en lugar de limitarse a comparar palabras clave. De este modo, la búsqueda semántica puede ofrecer resultados más pertinentes, aunque no contengan las palabras exactas utilizadas en la consulta original.

Para lograrlo, la búsqueda semántica emplea varias técnicas, como la desambiguación del sentido de las palabras, la extracción de conceptos y la expansión de consultas. También utiliza la búsqueda vectorial y el aprendizaje automático para obtener resultados que coincidan con la intención y el contexto del usuario. La búsqueda semántica está muy extendida en los motores de búsqueda web, como Google, y se nutre de tecnologías como Knowledge Graph, que almacena datos estructurados sobre entidades y sus relaciones. Esto permite a los motores de búsqueda comprender el significado de las consultas y ofrecer resultados más precisos y significativos.

La búsqueda semántica es muy útil para las empresas que quieren responder a preguntas sobre su propio conocimiento del dominio, como su documentación técnica, contratos, descripciones de productos...

¿Qué es la Generación Aumentada de Recuperación (RAG)?

Búsqueda semántica

La Generación Aumentada por Recuperación (RAG) es una técnica que mejora la precisión y fiabilidad de los modelos generativos de IA, como los Grandes Modelos Lingüísticos (LLM), mediante la incorporación de fuentes de datos externas para proporcionar información contextual más precisa y actualizada. Integra un componente de recuperación con un modelo generativo, lo que permite al sistema buscar y obtener información relevante de una base de datos o de conocimientos para complementar su conocimiento interno a la hora de generar respuestas.

Este enfoque garantiza que el modelo de IA pueda ofrecer respuestas basadas en los hechos más actuales y fiables, y permite a los usuarios verificar las fuentes de la información utilizada en las respuestas del modelo. La GAR ayuda a basar el modelo de IA en fuentes externas de conocimiento, mejorando la calidad de sus resultados y proporcionando una forma de actualizar el modelo sin necesidad de un reentrenamiento exhaustivo.

La GAR es una gran estrategia para mitigar las posibles alucinaciones de los modelos generativos de IA. RAG ayuda a construir un sistema de respuesta a preguntas que tiene lo mejor de ambos mundos: precisión factual y respuestas humanas generadas en lenguaje natural.

¿Qué es la biblioteca de transformadores de frases?

Transformadores de frases

La biblioteca Sentence Transformers es un potente marco de Python diseñado para la incrustación de texto de última generación. Se basa en redes neuronales transformadoras como BERT, RoBERTa, XLM-R y otras, que ofrecen el máximo rendimiento en diversas tareas, como la búsqueda semántica, la extracción de paráfrasis, la comparación de similitudes semánticas, la agrupación y muchas más. Esta biblioteca permite ajustar con facilidad los métodos de incrustación de frases, lo que posibilita la creación de incrustaciones de frases específicas para cada tarea y adaptadas a necesidades concretas. Más información en el sitio web de Sentence Transformers

La biblioteca ofrece una amplia selección de modelos de Sentence Transformers preentrenados para más de 50 idiomas, disponibles en la plataforma Hugging Face. Los usuarios también pueden entrenar o ajustar sus propios modelos utilizando la biblioteca, lo que proporciona la flexibilidad necesaria para crear modelos personalizados para casos de uso únicos. Recientemente, el equipo de Sentence Transformers ha lanzado una nueva versión (v3) que mejora considerablemente las capacidades de esta biblioteca, en especial su capacidad de ajuste.

La biblioteca Sentence Transformers es rápida, completa y está bien mantenida, por lo que la utilizaremos en este tutorial.

Crear su propio modelo de búsqueda semántica

Crear tu propio modelo de búsqueda semántica es una excelente forma de obtener resultados precisos y, al mismo tiempo, garantizar una latencia muy baja. Esto es aún más cierto si despliegas tu propio modelo de búsqueda semántica en una GPU.

En primer lugar, vamos a crear un pequeño conjunto de datos que contenga nuestros datos. Cree un archivo CSV de 1 columna (llamado "dataset.csv") que contenga la siguiente documentación técnica sobre impresoras HP (en un escenario de la vida real querrá incluir muchos más ejemplos, por supuesto):

"HP® LaserJets have unmatched printing speed, performance and reliability that you can trust. Enjoy Low Prices and Free Shipping when you buy now online."
"Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
"HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00."

Cada fila puede contener hasta 512 tokens (aproximadamente el equivalente a 400 palabras) y, para maximizar la precisión, se recomienda no superar los 128 tokens (aproximadamente el equivalente a 100 palabras). Ahora que tenemos nuestras 3 piezas de documentación en nuestro conjunto de datos, podemos codificar los datos utilizando nuestro modelo con Sentence Transformers. Crea un script en Python con lo siguiente (asegúrate de que PyTorch y Sentence Transformers están instalados).

from sentence_transformers import SentenceTransformer
import csv
import torch

model_name = 'paraphrase-multilingual-mpnet-base-v2'
encoded_model_path = 'semantic_search_model.pt'
dataset_path = 'dataset.csv'

bi_encoder = SentenceTransformer(model_name)

passages = []
with open(dataset_path) as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])
        
corpus_embeddings = bi_encoder.encode(
    passages, batch_size=32, convert_to_tensor=True, show_progress_bar=True)

torch.save(corpus_embeddings, encoded_model_path)

Este script descarga y utiliza paraphrase-multilingual-mpnet-base-v2 como modelo base y lo utiliza para codificar nuestros datos. Puede elegir entre muchos modelos preentrenados disponibles, dependiendo de sus requisitos (tamaño del modelo, caso de uso, idiomas soportados, ...). Dependiendo de tu hardware, deberás adaptar el parámetro "batch_size" para acelerar el proceso de codificación.

Una vez creado, puede utilizar su modelo para la inferencia con el siguiente script de Python:

import csv
from sentence_transformers import SentenceTransformer, util
import torch

bi_encoder = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')
semantic_search_model = torch.load('semantic_search_model.pt')

passages = []
with open('app/custom_model/dataset.csv') as csv_file:
    csv_reader = csv.reader(csv_file)
    for row in csv_reader:
        passages.append(row[0])

question_embedding = bi_encoder.encode(
    "How long is the warranty on the HP Color LaserJet Pro?", convert_to_tensor=True)
hits = util.semantic_search(
    question_embedding, semantic_search_model, top_k=3)
hits = hits[0]

result = {"search_results": [
    {"score": hit['score'], "text": passages[hit['corpus_id']]} for hit in hits]}

El script de inferencia anterior devuelve los siguientes resultados:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty)."
    },
    {
        "score": 0.74,
        "text": "All consumer PCs and printers come with a standard one-year warranty. Care packs provide an enhanced level of support and/or an extended period of coverage for your HP hardware. All commercial PCs and printers come with either a one-year or three-year warranty."
    },
    {
        "score": 0.68,
        "text": "In-warranty plan · Available in 2-, 3-, or 4-year extension plans · Includes remote problem diagnosis support and Next Business Day Exchange Service."
    },
    ]
}

En nuestro script de inferencia, el parámetro "top_k" determina cuántos resultados queremos obtener. En el resultado, mostramos el texto coincidente del conjunto de datos con una puntuación de confianza. Esta puntuación es importante porque nos ayuda a decidir si queremos aceptar la respuesta o no.

Generar una respuesta en lenguaje natural con IA generativa

Como se puede ver, la principal limitación de la búsqueda semántica es que el modelo devuelve el texto en bruto del conjunto de datos sin responder directamente a la pregunta. Así que ahora queremos dárselo a un modelo generativo de IA como contexto para que responda a la pregunta inicial en lenguaje natural.

Podemos conseguirlo fácilmente aprovechando un LLM avanzado como GPT-4 en OpenAI o LLaMA 3 y ChatDolphin en NLP Cloud. Puede decidir quedarse con el mejor resultado del modelo de búsqueda semántica y pasarlo como contexto al LLM, o quedarse con varios resultados. A continuación se muestra un ejemplo que utiliza sólo el mejor resultado:

Context: Every HP LaserJet comes with a one-year HP commercial warranty (or HP Limited Warranty).
Based on the above context, answer the following question: How long is the warranty on the HP Color LaserJet Pro?

Esta solicitud devuelve algo parecido:

The warranty on the HP Color LasertJet Pro lasts at least 1 year.

Modelo de búsqueda semántica con datos codificados VS almacenamiento de incrustaciones en una base de datos vectorial

En un sistema de Generación Mejorada de Recuperación (RAG), crear un modelo de búsqueda semántica con datos locales codificados o utilizar una base de datos vectorial son dos opciones interesantes.

Cuando codificamos nuestros propios datos, los convertimos en tensores y luego tenemos la oportunidad de cargarlos en una GPU. Por otro lado, una base de datos vectorial es una base de datos especializada diseñada para almacenar, indexar y consultar estos vectores de alta dimensión de forma eficiente.

Para las empresas que desean lograr latencias muy bajas, se recomienda codificar sus propios datos y cargarlos en una GPU para mejorar el tiempo de cálculo. Sin embargo, esto va en detrimento de la flexibilidad, ya que los datos tienen que volver a codificarse cada vez que cambia el conjunto de datos. Si tus datos subyacentes cambian con mucha frecuencia, puede que te resulte más sencillo extraer las incrustaciones y almacenarlas de forma incremental en una base de datos vectorial (como PG Vector, por ejemplo).

Conclusión

La Generación Aumentada de Recuperación es crucial para las empresas que buscan responder a preguntas sobre datos específicos como documentación técnica, contratos, etc., ya que aumenta considerablemente la precisión de los resultados. La RAG es un componente clave de un chatbot de asistencia, por ejemplo.

Sentence Transformers es una gran biblioteca que puede utilizarse para crear tu propio modelo de búsqueda semántica basado en tus propios datos. Cuando se implementa en una GPU y se combina con un modelo de IA generativa avanzada, este modelo resulta extremadamente potente.

Si no está interesado en crear y desplegar su propio modelo de búsqueda semántica basado en Sentence Transformers por sí mismo, puede hacerlo fácilmente en 1 clic en NLP Cloud. ¡Pruebe ahora la búsqueda semántica en NLP Cloud!

Si tiene alguna pregunta sobre RAG, la búsqueda semántica y los transformadores de frases, no dude en consultarnos, ¡siempre es un placer asesorarle!

Julien
Director Técnico de NLP Cloud