7.1 KiB
V2IntentRouter Architecture
1. Архитектура
Текущий V2IntentRouter состоит из следующих компонентов:
-
router.pyГлавная точка входа и оркестратор. -
modules/normalizer.pyНормализация текста запроса вnormalized_query. -
modules/target_terms.pyИзвлечениеtarget_terms,endpoint_paths,matched_aliases,alias_docs. -
modules/anchors.pyИзвлечениеanchorsи вспомогательных marker-сигналов. -
routers/docs_subintent_resolver.pyОпределениеsubintent. -
routers/deterministic.pyДетерминированное определениеrouting_domain,intent,subintent,confidence,routing_mode,llm_router_used,reason_short. -
routers/llm.pyLLM-based определениеrouting_domain,intent,subintent,confidence,reason_short. -
routers/prompts.ymlPrompt для LLM-router.
2. Контракт
Вход
user_query: str
Выход
V2RouteResult:
routing_domain: strintent: strsubintent: struser_query: strnormalized_query: strtarget_terms: list[str]anchors: V2RouteAnchorsconfidence: floatrouting_mode: strllm_router_used: boolreason_short: str
V2RouteAnchors:
entity_names: list[str]terms: list[str]file_names: list[str]endpoint_paths: list[str]target_doc_hints: list[str]matched_aliases: list[str]process_domain: str | Noneprocess_subdomain: str | None
3. Поддерживаемые домены, интенты и сабинтенты
Домены
DOCSGENERAL
Интенты
DOC_EXPLAINGENERAL_QA
Сабинтенты
SUMMARYFIND_FILES
Поддерживаемые маршруты
GENERAL / GENERAL_QA / SUMMARYDOCS / DOC_EXPLAIN / SUMMARYDOCS / DOC_EXPLAIN / FIND_FILES
4. Флоу обработки запроса
router.pyпринимаетuser_query.modules/normalizer.pyстроитnormalized_query.modules/target_terms.pyизвлекает ключевые термы и alias-based сигналы.modules/anchors.pyстроитanchorsи marker-сигналы.router.pyсобираетQueryFeatures.routers/deterministic.pyпытается определить маршрут детерминированно.- Если deterministic route найден, он сразу возвращается.
- Если deterministic route не найден,
router.pyвызываетrouters/llm.py. - Если LLM вернул валидный маршрут, собирается
V2RouteResultсrouting_mode="llm_assisted". - Если LLM недоступен или не вернул валидный маршрут, используется fallback:
GENERAL / GENERAL_QA / SUMMARYсrouting_mode="llm_fallback".
5. Компоненты по флоу
router.py
-
Задача Собрать весь процесс роутинга в одной входной точке.
-
Как решает Последовательно вызывает normalizer, target terms extractor, anchors extractor, deterministic router и при необходимости LLM router.
-
Вход
user_query: str -
Выход
V2RouteResult
modules/normalizer.py
-
Задача Привести запрос к стабильной форме для дальнейшего анализа.
-
Как решает Схлопывает лишние пробелы через
" ".join(...split()). -
Вход
user_query: str -
Выход
normalized_query: str
modules/target_terms.py
-
Задача Выделить ключевые термы и retrieval-сигналы из запроса.
-
Как решает Использует:
- regex для path/entity-like фрагментов
- список stop-words
- alias rules с фразами и каноническими термами
- эвристику для
/health
-
Вход
normalized_query: str -
Выход
TargetTermsAnalysis:target_termsendpoint_pathsmatched_aliasesalias_docs
modules/anchors.py
-
Задача Построить полный набор
anchorsи doc-oriented marker-сигналов. -
Как решает Использует:
- regex для
entity_namesиfile_names - словари marker-фраз:
- file markers
- architecture markers
- logic markers
- domain markers
- endpoint markers
- map
endpoint -> target_doc_hint - alias docs из
TargetTermsAnalysis
- regex для
-
Вход
normalized_query: strTargetTermsAnalysis
-
Выход
AnchorAnalysis:anchorsfile_markersarchitecture_markerslogic_markersdomain_markersendpoint_markers
routers/docs_subintent_resolver.py
-
Задача Определить
subintent. -
Как решает Эвристика:
- если есть
file_markers->FIND_FILES - если есть doc-signals (
endpoint_paths,endpoint_markers,architecture_markers,logic_markers,domain_markers,target_doc_hints) ->SUMMARY - иначе
None
- если есть
-
Вход
QueryFeatures -
Выход
subintent: str | None
routers/deterministic.py
-
Задача Детерминированно определить маршрут без LLM там, где это возможно.
-
Как решает Использует:
DocsSubintentResolver- проверку conflicting doc anchors
- список general markers
Правила:
FIND_FILES->DOCS / DOC_EXPLAIN / FIND_FILESsubintent != Noneи нет конфликта doc-signals ->DOCS / DOC_EXPLAIN / SUMMARY- general marker ->
GENERAL / GENERAL_QA / SUMMARY
-
Вход
user_query: strQueryFeaturesanchors: V2RouteAnchors
-
Выход
V2RouteResult | None
routers/llm.py
-
Задача Определить маршрут через LLM, если deterministic routing не дал результата.
-
Как решает Формирует JSON payload из:
user_querynormalized_querytarget_termsanchors- списка допустимых маршрутов
Затем:
- вызывает LLM
- парсит JSON
- валидирует маршрут по whitelist
- нормализует
confidence
-
Вход
user_query: strnormalized_query: strtarget_terms: list[str]anchors: dict
-
Выход
dict | None:routing_domainintentsubintentconfidencereason_short
routers/prompts.yml
-
Задача Задать LLM-router формальный контракт ответа.
-
Как решает Описывает допустимые маршруты и требует вернуть только JSON.
-
Вход Payload от
routers/llm.py -
Выход Структурированный JSON-ответ LLM