Шаблоны промптов для взаимодействия с LLM. Динамическая генерация и композиция.
Prompts — это шаблоны взаимодействия. В этой теме научимся создавать предустановленные шаблоны для стандартизации частых сценариев использования LLM.
Prompts (Промпты) — предустановленные шаблоны взаимодействия с LLM, которые MCP сервер предоставляет для использования.
| Характеристика | Resources | Tools | Prompts |
|---|---|---|---|
| Назначение | Чтение данных | Выполнение действий | Шаблоны для LLM |
| Возврат | Содержимое | Результат выполнения | Сообщение для LLM |
| Использование | Прямой доступ | Вызов функции | Генерация промпта |
code_review(code) → Шаблон для проверки кода
write_test(function) → Шаблон для написания тестов
summarize(text) → Шаблон для суммаризации
explain_concept(topic) → Шаблон для объяснения концепции
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Prompts Demo")
@mcp.prompt()
def code_review_template() -> str:
"""Шаблон для код-ревью."""
return """
Ты — опытный разработчик, проводящий код-ревью.
Проанализируй предоставленный код и дай рекомендации по:
1. Потенциальным багам и уязвимостям
2. Нарушениям best practices и стиля кода
3. Возможностям для оптимизации производительности
4. Улучшению читаемости и поддерживаемости
Будь конструктивен, указывай на конкретные строки кода.
"""@mcp.prompt()
def code_review_with_code(code: str) -> str:
"""
Шаблон для код-ревью с кодом.
Args:
code: Код для проверки
"""
return f"""
Пожалуйста, проверь этот код:
```python
{code}Обрати внимание на:
Дай конкретные рекомендации с примерами исправлений. """
---
## 3. Промпты с несколькими аргументами
### Множественные параметры
```python
from typing import Optional
@mcp.prompt()
def write_unit_test(
function_name: str,
function_code: str,
test_framework: str = "pytest",
include_edge_cases: bool = True
) -> str:
"""
Шаблон для написания юнит-тестов.
Args:
function_name: Имя тестируемой функции
function_code: Код функции
test_framework: Фреймворк для тестов (pytest, unittest)
include_edge_cases: Включать ли тесты граничных значений
"""
edge_cases_instruction = """
- Тесты граничных значений (пустыеввода, максимальные значения, None)
- Тесты исключительных ситуаций (ожидаемые исключения)
""" if include_edge_cases else ""
return f"""
Напиши юнит-тесты для функции `{function_name}` используя {test_framework}:
```python
{function_code}
Тесты должны покрывать:
Для каждого теста напиши понятное название и комментарий, что он проверяет. """
### Промпт для генерации документации
```python
@mcp.prompt()
def generate_documentation(
code: str,
language: str = "python",
docstyle: str = "google",
include_examples: bool = True
) -> str:
"""
Шаблон для генерации документации.
Args:
code: Код для документирования
language: Язык программирования
docstyle: Стиль документации (google, numpy, sphinx)
include_examples: Включать ли примеры использования
"""
style_guide = {
"google": "Google Style Guide (Args, Returns, Raises секции)",
"numpy": "NumPy Style Guide (Parameters, Returns секции)",
"sphinx": "reStructuredText для Sphinx (:param, :return:)"
}
examples_section = """
Также напиши 2-3 примера использования каждой функции.
""" if include_examples else ""
return f"""
Напиши документацию для следующего кода на {language}:
```{language}
{code}
Используй {style_guide.get(docstyle, docstyle)} для форматирования. Для каждой функции укажи:
---
## 4. Промпты для разных ролей
### Роль: Senior Developer
```python
@mcp.prompt()
def senior_dev_review(code: str, task_description: str) -> str:
"""
Ревью от лица senior разработчика.
Args:
code: Код для проверки
task_description: Описание задачи
"""
return f"""
Ты — senior разработчик с 10+ годами опыта. Твоя задача — провести код-ревью.
**Задача:**
{task_description}
**Код для проверки:**
```python
{code}
Что проверить:
Дай развёрнутый ответ с конкретными рекомендациями. """
### Роль: Security Expert
```python
@mcp.prompt()
def security_audit(code: str, context: str = "") -> str:
"""
Аудит безопасности кода.
Args:
code: Код для аудита
context: Контекст использования (веб, CLI, API)
"""
return f"""
Ты — эксперт по безопасности приложений. Проведи аудит кода.
**Контекст:** {context or "Не указан"}
**Код для аудита:**
```python
{code}
Проверь на уязвимости:
Для каждой найденной уязвимости:
### Роль: Performance Engineer
```python
@mcp.prompt()
def performance_review(code: str, expected_load: str = "") -> str:
"""
Анализ производительности кода.
Args:
code: Код для анализа
expected_load: Ожидаемая нагрузка
"""
return f"""
Ты — инженер по производительности. Проанализируй код.
**Ожидаемая нагрузка:** {expected_load or "Не указана"}
**Код для анализа:**
```python
{code}
Что проанализировать:
Для каждой проблемы:
---
## 5. Промпты для работы с данными
### Анализ данных
```python
@mcp.prompt()
def analyze_dataframe(code: str, data_description: str) -> str:
"""
Анализ кода для pandas DataFrame.
Args:
code: Код с pandas операциями
data_description: Описание данных
"""
return f"""
Ты — эксперт по анализу данных с глубоким знанием pandas.
**Описание данных:**
{data_description}
**Код для анализа:**
```python
{code}
Проанализируй:
Предложи оптимизированную версию кода с объяснениями. """
### SQL запросы
```python
@mcp.prompt()
def optimize_sql(query: str, schema_info: str = "") -> str:
"""
Оптимизация SQL запроса.
Args:
query: SQL запрос для оптимизации
schema_info: Информация о схеме БД
"""
return f"""
Ты — DBA с опытом оптимизации сложных запросов.
**Схема БД:**
{schema_info or "Не предоставлена"}
**Запрос для оптимизации:**
```sql
{query}
Проанализируй:
Предложи оптимизированную версию с объяснениями. """
---
## 6. Промпты для обучения
### Объяснение концепции
```python
@mcp.prompt()
def explain_concept(
concept: str,
audience_level: str = "intermediate",
include_examples: bool = True
) -> str:
"""
Шаблон для объяснения концепции.
Args:
concept: Концепция для объяснения
audience_level: Уровень аудитории (beginner, intermediate, advanced)
include_examples: Включать ли примеры
"""
level_descriptions = {
"beginner": "Объясняй как новичку, избегай сложного жаргона",
"intermediate": "Используй технические термины, но объясняй сложные моменты",
"advanced": "Глубокое техническое объяснение без упрощений"
}
examples_instruction = """
Включи практические примеры кода для иллюстрации концепции.
""" if include_examples else ""
return f"""
Ты — опытный преподаватель программирования.
**Задача:** Объясни концепцию "{concept}"
**Уровень аудитории:** {audience_level}
{level_descriptions.get(audience_level, "")}
{examples_instruction}
**Структура объяснения:**
1. Краткое определение (1-2 предложения)
2. Зачем это нужно (use cases)
3. Как это работает (механизм)
4. Примеры использования
5. Распространённые ошибки и как их избежать
6. Связанные концепции для дальнейшего изучения
"""
@mcp.prompt()
def solve_coding_problem(
problem_description: str,
constraints: str = "",
language: str = "python"
) -> str:
"""
Шаблон для решения алгоритмической задачи.
Args:
problem_description: Описание задачи
constraints: Ограничения (время, память)
language: Язык программирования
"""
return f"""
Ты — участник соревнований по программированию.
**Задача:**
{problem_description}
**Ограничения:**
{constraints or "Стандартные"}
**Язык решения:** {language}
**Предоставь:**
1. Пошаговое объяснение подхода
2. Анализ временной и пространственной сложности
3. Решение на {language} с комментариями
4. Примеры использования (test cases)
5. Альтернативные подходы (если есть)
"""@mcp.prompt()
def debug_error(
error_message: str,
code_snippet: str,
environment: str = ""
) -> str:
"""
Шаблон для отладки ошибки.
Args:
error_message: Текст ошибки
code_snippet: Код, где произошла ошибка
environment: Окружение (OS, версии)
"""
return f"""
Ты — эксперт по отладке сложных проблем.
**Ошибка:**{error_message}
**Код:**
```python
{code_snippet}
Окружение: {environment or "Не указано"}
Проанализируй:
Дай развёрнутый ответ с конкретными командами и примерами кода. """
### Dockerfile review
```python
@mcp.prompt()
def review_dockerfile(dockerfile: str) -> str:
"""
Ревью Dockerfile.
Args:
dockerfile: Содержимое Dockerfile
"""
return f"""
Ты — эксперт по Docker и контейнеризации.
**Dockerfile для проверки:**
```dockerfile
{dockerfile}
Проанализируй:
Предложи оптимизированную версию Dockerfile. """
---
## 8. Промпты для написания кода
### Генерация кода по описанию
```python
@mcp.prompt()
def generate_code(
description: str,
language: str = "python",
requirements: str = ""
) -> str:
"""
Генерация кода по описанию.
Args:
description: Описание функциональности
language: Язык программирования
requirements: Дополнительные требования
"""
return f"""
Ты — опытный разработчик на {language}.
**Задача:**
{description}
**Требования:**
{requirements or "Стандартные (чистый код, тесты, документация)"}
**Предоставь:**
1. Полный рабочий код на {language}
2. Объяснение архитектуры и ключевых решений
3. Примеры использования
4. Юнит-тесты для основных функций
5. Инструкции по запуску
Код должен следовать best practices языка и быть готовым к продакшену.
"""
@mcp.prompt()
def refactor_code(
code: str,
goals: str = "",
language: str = "python"
) -> str:
"""
Рефакторинг кода.
Args:
code: Код для рефакторинга
goals: Цели рефакторинга
language: Язык программирования
"""
return f"""
Ты — эксперт по рефакторингу и чистому коду.
**Код для рефакторинга:**
```{language}
{code}Цели рефакторинга: {goals or "Улучшение читаемости, поддерживаемости, производительности"}
Выполни:
Сохраняй функциональность кода неизменной. """
---
## 9. Возврат структурированных промптов
### Промпт с несколькими сообщениями
```python
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("Advanced Prompts")
@mcp.prompt()
def multi_turn_conversation(topic: str) -> list:
"""
Шаблон для многораундовой беседы.
Args:
topic: Тема беседы
"""
return [
{
"role": "system",
"content": {
"type": "text",
"text": f"Ты — эксперт по теме '{topic}'. Твоя задача — помогать пользователям глубже понять тему через диалог."
}
},
{
"role": "user",
"content": {
"type": "text",
"text": f"Я хочу узнать больше о '{topic}'. Начни с краткого введения, а затем задай мне вопрос, чтобы понять мой текущий уровень знаний."
}
}
]
@mcp.prompt()
def code_review_with_context(
code: str,
previous_feedback: str,
changes_made: str
) -> str:
"""
Повторное код-ревью с учётом предыдущих правок.
Args:
code: Текущая версия кода
previous_feedback: Предыдущие замечания
changes_made: Описание внесённых изменений
"""
return f"""
Ты проводишь повторное код-ревью.
**Предыдущие замечания:**
{previous_feedback}
**Внесённые изменения:**
{changes_made}
**Текущая версия кода:**
```python
{code}Задача:
Будь конкретен, ссылайся на строки кода. """
---
## 10. Best Practices для Prompts
### 1. Подробные описания
```python
# ❌ ПЛОХО: Бесполезное описание
@mcp.prompt()
def review(code: str) -> str:
return f"Review this: {code}"
# ✅ ХОРОШО: Подробное описание
@mcp.prompt()
def code_review_detailed(
code: str,
focus_areas: str = "all"
) -> str:
"""
Детальное код-ревью с фокусом на указанных областях.
Args:
code: Код для проверки
focus_areas: Области фокуса (bugs, security, performance, style, all)
"""
return f"""
Ты — опытный разработчик, проводящий код-ревью.
**Фокус:** {focus_areas}
**Код:**
```python
{code}
[Подробные инструкции...] """
### 2. Модульность
```python
# Базовый промпт для ревью
def base_code_review_prompt(code: str) -> str:
return f"""
Проведи код-ревью:
```python
{code}
"""
@mcp.prompt() def security_review(code: str) -> str: """Аудит безопасности кода.""" return base_code_review_prompt(code) + "\nСфокусируйся на уязвимостях безопасности."
@mcp.prompt() def performance_review(code: str) -> str: """Анализ производительности кода.""" return base_code_review_prompt(code) + "\nСфокусируйся на производительности."
### 3. Тестирование промптов
```python
# Тестирование промптов перед публикацией
def test_prompts():
"""Проверка генерации промптов."""
# Проверка базового промпта
prompt = code_review_with_code("def hello():\n print('Hi')")
assert "код-ревью" in prompt.lower()
assert "def hello():" in prompt
# Проверка промпта с аргументами
prompt = write_unit_test(
function_name="add",
function_code="def add(a, b): return a + b",
test_framework="pytest"
)
assert "pytest" in prompt
assert "add" in prompt
print("✅ All prompts generated correctly")
| Концепт | Описание |
|---|---|
| @mcp.prompt() | Декоратор для регистрации промптов |
| Аргументы | Параметры для динамической генерации промпта |
| Возврат | Строка или список сообщений |
| Роли | Промпты для разных ролей (dev, security, DevOps) |
| Best practices | Подробные описания, модульность, тестирование |
Следующая тема: Транспортные протоколы — stdio, SSE, WebSocket: выбор и реализация.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.