Por lo que he podido probar, de momento los modelos generativos locales están lejos de acercarse al rendimiento de los modelos de OpenAI, GPT-3 y GPT-4.
Por otro lado el API de OpenAI impone un límite al tamaño de nuestras preguntas que, dependiendo del modelo que empleemos, será menor o mayor. Con GPT-3.5 no puedes sobrepasar los 4096 tokens; con gpt-3.5-turbo-16k, en cambio, cuadruplican el límite. Según la documentación este último te permitiría enviar unas doce mil palabras de golpe. Por lo menos si el texto está escrito en inglés: la transformación de palabras a tokens depende de los tipos de caracteres, y puede haber diferencias notables según el idioma que utilicemos.
Pongamos que quiero que GPT use como referencia un texto que sobrepasa el límite impuesto, por ejemplo un documento de varias páginas desconocido —o sea con el que no haya sido entrenado el modelo. La solución pasaría por utilizar una base de datos vectorial.
¿Qué es una base de datos vectorial y por qué son tan buenas en el manejo de datos desestructurados? Un vector o incrustación (embedding) es una matriz de números capaz de representar datos más complejos como texto, imágenes, audio o incluso video. En el caso del texto, estas representaciones están diseñadas para capturar las relaciones semánticas y sintácticas entre las palabras, lo que permite que los algoritmos comprendan y procesen el lenguaje de manera más efectiva. Simplificando, los modelos incrustadores (embedding models) asignan palabras a vectores numéricos, donde las palabras similares se ubican más cerca unas de otras. El propio OpenAI ofrece un API de modelos incrustadores.
Dado que GPT puede recuperar información de una base de datos vectorial, la pregunta hecha al API también se incrustará y, en función de la búsqueda de similitud, el recuperador (retriever) devolverá las incrustaciones con los datos para responder la pregunta. Después de esto, el LLM podrá devolver una respuesta coherente y bien estructurada.
Esto que parece tan complicado, la biblioteca de programación de Langchain lo resuelve en pocas líneas. De modo que si queremos consultar un documento almacenado en nuestro disco duro, bastaría con estas líneas de código
1 2 3 4 5 6 7 |
from langchain.indexes import VectorstoreIndexCreator from langchain.document_loaders import TextLoader loader = TextLoader("documento.txt") index = VectorstoreIndexCreator().from_loaders([loader]) query = "Haz un resumen del texto" print(index.query(query)) |
Además de cargar el texto de un fichero, Langchain dispone de otros «cargadores» como WebBaseLoader o HuggingFaceDatasetLoader, que cargan el texto a partir de la dirección de una página web o un conjunto de datos de Hugging Face.
VectorstoreIndexCreator es un componente utilizado para crear un índice que permita consultar documentos de texto. Divide los documentos en partes más pequeñas, genera las incrustaciones (es decir, representaciones numéricas) para cada documento y almacena los documentos y sus incrustaciones en un vectorstore, que luego se puede consultar para recuperar documentos relevantes.
Con los datos del documento indexados, ahora podemos utilizar el método de consulta query. De esta manera la consulta se limitará al contenido del texto, el modelo «solo» conoce su contenido, no podrías por ejemplo preguntarle por textos relacionados. Si quisieras hacerlo, deberías añadir un segundo argumento al método query en el que se especifica el LLM que queremos usar.
1 2 3 4 5 6 7 8 9 |
from langchain.indexes import VectorstoreIndexCreator from langchain.document_loaders import TextLoader from langchain.chat_models import ChatOpenAI loader = TextLoader("documento.txt") index = VectorstoreIndexCreator().from_loaders([loader]) query = "Haz un resumen del texto" llm = ChatOpenAI(client=self.open_ai_model, temperature=0.3, max_tokens=2000) print(index.query(query, llm=self.llm)) |
Aquí he mostrado una versión muy simplificada de cómo aprovechar un base de datos vectorial (abstraída por Langchain). Tanto el vectostore como el retriever o el troceado en chunks se podrían definir más acorde con nuestras necesidades. Por último, no olvidemos que, aunque el documento se encuentre en nuestro disco duro, su contenido viajará por internet y pasará por las manos de OpenAI. Tenedlo en cuenta sobretodo si estáis tratando con datos sensibles.