104 lines
5.7 KiB
Markdown
104 lines
5.7 KiB
Markdown
# 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`, если пользователь попросит перейти к реализации.
|