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 Админка (отложено)

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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