Heute habe ich einen Artikel auf Hacker News über ein neues Plugin für Obsidian gelesen, das mit ChatGPT integriert ist. Es gibt eine ganze Reihe solcher Tools auf dem Markt, und ich freue mich über die verschiedenen Möglichkeiten, wie sie in Obsidian eingesetzt werden. Sie können Menschen dabei helfen, Verbindungen zu knüpfen und Ihren Notizen mehr Tiefe verleihen. Einige Kommentatoren sind der Meinung, dass dies die Arbeit ersetzt, die man sonst selbst machen würde, aber ich denke, dass dies tatsächlich neue und erstaunliche Möglichkeiten bietet.
Dialog mit Notizen
Die vielleicht direkteste und wichtigste Maßnahme, die Sie ergreifen sollten, ist ein Dialog mit dem Inhalt Ihrer Notizen. Stellen Sie Fragen, um Erkenntnisse zu gewinnen. Es wäre sehr bequem, wenn Sie dieses Modell direkt auf Ihre Notizen richten könnten, und dann wäre alles gut. Aber die meisten Modelle können nicht alles auf einmal verarbeiten.
Wenn Sie eine Frage haben, sind nicht alle Notizen relevant. Obsidian bietet zwar eine Suchfunktion, aber sie sucht nur nach genauen Wörtern und Sätzen, während wir nach Konzepten suchen müssen. An dieser Stelle kommen eingebettete Indizes ins Spiel. Das Erstellen eines Indexes ist eigentlich ganz einfach.
Aufbau des Indexers
Wenn Sie ein Obsidian-Plugin erstellen, können Sie es so einstellen, dass es bestimmte Aktionen beim Start ausführt und dann andere Aktionen ausführt, wenn Sie Befehle ausführen, Notizen öffnen oder andere Aktivitäten in Obsidian durchführen. Wir wollen also, dass das Plugin Ihre Notizen von Anfang an versteht, und dass es seinen Fortschritt speichert, so dass es den Index nicht erneut erzeugen muss. Schauen wir uns ein Codebeispiel an, das zeigt, wie wir einen Index für unsere Notizen erstellen. Ich verwende hier die [Lama-Index], [LangChain] ist ebenfalls eine ausgezeichnete Wahl.
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)
Zunächst müssen wir ein In-Memory-Data-Warehouse initialisieren. Dies ist die Speichereinrichtung, die mit dem Llama-Index geliefert wird, aber auch Chroma DB ist eine beliebte Wahl. Die zweite Codezeile zeigt an, dass wir alles im Index speichern wollen. Als Nächstes holen wir uns den Dateipfad und initialisieren einen Reader, der die Datei liest. Llama Index versteht Markdown, so dass es den Inhalt korrekt lesen und indizieren kann. Es unterstützt auch PDFs, Textdateien, Notion-Dokumente und mehr. Es speichert nicht nur Wörter, sondern versteht auch ihre Bedeutung und ihre Beziehung zu anderen Wörtern im Text.
await VectorStoreIndex.fromDocuments(thedoc, { storageContext: storage_context, serviceContext: service_context });
Dieser Teil des Codes nutzt einen der Dienste von OpenAI, aber er ist von ChatGPT getrennt und verwendet ein anderes Modell und Produkt.Langchain bietet auch Alternativen, um dies lokal zu tun, wenn auch etwas langsamer.Ollama bietet auch Einbettung. Sie können diese Dienste auch auf einer superschnellen, selbst gehosteten Instanz in der Cloud nutzen und die Instanz dann herunterfahren, wenn die Indizierung abgeschlossen ist.
Hinweise zur Suche
Obsidian kann alle Dateien auflisten, so dass wir diesen Vorgang immer wieder durchführen können. Wir halten die Daten fest, so dass wir nur einmal arbeiten müssen. Wie können wir nun die Frage stellen? Wir brauchen einen Code, der den relevanten Teil unserer Notizen aufruft, ihn an das Modell weitergibt und diese Informationen verwendet, um eine Antwort zu erhalten.
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 = `Nutzen Sie den folgenden Text, um eine Antwort auf die Frage zu finden: ${response.map(r => r.node.toJSON().text).join(" - ")}`
In diesem Code verwenden wir den verarbeiteten Inhalt, um den Index zu initialisieren. In der Zeile `Retriever.retrieve` werden die Hinweise verwendet, um alle relevanten Notenausschnitte zu finden und den Text an uns zurückzugeben. Hier wird festgelegt, dass die ersten 5 besten Treffer verwendet werden. Ich erhalte also 5 Textfragmente aus den Notizen. Mit diesen Rohdaten können wir einen Systemprompt erstellen, der dem Modell vorgibt, wie es antworten soll, wenn wir eine Frage stellen.
const ollama = new Ollama().
ollama.setModel("ollama2");
ollama.setSystemPrompt(systemPrompt);
const genout = await ollama.generate(prompt);
Als nächstes haben wir mit Modellen gearbeitet. Ich habe ein Modell verwendet, das ich vor ein paar Tagen in [npm] in der Bibliothek. Ich habe das Modell auf die Verwendung vonLama2Es wurde mit dem Befehl `ollama pull llama2` auf meinen Rechner heruntergeladen. Sie können mit verschiedenen Modellen experimentieren, um die Antwort zu finden, die für Sie am besten funktioniert.
Um eine schnelle Antwort zu erhalten, sollten Sie ein kleines Modell wählen. Gleichzeitig sollten Sie aber auch ein Modell wählen, dessen Eingabekontext groß genug ist, um alle Textfragmente aufzunehmen. Ich habe bis zu 5 Textfragmente mit jeweils 256 Token eingestellt. Die Eingabeaufforderung des Systems enthält unsere Textfragmente. Stellen Sie einfach eine Frage und erhalten Sie innerhalb von Sekunden eine Antwort.
Toll, jetzt kann unser Obsidian-Plugin die Antworten entsprechend anzeigen.
Was können wir sonst noch tun?
Sie könnten auch erwägen, Ihren Textinhalt zu vereinfachen oder die besten Schlüsselwörter zu finden, die zu Ihrem Text passen, und sie zu den Metadaten hinzuzufügen, damit Sie Ihre Notizen besser miteinander verknüpfen können. Ich habe versucht, 10 nützliche Fragen und Antworten zu formulieren und sie an [Anki] Vielleicht möchten Sie verschiedene Modelle und Aufforderungen ausprobieren, um diese unterschiedlichen Zwecke zu erreichen. Es ist sehr einfach, die Hinweise und sogar die Gewichtung der Modelle je nach den Anforderungen der Aufgabe zu ändern.
Ich hoffe, dieser Beitrag hat Ihnen einen Einblick gegeben, wie Sie Ihr nächstes großartiges Plugin für Obsidian oder andere Notizprogramme entwickeln können. Wie Sie in [ sehen könnenollama.deWie Sie sehen, ist die Verwendung der neuesten nativen KI-Tools ein Kinderspiel, und ich möchte, dass Sie mir Ihre Kreativität zeigen.