En este tutorial, experimentará con varias estrategias de fragmentación utilizando LangChain y el modelo más reciente de IBM® Granite ahora disponible en watsonx.ai. El objetivo general es realizar la generación aumentada por recuperación (RAG, por sus siglas en inglés).
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. La RAG es una técnica de procesamiento de lenguaje natural (PLN) que combina la recuperación de información y los modelos de lenguaje grandes (LLM) para recuperar información relevante de conjuntos de datos complementarios para optimizar la calidad de la salida del LLM. Para gestionar documentos grandes, podemos usar la fragmentación para dividir el texto en fragmentos más pequeños de fragmentos significativos. Estos fragmentos de texto se pueden incorporar y almacenar en una base de datos vectorial mediante el uso de un modelo de incorporación. Finalmente, el sistema RAG puede usar 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 de LLM. Algunos procesos de fragmentación comúnmente utilizados incluyen:
Si bien puede elegir entre varias herramientas, este tutorial lo guiará a través de cómo configurar una cuenta de IBM para usar un Jupyter Notebook.
Inicie sesión en watsonx.ai con su cuenta de IBM Cloud.
Cree un proyecto watsonx.ai.
Puede obtener su ID de proyecto desde dentro de su proyecto. Haga clic en la pestaña Manage. Luego, copie el ID del proyecto de la sección Details de la página General. Necesita este ID para este tutorial.
Cree un Jupyter Notebook.
Este paso abrirá un entorno de Notebook donde podrá copiar el código de este tutorial. También puede descargar este notebook 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 y los conjuntos de datos utilizados se pueden encontrar en GitHub.
Cree una instancia de servicio watsonx.ai Runtime (seleccione la región adecuada y elija el plan Lite, que es una instancia gratuita).
Genere una clave de API.
Asocie la instancia del servicio watsonx.ai Runtime al proyecto que creó en watsonx.ai.
Para establecer nuestras credenciales, necesitamos el WATSONX_APIKEY y WATSONX_PROJECT_ID que generó en el paso 1. También estableceremos la URL que sirve como endpoint de la API.
Usaremos Granite 3.1 como nuestro LLM para este tutorial. Para inicializar el LLM, necesitamos establecer los parámetros del modelo. Para aprender más sobre estos parámetros del modelo, como los límites mínimo y máximo de tokens, consulte la documentación.
El contexto que estamos utilizando para nuestro pipeline de RAG es el anuncio oficial de IBM para el lanzamiento de Granite 3.1. Podemos cargar el blog a 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 la fragmentación de tamaño fijo, podemos usar CharacterTextSplitter de LangChain y establecer un chunk_size, así como un chunk_overlap. El tamaño del fragmento se mide por el número de caracteres. Siéntase libre de experimentar con diferentes valores. También estableceremos que el separador sea el carácter de nueva línea para que podamos diferenciar entre párrafos. Para la tokenización, podemos usar el tokenizador granite-3.1-8b-instruct . El tokenizador desglosa el texto en tokens que el LLM puede procesar.
Podemos imprimir uno de los fragmentos para comprender mejor su estructura.
Salida: (truncada)
También podemos usar el tokenizador para verificar nuestro proceso y la cantidad de tokens presentes en cada fragmento. Este paso es opcional y tiene fines demostrativos.
Resultado:
¡Excelente! Parece que nuestros tamaños de fragmentos se implementaron adecuadamente.
Para la fragmentación recursiva, podemos usar 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 incorporación o codificador. Podemos usar el modelo granite-embedding-30m-english como nuestro modelo de incorporación. También podemos imprimir uno de los fragmentos para comprender mejor su estructura.
Salida: (truncada)
Los documentos de varios tipos de archivos son compatibles con los divisores de texto basados en documentos de LangChain. Para los fines de 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 resultado, 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 incorporaciones vectoriales. Un almacén de vectores de código abierto que podemos usar es Chroma DB. Podemos acceder fácilmente a la funcionalidad de Chroma a través del paquete langchain_chroma.
Inicialicemos nuestra base de datos vectorial Chroma, proporcionemos nuestro modelo de incorporación y agreguemos nuestros documentos producidos por fragmentación semántica.
Resultado:
A continuación, podemos crear una plantilla de instrucciones para nuestro LLM. Esta plantilla de instrucciones nos permite hacer varias preguntas sin alterar la estructura inicial de las instrucciones. También podemos proporcionar nuestro almacén de vectores como el recuperador. Este paso finaliza la estructura de RAG.
Usando nuestro flujo de trabajo de RAG completo, invoquemos una consulta de usuario. En primer lugar, podemos dar una instrucción estratégica al modelo sin ningún contexto adicional del almacén de vectores que construimos para probar si el modelo está utilizando su conocimiento incorporado o realmente el contexto de 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 de RAG que creamos.
Resultado:
¡Excelente! El modelo Granite utilizó correctamente el contexto de RAG para darnos información correcta sobre Docling mientras preservaba la coherencia semántica. Probamos que este mismo resultado no era posible sin el uso de RAG.
En este tutorial, creó un pipeline de RAG y experimentó con varias estrategias de fragmentación para mejorar la precisión de recuperación del sistema. Con el modelo Granite 3.1, producimos correctamente 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 puede acceder a través del contexto proporcionado, ya que no formaba parte de la base de conocimientos inicial del modelo.
Para aquellos que buscan lecturas adicionales, consulte los resultados de un proyecto que compara el rendimiento de LLM mediante fragmentación estructurada HTML en comparación con la fragmentación de watsonx.
Entrene, valide, ajuste y despliegue IA generativa, modelos fundacionales y capacidades de machine learning con IBM watsonx.ai, un estudio empresarial de próxima generación para creadores de IA. Diseñe aplicaciones de IA en menos tiempo y con menos datos.
Ponga la IA a trabajar en su negocio con la experiencia en IA líder en la industria y la cartera de soluciones de IBM a su lado.
Reinvente los flujos de trabajo y las operaciones críticas añadiendo IA para maximizar las experiencias, la toma de decisiones en tiempo real y el valor empresarial.