Graph-first запросы к архитектуре
Что это
Команда query — единая точка входа для вопросов. Она сама решает, куда направить запрос: архитектурные вопросы уходят в граф кода (graph-first), а фактические — в проверенные знания (FTS5 по канонической генерации). Логика маршрутизации живёт в QueryService.route (src/raytsystem/querying.py).
Правило маршрутизации:
--scope code— всегда пытаться через граф кода; при недоступности графа запрос отклоняется (fail-closed), а не подменяется поиском.--scope auto(по умолчанию) — через граф, только если включён флагgraph_first_query_enabledи запрос распознан как «кодовый» по маркерам намерения (напримерархитектур,зависимост,импорт,модул,влияни,где определ,код,функци,.py,.tsx). Иначе — обычный поиск по знаниям.--scope knowledge— всегда обычный поиск.
Когда использовать
- Ориентация в архитектуре, зависимостях, владельцах функциональности и импактах — начинайте с
query --scope auto. - Смешанные вопросы, где заранее неясно, факт это или структура кода.
- Сравнение «обычное чтение файлов против graph-first» — через
graph benchmark.
Предварительные условия
- Для graph-ветки нужны флаги
code_graph_enabledиgraph_first_query_enabled(по умолчанию включены) и свежий граф. - Для knowledge-ветки нужна собранная генерация и индекс FTS5.
Пошагово
- Задайте вопрос:
uv run raytsystem query "..." --scope auto --json. - Управляйте глубиной обхода графа флагом
--depth(1..3, по умолчанию 2) и числом результатов знаний--limit(1..20). - Прочитайте в ответе
resolved_scope(codeилиknowledge) иfallback_reason, если он есть.
Fallback и бюджет контекста
Если при --scope auto граф отсутствует или устарел, route не падает, а переключается на обычный поиск и записывает причину code_graph_unavailable_or_stale. Если graph-first выключен флагом, а вопрос кодовый, причина будет graph_first_disabled (src/raytsystem/querying.py).
Ответ графа ограничен бюджетом узлов, рёбер и байт: результат «seed-first», но при превышении жёсткого лимита байт операция завершается ошибкой, а не выдаёт неполный небезопасный ответ (src/raytsystem/codegraph/querying.py). Это и есть механизм экономии контекста — вернуть релевантный минимум вместо чтения множества файлов целиком.
Benchmark
graph benchmark сравнивает ограниченный обычный лексический/файловый базовый поиск с graph-first при одинаковом байтовом лимите. Он использует объявленные вопросы и ожидаемые пути из benchmarks/codegraph/questions.jsonl и сообщает: хешированные вопросы, байты контекста, число прочитанных файлов, число поисковых операций, покрытие, точность ссылок на источники, задержку, число fallback и провалы из-за устаревшего графа. На устаревшем графе команда отказывается работать.
uv run raytsystem graph benchmark --json
Важно: результаты — это наблюдения, а не маркетинговые обещания. Целевое сокращение контекста (в исходниках упоминается ориентир 40%) сообщается как pass/fail без подгонки. Не выдавайте конкретные числа за гарантированный факт — benchmark воспроизводим, запустите его в своём репозитории.
Ожидаемый результат
- При кодовом намерении и свежем графе — срез графа (
resolved_scope: code). - При факте, отключённом флаге или устаревшем графе (в режиме auto) — ответ из знаний с указанным
fallback_reason.
Ограничения и безопасность
- Граф — производное состояние и не заменяет
ledger/CURRENT; ответы знаний строятся только на поддержанных claim с проверенными цитатами. - Запросы проходят проверку на длину и политику чувствительности; секреты в тексте запроса отклоняются.
- В режиме
--scope codeнедоступность графа приводит к отказу, а не к тихому fallback.
Частые ошибки
- Ждёте графовый ответ, а получаете знания — проверьте
fallback_reasonи свежесть графа (graph status). - Кодовый вопрос уходит в знания — включён ли
graph_first_query_enabledи распознаётся ли намерение (добавьте явные маркеры вроде «архитектура», «зависимости», «impact»).
Связанные страницы
Источники истины
src/raytsystem/querying.pysrc/raytsystem/codegraph/querying.pysrc/raytsystem/cli.pydocs/11-code-graph-and-execution-plane.mdbenchmarks/codegraph/questions.jsonl