Creación de Índice Vectorial con Langchain y Embeddings

Clase 19 de 37Curso de LangChain

Resumen

¿Cómo se crea un índice de Chroma a partir de documentos JSON-L?

Comenzar con un proyecto de indexación de documentos puede parecer una tarea compleja, pero con las herramientas adecuadas, se puede simplificar en gran medida. La meta es transformar una base de datos JSON-L en un índice de Chroma que pueda procesar consultas de usuario de manera eficiente. ¡Veamos cómo hacerlo!

¿Cómo preparar los documentos?

En primer lugar, es esencial tener un ambiente de programación listo y la base de datos, en este caso, un archivo JSON-L. Nuestro primer paso es convertir este archivo en un formato que Langchain pueda procesar.

  • Conversión a formato Langchain: Esto se logra mediante una función de Python que cargue los documentos desde un path especificado. Supongamos que llamamos a esta función loadDocuments. Esta función utiliza docs.json.lloader para convertir cada línea del JSON-L en un document de Langchain.
def loadDocuments(filePath):
    from utils import docs.json.loader
    loader = docs.json.loader(filePath)
    data = loader.load()
    return data

¿Cómo dividir los documentos?

Una vez que los documentos están en formato adecuado, es necesario dividirlos en fragmentos más pequeños. Esto se hace para que puedan ser procesados por embeddings, que convertirán los documentos en números.

  • Uso de un text splitter: Utilizamos recursive character text splitter de Langchain. Este nos permite establecer un chunk_size adecuado, que para embeddings grandes como los de OpenAI puede ser de 1600 caracteres.
from langchain.textsplitters import recursive_character_text_splitter

text_splitter = recursive_character_text_splitter(chunk_size=1600, chunk_overlap=160)
split_documents = text_splitter.split_documents(data)

¿Cómo obtener el path correcto de los documentos?

Para facilitar el proceso, podemos definir una función que obtenga automáticamente el path correcto hacia nuestros documentos. Esta puede ser una función simple de utils, por ejemplo, getFilePath.

from utils import getFilePath

file_path = getFilePath()
print("Path to documents:", file_path)

¿Cómo verificar el proceso?

Es importante verificar cuántos fragmentos de documentos tenemos y cómo se ve uno en detalle. Esto nos ayuda a entender que el proceso de división se ha llevado a cabo correctamente.

def main():
    # Cargar y dividir documentos
    documents = loadDocuments(getFilePath())
    split_documents = split_documents(documents)

    # Imprimir resultados
    print("Número total de documentos:", len(split_documents))
    print("Primer documento:", split_documents[0])

A través de estos pasos, pasamos de tener un archivo JSON-L grande a más de 1800 fragmentos de documentos, cada uno con información clave como el contenido de la página y metadatos sobre el creador y el repositorio asociado. Este proceso nos prepara para la próxima etapa que incluye la conversión de esos documentos en embeddings y su almacenamiento en una base de datos vectorial como Chroma.

¿Está todo listo? ¡Es hora de seguir explorando y avanzar hacia la creación de un modelo de chat efectivo!