Руководство пользователя

Полное руководство по использованию CodeGraph для анализа кода.

Содержание

Обзор

CodeGraph отвечает на вопросы на естественном языке о кодовой базе, комбинируя: - Семантический поиск — Поиск кода по смыслу и назначению - Структурный поиск — Обход графов вызовов и потоков данных - Синтез с помощью LLM — Генерация ответов, понятных человеку

Базовое использование

Интерактивный режим

python examples/demo_simple.py

Введите вопросы в командной строке:

> Что делает CommitTransaction?
> Найди методы, отвечающие за выделение памяти
> Покажи цепочку вызовов от исполнителя к хранилищу

Программное использование

from src.digital_employees.runtime.scenarios import invoke_role_bound_scenario

scenario_context = {"project_key": "codegraph", "namespace": "codegraph/default/codegraph", "task_id": "TASK-EXAMPLE", "language": "ru"}
question = "Какие методы обрабатывают фиксацию транзакций?"
result = invoke_role_bound_scenario(query=question, context=scenario_context)

print(f"Ответ: {result['answer']}")
print(f"Достоверность: {result.get('confidence', 'N/A')}")
print(f"Интент: {result.get('intent')}")

invoke_role_bound_scenario() принимает явный сценарий и scoped context:

result = invoke_role_bound_scenario(
    query="Найти уязвимости SQL-инъекций",
    scenario_id="scenario_02",
    context=scenario_context,
)

Типы вопросов

Запросы определений

Поиск мест определения кода:

Найди метод 'heap_insert'
Где определён AbortTransaction?
Покажи мне функцию RelationGetBufferForTuple

Запросы связей

Анализ связей в коде:

Какие методы вызывают LWLockAcquire?
Найди вызывающие функции MemoryContextCreate
Что вызывает heap_insert?

Семантические запросы

Вопросы о поведении и назначении:

Как PostgreSQL обрабатывает MVCC?
Объясни процесс фиксации транзакций
Какой механизм обеспечивает долговечность?

Запросы безопасности

Поиск уязвимостей:

Найди потенциальные точки SQL-инъекций
Покажи пути с необработанным пользовательским вводом
Найди риски переполнения буфера

Понимание результатов

Структура результата

invoke_role_bound_scenario() возвращает словарь MultiScenarioState со следующими ключевыми полями:

{
    # Основной вывод
    "answer": "CommitTransaction завершает транзакцию путём...",
    "confidence": 0.85,                # Уверенность классификации интента (0.0–1.0)
    "intent": "security",              # Определённый интент (security, performance и т.д.)
    "scenario_id": "scenario_2",       # ID выполненного сценария

    # Подтверждающие данные
    "evidence": ["xact.c:1234 — CommitTransaction вызывает..."],
    "cpg_results": [...],              # Результаты CPG-запросов
    "metadata": {...},                 # Метаданные сценария

    # Классификация
    "classification_method": "keyword", # "keyword" или "llm"

    # Обработка ошибок
    "error": None,                     # Сообщение об ошибке (если есть)
}

Полный MultiScenarioState TypedDict (src/workflow/state.py) содержит 21 ключ, включая query, context, language, subsystems, methods, call_graph, retrieved_functions, retry_count, enrichment_config, внутренний слот адаптера OpenViking, db_path, collection_prefix и pre_retrieval_results.

Уровни достоверности

Поле confidence отражает уверенность классификатора интентов, а не качество ответа:

Уровень Значение
> 0.9 Высокая достоверность — совпадение по ключевым словам или принудительный сценарий
0.7–0.9 Хорошая достоверность — классификация LLM
0.5–0.7 Умеренная — неоднозначный интент
< 0.5 Низкая — откат к сценарию по умолчанию

Расширенные функции

Гибридный режим поиска

Комбинированный семантический поиск через OpenViking и структурный поиск CPG через GoCPG:

from src.agents.core_agents.retriever_agent import RetrieverAgent
from src.agents.core_agents.analyzer_agent import AnalyzerAgent
from src.services.cpg import CPGQueryService
from src.workflow._components import get_retrieval_adapter

# Инициализация зависимостей
retrieval_adapter = get_retrieval_adapter(collection_prefix="codegraph")
analyzer_agent = AnalyzerAgent()
cpg_service = CPGQueryService(db_path="data/projects/codegraph.duckdb", grpc_only=True)

# Создание ретривера с гибридным режимом
retriever = RetrieverAgent(
    retrieval_adapter,
    analyzer_agent=analyzer_agent,
    cpg_service=cpg_service,   # Включает гибридный поиск
    enable_hybrid=True,
)

# Запуск гибридного поиска
results = retriever.retrieve_hybrid(
    question="Найти шаблоны выделения памяти",
    mode="hybrid",             # "hybrid", "vector_only" или "graph_only"
    query_type="structural",   # Подсказка: "semantic", "structural", "security"
    top_k=10,
)

Анализ нескольких доменов

Явно разрешите проект и передайте его project scope через контекст workflow:

from src.project_manager import ProjectManager

pm = ProjectManager()
project = pm.resolve_project(project_name="postgresql")

from src.digital_employees.runtime.scenarios import invoke_role_bound_scenario
scenario_context = {"project_key": "codegraph", "namespace": "codegraph/default/codegraph", "task_id": "TASK-EXAMPLE", "language": "ru"}
result = invoke_role_bound_scenario(
    query="Найти риски переполнения буфера",
    context={
        **scenario_context,
        "project_key": project.name,
        "db_path": project.db_path,
        "source_path": project.source_path,
        "domain": project.domain,
    },
)

Проекты регистрируются в config.yamlprojects с полями db_path, source_path, language и domain.

Сценарный анализ

Используйте role-bound вызов сценариев для сценарного анализа:

from src.digital_employees.runtime.scenarios import invoke_role_bound_scenario

scenario_context = {"project_key": "codegraph", "namespace": "codegraph/default/codegraph", "task_id": "TASK-EXAMPLE", "language": "ru"}

# Анализ безопасности — тип определяется автоматически
result = invoke_role_bound_scenario(query="Найти уязвимости к SQL-инъекциям", context=scenario_context)
print(f"Интент: {result.get('intent')}")  # → 'security'

# Анализ производительности
result = invoke_role_bound_scenario(query="Найти функции с высокой цикломатической сложностью", context=scenario_context)
print(f"Интент: {result.get('intent')}")  # → 'performance'

# Принудительный выбор сценария (например, security = scenario_02)
result = invoke_role_bound_scenario(
    query="Проанализировать модуль аутентификации",
    scenario_id="scenario_02",
    context=scenario_context,
)

Доступен 21 сценарий (S01 onboarding — S21 interface_docs_sync). Полный список см. в Сценарии.

Поиск структурных шаблонов

Поиск шаблонов кода с использованием CST-сопоставления tree-sitter GoCPG с CPG-ограничениями:

Использование шаблонов программно

import asyncio
from src.services.gocpg import GoCPGClient

async def main():
    client = GoCPGClient()

    # Ad-hoc поиск шаблонов (без CPG-базы)
    results = await client.search(pattern="malloc($x)", language="c", max_results=50)

    # Сканирование с CPG-ограничениями по правилам
    results = await client.scan(
        db_path="data/projects/postgres.duckdb",
        rule_id="unchecked-return",
    )
    print(results)

asyncio.run(main())

Запрос находок шаблонов через CPG Query Service

from src.services.cpg import CPGQueryService

cpg = CPGQueryService(db_path="data/projects/postgres.duckdb", grpc_only=True)

# Запрос сохранённых находок паттернов
findings = cpg.get_pattern_findings(severity="high")
stats = cpg.get_pattern_statistics()

Рекомендации

Формулирование эффективных вопросов

Хорошие вопросы: - “Какие функции обрабатывают выделение памяти в менеджере буферов?” - “Покажи путь вызовов от парсера к исполнителю” - “Найди необработанные пользовательские входы, попадающие в SQL-запросы”

Менее эффективные: - “Расскажи мне о коде” (слишком расплывчато) - “Исправь эту ошибку” (запрос действия, а не анализа) - “Всё о транзакциях” (слишком широко)

Оптимизация производительности

  1. Будьте конкретны — Чёткие вопросы дают более быстрые ответы
  2. Используйте структурные запросы — Когда вы знаете шаблон
  3. Включите кеширование — Для повторяющихся похожих запросов
  4. Ограничьте область — Добавьте ограничения по файлам или подсистемам

Интерпретация ответов

  1. Проверьте данные — Проверяйте ссылки на код в result['evidence']
  2. Учитывайте достоверность — Низкая достоверность = требуется ручная проверка
  3. Уточняйте — Задавайте дополнительные вопросы
  4. Сверяйте — Сравнивайте с реальным кодом

Интеграция в рабочие процессы

Интеграция с CI/CD

# .github/workflows/code-analysis.yml
- name: Запустить анализ кода
  run: |
    python -c "
    from src.digital_employees.runtime.scenarios import invoke_role_bound_scenario
    scenario_context = {'project_key': 'codegraph', 'namespace': 'codegraph/default/codegraph', 'task_id': 'TASK-EXAMPLE', 'language': 'ru'}
    result = invoke_role_bound_scenario(query='Найти потенциальные проблемы безопасности', context=scenario_context)
    if result.get('error'):
        print(f'Ошибка анализа: {result[\"error\"]}')
        exit(1)
    print(result['answer'])
    "

Проверка кода

# Запуск автоматической проверки staged changes
python -m src.cli review --staged

# Доступные флаги:
#   --db PATH       Путь к DuckDB CPG-базе данных
#   --base-ref REF  Git base ref для diff review
#   --format FORMAT Формат вывода: text, json, markdown или sarif
#   --output-file   Необязательный файл вывода

Генерация документации

from src.digital_employees.runtime.scenarios import invoke_role_bound_scenario

scenario_context = {"project_key": "codegraph", "namespace": "codegraph/default/codegraph", "task_id": "TASK-EXAMPLE", "language": "ru"}
result = invoke_role_bound_scenario(query="Документируй подсистему транзакций", context=scenario_context)

# result['answer'] содержит сгенерированную документацию
print(result['answer'])

Дальнейшие шаги