377 lines
12 KiB
Markdown
377 lines
12 KiB
Markdown
# v1.plan.md
|
||
|
||
## 1. Цель ближайшего этапа
|
||
|
||
На ближайшем этапе цель — не достраивать полного агента и не интегрировать решение в UI, а довести до зрелого состояния **изолированный code-first test pipeline**:
|
||
|
||
**user query -> IntentRouterV2 -> retrieval plan -> layered retrieval -> evidence gate -> LLM answer -> diagnostics**
|
||
|
||
Именно этот контур должен стать будущим ядром агента, которое позже заменит legacy `RouterService`.
|
||
|
||
---
|
||
|
||
## 2. Что считается результатом этапа
|
||
|
||
Этап можно считать успешным, когда:
|
||
|
||
- `IntentRouterV2` стабильно определяет `intent`, `sub_intent`, `keyword_hints`, `path_scope`, `layers`, `conversation_mode` и retrieval constraints;
|
||
- retrieval реально следует плану, заданному роутером;
|
||
- LLM получает контекст, собранный из retrieval, а не из побочных обходных механизмов;
|
||
- ответ не строится без достаточного evidence;
|
||
- диагностика тестов позволяет понять:
|
||
- что выбрал router;
|
||
- что извлек retrieval;
|
||
- чего не хватило;
|
||
- почему ответ хороший или плохой.
|
||
|
||
---
|
||
|
||
## 3. Что сейчас не делать
|
||
|
||
На текущем этапе не стоит:
|
||
|
||
- встраивать это сразу в UI;
|
||
- подключать docs retrieval как обязательную часть MVP;
|
||
- строить полный cross-domain runtime;
|
||
- пытаться довести сразу весь orchestration runtime;
|
||
- инвестировать много времени в `C6`, `D5`, `D6`;
|
||
- лечить legacy `RouterService`, кроме минимально необходимого для совместимости.
|
||
|
||
---
|
||
|
||
## 4. Приоритетный план работ
|
||
|
||
## 4.1. Итерация 1 — зафиксировать канонический test-first контур
|
||
|
||
### 4.1.1. Принять `IntentRouterV2` как единственную точку истины для тестового MVP
|
||
|
||
Именно `IntentRouterV2` должен определять:
|
||
|
||
- `domain`
|
||
- `intent`
|
||
- `sub_intent`
|
||
- `keyword_hints`
|
||
- `path_scope`
|
||
- `layers`
|
||
- `conversation_mode`
|
||
- retrieval constraints
|
||
|
||
### 4.1.2. Зафиксировать минимальный набор сценариев MVP-now
|
||
|
||
Для текущего этапа в качестве канонического набора сценариев следует оставить:
|
||
|
||
- `OPEN_FILE`
|
||
- `EXPLAIN`
|
||
- `FIND_TESTS`
|
||
- `FIND_ENTRYPOINTS`
|
||
- `GENERAL_QA` как fallback
|
||
|
||
### 4.1.3. Зафиксировать контракт тестового пайплайна
|
||
|
||
Нужно явно определить структуру следующих объектов:
|
||
|
||
- `RouterResult`
|
||
- `RetrievalRequest`
|
||
- `RetrievalResult`
|
||
- `EvidenceBundle`
|
||
- `AnswerSynthesisInput`
|
||
- `DiagnosticsReport`
|
||
|
||
Это нужно, чтобы тесты настраивали устойчивый контракт, а не размытый процесс.
|
||
|
||
---
|
||
|
||
## 4.2. Итерация 2 — связать router и retrieval
|
||
|
||
### 4.2.1. Сделать retrieval adapter под контракт роутера
|
||
|
||
Output `IntentRouterV2` должен напрямую превращаться в retrieval plan.
|
||
|
||
Примеры:
|
||
|
||
- `OPEN_FILE`
|
||
- path-priority retrieval
|
||
- `C0_SOURCE_CHUNKS`
|
||
|
||
- `EXPLAIN`
|
||
- symbol-first retrieval
|
||
- `C1 + C0 + C2`, optionally `C3`
|
||
|
||
- `FIND_TESTS`
|
||
- target symbol / path
|
||
- lightweight `C5-lite`
|
||
|
||
- `FIND_ENTRYPOINTS`
|
||
- `C3_ENTRYPOINTS`
|
||
|
||
- `GENERAL_QA`
|
||
- ограниченный broad retrieval без агрессивных допущений
|
||
|
||
### 4.2.2. Убрать разрыв между индексатором и retrieval runtime
|
||
|
||
Нужна надежная связка:
|
||
|
||
**index data -> retrieval gateway -> normalized retrieval output**
|
||
|
||
Retrieval должен стать нормальной runtime-функцией, а не только наличием индексов и отдельных explain-механизмов.
|
||
|
||
### 4.2.3. Ввести единый формат retrieval output
|
||
|
||
Нужен единый формат, в который складываются найденные артефакты:
|
||
|
||
- symbols
|
||
- chunks
|
||
- relations
|
||
- entrypoints
|
||
- tests
|
||
- diagnostics per layer
|
||
|
||
Это станет основой для `EvidenceBundle`.
|
||
|
||
---
|
||
|
||
## 4.3. Итерация 3 — перенести evidence-first логику в общий test pipeline
|
||
|
||
### 4.3.1. Сделать общий evidence gate
|
||
|
||
Для каждого sub-intent нужно определить minimum evidence.
|
||
|
||
#### `OPEN_FILE`
|
||
- найден path или очень сильный lexical hit;
|
||
- есть хотя бы 1–2 relevant chunks.
|
||
|
||
#### `EXPLAIN`
|
||
- найден целевой symbol или уверенный target fragment;
|
||
- есть минимальное число code chunks;
|
||
- есть хотя бы базовые relations или surrounding context.
|
||
|
||
#### `FIND_TESTS`
|
||
- найден target symbol/file;
|
||
- найден хотя бы один reliable candidate test.
|
||
|
||
#### `FIND_ENTRYPOINTS`
|
||
- найден хотя бы один candidate entrypoint.
|
||
|
||
#### `GENERAL_QA`
|
||
- найден хоть какой-то устойчивый контекст;
|
||
- иначе ответ должен честно говорить о слабом evidence.
|
||
|
||
### 4.3.2. Запретить уверенный ответ без опоры
|
||
|
||
Если minimum evidence не выполнен, система должна:
|
||
|
||
- либо честно деградировать;
|
||
- либо выдать частичный ответ;
|
||
- либо явно сообщить, каких данных не хватает.
|
||
|
||
---
|
||
|
||
## 4.4. Итерация 4 — унифицировать сборку контекста для LLM
|
||
|
||
### 4.4.1. Ввести единый `EvidenceBundle`
|
||
|
||
LLM должна получать структурированный пакет:
|
||
|
||
- target intent / sub-intent
|
||
- target symbol / path
|
||
- relevant code chunks
|
||
- retrieved relations
|
||
- entrypoints if any
|
||
- test evidence if any
|
||
- retrieval diagnostics summary
|
||
- evidence sufficiency flags
|
||
|
||
### 4.4.2. Разделить fast context и deep context
|
||
|
||
#### Fast context
|
||
Короткая выжимка:
|
||
- target symbol
|
||
- file
|
||
- short relations summary
|
||
- top evidence
|
||
|
||
#### Deep context
|
||
Полные chunks, расширенные relations и supporting fragments.
|
||
|
||
### 4.4.3. Стандартизировать prompt contract
|
||
|
||
Для каждого sub-intent нужен понятный режим ответа:
|
||
|
||
- открыть;
|
||
- объяснить;
|
||
- найти тесты;
|
||
- найти точки входа;
|
||
- общий fallback.
|
||
|
||
LLM должна понимать:
|
||
|
||
- какой тип ответа нужен;
|
||
- насколько evidence полон;
|
||
- можно ли делать выводы;
|
||
- где надо явно отметить неопределенность.
|
||
|
||
---
|
||
|
||
## 4.5. Итерация 5 — довести диагностику до рабочего инструмента настройки
|
||
|
||
### 4.5.1. Разделить диагностику на 2 уровня
|
||
|
||
#### Уровень 1 — Human-readable summary
|
||
Коротко:
|
||
- intent выбран правильно / нет;
|
||
- target найден / нет;
|
||
- retrieval успешен / нет;
|
||
- evidence достаточен / нет;
|
||
- ответ надежный / частичный / слабый.
|
||
|
||
#### Уровень 2 — Detailed diagnostics
|
||
Подробно:
|
||
- router fields;
|
||
- layer-by-layer retrieval;
|
||
- empty / failed layers;
|
||
- ranking decisions;
|
||
- evidence gate results;
|
||
- context assembly details.
|
||
|
||
### 4.5.2. Добавить явные failure reasons
|
||
|
||
Рекомендуемый минимальный набор:
|
||
|
||
- `router_low_confidence`
|
||
- `target_symbol_not_found`
|
||
- `path_scope_empty`
|
||
- `layer_c1_empty`
|
||
- `layer_c2_empty`
|
||
- `test_mapping_not_found`
|
||
- `insufficient_code_evidence`
|
||
|
||
---
|
||
|
||
## 5. Как трактовать RAG-план на текущем этапе
|
||
|
||
## 5.1. Что оставить как целевой план
|
||
|
||
Целевую карту слоев оставляем без изменений:
|
||
|
||
- `C0–C6`
|
||
- `D0–D6`
|
||
|
||
Она остается правильной как target architecture.
|
||
|
||
## 5.2. Что считать MVP-now
|
||
|
||
Для текущего этапа обязательны:
|
||
|
||
- `C0_SOURCE_CHUNKS`
|
||
- `C1_SYMBOL_CATALOG`
|
||
- `C2_SYMBOL_RELATIONS`
|
||
- `C3_ENTRYPOINTS`
|
||
|
||
И в облегченном виде:
|
||
|
||
- `C5_TEST_MAPPINGS_LITE`
|
||
|
||
Пока не делать блокирующими:
|
||
|
||
- `C4_EXECUTION_PATHS`
|
||
- `C6_CODE_FACTS`
|
||
- весь docs runtime
|
||
|
||
## 5.3. Что считать следующим этапом
|
||
|
||
После стабилизации code-first MVP:
|
||
|
||
- подключение docs retrieval;
|
||
- использование D-layers в runtime;
|
||
- docs-from-code generation;
|
||
- cross-domain linking.
|
||
|
||
---
|
||
|
||
## 6. Как строить тестовый контур
|
||
|
||
## 6.1. Router tests
|
||
|
||
Проверяют только:
|
||
|
||
- intent
|
||
- sub_intent
|
||
- layers
|
||
- keyword_hints
|
||
- path_scope
|
||
- confidence / fallback behavior
|
||
|
||
## 6.2. Retrieval tests
|
||
|
||
Проверяют:
|
||
|
||
- что retrieval реально использует router output;
|
||
- какие слои сработали;
|
||
- что извлечено;
|
||
- нет ли шума от тестов;
|
||
- не пропал ли основной код.
|
||
|
||
## 6.3. Evidence gate tests
|
||
|
||
Проверяют:
|
||
|
||
- достаточен ли evidence;
|
||
- правильно ли система деградирует;
|
||
- не отвечает ли уверенно при слабой опоре.
|
||
|
||
## 6.4. Answer quality tests
|
||
|
||
Проверяют финальный ответ LLM:
|
||
|
||
- есть ли опора в коде;
|
||
- нет ли лишних догадок;
|
||
- хватает ли связности;
|
||
- соответствует ли ответ типу вопроса.
|
||
|
||
---
|
||
|
||
## 7. Что скорректировать в README / архитектурном плане
|
||
|
||
В README нужно явно разделить:
|
||
|
||
### 7.1. Target Architecture
|
||
Полная целевая система.
|
||
|
||
### 7.2. MVP-now
|
||
Изолированный test-first контур для `CODE_QA`, который:
|
||
|
||
- не зависит от UI;
|
||
- не зависит от full runtime orchestration;
|
||
- нацелен на доводку `IntentRouterV2` + retrieval + evidence + LLM answers.
|
||
|
||
---
|
||
|
||
## 8. Самые важные изменения в реализации прямо сейчас
|
||
|
||
Приоритет:
|
||
|
||
### P1
|
||
Сделать `IntentRouterV2` центром тестового MVP.
|
||
|
||
### P2
|
||
Связать router output с реальным layered retrieval.
|
||
|
||
### P3
|
||
Ввести единый `EvidenceBundle`.
|
||
|
||
### P4
|
||
Сделать общий evidence gate для всего test pipeline.
|
||
|
||
### P5
|
||
Привести диагностику к форме, удобной для настройки через тесты.
|
||
|
||
### P6
|
||
Добавить `C5-lite` для `FIND_TESTS`.
|
||
|
||
---
|
||
|
||
## 9. Итоговая формулировка ближайшей цели
|
||
|
||
> Довести до зрелости изолированный code-first test pipeline на базе `IntentRouterV2`, в котором роутер управляет retrieval, retrieval формирует evidence bundle, evidence gate контролирует достаточность опоры, а LLM отвечает строго на основе извлеченного контекста и прозрачной диагностики.
|
||
|