45:57Chase AI
Log in to leave a comment
No posts yet
Ao construir um sistema RAG em ambiente local, o primeiro obstáculo que você encontrará é a capacidade da VRAM e os terríveis conflitos de versão entre bibliotecas. Modelos de quantização de 8 bits consomem cerca de 1GB de VRAM para cada 1 bilhão de parâmetros. Considerando o consumo do próprio Windows ou macOS, é recomendável deixar pelo menos 20% de espaço livre. Sem essa folga, você verá um desempenho desastroso, com a velocidade de geração de tokens rastejando a cerca de 2 por segundo. Em particular, o framework lightrag-hku costuma apresentar erros de runtime quando encontra versões recentes do numpy 2.x.
Primeiro, abra o terminal e fixe a versão digitando pip install numpy==1.26.4 --force-reinstall. Em seguida, instale o nest_asyncio e adicione nest_asyncio.apply() no topo do seu código. Se não fizer isso, o loop assíncrono no Jupyter Notebook entrará em conflito, travando todo o processo. Se a memória da sua GPU for inferior a 8GB, ao inicializar o LightRAG, configure o embedding_batch_num para 10 ou menos e o llm_model_max_async para cerca de 4. Apenas com esses ajustes, você pode evitar o fenômeno OOM (Out Of Memory), onde o sistema morre sem motivo aparente, economizando pelo menos 2 horas de trabalho perdido.
Simplesmente salvar o texto em blocos faz com que o contexto entre as informações seja perdido. No entanto, se você analisar corretamente a estrutura de wikilinks ([[link]]) do Obsidian, poderá criar um grafo de conhecimento bastante sofisticado. A chave é remover símbolos Markdown desnecessários antes que o LLM os leia. Limpar esses caracteres sujos pode economizar quase 30% do consumo de tokens.
Ao criar notas, crie o hábito de incluir campos como type e domain na seção YAML superior. Isso altera drasticamente a velocidade de filtragem na busca. Use o padrão r"\[\[(.+?)\]\]" no módulo re do Python para extrair as conexões entre documentos e converta-as em um dataset de relacionamentos no formato JSONL. O nome do arquivo também é importante. Em vez de datas como '2024-04-14', use o tema central do conhecimento como título para que os nós indexados cumpram seu papel. Dados conectados dessa forma permitem inferências que transcendem simples buscas, navegando entre conceitos.
Ao rodar um LLM local, o maior desperdício é gastar tempo calculando embeddings que já foram processados. O cache padrão do Python é perdido assim que o programa é fechado. Por isso, você deve usar o DiskCache, baseado em SQLite, para criar um armazenamento físico. Projete o sistema para que, se a similaridade de cosseno entre as perguntas ultrapassar 0,95, ele retorne a resposta em cache imediatamente, sem chamar o LLM. Ao aplicar esse cache semântico, o tempo de resposta pode ser reduzido para cerca de 100ms.
O método é simples. Instale a biblioteca com pip install diskcache e crie uma classe para armazenar pares de texto de embedding e vetores. É ainda melhor se você misturar um algoritmo de decaimento temporal:
A lógica deve ser estruturada para que notas recém-editadas apareçam no topo dos resultados de busca. Definindo um TTL (Time To Live) de 1 hora para o cache de embeddings e 2 horas para o cache de respostas geradas, você terá um sistema de resposta instantânea para perguntas repetitivas.
Diagramas de arquitetura ou capturas de tela contidos nas notas carregam muito mais informação do que o texto. Deixá-los fora da busca é uma perda. Usando o modelo CLIP, você pode posicionar imagens e textos no mesmo espaço vetorial, permitindo encontrar imagens relevantes apenas digitando "fluxograma de dados". Se não tiver uma GPU de alto desempenho, pode converter o modelo CLIP-ViT-B-32 para o formato OpenVINO e rodá-lo na CPU.
Ao encontrar o caminho de uma imagem em um arquivo Markdown, agrupe cerca de 200 caracteres de texto antes e depois dela. Em seguida, use um VLM local leve, como o Phi-3.5-vision, para extrair automaticamente a legenda da imagem. Salve este vetor de legenda e o vetor de características da imagem juntos em um DB vetorial local como o Qdrant. Através deste processo, até figuras complexas difíceis de descrever apenas com texto serão incluídas nos resultados da busca.
Reindexar todo o cofre (vault) cada vez que você edita um único arquivo é ineficiente. Usando a biblioteca watchdog do Python, você pode detectar o momento em que um arquivo é salvo e atualizar apenas a parte alterada. No entanto, como a CPU gritaria se a indexação rodasse continuamente enquanto você escreve, o tratamento de debouncing é essencial.
Ao escrever o script, use o watchdog.observers para monitorar a pasta e, quando ocorrer um evento de modificação, aguarde cerca de 5 segundos antes de iniciar a tarefa. Salve o valor de hash SHA-256 de cada arquivo separadamente e inclua um processo de comparação para verificar se o conteúdo realmente mudou. Selecione apenas os arquivos com hashes diferentes, remova os nós antigos e insira os novos vetores. Com isso, você terá uma base de conhecimento em tempo real que reflete as alterações assim que você salva a nota. Isso significa que não há necessidade de pressionar manualmente um botão de atualização.