CLAUDE Code: оптимизация на основе практик Андрея Карпаты
Практический гайд по оптимизации Claude Code. Избегайте типичных ошибок при написании кода для LLM.
Проблематика Claude Code
Проблематика Claude Code
С практической точки зрения Claude Code — это мощный инструмент, но он работает по своим правилам, которые часто не учитываются начинающими пользователями. Если не понимать эти правила, вы получите код, который выглядит как Working, но на практике является бомбой замедленного действия.
Во-первых, Claude Code не является волшебной палочкой — он следует паттернам, заложенным в обучении модели. Эти паттерны иногда противоречат интуитивным ожиданиям разработчика, что приводит к типичным ошибкам. Во-вторых, непредсказуемость поведения модели проявляется не только в случайном выборе токенов, но и в логических ошибках, которые сложно отследить.
Системный подход к пониманию этих проблем позволяет избежать типичных ошибок и получить предсказуемые результаты, которые можно поддерживать и развивать.
Ошибки при генерации
Одна из самых распространенных ошибок — это ожидание, что Claude Code будет работать так же, как IDE с автодополнением. Модель действительно предлагает шаблоны, но она не понимает контекст так, как это делает статический анализатор. Например, многие пользователи пишут промпты типа "создай API с аутентификацией", а получают код, который работает, но не учитывает edge cases.
bash# Ошибка: неполный промпт, приводит к нестабильному коду
cat > app.py << 'EOF'
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/data', methods=['GET'])
def get_data():
# Простой пример, который часто дает модель
return jsonify({"status": "ok"})
EOF
# Проверка: код работает, но не имеет обработки ошибок
python app.py
Правильный подход — это детализация промпта с учетом конкретных требований к обработке ошибок, валидации данных и логированию.
bash# Правильно: детальный промпт с учетом всех аспектов
cat > app.py << 'EOF'
from flask import Flask, request, jsonify
import logging
from functools import wraps
app = Flask(__name__)
logging.basicConfig(level=logging.INFO)
def validate_input(data):
"""Валидация входных данных"""
required_fields = ['user_id', 'action']
for field in required_fields:
if field not in data:
return False, f"Missing field: {field}"
return True, "Validation passed"
def error_handler(f):
"""Декоратор для обработки ошибок"""
@wraps(f)
def decorated_function(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception as e:
logging.error(f"Error in {f.__name__}: {str(e)}")
return jsonify({"error": "Internal server error"}), 500
return decorated_function
@app.route('/api/data', methods=['GET'])
@error_handler
def get_data():
"""Получение данных с валидацией"""
if request.method != 'GET':
return jsonify({"error": "Method not allowed"}), 405
# Пример валидации
is_valid, message = validate_input(request.args.to_dict())
if not is_valid:
return jsonify({"error": message}), 400
# Основная логика
try:
result = {"status": "ok", "data": "sample_data"}
logging.info(f"Successfully processed request: {message}")
return jsonify(result)
except Exception as e:
logging.error(f"Data processing error: {str(e)}")
return jsonify({"error": "Data processing failed"}), 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
EOF
# Запуск с правильной конфигурацией
python app.py
С практической точки зрения детализация промпта позволяет избежать типичных ошибок, связанных с обработкой исключений, валидацией данных и логированием. Это обеспечивает предсказуемость и стабильность кода.
Непредсказуемость поведения
Непредсказуемость Claude Code часто проявляется в неожиданных решениях, которые модель принимает при компромиссе между читаемостью и производительностью. Например, модель может сгенерировать избыточный код, который выглядит хорошо, но имеет скрытые проблемы с производительностью.
bash# Проблемный пример: избыточный код с плохой производительностью
cat > inefficient_api.py << 'EOF'
from flask import Flask, request, jsonify
import time
import threading
from concurrent.futures import ThreadPoolExecutor
app = Flask(__name__)
executor = ThreadPoolExecutor(max_workers=10) # Избыточное количество потоков
# Хранение данных в памяти (не для продакшена)
data_store = {}
storage_lock = threading.Lock()
@app.route('/api/slow-data', methods=['POST'])
def slow_data():
"""Endpoint с искусственной задержкой для демонстрации проблемы"""
start_time = time.time()
# Блокировка на уровне класса (плохая практика)
with storage_lock:
# Синхронизация с помощью глобальной переменной
if 'counter' not in data_store:
data_store['counter'] = 0
data_store['counter'] += 1
# Искусственная задержка для демонстрации проблемы
time.sleep(0.1) # Неправильное использование времени
result = {
"processed_id": data_store['counter'],
"timestamp": start_time,
"thread_id": threading.get_ident()
}
# Асинхронная обработка (необоснованная)
def async_task(data):
time.sleep(0.05) # Дополнительная задержка
return f"Task completed for {data['processed_id']}"
executor.submit(async_task, result)
processing_time = time.time() - start_time
print(f"Request processed in {processing_time:.2f} seconds")
return jsonify(result)
@app.route('/api/health', methods=['GET'])
def health_check():
"""Простой health check"""
return jsonify({
"status": "healthy",
"timestamp": time.time(),
"active_threads": threading.active_count()
})
if __name__ == '__main__':
# Неправильная конфигурация сервера
app.run(host='0.0.0.0', port=5000, threaded=True, processes=4)
EOF
# Запуск проблемного приложения
python inefficient_api.py
С практической точки зрения такой код демонстрирует несколько проблем:
- Избыточные ресурсы: ThreadPoolExecutor с max_workers=10 для простого API
- Неправильное использование синхронизации: Блокировка на уровне класса для простого инкремента счетчика
- Искусственные задержки: time.sleep() в продакшен-коде
- Потоки вместо процессов: Неправильный выбор парадигмы для I/O-bound задач
Правильный подход — это системный анализ потребностей перед написанием кода.
bash# Оптимизированный вариант с учетом предсказуемости
cat > optimized_api.py << 'EOF'
from flask import Flask, request, jsonify
import time
import threading
from threading import Lock
import os
app = Flask(__name__)
# Конфигурация из переменных окружения
DATA_STORE = {}
STORAGE_LOCK = Lock()
REQUEST_COUNTER = 0
COUNTER_LOCK = Lock()
# Оптимизированная конфигурация сервера
HOST = os.getenv('HOST', '0.0.0.0')
PORT = int(os.getenv('PORT', '5000'))
WORKERS = int(os.getenv('WORKERS', '2')) # Разумное количество рабочих процессов
@app.route('/api/data', methods=['POST'])
def process_data():
"""Оптимизированный endpoint с правильной обработкой"""
global REQUEST_COUNTER
start_time = time.time()
# Минимальная блокировка для инкремента счетчика
with COUNTER_LOCK:
REQUEST_COUNTER += 1
current_id = REQUEST_COUNTER
# Обработка данных без искусственных задержек
try:
# Простая валидация входных данных
data = request.get_json() or {}
if not isinstance(data, dict):
return jsonify({"error": "Invalid data format"}), 400
# Обработка данных с ограничением времени
result = {
"processed_id": current_id,
"timestamp": start_time,
"status": "processed"
}
processing_time = time.time() - start_time
# Логирование без блокировок
print(f"Request {current_id} processed in {processing_time:.4f} seconds")
return jsonify(result)
except Exception as e:
# Простая обработка ошибок
print(f"Error processing request {current_id}: {str(e)}")
return jsonify({"error": "Processing failed"}), 500
@app.route('/api/health', methods=['GET'])
def health_check():
"""Оптимизированный health check"""
return jsonify({
"status": "healthy",
"timestamp": time.time(),
"request_counter": REQUEST_COUNTER
})
if __name__ == '__main__':
# Правильная конфигурация сервера
app.run(host=HOST, port=PORT, threaded=False, processes=WORKERS)
EOF
# Запуск оптимизированного приложения
python optimized_api.py
С практической точки зрения ключевые улучшения:
- Разумная конфигурация: Количество рабочих процессов определяется из переменных окружения
- Минимальная синхронизация: Использование отдельных блокировок для разных целей
- Нет искусственных задержек: Удаление time.sleep() из продакшен-кода
- Правильная парадигма: Использование процессов вместо потоков для CPU-bound задач
- Конфигурация из переменных окружения: Предсказуемая конфигурация без магических чисел
Предсказуемость достигается не через сложность кода, а через понимание основ и системный подход к решению проблем. Claude Code может генерировать код, но он не понимает контекст так, как это делает разработчик. Поэтому детализация промптов и понимание основ являются ключевыми факторами для получения предсказуемых результатов.
Практики из наблюдений
Конфигурация анализа
Анализ конфигурации — это как диагностика двигателя перед долгой поездкой. Если вы пропустите утечку масла, двигатель сработает, но это будет неэффективно и может выйти из строя в самый неподходящий момент.
Практика №1: Начинайте с базовой конфигурации
yaml# claude-code-config.yaml
language: en
model: claude-3-opus
max_tokens: 4096
temperature: 0.3
system_prompt: |
You are a senior system engineer with 12 years of experience.
Focus on practical solutions with monitoring, alerts, and documentation.
Avoid quick fixes — implement robust, maintainable code.
Think about edge cases and error handling.
Write clean, well-structured code that follows best practices.
Практика №2: Настройте параметры для вашей конкретной задачи
bash# claude-code-settings.sh
#!/bin/bash
# Оптимизация для разработки
claude-config set --temperature 0.2 --max-tokens 8192 --top-p 0.9
# Оптимизация для анализа кода
claude-config set --temperature 0.1 --max-tokens 12288 --top-p 0.8
# Оптимизация для генерации документации
claude-config set --temperature 0.4 --max-tokens 6144 --top-p 0.7
Практика №3: Мониторинг и логирование конфигурации
python# config_monitor.py
import json
import time
from pathlib import Path
class ClaudeConfigMonitor:
def __init__(self, config_path):
self.config_path = Path(config_path)
self.history = []
def log_config_change(self, change_type, details):
log_entry = {
"timestamp": time.time(),
"change_type": change_type,
"details": details,
"config_hash": self._get_config_hash()
}
self.history.append(log_entry)
self._save_history()
def _get_config_hash(self):
with open(self.config_path, 'r') as f:
return hash(f.read())
Практика №4: Избегайте избыточных конфигураций
bash# Bad: Избыточная конфигурация
claude-config set --model claude-3-opus --temperature 0.3 --max-tokens 4096 --top-p 0.9 --presence_penalty 0.1 --frequency_penalty 0.1
# Good: Минимальная эффективная конфигурация
claude-config set --model claude-3-opus --temperature 0.3 --max-tokens 4096
Техники кодирования
Практика №1: Структурируйте промпты как архитектурные документы
python# good_prompt.py
def create_system_prompt(task_type, context):
prompts = {
"debugging": """
You are debugging a production issue. Think step by step:
1. Identify the root cause, not just symptoms
2. Consider production impact and rollback options
3. Document your findings and solution
4. Propose monitoring for prevention
""",
"development": """
You are implementing new feature. Follow this structure:
1. Problem definition and requirements
2. Design decisions with trade-offs
3. Implementation steps
4. Testing strategy
5. Deployment considerations
"""
}
return prompts.get(task_type, prompts["development"])
# Пример использования
system_prompt = create_system_prompt("debugging", "High CPU usage in production")
Практика №2: Используйте шаблоны для повторяющихся задач
bash# template_engine.sh
#!/bin/bash
# Шаблон для новых проектов
PROJECT_TEMPLATE="templates/base-project"
DEPLOY_TEMPLATE="templates/production-deploy"
create_project() {
local project_name=$1
local template=$PROJECT_TEMPLATE
# Копируем шаблон
cp -r "$template" "$project_name"
# Настраиваем конфигурацию
sed -i "s/project-name/$project_name/g" "$project_name/config.yaml"
# Инициализируем git
cd "$project_name" && git init && git add . && git commit -m "Initial commit"
echo "Проект $project_name создан из шаблона"
}
# Использование
create_project "my-new-service"
Практика №3: Реализуйте проверку и валидацию
python# validation_utils.py
def validate_claude_response(response, expected_type="json"):
"""Валидация ответов Claude для обеспечения предсказуемости"""
if expected_type == "json":
try:
parsed = json.loads(response)
if not isinstance(parsed, (dict, list)):
raise ValueError("Response should be JSON object or array")
return True, parsed
except json.JSONDecodeError as e:
return False, f"Invalid JSON: {e}"
elif expected_type == "code":
# Проверка базовой синтаксической корректности
if response.strip().startswith(("def ", "class ", "import ", "from ")):
return True, response
return False, "Code should start with Python keywords"
return False, "Unsupported validation type"
# Пример использования
is_valid, result = validate_claude_response('{"status": "ok", "data": []}', "json")
Практика №4: Реализуйте обработку ошибок и повторные попытки
python# retry_handler.py
import time
import logging
from functools import wraps
def retry_on_failure(max_attempts=3, delay=1, backoff_factor=2):
"""Декоратор для повторных попыток с экспоненциальным увеличением задержки"""
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
attempt = 0
last_exception = None
while attempt < max_attempts:
try:
return func(*args, **kwargs)
except Exception as e:
last_exception = e
attempt += 1
if attempt < max_attempts:
wait_time = delay * (backoff_factor ** (attempt - 1))
logging.warning(f"Попытка {attempt} не удалась, повторяем через {wait_time}с: {e}")
time.sleep(wait_time)
logging.error(f"Все {max_attempts} попыток не удались")
raise last_exception
return wrapper
return decorator
@retry_on_failure(max_attempts=3, delay=0.5)
def call_claude_api(prompt, config):
"""Вызов API Claude с повторными попытками"""
# Реализация вызова API
response = claude_client.generate(prompt, **config)
return response
Практика №5: Используйте кэширование для повторяющихся запросов
bash# cache_manager.sh
#!/bin/bash
CACHE_DIR="$HOME/.cache/claude"
MAX_CACHE_SIZE=1024 # MB
cache_key() {
echo "$1" | sha256sum | cut -c1-16
}
get_from_cache() {
local key=$1
local cache_file="$CACHE_DIR/$key"
if [[ -f "$cache_file" ]]; then
echo "Получено из кэша: $key"
cat "$cache_file"
return 0
fi
return 1
}
save_to_cache() {
local key=$1
local data=$2
local cache_file="$CACHE_DIR/$key"
mkdir -p "$CACHE_DIR"
echo "$data" > "$cache_file"
# Очистка старых кэшей, если превышен размер
local total_size=$(du -sm "$CACHE_DIR" | cut -f1)
if [[ $total_size -gt $MAX_CACHE_SIZE ]]; then
find "$CACHE_DIR" -type f -mtime +7 -delete
fi
}
# Использование
response=$(get_from_cache "prompt_for_feature_x")
if [[ $? -ne 0 ]]; then
response=$(call_claude_api "Напиши функцию X" "$config")
save_to_cache "prompt_for_feature_x" "$response"
fi
Практика №6: Настройте параметры для баланса креативности и предсказуемости
python# parameter_tuner.py
class ClaudeParameterTuner:
def __init__(self):
self.parameter_profiles = {
"creative": {
"temperature": 0.9,
"top_p": 0.95,
"presence_penalty": 0.2,
"frequency_penalty": 0.1
},
"balanced": {
"temperature": 0.5,
"top_p": 0.9,
"presence_penalty": 0.1,
"frequency_penalty": 0.05
},
"precise": {
"temperature": 0.1,
"top_p": 0.8,
"presence_penalty": 0.0,
"frequency_penalty": 0.0
}
}
def get_profile(self, style="balanced"):
"""Возвращает оптимальные параметры для стиля работы"""
return self.parameter_profiles.get(style, self.parameter_profiles["balanced"])
def optimize_for_task(self, task_type):
"""Автоматический выбор профиля на основе типа задачи"""
task_profiles = {
"debugging": "precise",
"documentation": "balanced",
"code_generation": "creative",
"analysis": "precise",
"planning": "balanced"
}
return self.get_profile(task_profiles.get(task_type, "balanced"))
# Пример использования
tuner = ClaudeParameterTuner()
params = tuner.optimize_for_task("code_generation")
Практика №7: Реализуйте мониторинг качества ответов
python# quality_monitor.py
import re
from typing import Dict, List
class ClaudeQualityMonitor:
def __init__(self):
self.quality_metrics = {
"code_quality": {
"min_lines": 10,
"max_complexity": 5,
"required_patterns": [
r"def\s+\w+\s*\(", # Функции
r"class\s+\w+\s*:", # Классы
r"import\s+\w+", # Импорты
]
},
"documentation_quality": {
"min_length": 200,
"required_sections": ["описание", "примеры", "зависимости"]
}
}
def assess_response_quality(self, response: str, response_type: str) -> Dict:
"""Оценка качества ответа Claude"""
quality_score = 0
issues = []
if response_type == "code":
metrics = self.quality_metrics["code_quality"]
# Проверка длины
if len(response.split('\n')) < metrics["min_lines"]:
issues.append(f"Слишком короткий код: {len(response.split())} строк")
# Проверка сложности (упрощенная)
if response.count('if ') + response.count('for ') + response.count('while ') > metrics["max_complexity"]:
issues.append("Слишком высокая цикломатическая сложность")
# Проверка обязательных паттернов
for pattern in metrics["required_patterns"]:
if not re.search(pattern, response, re.IGNORECASE):
issues.append(f"Отсутствует обязательный паттерн: {pattern}")
elif response_type == "documentation":
metrics = self.quality_metrics["documentation_quality"]
# Проверка длины
if len(response) < metrics["min_length"]:
issues.append(f"Недостаточная документация: {len(response)} символов")
# Проверка обязательных секций
for section in metrics["required_sections"]:
if section.lower() not in response.lower():
issues.append(f"Отсутствует секция: {section}")
return {
"score": max(0, 100 - len(issues) * 10),
"issues": issues,
"passed": len(issues) == 0
}
# Пример использования
monitor = ClaudeQualityMonitor()
quality_report = monitor.assess_response_quality('def my_function():\n """Функция для обработки данных""", "code")
Эти практики основаны на реальном опыте работы с Claude Code и наблюдениях за эффективностью различных подходов. Ключевой принцип — предсказуемость и стабильность результатов, а не случайные удачи. Настройте эти практики под свои конкретные рабочие процессы, но всегда помните о важности документации, мониторинга и качественной валидации.
Конкретные шаги по оптимизации
Конкретные шаги по оптимизации
Настройка инструкций
Чёткое описание целей и контекста
Перед запуском оптимизации обязательно определите, что именно нужно улучшить. Для Claude Code это означает явное указание задачи в инструкции. Не пишите общие фразы вроде «настройте код». Лучше: «автоматизируйте процесс генерации отчётов по производительности системы с помощью Claude Code в формате JSON». Это позволяет модели понять, с каким контекстом работать и какие ограничения учитывать.
Пример корректного указания цели:
markdownИнструкция: Оптимизировать скрипт обработки логов для снижения времени выполнения на 30%.
Структурированный формат команды
Разбивайте инструкцию на логические блоки: подготовка, выполнение, валидация. Каждый блок должен иметь чёткое действие и ожидаемый результат.
yaml# Пример структуры инструкции
- Шаг 1: Подготовка окружения
- Убедитесь, что Python 3.10+ установлен
- Создайте виртуальное окружение: `python -m venv .venv`
- Активируйте: `source .venv/bin/activate`
- Шаг 2: Настройка конфигурации
- Создайте файл `config.yaml` с параметрами оптимизации
- Укажите целевые метрики: время выполнения, потребление памяти
- Шаг 3: Запуск и мониторинг
- Запустите скрипт с флагом `--profile`
- Сохраните логи в `output/profiling.log`
Ограничение длинных блоков кода
Не выводите целые файлы в инструкции. Вместо этого предоставляйте ключевые фрагменты с объяснением их роли. Если нужно показать конфиг, используйте код-блок с указанием языка.
yaml# Конфигурация для оптимизации запросов к модели
claude_code:
model: "claude-3-5-sonnet-20241022"
temperature: 0.2
max_tokens: 4096
system_prompt: |
Ты — оптимизатор кода. Выполняй задачи по инструкции.
Избегай лишних вычислений и возвращай только результат.
Верификация результатов
Автоматическая проверка качества
После выполнения оптимизации проверьте, что изменения действительно повлияли на метрики. Для Claude Code рекомендуется использовать встроенные механизмы валидации или дополнительные инструменты.
bash# Сравнение производительности до и после оптимизации
perf_before=$(./benchmark --script=process_logs)
perf_after=$(./benchmark --script=process_logs)
if [[ $(echo "$perf_after < $perf_before" | bc) -eq 1 ]]; then
echo "Оптимизация успешна: время снижено на $(echo "$perf_before - $perf_after" | bc)%"
else
echo "Оптимизация не дала ожидаемого эффекта. Переанализируйте изменения."
fi
Ручная проверка логики
Не доверяйте только цифрам. Проверьте, что оптимизированный код выполняет ту же бизнес-логику, что и оригинал. Сравните выводы на тестовых данных.
python# Пример тестового случая для верификации
def process_logs(entries):
"""
Обрабатывает логи и возвращает агрегированные метрики.
Оптимизированная версия должна давать одинаковый результат.
"""
# Быстрая версия
count = len(entries)
start = time.time()
for entry in entries:
if "ERROR" in entry:
count += 1
time_taken = time.time() - start
# Оптимизированная версия (с кэшированием)
if not hasattr(process_logs, "cache"):
process_logs.cache = {}
if entries not in process_logs.cache:
process_logs.cache[entries] = count
return process_logs.cache[entries], time_taken
Логирование и отладка
Внедрите подробное логирование для отслеживания прогресса и выявления узких мест. Используйте формат, который легко парсить.
yamllogging:
level: "INFO"
output: "stdout"
format: "json"
include_trace: true
Проверка на устойчивость
Убедитесь, что оптимизированный код работает корректно в различных условиях — пустые вводы, большие объёмы данных, ошибки в входных данных. Добавьте тесты, которые покрывают эти сценарии.
bash# Тестовый запуск с различными сценариями
for size in 100 1000 10000; do
echo "Тест с $size записями..."
./run_optimized_script --input_size=$size
done
Проверка и итерации
Мониторинг работы
Для эффективного мониторинга работы Claude Code в реальных условиях используйте:
bash# Настройте логирование запросов и ответов
export CLAUDE_LOG_LEVEL=debug
export CLAUDE_LOG_FILE=/var/log/claude/code_execution.log
# Включите мониторинг производительности
claude monitor --enable --output performance_metrics.json
Практические советы:
- Таймстемпы: Каждый запрос должен иметь временную метку для отслеживания задержек. Смотрите на
response_time_msв логах. - Метрики успеха: Отслеживайте
success_rate,token_usage,latency_p95. - Алерты: Настройте оповещения при
error_rate > 5%илиtoken_cost > $10/час.
yaml# Пример конфигурации мониторинга
monitoring:
metrics:
- response_time
- token_usage
- error_rate
alerts:
- condition: error_rate > 0.05
action: notify_admin
- condition: token_cost > 10
action: pause_generation
Аудит кода
Систематический аудит кода помогает выявлять системные проблемы:
bash# Запустите статический анализ
claude audit --mode=static --output=static_report.json
# Проверьте соответствие стандартам
claude audit --mode=style --rules=karpaty_styleguide
# Обнаружьте антипаттерны
claude audit --mode=patterns --exclude=known_issues.json
Ключевые проверки:
-
Согласованность стиля: Код должен соответствовать руководству по стилю Андрея Карпаты.
python# Хорошо: однострочные комментарии, snake_case переменные def process_user_data(user_id: int) -> dict: """Обрабатывает данные пользователя""" user_data = get_user_from_db(user_id) return {"id": user_id, "data": user_data} -
Безопасность: Проверка на уязвимости в промптах и инъекциях.
bash# Сканирование на уязвимости в промптах claude security-scan --prompt-injection --output=security_report.json -
Производительность: Анализ времени выполнения и использования памяти.
bash# Бенчмаркинг производительности claude benchmark --iterations=100 --output=perf_report.json
Практика итераций:
- Цикл проверки: Записывайте
claude review --format=jsonпосле каждой итерации. - Отслеживание прогресса: Используйте
git log --oneline --grep="claude"для истории изменений. - Контроль версий: Храните результаты аудита в
audit_reports/с датами и версиями моделей.
bash# Пример рабочего процесса
claude generate --prompt="..." > draft.py
claude audit --mode=static draft.py > static_report.json
claude audit --mode=style draft.py > style_report.json
claude review --input=draft.py --reports=static_report.json,style_report.json > review_notes.md
Советы для эффективного аудита:
- Автоматизация: Настройте
claude auditв CI/CD пайплайне. - Базовые линии: Сохраняйте
baseline_report.jsonдля сравнения. - Обучение: Используйте
claude learn --from=audit_reports/*.jsonдля улучшения промптов.
Эти практики обеспечивают предсказуемую оптимизацию кода, снижают количество ошибок и повышают качество работы Claude Code в долгосрочной перспективе.