RAG: Respuesta a preguntas sobre conocimiento del dominio con búsqueda semántica e IA generativa

Responder a preguntas basadas en el conocimiento del dominio (como documentación interna, contratos, libros, etc.) es todo un reto. En este artículo exploramos una técnica avanzada llamada Retrieval-Augmented Generation (RAG) para conseguirlo con gran precisión, mezclando la búsqueda semántica y la generación de texto con modelos como ChatDolphin, LLaMA, ChatGPT, GPT-4...

Respuesta a preguntas

Los retos de responder a preguntas sobre el conocimiento del dominio

Para responder a las preguntas sobre el conocimiento del dominio es necesario enviar primero un contexto al modelo de IA y, a continuación, formular una pregunta al respecto.

Por ejemplo, podría enviar el siguiente contexto:

All NLP Cloud plans can be stopped anytime. You only pay for the time you used the service. In case of a downgrade, you will get a discount on your next invoice.

Ahora quizá quieras hacerte la siguiente pregunta:

When can plans be stopped?

La IA respondería algo así:

Anytime

Para más detalles, consulte nuestra documentación sobre la respuesta a preguntas aquí.

El problema de este enfoque es que el tamaño de su contexto (es decir, el tamaño de su texto de entrada) es limitado. Así que no puedes enviar todo tu conocimiento del dominio como contexto.

Supongamos que quiere crear un chatbot de soporte que lo sepa todo sobre la documentación de su producto, para que los usuarios finales puedan hacer cualquier pregunta relacionada con el producto al chatbot sin tener que ponerse en contacto con un agente de soporte real. Lo más probable es que su documentación conste de varios cientos o miles de palabras, o incluso millones de palabras...

Veamos cómo superar esta limitación y responder a preguntas sobre documentos de gran tamaño.

Búsqueda semántica VS IA generativa

Cuando se trata de responder a preguntas, pueden utilizarse dos tipos de tecnologías. La generación de textos (IA generativa) y la búsqueda semántica.

El primero, la generación de texto, es básicamente lo que acabo de mostrar arriba. Normalmente se utiliza un modelo avanzado de generación de texto como ChatDolphin, LLaMA, ChatGPT, GPT-4... Es capaz de entender una pregunta humana, y responder como un humano también. Sin embargo, no funciona con documentos de gran tamaño. El ajuste fino de un modelo de IA generativa con sus conocimientos del dominio no funcionaría bien, ya que el ajuste fino no es una buena técnica para añadir conocimientos a un modelo.

La búsqueda semántica consiste básicamente en buscar un documento de la misma forma que Google, pero basándote en tu propio conocimiento del dominio.

Para conseguirlo, debe convertir sus documentos internos en vectores (también conocidos como "embeddings"). A continuación, debe convertir su pregunta también en un vector y, después, realizar una búsqueda vectorial (también conocida como "similitud semántica") para recuperar la parte de su conocimiento del dominio que más se acerque a su pregunta.

Una primera solución es almacenar sus incrustaciones en una base de datos vectorial dedicada como PG Vector. Otra solución es codificar su propio modelo de búsqueda semántica con su propio conocimiento del dominio y desplegarlo en una GPU (que es la solución que proponemos en NLP Cloud porque ofrece el mejor tiempo de respuesta). Entonces, una vez que tenga lista su base de datos vectorial, o una vez creado su modelo, puede hacer preguntas en lenguaje natural y su modelo de IA le devolverá un extracto de su conocimiento de dominio que responda mejor a su pregunta.

La búsqueda semántica suele ser muy rápida y relativamente barata. También es más fiable que la estrategia de ajuste fino de generación de texto, por lo que no se enfrentará a ningún problema de alucinación de la IA. Pero no es capaz de "responder" adecuadamente a una pregunta. Simplemente devuelve un fragmento de texto que contiene una respuesta a tu pregunta. Después, es el usuario el que tiene que leer todo el texto para encontrar la respuesta a su pregunta.

Para más detalles, consulte nuestra documentación sobre búsqueda semántica aquí.

La buena noticia es que es posible combinar la búsqueda semántica y la IA generativa para obtener resultados avanzados.

Respuesta a preguntas combinando búsqueda semántica e inteligencia artificial generativa

Para responder a preguntas sobre conocimiento del dominio, la estrategia que preferimos en NLP Cloud es la siguiente: primero realizar una petición con búsqueda semántica para recuperar los recursos que mejor respondan a su pregunta y, a continuación, utilizar la generación de texto para responder a la pregunta basándose en estos recursos como un humano.

Supongamos que somos distribuidores de impresoras HP y queremos responder a las preguntas de nuestros clientes en nuestro sitio web.

Primero tendremos que calcular los embeddings y almacenarlos en una base de datos vectorial, o crear nuestro propio modelo de búsqueda semántica. Aquí se compondrá únicamente de 3 ejemplos, pero en la vida real se pueden incluir hasta 1 millón de ejemplos cuando se utiliza la búsqueda semántica en NLP Cloud. Simplemente creamos un archivo CSV y ponemos lo siguiente dentro:

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 printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert.
HP LaserJet ; Lowest cost per page on mono laser printing. · $319.99 ; Wireless options available. · $109.00 ; Essential management features. · $209.00.

A continuación, cargamos nuestro conjunto de datos CSV en NLP Cloud y hacemos clic en "Crear modelo". Al cabo de un rato, nuestro propio modelo de búsqueda semántica que contiene nuestro propio conocimiento del dominio estará listo y recibiremos una URL de API privada para poder utilizarlo.

Formulemos una pregunta a nuestro flamante modelo utilizando el cliente Python de NLP Cloud:

import nlpcloud

# We use a fake model name and a fake API key for illustration reasons.
client = nlpcloud.Client("custom-model/5d8e6s8w5", "poigre5754gaefdsf5486gdsa56", gpu=True)
client.semantic_search("How long is the warranty on the HP Color LaserJet Pro?")

El modelo devuelve rápidamente lo siguiente con un breve tiempo de respuesta:

{
"search_results": [
    {
        "score": 0.99,
        "text": "Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert."
    },
    {
        "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."
    },
    ]
}

Ahora recuperamos la respuesta que tenga la puntuación más alta (también podríamos recuperar perfectamente varias respuestas): "Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert."

Esta respuesta es correcta, pero no es muy fácil de usar, ya que el usuario tiene que leer un texto bastante largo para obtener la respuesta. Así que ahora volvemos a hacer la misma pregunta a nuestro punto final de respuesta de preguntas, utilizando el modelo ChatDolphin. Utilizaremos la respuesta de la búsqueda semántica como contexto:

import nlpcloud

client = nlpcloud.Client("chatdolphin", "poigre5754gaefdsf5486gdsa56", gpu=True)
client.question(
    """How long is the warranty on the HP Color LaserJet Pro?""",
    context="""Every HP printer comes with at least a one-year HP commercial warranty (or HP Limited Warranty). Some models automatically benefit from a three-year warranty, which is the case of the HP Color LaserJet Plus, the HP Color LaserJet Pro, and the HP Color LaserJet Expert."""
)

La respuesta es la siguiente:

{
    "answer": "The warranty lasts for three years."
}

Bastante bueno, ¿no?

Conclusión

A pesar de los recientes avances en modelos de IA generativa como ChatDolphin, LLaMA, ChatGPT, GPT-4, etc., el tamaño limitado de las peticiones hace imposible utilizar estos grandes modelos en el conocimiento de dominios específicos para la respuesta a preguntas. Por desgracia, el ajuste fino de estos modelos no funciona bien para este tipo de casos de uso...

Una buena estrategia es implementar un sistema RAG. En primer lugar, responda a su pregunta convirtiendo sus documentos en incrustaciones y almacenándolas en una base de datos vectorial, o creando su propio modelo de búsqueda semántica a partir de sus documentos, y después utilice un modelo regular de respuesta a preguntas basado en IA generativa con el fin de devolver una respuesta humana a la pregunta inicial.

Si desea poner en práctica esta estrategia, no dude en crear su propio modelo de búsqueda semántica en NLP Cloud: consulte la documentación relacionada aquí!

Mark
Ingeniero de aplicaciones en NLP Cloud