AI personal knowledge base: RAG по личному тексту
AI personal knowledge base можно собрать вокруг одного текстового файла: в нём есть даты, заметки, задачи и контекст. Для небольших архивов достаточно поиска и ручной вставки фрагментов в модель. RAG нужен, когда файл стал большим или когда вы хотите автоматизировать поиск и ответы с цитатами.
Когда хватит обычного поиска
Начните с простого. Найдите нужные записи через rg или grep, передайте модели несколько фрагментов и задайте вопрос. Для файла на несколько сотен килобайт этого часто достаточно.
rg -n "проект X|TODO|Идея" everything.txt | head -40
RAG имеет смысл, когда файл не помещается в контекст, когда нужно отвечать по сотням документов или когда поиск должен работать автоматически по запросу. Для десяти заметок сложная система будет дороже ручного поиска.
| Подход | Когда подходит | Плюсы | Минусы |
|---|---|---|---|
| Поиск и вставка вручную | Небольшой файл, редкие вопросы | Просто, прозрачно, без зависимостей | Нужно каждый раз искать самому |
| Передать файл целиком | Файл помещается в контекст | Модель видит весь текст | Дорого и медленно на больших файлах |
| RAG | Большой архив, частые вопросы, автоматизация | Находит нужные фрагменты и цитирует их | Нужно поддерживать индекс и проверять ответы |
Как устроен RAG
Схема простая: текст разбивается на части, для каждой части строится векторное представление, представления сохраняются в хранилище. На вопрос система находит несколько ближайших фрагментов и передаёт их модели вместе с вопросом.
- Разбить файл на фрагменты.
- Построить эмбеддинги для каждого фрагмента.
- Сохранить векторы и метаданные.
- Найти несколько ближайших фрагментов по вопросу.
- Передать фрагменты модели и попросить ответ с цитатами.
Последний шаг важен. Модель должна отвечать по найденным фрагментам, а не по своей памяти. Иначе вы получите красивый ответ, который не связан с вашими записями.
Как разбивать OBTF
Не режьте файл по случайным символам. Лучше делить его по смыслу: по датам, заголовкам или блокам записей. Один фрагмент может содержать от нескольких абзацев до одной страницы текста.
- Сохраняйте дату и источник в метаданных.
- Добавляйте небольшой перехлёст между соседними фрагментами, чтобы не терять контекст на границе.
- Не смешивайте разные проекты в одном фрагменте, если их можно разделить.
- Для бумажных заметок храните номер страницы и ссылку на скан.
Метаданные важнее размера фрагмента. Если модель знает дату и источник, ответ можно проверить. Если нет, цитата превращается в догадку.
Эмбеддинги и хранилище
Эмбеддинг превращает фрагмент текста в набор чисел. Похожие по смыслу фрагменты оказываются рядом в векторном пространстве. Для русских и английских текстов подойдут модели nomic-embed-text, bge-m3 и другие многоязычные варианты.
Для хранения можно использовать Chroma, LanceDB или sqlite-vec. Для небольшого личного архива подойдёт и простой файл с векторами, но готовое хранилище экономит время.
Локальный вариант
Если данные не должны покидать компьютер, используйте локальные модели. Ollama умеет запускать и генеративную модель, и модель эмбеддингов.
ollama pull llama3.1
ollama pull nomic-embed-text
ollama run llama3.1
Дальше нужен небольшой скрипт: он читает файл, разбивает его на фрагменты, получает эмбеддинги, сохраняет их и ищет ближайшие записи. Скрипт можно написать на Python или другом языке, который вам удобен. Главное, чтобы он сохранял метаданные и не терял исходный текст.
Локальный вариант медленнее облачного, но приватнее. Для чувствительных заметок это часто важнее скорости.
Внешние модели
Внешние модели проще в настройке и обычно сильнее. Но текст уходит на чужой сервер. Не отправляйте пароли, ключи и чужие персональные данные. Проверьте настройки хранения и обучения на ваших данных, если они есть.
Для облачного варианта можно использовать API модели и отдельный сервис эмбеддингов. Схема остаётся той же: найти фрагменты, передать их модели, получить ответ со ссылками на даты и записи.
Запросы с цитатами
Хороший запрос требует опоры на текст. Примеры:
- «Ответь только по предоставленным фрагментам. Для каждого утверждения укажи дату и источник».
- «Найди открытые задачи по проекту X. Верни дату, задачу и следующий шаг».
- «Сравни решения по теме Y за последние полгода. Покажи, что изменилось».
- «Если в тексте нет ответа, скажи об этом. Не придумывай факты».
После ответа проверьте цитаты по файлу. Модель может перепутать дату, склеить два фрагмента или добавить вывод, которого не было.
Конфиденциальность и безопасность
Индекс содержит те же данные, что и исходный файл. Если файл зашифрован, индекс тоже нужно защищать. Не храните эмбеддинги в открытом виде, если в заметках есть чувствительная информация.
Для локального варианта держите модели и индекс на своём диске. Для облачного проверьте, кто имеет доступ к аккаунту, и включите двухфакторную аутентификацию. Подробнее о шифровании есть в отдельном руководстве.
Ограничения
- Индекс устаревает после массовых правок, его нужно пересобирать.
- Распознавание рукописного текста может добавить ошибки в базу.
- Модель может выдумать факт, даже если фрагменты найдены правильно.
- Большой индекс требует памяти и времени на поиск.
- Метаданные могут потеряться при неправильной разбивке.
- RAG не заменяет резервные копии и проверку источников.
Контрольный список
- Понятно, зачем нужен RAG, а не обычный поиск.
- Файл разбит по смыслу, с датами и источниками.
- Эмбеддинги и индекс защищены так же, как исходные заметки.
- Модель получает инструкцию отвечать по тексту и цитировать источник.
- Ответы проверяются по OBTF и сканам.
- Есть план пересборки индекса после больших изменений.
Если вы ещё выбираете между обычным поиском и RAG, начните с поиска через grep и rg. Если хотите связать бумажный блокнот с моделями, посмотрите руководство про блокнот, OBTF и LLM.
Начните с готового файла. В шаблоне уже есть дата, маркеры и примеры записей.