1 puntos por GN⁺ 2023-07-10 | 1 comentarios | Compartir por WhatsApp
  • 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-002 de 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.py para crear la base de datos vectorial, y luego iniciar la interfaz interactiva de consultas con python 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_KEY en el archivo .env

1 comentarios

 
GN⁺ 2023-07-10
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 .toml
    Si 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 pass
    El 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

    • Es difícil competir. Si una empresa pequeña quiere procesar 10 mil solicitudes de chatbot, las opciones son pagarle menos de 50 dólares al mes a OpenAI, o administrar GPUs en la nube y contratar a un ingeniero de machine learning para gastar más de 1000 dólares al mes, o poner una 4090 local debajo del escritorio de alguien y asumir un costo fijo de 1500 dólares sin fiabilidad
      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
    • Me pregunto qué están haciendo, más allá de simples experimentos, para realizar trabajo realmente útil con otros LLM
      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
    • Parece que no lo hicieron para lanzar un producto real, sino para meter una línea en el CV que demuestre experiencia con OpenAI
      Supongo que es el resultado de que OpenAI no tenga su propio programa de certificación
    • ¿No bastaría con conectar LocalAI a https://mudler.pm/posts/smart-slackbot-for-teams/?
    • La única “basura” de OpenAI que se usa aquí es para la generación de embeddings
      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

    • Está bastante por debajo de los productos de OpenAI, y ya me cansé de que hablen como si estos modelos ya fueran completamente intercambiables entre sí
      Todavía no es así
    • Me pregunto si esto es lo bastante robusto como para meter todos los correos y registros de chat y conversar con ellos
      ¿Podrá extraer contexto para entender preguntas sobre logs recientes?
    • Me pregunto cómo corre en una Mac Intel. Uso un i9 de 6 núcleos
      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
    • Sería buenísimo si pudiera usarse con Confluence
      Algo como escribir la documentación y luego simplemente hacer preguntas sobre su contenido
    • Lo de 100% privado me genera dudas
      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?

  • 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 OpenAIEmbeddings de 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í

    • El modelo de embeddings que se usa es el embedding por defecto de la API de OpenAI, text-embedding-ada-002
      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.

  • 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

    • No se está usando GPT-2. El README está mal.
      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 utilidad RecursiveCharacterTextSplitter() 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.
    • El modelo de embeddings usado es text-embedding-ada-002, el embedding predeterminado de la API de OpenAI.
      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.
    • Asumo que GPT-4 dará mejores respuestas a las preguntas que GPT-2.
  • ¿Soy el único que no necesita buscar en todos sus datos? ¿Cuál sería el caso de uso aquí?

    • Un ejemplo de caso de uso sería este:
      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 tienes los datos, pero no sabes dónde están.
      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?

    • Pinecone y Milvus pueden ser alternativas a usar FAISS en el componente de almacenamiento y 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
    • Estoy haciendo una DB vectorial simple solo con numpy: https://github.com/sdan/vlite
      Creo que Milvus, Quickwit y Pinecone están más orientados a empresas y son más difíciles de usar
    • Creo que qdrant es mejor
  • Hay modelos locales de embeddings más rápidos y más precisos, así que no entiendo por qué tener una dependencia de OpenAI

    • ¿Qué modelos?
  • 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