Полное руководство по использованию CodeGraph для анализа кода.
Содержание¶
- Обзор
- Базовое использование
- Интерактивный режим
- Программное использование
- Типы вопросов
- Запросы определений
- Запросы связей
- Семантические запросы
- Запросы безопасности
- Понимание результатов
- Структура результата
- Уровни достоверности
- Расширенные функции
- Гибридный режим поиска
- Анализ нескольких доменов
- Сценарный анализ
- Поиск структурных шаблонов
- Рекомендации
- Формулирование эффективных вопросов
- Оптимизация производительности
- Интерпретация ответов
- Интеграция в рабочие процессы
- Интеграция с CI/CD
- Проверка кода
- Генерация документации
- Дальнейшие шаги
Обзор¶
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.yaml → projects с полями 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-запросы”
Менее эффективные: - “Расскажи мне о коде” (слишком расплывчато) - “Исправь эту ошибку” (запрос действия, а не анализа) - “Всё о транзакциях” (слишком широко)
Оптимизация производительности¶
- Будьте конкретны — Чёткие вопросы дают более быстрые ответы
- Используйте структурные запросы — Когда вы знаете шаблон
- Включите кеширование — Для повторяющихся похожих запросов
- Ограничьте область — Добавьте ограничения по файлам или подсистемам
Интерпретация ответов¶
- Проверьте данные — Проверяйте ссылки на код в
result['evidence'] - Учитывайте достоверность — Низкая достоверность = требуется ручная проверка
- Уточняйте — Задавайте дополнительные вопросы
- Сверяйте — Сравнивайте с реальным кодом
Интеграция в рабочие процессы¶
Интеграция с 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'])
Дальнейшие шаги¶
- Сценарии — Все 21 сценарий анализа
- Руководство CLI — Интерфейс командной строки
- Справка по API — Программный доступ
- Устранение неполадок — Типичные проблемы