Эффективное использование языковых моделей в заметках Obsidian
Сегодня я прочитал статью на Hacker News о новом плагине для Obsidian, который интегрируется с ChatGPT. На рынке существует довольно много подобных инструментов, и я рад видеть, как люди по-разному применяют их в Obsidian. Они могут помочь людям наладить связи и придать больше глубины содержанию ваших заметок. Некоторые комментаторы считают, что это заменит вам работу, которую вы бы делали самостоятельно, но я думаю, что на самом деле это дает вам новые и удивительные возможности.
Диалог с примечаниями
Возможно, самое прямое и самое важное, что вы хотите сделать, - это вести диалог с содержимым ваших заметок. Задавайте вопросы, чтобы понять суть. Было бы очень удобно, если бы модель можно было направить прямо на ваши заметки, и тогда все будет в порядке. Но большинство моделей не могут справиться со всем сразу.
Когда у вас возникает вопрос, не все заметки имеют отношение к делу. Вам нужно найти релевантные части и отправить их в модель. Obsidian предоставляет функцию поиска, но она ищет только точные слова и фразы, а нам нужно искать концепции. Именно здесь на помощь приходят встроенные индексы. Создать индекс на самом деле довольно просто.
Создание индексатора
Когда вы создаете плагин для Obsidian, вы можете настроить его на выполнение определенных действий при запуске, а затем на выполнение других действий, когда вы выполняете команды, открываете заметки или выполняете другие действия в Obsidian. Поэтому мы хотим, чтобы плагин сразу же понимал ваши заметки и сохранял прогресс, чтобы не генерировать индекс снова. Давайте посмотрим на пример кода, который показывает, как создать индекс для наших заметок. Здесь я использую [Индекс ламы], [LangChain] также является отличным выбором.
import { VectorStoreIndex, serviceContextFromDefaults, storageContextFromDefaults, MarkdownReader } из "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)
Во-первых, нам нужно инициализировать хранилище данных in-memory. Это хранилище, которое поставляется с индексом Llama, но также популярным выбором является Chroma DB. Вторая строка кода указывает на то, что мы хотим сохранять все в индексе. Далее получаем путь к файлу и инициализируем ридер, который затем считывает файл. Llama Index понимает Markdown, поэтому он может правильно читать и индексировать содержимое. Он также поддерживает PDF-файлы, текстовые файлы, документы Notion и многое другое. Он не только хранит слова, но и понимает их значение и связь с другими словами в тексте.
await VectorStoreIndex.fromDocuments(thedoc, { storageContext: storage_context, serviceContext: service_context });
Эта часть кода использует один из сервисов OpenAI, но он отделен от ChatGPT и использует другую модель и продукт. Langchain также предлагает альтернативы для локального выполнения этой задачи, хотя и немного медленнее. Ollama также предлагает встраивание. Вы также можете использовать эти сервисы на супербыстром хостинговом экземпляре в облаке, а затем отключить его по завершении индексации.
Поисковые заметки
Мы проиндексировали этот файл. Obsidian может перечислить все файлы, поэтому мы можем запускать этот процесс снова и снова. Мы сохраняем данные, поэтому нам нужно выполнить операцию только один раз. Как теперь задать вопрос? Нам нужен код, который перейдет к соответствующей части наших заметок, передаст ее модели и использует эту информацию для получения ответа.
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 = `Используйте следующий текст, чтобы придумать ответ на подсказку: ${response.map(r => r.node.toJSON().text).join(" - ")}`.
В этом коде мы используем обработанное содержимое для инициализации индекса. Строка `Retriever.retrieve` будет использовать подсказки для поиска всех релевантных фрагментов заметок и возвращать нам текст. Здесь мы задаем использование первых 5 лучших совпадений. Таким образом, я получу 5 фрагментов текста из заметок. С помощью этих исходных данных мы можем сгенерировать системную подсказку, которая подскажет модели, как она должна ответить, когда мы зададим вопрос.
const оллама = new Ollama().
ollama.setModel("ollama2");
ollama.setSystemPrompt(systemPrompt);
const genout = await ollama.generate(prompt);
Далее мы начали работать с моделями. Я использовал модель, которую создал несколько дней назад в [npm] на библиотеке. Я установил модель для использованиялама2Он был загружен на мою машину командой `ollama pull llama2`. Вы можете поэкспериментировать с различными моделями, чтобы найти ответ, который подходит вам лучше всего.
Чтобы получить быстрый ответ, следует выбрать небольшую модель. Но в то же время следует выбирать модель с достаточно большим размером входного контекста, чтобы вместить все фрагменты текста. Я задал до 5 текстовых фрагментов по 256 лексем. Системная подсказка включает в себя наши текстовые фрагменты. Просто задайте вопрос и получите ответ в течение нескольких секунд.
Отлично, теперь наш плагин Obsidian может отображать ответы соответствующим образом.
Что еще мы можем сделать?
Вы также можете упростить содержание текста или найти ключевые слова, которые лучше всего подходят к тексту, и добавить их в метаданные, чтобы лучше связать заметки воедино. Я попробовал составить 10 полезных вопросов и ответов и отправить их на [Энки] Возможно, вам захочется попробовать разные модели и подсказки для достижения этих разных целей. Очень легко менять подсказки и даже вес моделей в зависимости от задач.
Надеюсь, этот пост дал вам некоторое представление о том, как разработать свой следующий замечательный плагин для Obsidian или других инструментов для ведения заметок. Как вы можете видеть в [ollama.comЯ хочу, чтобы вы продемонстрировали свою креативность, используя новейшие инструменты искусственного интеллекта.
© заявление об авторских правах
Авторское право на статью Круг обмена ИИ Пожалуйста, не воспроизводите без разрешения.
Похожие статьи
Нет комментариев...