Hoje li um artigo no Hacker News sobre um novo plugin para a Obsidian que se integra ao ChatGPT. Há várias dessas ferramentas no mercado e fico feliz em ver as diferentes maneiras como as pessoas as estão aplicando à Obsidian. Elas podem ajudar as pessoas a fazer conexões e dar mais profundidade ao conteúdo de suas notas. Alguns comentaristas acham que isso substituirá o trabalho que você faria por conta própria, mas acho que, na verdade, isso oferece recursos novos e surpreendentes.
Diálogo com anotações
Talvez a coisa mais direta e mais importante que você queira fazer seja dialogar com o conteúdo de suas anotações. Faça perguntas para obter insights. Seria muito conveniente poder apontar esse modelo diretamente para suas anotações e, assim, tudo estaria bem. Mas a maioria dos modelos não consegue lidar com tudo ao mesmo tempo.
Quando você tem uma pergunta, nem todas as anotações são relevantes. A Obsidian oferece uma função de pesquisa, mas ela só pesquisa palavras e frases exatas; o que precisamos pesquisar são conceitos. É aí que entram os índices incorporados. Criar um índice é, na verdade, bastante simples.
Criação do indexador
Ao criar um plugin da Obsidian, você pode configurá-lo para executar determinadas ações na inicialização e, em seguida, executar outras ações quando você executar comandos, abrir notas ou realizar outras atividades na Obsidian. Portanto, queremos que o plugin entenda suas anotações logo de cara e salve o progresso para que não seja necessário gerar o índice novamente. Vamos dar uma olhada em um exemplo de código que mostra como criar um índice para nossas anotações. Estou usando aqui o [Índice Llama], [LangChain] também é uma excelente opção.
importar { VectorStoreIndex, serviceContextFromDefaults, storageContextFromDefaults, MarkdownReader } de "llamaindex" ;
const service_context = serviceContextFromDefaults({ chunkSize: 256 })
const storage_context = await storageContextFromDefaults({ persistDir: ". /storage" });const mdpath = process.argv[2];
const mdreader = new MarkdownReader();
const thedoc = await mdreader.loadData(mdpath)
Em primeiro lugar, precisamos inicializar um data warehouse na memória. Esse é o recurso de armazenamento que vem com o Llama Index, mas o Chroma DB também é uma opção popular. A segunda linha de código indica que queremos manter tudo no índice. Em seguida, obtenha o caminho do arquivo e inicialize um leitor que lerá o arquivo. O Llama Index entende Markdown, portanto, pode ler e indexar o conteúdo corretamente. Ele também é compatível com PDFs, arquivos de texto, documentos do Notion e muito mais. Ele não apenas armazena palavras, mas também entende seu significado e sua relação com outras palavras no texto.
await VectorStoreIndex.fromDocuments(thedoc, { storageContext: storage_context, serviceContext: service_context });
Agora, essa parte do código usa um dos serviços da OpenAI, mas ele é separado do ChatGPT e usa um modelo e um produto diferentes. A Langchain também oferece alternativas para fazer isso localmente, embora um pouco mais lentas. Você também pode usar esses serviços em uma instância auto-hospedada super-rápida na nuvem e, em seguida, desligar a instância quando a indexação estiver concluída.
Notas de pesquisa
A Obsidian pode listar todos os arquivos para que possamos executar esse processo várias vezes. Estamos mantendo os dados, portanto, só precisamos operar uma vez. Agora, como fazemos a pergunta? Precisamos de algum código que vá até a parte relevante das nossas anotações, entregue-a ao modelo e use essas informações para obter uma resposta.
const storage_context = await storageContextFromDefaults({ persistDir: ". /storage" });
const index = await VectorStoreIndex.init({ storageContext: storage_context });
const ret = index.asRetriever();
ret.similarityTopK = 5
const prompt = process.argv[2];
const response = await ret.retrieve(prompt);
const systemPrompt = `Use o texto a seguir para ajudar a encontrar uma resposta para o prompt: ${response.map(r => r.node.toJSON().text).join(" - ")}`
Nesse código, usamos o conteúdo processado para inicializar o índice. A linha `Retriever.retrieve` usará as dicas para localizar todos os trechos relevantes das notas e nos retornará o texto. Aqui, configuramos para usar as primeiras 5 melhores correspondências. Portanto, receberei 5 trechos de texto das anotações. Com esses dados brutos, podemos gerar um prompt do sistema para orientar o modelo sobre como ele deve responder quando fizermos uma pergunta.
const ollama = new Ollama().
ollama.setModel("ollama2");
ollama.setSystemPrompt(systemPrompt);
const genout = await ollama.generate(prompt);
Em seguida, começamos a trabalhar com modelos. Usei um modelo que criei há alguns dias em [npm] na biblioteca. Configurei o modelo para usarlhama2Ele foi baixado em minha máquina com o comando `ollama pull llama2`. Você pode fazer experiências com modelos diferentes para encontrar a resposta que funciona melhor para você.
Para obter uma resposta rápida, você deve escolher um modelo pequeno. Mas, ao mesmo tempo, você também deve escolher um modelo com um tamanho de contexto de entrada grande o suficiente para conter todos os fragmentos de texto. Configurei até 5 trechos de texto de 256 tokens. O prompt do sistema inclui nossos trechos de texto. Basta fazer uma pergunta e obter uma resposta em segundos.
Ótimo, agora nosso plug-in Obsidian pode exibir as respostas adequadamente.
O que mais podemos fazer?
Você também pode simplificar o conteúdo do texto ou encontrar as melhores palavras-chave que correspondam ao seu texto e adicioná-las aos metadados para poder vincular melhor suas anotações. Tentei elaborar 10 perguntas e respostas úteis e enviá-las para [Anki] Talvez você queira experimentar modelos e avisos diferentes para atingir essas diferentes finalidades. É muito fácil alterar as dicas e até mesmo os pesos dos modelos de acordo com as necessidades da tarefa.
Espero que esta publicação tenha lhe dado algumas dicas sobre como desenvolver seu próximo plug-in excelente para a Obsidian ou outras ferramentas de anotações. Como você pode ver em [ollama.com...] visto que usar as mais recentes ferramentas nativas de IA é muito fácil, e quero que você me mostre sua criatividade.