En este tutorial, experimentará con varias estrategias de fragmentación utilizando LangChain y el último modelo de IBM Granite ahora disponible en watsonx.a™. El objetivo general es realizar generación aumentada por recuperación (RAG).
La fragmentación se refiere al proceso de dividir grandes fragmentos de texto en segmentos o fragmentos de texto más pequeños. Para enfatizar la importancia de la fragmentación, es útil comprender la RAG. RAG es una técnica en procesamiento del lenguaje natural (PLN) que combina la recuperación de información y los grandes modelos de lenguaje (LLM) para recuperar información relevante de conjuntos de datos para optimizar la calidad del output del LLM. Para gestionar documentos grandes, podemos utilizar la fragmentación para dividir el texto en fragmentos más pequeños de fragmentos significativos. Estos fragmentos de texto pueden incrustarse y almacenarse en una base de datos vectorial mediante el uso de un modelo de embedding. Por último, el sistema RAG puede utilizar la búsqueda semántica para recuperar solo los fragmentos más relevantes. Los fragmentos más pequeños tienden a superar a los fragmentos más grandes, ya que tienden a ser piezas más manejables para modelos de tamaño de ventana de contexto más pequeño.
Algunos componentes clave de la fragmentación incluyen:
Hay varias estrategias de fragmentación diferentes para elegir. Es importante seleccionar la técnica de fragmentación más eficaz para el caso de uso específico de su aplicación LLM. Algunos procesos de fragmentación de uso común incluyen:r:
Aunque puede elegir entre varias herramientas, este tutorial le muestra cómo configurar una cuenta de IBM para utilizar un Jupyter Notebook.
Inicie sesión en watsonx.ai utilizando su cuenta de IBM® Cloud.
Cree un proyecto watsonx.ai.
Puede obtener el ID de su proyecto desde su proyecto. Haga clic en la pestaña Administrar. A continuación, copie el ID del proyecto de la sección Detalles de la página General. Necesita este ID para este tutorial.
Cree un Jupyter Notebook.
Este paso abrirá un entorno de Notebook donde podrás copiar el código de este tutorial. También puede descargar este cuaderno en su sistema local y cargarlo en su proyecto watsonx.ai como activo. Para ver más tutoriales de Granite, consulte la comunidad de IBM® Granite. Este Jupyter Notebook junto con los conjuntos de datos utilizados se pueden encontrar en GitHub.
Cree una instancia de servicio de watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia sin coste).
Genere una clave API.
Asocie la instancia del servicio watsonx.ai Runtime al proyecto que ha creado en watsonx.ai.
Para establecer nuestras credenciales, necesitamos el WATSONX_APIKEY yel WATSONX_PROJECT_ID que generó en el paso 1. También estableceremos la URL que sirve como endpoint de la API.
Utilizaremos Granite 3.1 como nuestro LLM para este tutorial. Para inicializar el LLM, necesitamos establecer los parámetros del modelo. Para obtener más información sobre estos parámetros del modelo, como los límites mínimo y máximo de token, consulte la documentación.
El contexto que estamos utilizando para nuestro pipeline RAG es el anuncio oficial de IBM para el lanzamiento de Granite 3.1. Podemos cargar el blog en un documento directamente desde la página web utilizando WebBaseLoader de LangChain.
Proporcionemos código de muestra para implementar cada una de las estrategias de fragmentación que cubrimos anteriormente en este tutorial disponible a través de LangChain.
Para implementar el fragmentado de tamaño fijo, podemos utilizar CharacterTextSplitter de LangChain y establecer un chunk_size y un chunk_overlap. El chunk_size se mide en caracteres. Siéntase libre de experimentar con diferentes valores. También estableceremos el separador como el carácter de nueva línea para poder diferenciar entre párrafos. Para la tokenización, podemos utilizar granite-3.1-8b-instruct tokenizer. El tokenizador descompone el texto en tokens que el LLM puede procesar.
Podemos imprimir uno de los fragmentos para comprender mejor su estructura.
Output: (truncado)
También podemos utilizar el tokenizador para verificar nuestro proceso y comprobar el número de tokens presentes en cada fragmento. Este paso es opcional y tiene fines demostrativos.
Resultado:
¡Genial! Parece que los tamaños de los fragmentos se han implementado correctamente.
Para la fragmentación recursiva, podemos utilizar RecursiveCharacterTextSplitter de LangChain. Al igual que en el ejemplo de fragmentación de tamaño fijo, podemos experimentar con diferentes tamaños de fragmentación y superposición.
Resultado:
El divisor fragmentó correctamente el texto utilizando los separadores predeterminados: [“\n\n”, “\n”, “ “, “”].
La fragmentación semántica requiere un modelo de embedding o codificador. Podemos utilizar el modelo granite-embedding-30m-english como modelo de embedding. También podemos imprimir uno de los fragmentos para comprender mejor su estructura.
Output: (truncado)
Los documentos de diferentes tipos de archivo son compatibles con los divisores de texto basados en documentos de LangChain. Para este tutorial, utilizaremos un archivo Markdown. Para ver ejemplos de división recursiva de JSON, división de código y división de HTML, consulte la documentación de LangChain.
Un ejemplo de un archivo Markdown que podemos cargar es el archivo README para Granite 3.1 en GitHub de IBM.
Resultado:
Ahora, podemos usar MarkdownHeaderTextSplitter de LangChain para dividir el archivo por tipo de encabezado, que establecemos en la lista headers_to_split_on. También imprimiremos uno de los fragmentos como ejemplo.
Resultado:
Como puede ver en el output, la fragmentación dividió correctamente el texto por tipo de encabezado.
Ahora que hemos experimentado con varias estrategias, sigamos adelante con nuestra implementación de RAG. Para este tutorial, elegiremos los fragmentos producidos por la división semántica y los convertiremos en embeddings. Un almacén de vectores de código abierto que podemos utilizar es Chroma DB. Podemos acceder fácilmente a la funcionalidad de Chroma a través del paquete langchain_chroma.
Inicialicemos nuestra base de datos de vectores Chroma, proporcionémosle nuestro modelo de embeddings y añadamos nuestros documentos producidos por fragmentación agéntica.
Resultado:
A continuación, podemos pasar a crear una plantilla de instrucción para nuestro LLM. Esta plantilla de instrucción nos permite hacer varias preguntas sin alterar la estructura inicial de la instrucción. También podemos proporcionar nuestro almacén de vectores como el recuperador. Este paso finaliza la estructura RAG.
Usando nuestro flujo de trabajo RAG completo, invoquemos una consulta de usuario. En primer lugar, podemos estimular estratégicamente el modelo sin ningún contexto adicional del almacén de vectores que hemos creado para comprobar si el modelo está utilizando su conocimiento integrado o realmente el contexto RAG. El blog de anuncios de Granite 3.1 hace referencia a Docling, la herramienta de IBM para analizar varios tipos de documentos y convertirlos en Markdown o JSON. Preguntemos al LLM sobre Docling.
Resultado:
Claramente, el modelo no fue entrenado con información sobre Docling y sin herramientas o información externas, no puede proporcionarnos esta información. Ahora, intentemos proporcionar la misma consulta a la cadena RAG que construimos.
Resultado:
¡Genial! El modelo Granite utilizó correctamente el contexto RAG para darnos la información correcta sobre Docling al tiempo que preservaba la coherencia semántica. Demostramos que este mismo resultado no era posible sin el uso de RAG.
En este tutorial, usted creó un pipeline RAG y experimentó con varias estrategias de fragmentación para mejorar la precisión de recuperación del sistema. Utilizando el modelo Granite 3.1, producimos con éxito respuestas de modelo adecuadas a una consulta de usuario relacionada con los documentos proporcionados como contexto. El texto que utilizamos para esta implementación de RAG se cargó desde un blog en ibm.com que anunciaba el lanzamiento de Granite 3.1. El modelo nos proporcionó información a la que solo se podía acceder a través del contexto proporcionado, ya que no formaba parte de la base de conocimientos inicial del modelo.
Quienes deseen obtener más información pueden consultar los resultados de un proyecto en el que se compara el rendimiento de los LLM con fragmentación estructurada HTML frente a la fragmentación watsonx.
Entrene, valide, ajuste e implemente IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de nueva generación para desarrolladores de IA. Cree aplicaciones de IA en menos tiempo y con menos datos.
Ponga la IA a trabajar en su negocio con la experiencia líder en IA del sector de IBM y junto a su cartera de soluciones.
Reinvente las operaciones y flujos de trabajo críticos añadiendo IA para maximizar las experiencias, la toma de decisiones en tiempo real y el valor empresarial.