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

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

Содержание

Обзор

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

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

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

python examples/demo_simple.py

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

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

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

from src.workflow import MultiScenarioCopilot

copilot = MultiScenarioCopilot()
question = "Какие методы обрабатывают фиксацию транзакций?"
result = copilot.run(question)

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

Метод run() принимает дополнительные параметры:

result = copilot.run(
    query="Найти уязвимости SQL-инъекций",
    context={"scenario_id": "scenario_2"},  # Принудительный выбор сценария
    language="ru",                           # Язык ответа (en/ru)
)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

copilot.run() возвращает словарь 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, vector_store, db_path, collection_prefix и pre_retrieval_results.

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

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

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

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

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

Комбинированный семантический (ChromaDB) и структурный (DuckDB CPG) поиск:

from src.agents.retriever_agent import RetrieverAgent
from src.retrieval.vector_store import VectorStoreReal
from src.agents.analyzer_agent import AnalyzerAgent
from src.services.cpg import CPGQueryService

# Инициализация зависимостей
vector_store = VectorStoreReal()
analyzer_agent = AnalyzerAgent()
cpg_service = CPGQueryService()

# Создание ретривера с гибридным режимом
retriever = RetrieverAgent(
    vector_store=vector_store,
    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,
)

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

Переключение между кодовыми базами через ProjectManager:

from src.project_manager import ProjectManager

pm = ProjectManager()

# Переключение на зарегистрированный проект (активирует БД, коллекции, домен)
pm.switch_project("postgresql")

# Анализ в контексте этого проекта
from src.workflow import MultiScenarioCopilot
copilot = MultiScenarioCopilot()
result = copilot.run("Найти риски переполнения буфера")

# Переключение на другой проект
pm.switch_project("linux_kernel")
result = copilot.run("Найти шаблоны use-after-free")

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

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

Использование сопровождающего агента для анализа по сценариям (тип сценария определяется автоматически):

from src.workflow import MultiScenarioCopilot

copilot = MultiScenarioCopilot()

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

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

# Принудительный выбор сценария (например, security = scenario_2)
result = copilot.run(
    "Проанализировать модуль аутентификации",
    context={"scenario_id": "scenario_2"},
)

Доступен 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()

# Запрос сохранённых находок паттернов
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.workflow import MultiScenarioCopilot
    copilot = MultiScenarioCopilot()
    result = copilot.run('Найти потенциальные проблемы безопасности')
    if result.get('error'):
        print(f'Ошибка анализа: {result[\"error\"]}')
        exit(1)
    print(result['answer'])
    "

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

# Запуск демо автоматической проверки изменений
python examples/demo_patch_review.py --db data/projects/myproject.duckdb

# Доступные флаги:
#   --db PATH       Путь к DuckDB CPG-базе данных
#   --no-dod        Отключить функционал Definition of Done
#   --auto-dod      Авто-генерация DoD вместо извлечения из PR body
#   --interactive   Включить интерактивное подтверждение DoD

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

from src.workflow import MultiScenarioCopilot

copilot = MultiScenarioCopilot()
result = copilot.run("Документируй подсистему транзакций")

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

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