PdfGptIndexer - Indexação e consulta de documentos PDF com embeddings da OpenAI e FAISS
(github.com/raghavan)- Ferramenta para indexar e consultar documentos PDF, implementando um sistema RAG que permite conversar com documentos PDF usando embeddings da OpenAI e FAISS
- Extrai texto de uma pasta de PDFs, divide em chunks de 1000 caracteres com sobreposição de 200 caracteres e gera embeddings com o modelo OpenAI
text-embedding-ada-002, armazenando-os em um índice FAISS local - Na etapa de consulta, carrega o índice vetorial FAISS salvo, converte a pergunta em embedding, encontra os 3 chunks de documento mais semelhantes e exibe a pontuação de similaridade e trechos de texto
- A geração de respostas funciona sintetizando uma resposta coerente com base no contexto recuperado pelo GPT-4
- Como os embeddings ficam armazenados localmente, não é necessário gerá-los novamente a cada consulta; após a criação inicial, é possível consultar os dados sem acesso à internet da OpenAI, sendo necessária chamada à API apenas para gerar a resposta
- O fluxo básico de execução é processar os PDFs com
python indexer.pypara criar o banco de dados vetorial e iniciar a interface interativa de consulta compython chatbot.py- A pasta de PDFs e o local de armazenamento do índice podem ser definidos por argumentos de linha de comando
- Basta executar novamente o indexador apenas quando novos PDFs forem adicionados à coleção
- Os requisitos de execução são Python 3.8 ou superior e uma chave de API da OpenAI, configurada pelo valor
OPENAI_API_KEYno arquivo.env
1 comentários
Comentários do Hacker News
O mais frustrante é que quase todos os apps que copiam esse tipo de ideia são dependentes da OpenAI
Já deu disso
Se a opção que exige OpenAI ou nuvem ficasse como algo do tipo “tecnicamente possível, mas uma configuração avançada bem incômoda”, e o padrão fosse o contrário, muito mais gente usaria
Acho melhor que apps assim tenham execução totalmente local como padrão, com a possibilidade de trocar para o modelo da Hugging Face que a pessoa quiser mudando só uma string no arquivo
.tomlSe realmente precisar da OpenAI, isso poderia ser habilitado com alguma forma de gerenciamento de chaves, como Docker secret ou uma cadeia com
pass, junto com mudança de configuraçãoO padrão deveria ser local-first, processando o máximo possível localmente e só enviando para a OpenAI uma quantidade mínima de tokens de prompts consolidados quando o usuário realmente quiser
Empresas maiores precisam de escalabilidade e, mesmo assim, é difícil competir com o preço da OpenAI
Alguém com perfil de fundador poderia até criar uma startup de OpenLLaMA com cobrança por requisição, fine-tuning e armazenamento vetorial
Já passamos da fase da novidade e agora eu só quero terminar o trabalho com eficiência
Pelo que testei até agora, o único modelo que consegue fazer o trabalho com alguma consistência é o GPT-4
Não sei se sou eu que ainda sou inexperiente ou se é só o otimismo típico do HN imaginando que outros LLMs são muito melhores em qualidade, consistência e confiabilidade para trabalho real
Imagino que isso aconteça porque a OpenAI não tem um programa próprio de certificação
Hoje a OpenAI oferece um dos melhores e mais baratos embeddings para projetos pessoais
Depois que os vetores são gerados, se quiser, dá para abandonar a nuvem completamente
O LangChain abstrai esse ponto de incômodo, então o gerador de embeddings pode ser trocado a qualquer momento
O resto já usa Hugging Face, e pode ser substituído por outros modelos além do GPT-2 com suporte a prompts
Os dados precisam continuar privados e não vazar para terceiros. Dá para usar algo como o privateGPT. Tem 32 mil estrelas no GitHub
Se a chave não é minha, então os dados também não são meus
“Interaja com seus documentos de forma privada usando o poder do GPT, 100% privado, sem vazamento de dados”[0]
[0] https://github.com/imartinez/privateGPT
Ainda não são
Será que consegue extrair contexto para entender perguntas sobre logs recentes?
Ainda não consegui um da série M, então estou pensando se seria melhor rodar em um ambiente de computação em nuvem com GPU
Tipo escrever a documentação e depois só fazer perguntas sobre o conteúdo
Pelo nível de paranoia que as autoridades demonstram com LLMs locais, eu não ficaria nem um pouco surpreso se a telemetria do Windows reportasse o que as pessoas estão fazendo com LLMs locais
Quem acha que não está acontecendo me parece ingênuo demais
Isso manda meus dados pessoais para a OpenAI? Isso não é um problema sério?
Não parece uma boa ideia, a menos que você remova todas as informações pessoais sensíveis dos dados. Estou deixando passar alguma coisa?
Política de uso de dados: https://openai.com/policies/api-data-usage-policies
Política de uso de dados por modelo: https://platform.openai.com/docs/models/how-we-use-your-data
Existe alguma forma mais detalhada de entender como os dados pessoais são usados além de só verificar se precisa ou não de uma chave da OpenAI?
O README está muito confuso
Diz que usa o tokenizer do GPT-2 e o GPT-2 como modelo de embeddings, mas olhando o código parece que o padrão é usar
OpenAIEmbeddingsdo LangChain e um LLM da OpenAINão seriam text-embedding-ada-002 e text-davinci-003, respectivamente?
Não faço a menor ideia de onde o GPT-2 entra nisso aqui
O GPT-2 é usado apenas no processo de tokenização para calcular o tamanho dos tokens com eficiência
Existe alguma empresa que ofereça isso em versão hospedada?
Quero bastante uma IA pequena na qual eu possa colocar todos os meus dados e fazer perguntas
Também tem recursos de conveniência, como integração com Google Drive, vídeos do YouTube etc.
Tem mais de 50 mil usuários ativos por dia
Não entendi. O GPT-2 é um dos poucos modelos públicos da OpenAI, então dá para rodar localmente direto; por que usar a API para isso?
https://github.com/openai/gpt-2
Está usando
from langchain.embeddings import OpenAIEmbeddings, e isso é a API de embeddings da OpenAI, text-embedding-ada-002A única parte em que o GPT-2 aparece é
GPT2TokenizerFast.from_pretrained("gpt2"), usado como função de comprimento para contar tokens no utilitárioRecursiveCharacterTextSplitter()do LangChainIsso também não faz muito sentido. Não sei por que usar um tokenizador do GPT-2 aqui
Só contar caracteres ou contar palavras com base em
.split()já seria suficiente. Aqui, a forma de contagem não é tão importanteO GPT-2 é usado apenas para calcular com eficiência o comprimento dos tokens durante o processo de tokenização
Atualizei o README para refletir isso corretamente
Sou o único que não precisa pesquisar em todos os meus dados? Qual é o caso de uso disso aqui?
No trabalho, há um grupo que discute vários temas de investimento, e o organizador tem bons contatos e tenta trazer palestrantes externos toda semana. É bem educativo
Tenho as anotações brutas de cada apresentação, e o objetivo era revisar essas anotações e organizar o conhecimento de forma adequada, como em um wiki
Já se passaram 3 anos desde que comecei, mas ainda não arrumei tempo, e sendo realista, é bem possível que eu nunca arrume
Para encontrar informação nessas anotações, eu poderia usar busca de texto, mas ela é sensível demais à string de busca e muitas vezes não encontra o que quero
Se a informação estiver espalhada por vários arquivos, é preciso abrir e examinar todos os resultados da busca
Com esse tipo de tecnologia, dá para colocar todas as anotações em um banco de dados vetorial e perguntar em linguagem natural o que você precisa
O sistema local interpreta a pergunta, encontra os documentos mais relevantes no banco e envia a pergunta e os resultados da busca para a OpenAI, para interpretar a pergunta e encontrar a resposta nas anotações
Eu já fiz uma prova de conceito com LangChain no passado, e funcionou. Houve um momento de "aha" quando ele respondeu juntando informações espalhadas por duas apresentações diferentes
Minha dificuldade é que há parâmetros demais para ajustar, e ainda não pensei em uma forma ou métrica para avaliar o desempenho do sistema. Aceito conselhos
Essas anotações não têm informações pessoais, então não há problema de privacidade
Eu gostaria de configurar algo parecido também para mais de 20 anos de e-mails, mas não fiz isso por questões de privacidade. Além disso, uso um indexador de e-mail chamado notmuch, então a necessidade de IA não é tão grande assim
Mas para outras anotações não pessoais, isso pode ser uma mão na roda, se eu conseguir fazer o sistema funcionar bem
Ao longo dos anos, produzi anotações demais sobre muitos assuntos, e não precisar organizá-las bem tem um valor que dá para converter em dinheiro de verdade
Basta me deixar escrever as anotações e depois deixar a IA encontrar o que eu precisar
Às vezes você sabe onde os dados estão, mas há dados demais, e o que você precisa é só uma explicação rápida sobre algo
Às vezes há muitos dados de várias fontes, e no fim o que você quer é um resumo do que a maioria ou todas elas dizem, ou um resumo de como elas diferem entre si
Há muitos casos de uso, e acho que, como estamos acostumados com as formas tradicionais de lidar com esse tipo de tarefa, a utilidade nem sempre vira aquele momento de “acender a lâmpada” até você se aprofundar e ver as possibilidades por conta própria
O escopo é bem amplo. Pessoalmente, um projeto em que estou trabalhando é uma variação disso: colocar anos de anotações pessoais e diários e fazer consultas para autorreflexão e crescimento pessoal
Acho que há muito potencial em toda essa área
Alguém sabe como Milvus, Quickwit e Pinecone se comparam?
Estou pensando se existem oportunidades de consultoria relacionadas a LLMs, ajuste fino/busca vetorial e chatbots para negócios locais
Também quero criar uma ferramenta em que você arrasta e solta arquivos para obter inferência personalizada com facilidade
Recentemente apareceu no meu feed do LinkedIn o https://gpt-trainer.com/ e vi também algumas outras para documentos
https://www.explainpaper.com/
https://www.konjer.xyz/
Não quero competir por preço
Seria legal também oferecer um LLM open source local em uma 3090, mas isso não teria escalabilidade
Vocês já viram outras startups de ajuste fino ou de contexto de busca vetorial?
Acho que você vai sentir mais diferença em relação aos embeddings pelo que usar para gerá-los do que pelas alternativas de armazenamento/busca
Por exemplo, usar coisas como as daqui https://news.ycombinator.com/item?id=36649579 em vez da API de embeddings da OpenAI
Fora desempenho em larga escala, custo, preferência pessoal ou experiência do desenvolvedor, não me vem à mente muita diferença entre as alternativas de armazenamento/busca de embeddings
Nunca tinha ouvido falar de Quickwit, mas olhando rapidamente o site, não parece um armazenamento vetorial e provavelmente é menos relacionado
Para ferramentas de criação de ChatGPT customizado, veja a minha lista: https://llm-utils.org/List+of+tools+for+making+a+%22ChatGPT+...
Em ajuste fino como serviço, há a Lamini AI, voltada para empresas
Outra startup de embeddings é a Weaviate
Acho que Milvus, Quickwit e Pinecone são mais voltados para uso corporativo e são difíceis de usar
Existem modelos locais de embeddings mais rápidos e mais precisos, então não entendo por que manter a dependência da OpenAI
Trabalho em uma empresa que atua como uma camada de segurança entre dados corporativos sensíveis e LLMs
Não importa se o modelo é HF, ChatGPT ou Bard, nem se o meio são dados de conversa, PDFs ou uma base de conhecimento como o Notion
Ocultamos dados sensíveis para evitar usos arriscados e ao mesmo tempo fazemos verificação factual
Se é esse tipo de coisa que você procura, posso te apresentar: tothepoint.tech