Desarrollar asistentes personales para automoción impulsados ​​por IA.  Parte 2

Desarrollar asistentes personales para automoción impulsados ​​por IA. Parte 2

Hacer que el chatbot sea más adecuado

Recientemente, creamos un chatbot simple, utilizando una instancia GPT 4 Turbo alojada en Azure. Es un excelente punto de partida, pero definitivamente necesitamos más para cumplir con los requisitos comerciales. Intentemos hablar con nuestro bot.

Inmediato:
Hola, me gustaría comprar un auto nuevo. ¿Puedes ayudarme con una elección? Busco un coche familiar con propulsión híbrida y tracción total. Soy un fanático del diseño moderno y las características sofisticadas. Mi presupuesto ronda los 70.000 euros.
Terminación:
¡Por supuesto, estaré encantado de ayudarle a encontrar un coche familiar adecuado que cumpla con sus criterios! Dadas sus preferencias (…), existen varias opciones de diferentes marcas que podrían encajar perfectamente. (…):
1. Audi Q5 TFSIe
Tren motriz: (…)
Características: (…)
Rango de precios: (…)
2. BMW X5 xDrive45e
Tren motriz: (…)
Características: (…)
Rango de precios: (…)
3. Recarga del Volvo XC90
Tren motriz: (…)
Características: (…)
Rango de precios: (…)
4. Mercedes-Benz GLE 450 4MATIC
Tren motriz: (…)
Características: (…)
Rango de precios: (…)
5. Lexus RX 450h
Tren motriz: (…)
Características: (…)
Rango de precios: (…)
Al considerar estas opciones, es importante probar las que más le interesan para tener una idea de su dinámica de conducción, comodidad y facilidad de uso de sus funciones tecnológicas. Además, (…)

Como puede ver, la respuesta es bastante larga, versátil y absolutamente inútil.

Si trabaja para una de esas marcas, no querrá que el chatbot se lo ofrezca a sus competidores. Además, la base de conocimientos está un poco desactualizada, por lo que la respuesta no es confiable. Además de eso, la respuesta es demasiado larga para mostrarla en un dispositivo móvil o leerla. Y hay que tener en cuenta que el usuario puede hacer un mal uso del chatbot para generar una tesis de maestría, escribir un cuento de hadas o planificar un viaje a Roma.

Nuestro trabajo es limitar las posibilidades de los bots. La forma de lograrlo es la ingeniería rápida. Intentemos agregar algunos mensajes del sistema antes del mensaje del usuario.

Messages=[
        {"role": "system", "content": "You are a car seller working for X"},
        {"role": "system", "content": "X offers following vehicles (…)"},
        {"role": "system", "content": "Never recommend X competitors"},
        {"role": "system", "content": "Avoid topics not related to X. e.g. If the user asks for weather, kindly redirect him to the weather service"},
        {"role": "system", "content": "Be strict and accurate, avoid too long messages"},
        {"role": "user", "content": "Hi, I’d like to buy a new car. Can you assist me with a choice? I’m looking for a family car with a hybrid powertrain and all-wheel drive. I’m a fan of modern design and fancy features. My budget is around 70k euro."},
    ]

Ahora el chatbot debería comportarse mucho mejor, pero aún así se le puede engañar. La ingeniería rápida avanzada, junto con la piratería de LLM y las formas de prevenirla, está fuera del alcance de este artículo, pero recomiendo encarecidamente explorar este tema antes de exponer su chatbot a clientes reales. Para nuestros propósitos, debe tener en cuenta que proporcionar una oferta completa en un mensaje («X ofertas después de los vehículos (…)») puede ir muy por encima de la ventana de contexto de LLM. Lo que nos lleva al siguiente punto.

Recuperación Generación Aumentada

A menudo desea proporcionar más información a su chatbot de la que puede manejar. Puede ser una oferta de una marca, un manual de usuario, un manual de servicio o todo eso junto y mucho más. GPT 4 Turbo puede funcionar con hasta 128 000 tokens (mensaje + finalización juntos), lo que equivale, según la documentación oficial, alrededor de 170 000 palabras en inglés. Sin embargo, la precisión del modelo disminuye alrededor de la mitad. , y el procesamiento de contexto más largo requiere más tiempo y consume más dinero. Google acaba de anunció un modelo de tokens de 1 millón pero en términos generales, hasta el momento no se recomienda poner demasiado en contexto. Considerándolo todo, probablemente no quieras poner ahí todo lo que tienes.

RAG es una técnica para recopilar información adecuada para el LLM que puede contener la información necesaria para responder las preguntas de los usuarios.

Supongamos que tiene dos documentos en la base de conocimientos de su empresa. El primero contiene la oferta de la empresa (todos los vehículos a la venta), y el segundo contiene manuales de mantenimiento. El usuario se acerca a su chatbot y hace la pregunta: “¿Qué coche debería comprar?”. Por supuesto, el bot necesita identificar las necesidades del usuario, pero también necesita algunos datos con los que trabajar. La respuesta probablemente esté incluida en el primer documento, pero ¿cómo podemos saberlo?

Más detalladamente, RAG es un proceso de comparar la pregunta con fuentes de datos disponibles para encontrar la más relevante. La técnica más común es la búsqueda vectorial. Este proceso convierte el conocimiento de su dominio en vectores y los almacena en una base de datos (este proceso se llama incrustación). Cada vector representa una parte del documento: un capítulo, una página, un párrafo, según su implementación. Cuando el usuario hace su pregunta, también se convierte en una representación vectorial. Luego, debe encontrar el documento representado por el vector más similar; debe contener la respuesta a la pregunta, por lo que debe agregarlo al contexto. La última parte es el mensaje, por ejemplo, «Basado en este conocimiento, responda la pregunta».

Por supuesto, el asunto es mucho más complicado. Debe considerar su modelo de incrustación y tal vez mejorarlo mediante ajustes. Es necesario comparar métodos de búsqueda (vectorial, semántica, palabras clave, híbridos) y adaptarlos con parámetros. Debe seleccionar la base de datos que mejor se ajuste, pulir su solicitud, convertir documentos complejos a texto (lo que puede ser un desafío, especialmente con archivos PDF) y tal vez procesar la salida para vincularla a fuentes o extraer imágenes.

Es un desafío pero posible. Vea el resultado en uno de nuestros casos de estudio: Manual de automóvil impulsado por voz.

La buena noticia es que usted no es el primero en trabajar en este problema y existen algunas soluciones listas para usar disponibles.

El que no tiene código es Azure AI Search, junto con Azure Cognitive Service y Azure Bot. El manual oficial cubre todos los pasos: requisitos previos, ingesta de datos e implementación de aplicaciones web. Funciona bien, incluyendo OCR, parametrización de búsqueda y exposición de enlaces a documentos fuente en las respuestas del chat. Si desea una solución más flexible, la versión de código bajo está disponible aquí.

Entiendo si quieres tener todas las piezas de la aplicación en tus manos y prefieres construirla desde cero. En este punto debemos volver a la opción de idioma. La biblioteca Langchain, que originalmente estaba disponible solo para Python, puede ser su mejor amiga para esta implementación.

Vea el ejemplo a continuación.

From langchain.chains.question_answering import load_qa_chain
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import Qdrant
from qdrant_client import QdrantClient
from langchain.chat_models import AzureChatOpenAI
from langchain.chains.retrieval_qa.base import RetrievalQA

client = QdrantClient(url="…", api_key="…")
embeddings = HuggingFaceEmbeddings(model_name="hkunlp/instructor-xl")
db = Qdrant(client= client, collection_name="…", embeddings=embeddings)
second_step = load_qa_chain(AzureChatOpenAI(
        deployment_name="…",
        openai_api_key="…",
        openai_api_base="…",
        openai_api_version="2023-05-15"
    ), chain_type="stuff", prompt="Using the context {{context}} answer the question: …")
first_step = RetrievalQA(
        combine_documents_chain=second_step,
        retriever=db.as_retriever(
            search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.5 }
        ),
    )
first_step.run()

Esta es la aplicación de búsqueda completa. Crea y ejecuta una «cadena» de operaciones; el primer paso es buscar datos en la base de datos Qdrant, utilizando un modelo llamado instructor-xl para incrustarlos. El segundo paso es poner el resultado del primer paso como un «contexto» para el mensaje GPT. Como puede ver, la aplicación se basa en la biblioteca Langchain. Existe un puerto Java para ello o puede ejecutar cada paso manualmente en el idioma que desee. Sin embargo, usar Langchain en Python es la forma más conveniente a seguir y una ventaja significativa de usar este lenguaje.

Con este conocimiento, puedes crear un chatbot y alimentarlo con el conocimiento de la empresa. Puede dirigir la aplicación a usuarios finales (propietarios de automóviles), empleados internos o clientes potenciales. Pero LLM puede «hacer» más.

llamada de función

«Hacer» es la palabra clave. En esta sección le enseñaremos al LLM a hacer algo por nosotros, no solo a brindar información o contar chistes. Un chatbot operativo puede descargar más datos si es necesario y decidir qué datos se requieren para la conversación, pero también puede ejecutar operaciones reales. La mayoría de los vehículos modernos se entregan con aplicaciones móviles que se pueden utilizar para leer datos (localizar el automóvil, consultar el kilometraje, leer advertencias) o ejecutar operaciones (abrir puertas, encender el aire acondicionado o iniciar el proceso de carga). Hagamos lo mismo con el chatbot.

La llamada a funciones es una funcionalidad incorporada de los modelos GPT. Hay un campo en el modelo API para herramientas (funciones) y puede generar respuestas en formato JSON. Puedes intentar lograr lo mismo con cualquier otro LLM con un mensaje como ese.

En este entorno, tiene acceso a un conjunto de herramientas que puede utilizar para responder la pregunta del usuario.

Puedes llamarlos así:

<function_calls>
  <invoke>
    <tool_name>$TOOL_NAME</tool_name>
      <parameters>
        <$PARAMETER_NAME>$PARAMETER_VALUE</$PARAMETER_NAME>
      </parameters>
  </invoke>
</function_calls>

Here are the tools available:
<tools>
  <tool_description>
    <tool_name>unlock</tool_name>
    <description>
      Unlocks the car.
    </description>
    <parameters>
      <parameter>
        <name>vin</name>  
        <type>string</type>
        <description>Car identifier</description>
      </parameter>
    </parameters>
  </tool_description>
</tools>
This is a prompt from the user: ….

Desafortunadamente, a los LLM a menudo no les gusta seguir una estructura requerida de finalización, por lo que es posible que enfrente algunos errores al analizar las respuestas.

Con GPT, la documentación oficial recomienda verificar el formato de respuesta, pero nunca encontré ningún problema con esta funcionalidad.

Veamos una solicitud de muestra con definiciones de funciones.

{
  "model": "gpt-4",
  "messages": [
    { "role": "user",  "content": "Unlock my car" }
  ],
  "tools": [
    {
      "type": "function",
      "function": {
        "name": "unlock",
        "description": "Unlocks the car",
        "parameters": {
          "type": "object",
          "properties": {
            "vin": {
              "type": "string",
              "description": "Car identifier"
            },
          "required": ["vin"]
        }
      }
    }
  ],
}

Para evitar que el artículo sea aún más largo, le recomiendo que visite la documentación oficial como referencia.

Si el LLM decide llamar a una función en lugar de responder al usuario, la respuesta contiene la solicitud de llamada a la función.

{
 …
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": null,
        "tool_calls": [
          {
            "id": "call_abc123",
            "type": "function",
            "function": {
              "name": "unlock",
              "arguments": "{\"vin\": \"ABC123\"}"
            }
          }
        ]
      },
      "logprobs": null,
      "finish_reason": "tool_calls"
    }
  ]
}

Basado en el razón_finalización valor, su aplicación decide devolver el contenido al usuario o ejecutar la operación. El hecho importante es que no existe ninguna magia que pueda usarse para llamar automáticamente a alguna API o ejecutar una función en su código. Su aplicación debe encontrar una función basada en el nombre y analizar los argumentos de la lista con formato JSON. Luego, la respuesta de la función debe enviarse al LLM (no al usuario), y el LLM toma la decisión sobre los próximos pasos: llamar a otra función (o la misma con diferentes argumentos) o escribir una respuesta para el usuario. Para enviar la respuesta al LLM, simplemente agréguela a la conversación.

{
  "model": "gpt-4",
  "messages": [
    { "role": "user",  "content": "Unlock my car" },
    {"role": "assistant", "content": null, "function_call": {"name": "unlock", "arguments": "{\"vin\": \"ABC123\"}"}},
    {"role": "function", "name": "unlock", "content": "{\"success\": true}"}
  ],
  "tools": [
    …
  ],
}

En el ejemplo anterior, la siguiente respuesta es más o menos «Claro, abrí tu auto».

Con este enfoque, debe enviar con cada solicitud no solo el historial de conversaciones y las indicaciones del sistema, sino también una lista de todas las funciones disponibles con todos los parámetros. Téngalo en cuenta al contar sus fichas.

Hacer un seguimiento

Como puede ver, podemos limitar la versatilidad del chatbot mediante una ingeniería rápida y aumentar su ingenio con RAG o herramientas externas. Nos lleva a otro nivel de usabilidad de los LLM, pero ahora tenemos que fusionarlos y no tirar al bebé con el agua del baño. En el último artículo, consideraremos la arquitectura de la aplicación, implementaremos algunas optimizaciones y evitaremos errores comunes. ¡Volveremos en seguida!




Source link

About David Lopez

Check Also

Akeneo acciones colectivas para una gestión eficiente del producto

Akeneo acciones colectivas para una gestión eficiente del producto

En el mundo del comercio electrónico en rápido crecimiento, la gestión de la información de …

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *