16 KiB
Текущая архитектура тестового пайплайна pipeline_setup_v3
Документ предназначен как краткое, но точное описание текущего устройства pipeline_setup_v3 для внешней модели вроде ChatGPT.
Важно: текущий pipeline_setup_v3 уже использует реальные runtime-компоненты агента, но по сути остается в первую очередь code-first пайплайном. Это особенно заметно в evidence gate и в наборе prompt'ов для LLM.
1. Общая схема пайплайна
pipeline_setup_v3 запускает один из трех режимов:
router_onlyrouter_ragfull_chain
Во всех режимах используется AgentRuntimeAdapter, который является тестовым адаптером поверх реальных компонентов рантайма.
Общий поток для full_chain:
- Пользовательский запрос
IntentRouterV2- Построение
RetrievalRequest RuntimeRetrievalAdapter- Построение нормализованного
RetrievalResult - Сборка
EvidenceBundle pre-evidence gateRuntimeAnswerPolicy- Вызов LLM через
AgentLlmService post-evidence gate- При необходимости
repair - Сборка итогового результата, диагностики и артефактов теста
Ключевая идея: 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-компоненты, которые реально вызываются
IntentRouterV2RuntimeRepoContextFactoryRuntimeRetrievalAdapterAgentRuntimeExecutorAgentLlmServicePromptLoader
2.3. Два варианта исполнения
router_only
Проверяет только результат роутера:
intentsub_intentgraph_idconversation_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_modequery_planretrieval_specretrieval_constraintssymbol_resolutionevidence_policygraph_id
3.2. Какие интенты есть сейчас
Сейчас в коде поддерживаются:
CODE_QADOCUMENTATION_EXPLAINGENERATE_DOCS_FROM_CODEFALLBACK
3.3. Какие саб-интенты есть сейчас
Для CODE_QA
OPEN_FILEEXPLAINEXPLAIN_LOCALFIND_TESTSFIND_ENTRYPOINTSTRACE_FLOWARCHITECTURENEXT_STEPSможет появляться как follow-up режим на уровне query planning
Для DOCUMENTATION_EXPLAIN
SYSTEM_FLOW_EXPLAINCOMPONENT_EXPLAINAPI_METHOD_EXPLAINENTITY_EXPLAIN
Для FALLBACK
GENERIC_FALLBACK
3.4. Что роутер возвращает на выходе
Результат роутера — это IntentRouterResult.
Ключевые поля:
intentretrieval_profilegraph_idconversation_modequery_planretrieval_specretrieval_constraintssymbol_resolutionevidence_policy
3.5. Что входит в query_plan
query_plan содержит:
rawnormalizedsub_intentnegationsexpansionskeyword_hintspath_hintsdoc_scope_hintssymbol_candidatessymbol_kind_hintanchors
Это основной bridge между классификацией запроса и retrieval.
3.6. Что входит в retrieval_spec
retrieval_spec содержит:
domainslayer_queriesfiltersrerank_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— сценарии и workflowD5_RELATION_GRAPH— связи между документами
4.4. Как retrieval связывается с роутером
Роутер возвращает:
domainslayer_queriesfiltersretrieval_constraints
Дальше build_retrieval_request(...) превращает это в RetrievalRequest, который содержит:
rag_session_idquerysub_intentpath_scopekeyword_hintssymbol_candidatesrequested_layersretrieval_specretrieval_constraintsquery_plan
4.5. Что возвращает retrieval
Сырые строки RAG затем нормализуются в RetrievalResult, который содержит:
target_symbol_candidatesresolved_symbolsymbol_resolution_statusfile_candidatescode_chunksrelationssemantic_hintsentrypointstest_candidateslayer_outcomesmissing_layersraw_rowsretrieval_report
4.6. Как из retrieval строится evidence
build_evidence_bundle(...) собирает EvidenceBundle.
Ключевые поля:
resolved_intentresolved_sub_intentresolved_targettarget_typetarget_symbol_candidatesfile_candidatescode_chunksrelationsentrypointstest_evidenceevidence_countsufficientfailure_reasonsretrieval_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 и хотя бы одинC0chunk - для
EXPLAINтребует target symbol и минимум 2 evidence chunk'а - для
FIND_TESTSтребует target и хотя бы один test candidate - для
FIND_ENTRYPOINTSтребует хотя бы один entrypoint - для остальных сценариев требует минимум 1 evidence
Что возвращает:
passedfailure_reasonsdegraded_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_ENTRYPOINTSEXPLAINARCHITECTURETRACE_FLOW
Если gate не проходит, он возвращает:
passed=Falseaction="repair"- список
reasons
После этого runtime может сделать дополнительный шаг repair через LLM.
Ограничение:
- post-gate тоже пока ориентирован на code-oriented sub-intents
- docs-сабинтенты для него еще не описаны отдельными правилами
6. Обращение к LLM
6.1. Где вызывается LLM
В pipeline_setup_v3 есть два места использования LLM:
- В классификации интента внутри
IntentClassifierV2 - В финальной генерации ответа внутри
AgentRuntimeExecutor
6.2. Prompt для классификации интента
Используется prompt:
rag_intent_router_v2
Назначение:
- если deterministic rules не дали результата, LLM выбирает интент
Текущий prompt исторически описывает старые имена интентов, поэтому его еще нужно синхронизировать с новым docs/fallback контрактом.
6.3. Prompt'ы для генерации ответа
Prompt selector сейчас выбирает:
code_qa_architecture_answercode_qa_explain_answercode_qa_explain_local_answercode_qa_find_entrypoints_answercode_qa_find_tests_answercode_qa_general_answercode_qa_open_file_answercode_qa_trace_flow_answercode_qa_degraded_answer
Дополнительно для repair используется:
code_qa_repair_answer
6.4. Как строится payload для LLM
Перед вызовом LLM runtime собирает:
AnswerSynthesisInputEvidenceBundleprompt_payload
В payload передаются:
user_questionresolved_targetanswer_modeevidence_summaryretrieval_summary- curated facts
- обязательные для упоминания сущности, методы, связи, шаги и т.д.
То есть LLM не получает просто "вопрос и куски текста", а получает уже структурированный grounded payload.
6.5. Что важно про текущее состояние prompt'ов
Сейчас runtime prompt selection и prompt contracts явно заточены под code QA.
Это значит:
- для
CODE_QAfull chain оформлен хорошо - для
DOCUMENTATION_EXPLAINrouting и retrieval есть, но отдельного docs answer-prompt слоя пока нет - для docs full-chain пока не хватает собственных prompt names, prompt payload contract и post-gate правил
7. Что именно сейчас проверяет pipeline_setup_v3
YAML-кейс может проверять четыре группы ожиданий:
routerretrievalllmpipeline
Примеры ожиданий:
- ожидаемый
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