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