Si bien la cantidad de loaders que contiene LangChain crece cada vez más, aún hay formatos que no se encuentran soportados (Como los Json Lines o JSONL). A continuación vamos a crear un loader propio que cargue ese tipo específico de datos.

Creando un Document Loader personalizado

Para leer archivos jsonlines desde Python instalaremos su respectiva librería.

%%capture
!pip install jsonlines

Importaremos la clase Document, la librería jsonlines y tiparemos un poco los datos para tener control y readibilidad del código.

from langchain.schema import Document
import jsonlines
from typing import List

Crearemos una clase nativa que llamada TransformersDocsJSONLLoader, esta contendrá el método init y load. En el constructor pediremos el filename y en el método load cargaremos todos los datos desde disco y los agregaremos a un objeto Document.

Para cada línea del jsonlines obtendremos el contenido desde la keyword text y crearemos metadata para almacenar el título, el dueño y el nombre de los diferentes repos (si existen), finalmente los acoplaremos en un objeto Document para retornar una lista de este objeto.

class TransformersDocsJSONLLoader:
  def __init__(self, file_path : str):
    self.file_path = file_path
  
  def load(self) -> List[Document]:
    with jsonlines.open(self.file_path) as reader:
      documents = []
      for obj in reader:
        page_content = obj.get("text", "")
        metadata = {
            "title" : obj.get("title", ""),
            "repo_owner" : obj.get("repo_owner", ""),
            "repo_name" : obj.get("repo_name", "")
        }
        documents.append(
            Document(page_content=page_content, metadata=metadata)
        )
    return documents

Probando el nuevo loader