PdfGptIndexer - Indexación y consultas sobre documentos PDF con OpenAI embeddings y FAISS
(github.com/raghavan)- Una herramienta para indexar y consultar documentos PDF, que implementa un sistema RAG para conversar con documentos PDF usando OpenAI embeddings y FAISS
- Extrae texto de una carpeta de PDFs, lo divide en fragmentos de 1000 caracteres con un solapamiento de 200 caracteres, luego genera embeddings con el modelo
text-embedding-ada-002de OpenAI y los guarda en un índice FAISS local - En la etapa de consulta, carga el índice vectorial FAISS guardado, convierte la pregunta en embeddings, encuentra los 3 fragmentos de documento más similares y luego muestra la puntuación de similitud y fragmentos de texto
- La generación de respuestas funciona sintetizando una respuesta coherente con GPT-4 a partir del contexto recuperado
- Al guardar los embeddings localmente, no es necesario volver a generarlos en cada consulta; después de la creación inicial, es posible consultar los datos sin acceso a internet de OpenAI y solo se requiere una llamada a la API para generar la respuesta
- El flujo de ejecución básico consiste en procesar los PDFs con
python indexer.pypara crear la base de datos vectorial, y luego iniciar la interfaz interactiva de consultas conpython chatbot.py- La carpeta de PDFs y la ubicación donde se guarda el índice se pueden especificar como argumentos de línea de comandos
- Solo hace falta volver a ejecutar el indexador cuando se agregan nuevos PDFs a la colección
- Los requisitos de ejecución son Python 3.8 o superior y una API key de OpenAI, configurada mediante el valor
OPENAI_API_KEYen el archivo.env
1 comentarios
Opiniones de Hacker News
Lo más frustrante es que casi todas las apps que copian este tipo de idea son OpenAI obligatorio
Ojalá ya pararan con eso
Las opciones que requieren OpenAI o la nube deberían dejarse como una configuración avanzada, “técnicamente posible pero bastante engorrosa”; si se invierte eso y se deja como predeterminado, habría muchos más usuarios
Creo que este tipo de app debería venir por defecto con ejecución completamente local, y permitir cambiar al modelo de Hugging Face que quieras con solo modificar una cadena en un archivo
.tomlSi de verdad hace falta OpenAI, bastaría con habilitarlo mediante un cambio de configuración y alguna forma de gestionar claves como Docker secret o una cadena
passEl valor predeterminado debería ser local-first: procesar lo más posible de forma local y solo enviar a OpenAI una cantidad mínima de tokens del prompt consolidado cuando el usuario realmente lo quiera
Las empresas más grandes necesitan escalabilidad, y aun así es difícil competir con los precios de OpenAI
Alguien con mentalidad emprendedora podría montar una startup de OpenLLaMA que ofrezca cobro por solicitud, ajuste fino y almacenamiento vectorial
Ya pasamos la etapa de lo “asombroso”; ahora quiero terminar el trabajo de forma eficiente
Por lo que he probado hasta ahora, el único modelo que me ha permitido hacer trabajo de forma medianamente confiable ha sido GPT-4
No sé si yo soy el torpe, o si en HN se están haciendo ilusiones al decir que otros LLM son mucho mejores en calidad, consistencia y confiabilidad para trabajo real
Supongo que es el resultado de que OpenAI no tenga su propio programa de certificación
Ahora mismo OpenAI ofrece uno de los mejores y más baratos embeddings para proyectos personales
Una vez creados los vectores, si quieres puedes salirte por completo de la nube
LangChain ya abstrajo ese punto problemático, así que el generador de embeddings se puede cambiar en cualquier momento
El resto ya usa Hugging Face, y puede reemplazarse por otros modelos distintos de GPT-2 que soporten prompts
Hay que mantener los datos privados y no filtrarlos a terceros. Para eso se puede usar algo como privateGPT. Tiene 32 mil estrellas en GitHub
Si la clave no es mía, entonces los datos tampoco son míos
“Interactúa con tus documentos de forma privada usando el poder de GPT, 100% privado, sin filtraciones de datos”[0]
[0] https://github.com/imartinez/privateGPT
Todavía no es así
¿Podrá extraer contexto para entender preguntas sobre logs recientes?
Todavía no he conseguido una de la serie M, así que me pregunto si sería mejor correrlo en un entorno de cómputo en la nube con GPU
Algo como escribir la documentación y luego simplemente hacer preguntas sobre su contenido
Viendo el nivel de paranoia que muestran quienes tienen poder respecto a los LLM locales, no me sorprendería nada que la telemetría de Windows informara sobre lo que la gente hace con ellos
Me parece que quien crea lo contrario es demasiado ingenuo
¿Mis datos personales se están enviando a OpenAI? ¿No es eso un problema serio?
No parece prudente a menos que se elimine de los datos toda la información personal sensible. ¿Me estoy perdiendo de algo?
Política de uso de datos: https://openai.com/policies/api-data-usage-policies
Política de uso de datos por modelo: https://platform.openai.com/docs/models/how-we-use-your-data
Más que confirmar si hace falta o no una clave de OpenAI, ¿hay alguna forma de saber con más detalle cómo se usan los datos personales?
El README es muy confuso
Dice que usa el tokenizador de GPT-2 y que GPT-2 se usa como modelo de embeddings, pero al ver el código parece que usa por defecto
OpenAIEmbeddingsde LangChain y un LLM de OpenAI¿No serían text-embedding-ada-002 y text-davinci-003, respectivamente?
No entiendo para nada qué papel cumple GPT-2 aquí
GPT-2 solo se usa durante la tokenización para calcular de forma eficiente la longitud de los tokens
¿Hay alguna empresa que ofrezca esto como versión alojada?
La verdad sí quiero bastante una IA pequeña a la que pueda darle todos mis datos y hacerle preguntas.
También tiene funciones de conveniencia como integración con Google Drive, videos de YouTube, etc.
Tiene más de 50 mil usuarios activos al día.
No entiendo. GPT-2 es uno de los pocos modelos públicos de OpenAI, así que se puede ejecutar localmente de inmediato; ¿por qué usar la API para esto?
https://github.com/openai/gpt-2
Se usa
from langchain.embeddings import OpenAIEmbeddings, y eso corresponde a la API de embeddings de OpenAI, text-embedding-ada-002.La única parte donde aparece GPT-2 es
GPT2TokenizerFast.from_pretrained("gpt2"), y solo se usa como función de longitud para contar tokens dentro de la utilidadRecursiveCharacterTextSplitter()de LangChain.Eso tampoco tiene mucho sentido. No entiendo por qué usar un tokenizador de GPT-2 aquí.
Bastaría con contar caracteres o contar palabras con base en
.split(). En este caso, la forma de contar no importa demasiado.GPT-2 solo se usa para calcular de forma eficiente la longitud de los tokens durante el proceso de tokenización.
Ya actualicé el README para reflejar esto con precisión.
¿Soy el único que no necesita buscar en todos sus datos? ¿Cuál sería el caso de uso aquí?
En el trabajo hay un grupo donde se discuten varios temas de inversión, y el organizador tiene muy buenos contactos, así que intenta traer ponentes externos cada semana. Es bastante educativo.
Tengo las notas en bruto de cada charla, y el objetivo era revisarlas y organizar bien ese conocimiento en algo tipo wiki.
Ya pasaron 3 años desde que empecé, pero todavía no he sacado el tiempo, y siendo realista, probablemente tampoco lo haga en el futuro.
Para buscar información en esas notas podría usar búsqueda de texto, pero es demasiado sensible a la cadena de búsqueda y muchas veces no encuentro lo que quiero.
Si la información está repartida en varios archivos, además tengo que abrir todos los resultados y revisarlos uno por uno.
Con una tecnología así, puedes meter todas las notas en una base de datos vectorial y preguntar en lenguaje natural por lo que necesites.
El sistema local interpreta la pregunta, encuentra en la base de datos los documentos más relevantes y luego envía la pregunta junto con los resultados a OpenAI para interpretar la consulta y encontrar la respuesta dentro de las notas.
Hace tiempo hice una prueba de concepto con LangChain y funcionó. Hubo un momento de “ajá” cuando una vez respondió combinando información que estaba dispersa entre dos charlas distintas.
El problema es que hay demasiados parámetros ajustables y todavía no se me ocurre una forma o una métrica para evaluar el rendimiento del sistema. Agradecería consejos.
Estas notas no contienen información personal, así que no hay problema de privacidad.
También he querido montar algo parecido sobre más de 20 años de correos, pero por privacidad no lo he hecho. Además uso un indexador de correo llamado notmuch, así que la necesidad de IA tampoco es tan grande.
Pero para otras notas no personales, si logro que este sistema funcione bastante bien, podría ser un salvavidas.
Durante años he creado demasiadas notas sobre muchos temas, y el simple hecho de no tener que organizarlas bien ya tiene un valor económico real.
Solo déjame tomar notas, y que la IA encuentre luego lo que necesito.
A veces sabes dónde están, pero hay demasiados, y lo único que necesitas es una explicación rápida sobre algo.
A veces hay muchos datos de distintas fuentes, y lo que quieres al final es un resumen de en qué coinciden la mayoría o todas, o un resumen de en qué difieren.
Hay muchos casos de uso, y creo que como estamos acostumbrados a las formas tradicionales de resolver estas tareas, muchas veces su utilidad no se vuelve un momento de “se me prendió el foco” hasta que uno se mete de lleno y ve lo que es posible.
El alcance es bastante amplio. Personalmente, el proyecto en el que estoy trabajando también es una variante de esto: meter años de notas personales y diarios para hacer consultas orientadas a la autorreflexión y el crecimiento personal.
Creo que hay muchísimo potencial en toda esta área.
¿Alguien sabe cómo se comparan Milvus, Quickwit y Pinecone?
Estoy pensando si habrá oportunidades de consultoría relacionadas con LLM, ajuste fino/búsqueda vectorial y chatbots para negocios locales
También quiero crear una herramienta donde puedas arrastrar y soltar archivos para obtener inferencia personalizada fácilmente
Hace poco me apareció https://gpt-trainer.com/ en mi feed de LinkedIn, y también vi algunos otros para documentos
https://www.explainpaper.com/
https://www.konjer.xyz/
No quiero competir por precio
Estaría genial servir un LLM open source local en una 3090, pero no tendría escalabilidad
¿Han visto otras startups de ajuste fino o de contexto de búsqueda vectorial?
Siento que las diferencias en embeddings se notarían más por lo que uses para generarlos que por la alternativa de almacenamiento/búsqueda
Por ejemplo, usar cosas como las de aquí https://news.ycombinator.com/item?id=36649579 en lugar de la API de embeddings de OpenAI
Fuera del rendimiento a gran escala, el costo, las preferencias personales o la experiencia de desarrollador, no se me ocurre mucha diferencia entre las alternativas de almacenamiento/búsqueda de embeddings
Es la primera vez que escucho de Quickwit; viendo rápido su sitio, no parece un almacén vectorial y probablemente tenga menos relación
Para herramientas para crear un ChatGPT personalizado, puedes ver mi lista: https://llm-utils.org/List+of+tools+for+making+a+%22ChatGPT+...
En ajuste fino como servicio, está Lamini AI, orientada a empresas
Como otra startup de embeddings, está Weaviate
Creo que Milvus, Quickwit y Pinecone están más orientados a empresas y son más difíciles de usar
Hay modelos locales de embeddings más rápidos y más precisos, así que no entiendo por qué tener una dependencia de OpenAI
Trabajo en una empresa que actúa como una capa de seguridad entre los datos corporativos sensibles y los LLM
No importa si el modelo es HF, ChatGPT o Bard, ni si el medio son datos conversacionales, PDF o una base de conocimiento como Notion
Ocultamos los datos sensibles para evitar usos riesgosos y al mismo tiempo hacemos verificación de hechos
Si eso es el tipo de cosa que buscas, puedo presentártelos. tothepoint.tech