Utilisation efficace des modèles linguistiques dans les notes Obsidian
Aujourd'hui, j'ai lu un article sur Hacker News à propos d'un nouveau plugin pour Obsidian qui intègre ChatGPT. Il existe un certain nombre d'outils de ce type sur le marché et je suis heureux de voir les différentes façons dont les gens les appliquent à Obsidian. Ils peuvent aider les gens à établir des liens et vous donner plus de profondeur dans le contenu de vos notes. Certains commentateurs pensent que cela remplacera le travail que vous feriez autrement par vous-même, mais je pense que cela vous offre en fait des capacités nouvelles et étonnantes.
Dialogue avec notes
La chose la plus directe et la plus importante à faire est peut-être d'établir un dialogue avec le contenu de vos notes. Posez des questions pour mieux comprendre. Il serait très pratique de pouvoir diriger ce modèle directement sur vos notes et tout irait bien. Mais la plupart des modèles ne peuvent pas tout traiter en même temps.
Lorsque vous avez une question, toutes les notes ne sont pas pertinentes. Obsidian propose une fonction de recherche, mais elle ne recherche que des mots et des phrases exacts, alors que ce sont des concepts qu'il nous faut rechercher. C'est là que les index intégrés entrent en jeu. La création d'un index est en fait assez simple.
Construction de l'indexeur
Lorsque vous créez un plugin Obsidian, vous pouvez le configurer pour qu'il effectue certaines actions au démarrage, puis d'autres actions lorsque vous exécutez des commandes, ouvrez des notes ou effectuez d'autres activités dans Obsidian. Nous voulons donc que le plugin comprenne vos notes dès le départ, et qu'il enregistre sa progression afin de ne pas avoir à générer à nouveau l'index. Regardons un exemple de code qui montre comment construire un index pour nos notes. J'utilise ici la méthode [Index des lamas], [LangChainLe [...] est également un excellent choix.
import { VectorStoreIndex, serviceContextFromDefaults, storageContextFromDefaults, MarkdownReader } from "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)
Tout d'abord, nous devons initialiser un entrepôt de données en mémoire. Il s'agit de l'installation de stockage fournie avec l'index Llama, mais Chroma DB est également un choix populaire. La deuxième ligne de code indique que nous voulons persister tout ce qui se trouve dans l'index. L'index Llama comprend le langage Markdown, il peut donc lire et indexer le contenu correctement. Il prend également en charge les PDF, les fichiers texte, les documents Notion, etc. Il ne se contente pas de stocker les mots, mais comprend également leur signification et leur relation avec d'autres mots dans le texte.
await VectorStoreIndex.fromDocuments(thedoc, { storageContext : storage_context, serviceContext : service_context }) ;
Cette partie du code utilise l'un des services d'OpenAI, mais il est distinct de ChatGPT et utilise un modèle et un produit différents. Langchain offre également des alternatives pour faire cela localement, bien que ce soit un peu plus lent. Vous pouvez également utiliser ces services sur une instance auto-hébergée ultra-rapide dans le nuage, puis fermer l'instance lorsque l'indexation est terminée.
Notes de recherche
Obsidian peut répertorier tous les fichiers, ce qui nous permet d'exécuter ce processus à plusieurs reprises. Nous persistons dans les données, de sorte que nous n'avons besoin d'opérer qu'une seule fois. Maintenant, comment poser la question ? Nous avons besoin d'un code qui va chercher la partie pertinente de nos notes, la transmet au modèle et utilise cette information pour obtenir une réponse.
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 = `Utilisez le texte suivant pour vous aider à trouver une réponse à l'invite : ${response.map(r => r.node.toJSON().text).join(" - ")}`
Dans ce code, nous utilisons le contenu traité pour initialiser l'index. La ligne `Retriever.retrieve` utilisera les indices pour trouver toutes les bribes de notes pertinentes et nous retournera le texte. Ici, nous avons choisi d'utiliser les 5 premières correspondances. J'obtiendrai donc 5 extraits de texte à partir des notes. Avec ces données brutes, nous pouvons générer une invite système pour guider le modèle sur la façon dont il doit répondre lorsque nous posons une question.
constante ollama = new Ollama().
ollama.setModel("ollama2") ;
ollama.setSystemPrompt(systemPrompt) ;
const genout = await ollama.generate(prompt) ;
Ensuite, nous avons commencé à travailler avec des modèles. J'ai utilisé un modèle que j'ai créé il y a quelques jours dans [npmsur la bibliothèque. J'ai paramétré le modèle pour qu'il utiliselama2Il a été téléchargé sur ma machine avec la commande `ollama pull llama2`. Vous pouvez expérimenter avec différents modèles pour trouver la réponse qui vous convient le mieux.
Pour obtenir une réponse rapide, vous devez choisir un petit modèle. Mais en même temps, vous devez également choisir un modèle dont la taille du contexte d'entrée est suffisamment grande pour contenir tous les fragments de texte. J'ai configuré jusqu'à 5 fragments de texte de 256 tokens. L'invite du système inclut nos fragments de texte. Il suffit de poser une question pour obtenir une réponse en quelques secondes.
Super, maintenant notre plugin Obsidian est capable d'afficher les réponses de manière appropriée.
Que pouvons-nous faire d'autre ?
Vous pouvez également envisager de simplifier le contenu de votre texte ou de trouver les meilleurs mots-clés correspondant à votre texte et de les ajouter aux métadonnées afin de mieux relier vos notes entre elles. J'ai essayé de rédiger 10 questions et réponses utiles et de les envoyer à [Anki] Vous pouvez essayer différents modèles et messages-guides pour atteindre ces différents objectifs. Il est très facile de modifier les indices et même le poids des modèles en fonction des besoins de la tâche.
J'espère que ce billet vous a permis de mieux comprendre comment développer votre prochain plugin pour Obsidian ou d'autres outils de prise de notes. Comme vous pouvez le voir dans [ollama.comL'utilisation des derniers outils d'IA natifs est un jeu d'enfant, et je veux que vous me fassiez part de votre créativité.
© déclaration de droits d'auteur
Article copyright Cercle de partage de l'IA Tous, prière de ne pas reproduire sans autorisation.
Articles connexes
Pas de commentaires...