vk_hackathon/.ai_update/changes.md
2026-04-18 12:38:29 +03:00

104 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# AI Change Log
Дата создания: 2026-04-18
## Как пользоваться
Этот файл - рабочий журнал изменений для Codex.
Перед новыми правками нужно прочитать этот файл и учитывать:
- что уже было изменено;
- какие файлы трогались;
- какие проверки запускались;
- какие ограничения и договоренности есть по задаче.
После каждой осмысленной правки нужно добавлять новую запись с:
- кратким описанием изменения;
- списком измененных файлов;
- результатом проверок;
- открытыми рисками или TODO, если они есть.
## Договоренности
- Не менять контракты `POST /index`, `POST /sparse_embedding`, `POST /search`.
- По текущей задаче фокус держать на `index`.
- Не трогать `search`, `docker-compose.yml` и инфраструктуру без отдельной просьбы.
- Не откатывать чужие или пользовательские изменения.
## Записи
### 2026-04-18 - индексный P1 и безопасный P0 search
Что сделано:
- В `index/main.py` заменен символьный chunking на сборку чанков окнами сообщений.
- Добавлен учет временного разрыва между сообщениями через `INDEX_TIME_GAP_SECONDS`.
- Overlap теперь работает по границам сообщений через `INDEX_CHUNK_OVERLAP_MESSAGES`, а не по хвосту строки.
- Сообщения рендерятся структурно: `author`, `time`, `thread`, `mentions`, флаги, `quote`, `forward`, `file`, `system_event`.
- `file_snippets` парсятся как JSON; в индекс попадают имя файла, mime, url, владелец и дата создания.
- `member_event` превращается в индексируемый системный текст.
- `page_content`, `dense_content`, `sparse_content` разведены.
- В `index/Dockerfile` старый `CHUNK_SIZE=10` заменен на реальные `INDEX_*` настройки chunking.
- В `search/main.py` исправлен runtime-баг с неинициализированным `must_conditions`.
- Основной query в search теперь берется из `question.search_text` с fallback на `question.text`.
- `question.variants`, `question.hyde`, `question.keywords` и entities используются как дополнительные dense/sparse запросы.
- Retrieval делает несколько prefetch-запросов и fusion через Qdrant.
- Rerank больше не выбрасывает retrieval-хвост.
- Финальные `message_ids` агрегируются, дедуплицируются и ограничиваются `top-50`.
Измененные файлы:
- `index/main.py`
- `index/Dockerfile`
- `search/main.py`
- `.ai_update/changes.md`
Проверки:
- `python3 -m py_compile index/main.py search/main.py`
- Прямой smoke `build_chunks` на `data/Go Nova.json`.
- Прямой smoke endpoint-функции `index(...)` на `data/Go Nova.json`.
- Pure smoke для `search` helper-функций через stub-модули, потому в host env нет `qdrant_client` и `httpx`.
Результаты проверки индекса:
- Было 29 чанков, стало 15.
- Покрытие сообщений на `data/Go Nova.json`: 25 из 25.
- Системное сообщение с `member_event` больше не выпадает.
- `file_snippets` с `IMG_8471.webp` попадает в `sparse_content`.
- Quote и forward маркеры попадают в `dense_content`.
- `page_content`, `dense_content`, `sparse_content` больше не одинаковые.
Открытые риски:
- Полный интеграционный прогон `search` с настоящими Qdrant/dense/rerank локально не выполнялся.
- `date_range` фильтр включается только если установленный `qdrant_client` поддерживает `models.DatetimeRange`.
- Полный docker build локально не запускался.
### 2026-04-18 - создан журнал изменений
Что сделано:
- Создан файл `.ai_update/changes.md`.
- Зафиксировано, что до этого код не менялся, была только разведка репозитория и ТЗ.
Контекст по текущему состоянию:
- `index/main.py` сейчас использует символьный chunking.
- `render_message` берет только `message.text` и `parts[*].text`.
- `page_content`, `dense_content`, `sparse_content` сейчас одинаковые.
- В примере `data/Go Nova.json` текущий `build_chunks` покрывает 24 из 25 сообщений; системное сообщение с `member_event` выпадает из индекса.
Измененные файлы:
- `.ai_update/changes.md`
Проверки:
- Код не запускался, потому что создан только журнал.
Следующий ожидаемый фокус:
- Перестроить индексный renderer и chunking в `index/main.py`, если пользователь попросит перейти к реализации.