# Текущая архитектура тестового пайплайна `pipeline_setup_v3` Документ предназначен как краткое, но точное описание текущего устройства `pipeline_setup_v3` для внешней модели вроде ChatGPT. Важно: текущий `pipeline_setup_v3` уже использует реальные runtime-компоненты агента, но по сути остается в первую очередь `code-first` пайплайном. Это особенно заметно в `evidence gate` и в наборе prompt'ов для LLM. ## 1. Общая схема пайплайна `pipeline_setup_v3` запускает один из трех режимов: - `router_only` - `router_rag` - `full_chain` Во всех режимах используется `AgentRuntimeAdapter`, который является тестовым адаптером поверх реальных компонентов рантайма. Общий поток для `full_chain`: 1. Пользовательский запрос 2. `IntentRouterV2` 3. Построение `RetrievalRequest` 4. `RuntimeRetrievalAdapter` 5. Построение нормализованного `RetrievalResult` 6. Сборка `EvidenceBundle` 7. `pre-evidence gate` 8. `RuntimeAnswerPolicy` 9. Вызов LLM через `AgentLlmService` 10. `post-evidence gate` 11. При необходимости `repair` 12. Сборка итогового результата, диагностики и артефактов теста Ключевая идея: `pipeline_setup_v3` не эмулирует локальный тестовый сценарий вручную, а прогоняет реальные компоненты: роутер, retrieval, runtime executor и LLM. ## 2. Из каких компонентов состоит `pipeline_setup_v3` ### 2.1. Harness уровня тестов Основные части: - `tests/pipeline_setup_v3/run.py` — CLI-вход для запуска набора кейсов - `tests/pipeline_setup_v3/core/runner.py` — оркестратор прогона кейсов - `tests/pipeline_setup_v3/core/case_loader.py` — загрузка YAML-кейсов - `tests/pipeline_setup_v3/core/validators.py` — проверка ожиданий - `tests/pipeline_setup_v3/core/artifacts.py` — запись JSON/Markdown-результатов - `tests/pipeline_setup_v3/runtime/agent_runtime_adapter.py` — мост к runtime-компонентам приложения ### 2.2. Runtime-компоненты, которые реально вызываются - `IntentRouterV2` - `RuntimeRepoContextFactory` - `RuntimeRetrievalAdapter` - `AgentRuntimeExecutor` - `AgentLlmService` - `PromptLoader` ### 2.3. Два варианта исполнения #### `router_only` Проверяет только результат роутера: - `intent` - `sub_intent` - `graph_id` - `conversation_mode` RAG и LLM не вызываются. #### `router_rag` Проверяет: - роутер - retrieval plan - реальный retrieval - нормализованный `RetrievalResult` LLM не вызывается. #### `full_chain` Проверяет полный runtime-контур: - роутер - retrieval - evidence bundle - pre-gate - answer policy - LLM - post-gate - repair - итоговый answer/diagnostics ## 3. Компонент: Intent Router ### 3.1. Что это такое `IntentRouterV2` классифицирует запрос и возвращает структурированный план для retrieval и дальнейшего рантайма. Он не просто выбирает `intent`, а сразу строит: - `conversation_mode` - `query_plan` - `retrieval_spec` - `retrieval_constraints` - `symbol_resolution` - `evidence_policy` - `graph_id` ### 3.2. Какие интенты есть сейчас Сейчас в коде поддерживаются: - `CODE_QA` - `DOCUMENTATION_EXPLAIN` - `GENERATE_DOCS_FROM_CODE` - `FALLBACK` ### 3.3. Какие саб-интенты есть сейчас #### Для `CODE_QA` - `OPEN_FILE` - `EXPLAIN` - `EXPLAIN_LOCAL` - `FIND_TESTS` - `FIND_ENTRYPOINTS` - `TRACE_FLOW` - `ARCHITECTURE` - `NEXT_STEPS` может появляться как follow-up режим на уровне query planning #### Для `DOCUMENTATION_EXPLAIN` - `SYSTEM_FLOW_EXPLAIN` - `COMPONENT_EXPLAIN` - `API_METHOD_EXPLAIN` - `ENTITY_EXPLAIN` #### Для `FALLBACK` - `GENERIC_FALLBACK` ### 3.4. Что роутер возвращает на выходе Результат роутера — это `IntentRouterResult`. Ключевые поля: - `intent` - `retrieval_profile` - `graph_id` - `conversation_mode` - `query_plan` - `retrieval_spec` - `retrieval_constraints` - `symbol_resolution` - `evidence_policy` ### 3.5. Что входит в `query_plan` `query_plan` содержит: - `raw` - `normalized` - `sub_intent` - `negations` - `expansions` - `keyword_hints` - `path_hints` - `doc_scope_hints` - `symbol_candidates` - `symbol_kind_hint` - `anchors` Это основной bridge между классификацией запроса и retrieval. ### 3.6. Что входит в `retrieval_spec` `retrieval_spec` содержит: - `domains` - `layer_queries` - `filters` - `rerank_profile` Именно этот объект задает, какие слои RAG должны быть запрошены. ### 3.7. Что важно про текущее состояние Текущий роутер уже умеет выделять docs-интенты и docs-сабинтенты, но downstream runtime ниже по пайплайну все еще во многом оптимизирован под `CODE_QA`. Это означает: - docs routing уже есть - docs layer selection уже есть - но `pre/post evidence gate` и prompt selection пока ориентированы в первую очередь на code sub-intents ## 4. Структура RAG ### 4.1. Общая идея RAG устроен как многослойный индекс. Retrieval работает не по одному единственному типу чанков, а по наборам специализированных слоев. ### 4.2. Code-слои - `C0_SOURCE_CHUNKS` — сырой код / чанки исходников - `C1_SYMBOL_CATALOG` — каталог символов - `C2_DEPENDENCY_GRAPH` — зависимости и связи - `C3_ENTRYPOINTS` — точки входа, маршруты, handler'ы - `C4_SEMANTIC_ROLES` — семантические роли и behavioral hints ### 4.3. Docs-слои - `D0_DOC_CHUNKS` — чанки документов - `D1_DOCUMENT_CATALOG` — каталог документов - `D2_FACT_INDEX` — атомарные факты - `D3_ENTITY_CATALOG` — сущности - `D4_WORKFLOW_INDEX` — сценарии и workflow - `D5_RELATION_GRAPH` — связи между документами ### 4.4. Как retrieval связывается с роутером Роутер возвращает: - `domains` - `layer_queries` - `filters` - `retrieval_constraints` Дальше `build_retrieval_request(...)` превращает это в `RetrievalRequest`, который содержит: - `rag_session_id` - `query` - `sub_intent` - `path_scope` - `keyword_hints` - `symbol_candidates` - `requested_layers` - `retrieval_spec` - `retrieval_constraints` - `query_plan` ### 4.5. Что возвращает retrieval Сырые строки RAG затем нормализуются в `RetrievalResult`, который содержит: - `target_symbol_candidates` - `resolved_symbol` - `symbol_resolution_status` - `file_candidates` - `code_chunks` - `relations` - `semantic_hints` - `entrypoints` - `test_candidates` - `layer_outcomes` - `missing_layers` - `raw_rows` - `retrieval_report` ### 4.6. Как из retrieval строится evidence `build_evidence_bundle(...)` собирает `EvidenceBundle`. Ключевые поля: - `resolved_intent` - `resolved_sub_intent` - `resolved_target` - `target_type` - `target_symbol_candidates` - `file_candidates` - `code_chunks` - `relations` - `entrypoints` - `test_evidence` - `evidence_count` - `sufficient` - `failure_reasons` - `retrieval_summary` Важно: `evidence_count` сейчас считается по количеству `code_chunks`. Это еще одно подтверждение, что runtime сегодня code-first. ## 5. Evidence Gate В пайплайне есть два gate'а. ## 5.1. Pre-evidence gate Расположение: - `src/app/modules/agent/runtime/steps/gates/pre/evidence_gate.py` Когда срабатывает: - после retrieval - после сборки `EvidenceBundle` - до вызова LLM Задача: - понять, достаточно ли evidence для уверенного ответа - выдать `passed/failure_reasons/degraded_message` Как работает сейчас: - для `OPEN_FILE` требует найденный path/file и хотя бы один `C0` chunk - для `EXPLAIN` требует target symbol и минимум 2 evidence chunk'а - для `FIND_TESTS` требует target и хотя бы один test candidate - для `FIND_ENTRYPOINTS` требует хотя бы один entrypoint - для остальных сценариев требует минимум 1 evidence Что возвращает: - `passed` - `failure_reasons` - `degraded_message` Ограничение: - логика pre-gate пока написана в терминах code sub-intents - docs-сценарии там явно не моделированы ## 5.2. Post-evidence gate Расположение: - `src/app/modules/agent/runtime/steps/gates/post/post_gate.py` Когда срабатывает: - после генерации draft answer - до возврата финального ответа Задача: - проверить groundedness черновика - убедиться, что ответ действительно опирается на evidence - решить, нужен ли `repair` Что проверяет: - что ответ не пустой - что degraded/not_found/ambiguous-ответы содержат обязательные guardrail-фразы - что normal answer не слишком общий - что упоминаются обязательные факты из curated evidence - что нет явной semantic leakage или contradictions Отдельные проверки есть для: - `FIND_ENTRYPOINTS` - `EXPLAIN` - `ARCHITECTURE` - `TRACE_FLOW` Если gate не проходит, он возвращает: - `passed=False` - `action="repair"` - список `reasons` После этого runtime может сделать дополнительный шаг `repair` через LLM. Ограничение: - post-gate тоже пока ориентирован на code-oriented sub-intents - docs-сабинтенты для него еще не описаны отдельными правилами ## 6. Обращение к LLM ### 6.1. Где вызывается LLM В `pipeline_setup_v3` есть два места использования LLM: 1. В классификации интента внутри `IntentClassifierV2` 2. В финальной генерации ответа внутри `AgentRuntimeExecutor` ### 6.2. Prompt для классификации интента Используется prompt: - `rag_intent_router_v2` Назначение: - если deterministic rules не дали результата, LLM выбирает интент Текущий prompt исторически описывает старые имена интентов, поэтому его еще нужно синхронизировать с новым docs/fallback контрактом. ### 6.3. Prompt'ы для генерации ответа Prompt selector сейчас выбирает: - `code_qa_architecture_answer` - `code_qa_explain_answer` - `code_qa_explain_local_answer` - `code_qa_find_entrypoints_answer` - `code_qa_find_tests_answer` - `code_qa_general_answer` - `code_qa_open_file_answer` - `code_qa_trace_flow_answer` - `code_qa_degraded_answer` Дополнительно для repair используется: - `code_qa_repair_answer` ### 6.4. Как строится payload для LLM Перед вызовом LLM runtime собирает: - `AnswerSynthesisInput` - `EvidenceBundle` - `prompt_payload` В payload передаются: - `user_question` - `resolved_target` - `answer_mode` - `evidence_summary` - `retrieval_summary` - curated facts - обязательные для упоминания сущности, методы, связи, шаги и т.д. То есть LLM не получает просто "вопрос и куски текста", а получает уже структурированный grounded payload. ### 6.5. Что важно про текущее состояние prompt'ов Сейчас runtime prompt selection и prompt contracts явно заточены под code QA. Это значит: - для `CODE_QA` full chain оформлен хорошо - для `DOCUMENTATION_EXPLAIN` routing и retrieval есть, но отдельного docs answer-prompt слоя пока нет - для docs full-chain пока не хватает собственных prompt names, prompt payload contract и post-gate правил ## 7. Что именно сейчас проверяет `pipeline_setup_v3` YAML-кейс может проверять четыре группы ожиданий: - `router` - `retrieval` - `llm` - `pipeline` Примеры ожиданий: - ожидаемый `intent` - ожидаемый `sub_intent` - нужные слои в `layers_include` - что retrieval не пустой - что в answer есть нужные фразы - какой `answer_mode` получился ## 8. Ключевые выводы о текущей архитектуре ### 8.1. Что уже сделано хорошо - `pipeline_setup_v3` работает поверх реальных runtime-компонентов - есть явный контракт между router → retrieval → evidence → answer - есть два evidence gate - есть structured diagnostics - есть нормализованные типы `RetrievalRequest`, `RetrievalResult`, `EvidenceBundle` ### 8.2. Что остается code-first - pre-evidence gate - post-evidence gate - prompt selector - набор answer prompts - часть логики нормализации evidence ### 8.3. Что это значит для docs use case Сейчас docs use case уже частично внедрен: - есть docs intent - есть docs sub-intents - есть docs layer mapping - есть docs retrieval profile Но для полноценного `full_chain` по документации еще не хватает: - docs-oriented pre-gate правил - docs-oriented post-gate правил - docs-specific answer prompts - docs-specific synthesis contract - отдельных full-chain test cases для `DOCUMENTATION_EXPLAIN` и `FALLBACK` ## 9. Краткое резюме по компонентам ### Intent Router Назначение: - классифицировать запрос - построить retrieval plan - задать evidence policy Выход: - `IntentRouterResult` ### RAG Назначение: - вернуть evidence из многослойного индекса Выход: - `RetrievalResult` - затем `EvidenceBundle` ### Pre-evidence gate Назначение: - решить, можно ли вообще уверенно отвечать Выход: - `passed/failure_reasons/degraded_message` ### Post-evidence gate Назначение: - проверить, grounded ли уже сгенерированный ответ Выход: - `return` или `repair` ### LLM Назначение: - классификация сложных интентов - генерация финального ответа - repair ответа при провале post-gate Текущий фокус: - в первую очередь `CODE_QA`