Skip to content

epic: RAG — indexing, advisor mode, knowledge base population #43

Description

@Tarasusrus

Контекст

Инфраструктура RAG уже есть: pgvector, rag_document таблица, RAGSearchSkill, rag.Retriever, rag.Store с ListPending() и UpdateEmbedding(). Проблема: никто не наполняет rag_document и нет воркера индексации.

Источники данных (раздельные пайплайны)

Тип Статус Примечание
Книги/статьи по личным финансам Приоритет 1 PDF или текст
Заметки/контекст (квартира, авто, цели) Приоритет 2 Free-form текст через бота
Транзакции Под вопросом BudgetSkill уже даёт доступ к данным — возможно не нужно

Каждый источник имеет свой metadata.type в rag_document: book, note, transaction.

Компоненты эпика

1. IndexWorker (Беклог #47)

Реализовать воркер: поллинг rag_document WHERE embedding IS NULL → embed → UpdateEmbedding().
Инфраструктура уже готова (ListPending, UpdateEmbedding), нужно только запустить в main.go.

2. Чанкинг документов (Беклог #48)

Длинные тексты (книги) нужно делить на чанки перед вставкой в rag_document.

  • Стратегия: по абзацам / фиксированный размер с overlap
  • Metadata: {type: book, title, chunk_index, total_chunks}

3. Загрузка книг — CLI/скрипт (Беклог #49)

Простой инструмент для первоначальной загрузки: go run ./cmd/ingest --file book.txt --title "Кошелёк или жизнь"
Не зависит от Telegram-транспорта.

4. Загрузка через Telegram — PDF (Беклог #50)

Пользователь пересылает PDF → бот парсит → чанкует → INSERT в rag_document.
⚠️ Зависит от Telegram-транспорта (обработка вложений). Отложено.

5. Админка / UI для управления документами (Беклог #51)

Простой веб-интерфейс или Telegram-команды для просмотра/удаления документов из базы знаний.
Отложено, но важно для поддержки контента.

6. AdvisorSkill — on-demand (Беклог #52)

Новый skill или action advise в BudgetSkill:

  • Вызывает summary + forecast для получения данных о тратах
  • Ищет релевантные советы в RAG (запрос по категориям с превышением)
  • LLM генерирует: сравнение с прогнозом, похвала/критика категорий, рекомендации из книг
  • Пример: «в этом месяце ты потратил на еду на 40% больше прогноза. По методу конвертов стоит...»

7. Проактивный советник — еженедельный (Беклог #53)

Worker или cron: каждое воскресенье вечером → запускает advisor → отправляет в Telegram.
Зависит от #52 (on-demand advisor).

Зависимости между компонентами

#47 IndexWorker
  ↑ нужен для всего
#48 Чанкинг
  ↑ нужен для #49, #50
#49 CLI загрузка ──→ #52 Advisor on-demand ──→ #53 Advisor weekly
#50 PDF via Telegram (отложено)
#51 Админка (отложено)

Архитектурные решения

Транзакции в RAG: вероятно не нужны — BudgetSkill.summary + forecast дают советнику всё необходимое. Решить при реализации #52.

Советник как отдельный Skill vs action в BudgetSkill: отдельный AdvisorSkill чище, но для MVP можно добавить action advise в BudgetSkill и вынести позже.

Хранение метаданных: metadata JSONB уже есть. Формат: {type, source_title, chunk_index, total_chunks, added_at}.

MVP последовательность (от простого к сложному)

  1. Add email #47 IndexWorker (2 часа — инфра уже есть)
  2. Add harvester for scraping email #48 + feat(telegram): add /budget /recurring /forecast /reminders commands #49 Чанкинг + CLI загрузка книги (4 часа)
  3. feat(observability): прокидывать имя модели в Langfuse generation #52 Advisor on-demand (4 часа)
  4. chore(deploy): LLM_CHAT_MODEL=deepseek-v4-flash #53 Advisor weekly (2 часа — зависит от feat(observability): прокидывать имя модели в Langfuse generation #52)
  5. feat(advisor): financial advisor skill (LLM-reasoning) #50 PDF via Telegram (отложено)
  6. feat(advisor): action analyze — обзорный LLM-анализ трат #51 Админка (отложено)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions