Тесты по учебным материалам через API

Пять вопросов с вариантами ответа и пояснением к каждому уроку курса. Вторая модель решает тест без ключа и находит ошибки, готовый файл импортируется в Moodle. Ключ Polza.ai, оплата в рублях.

  • Тесты к 1 000 уроков — от 257 ₽, оценка по ценам каталога
  • Проверка решением без ключа
  • Пояснение к каждому ответу
  • Импорт в Moodle
Охрана труда · Первая помощь при термическом ожоге

Вопрос 2 из 5

Как правильно поступить с одеждой, прилипшей к термическому ожогу?

○ Аккуратно оторвать её от кожи

● Обрезать одежду вокруг прилипшего участка

○ Оставить до осмотра врачом

○ Смазать маслом и снять

Пояснение

Верно. Текст прямо указывает: прилипшую к коже одежду не отрывают — её обрезают вокруг.

Реальный вопрос из теста. Как тестировали

Задача

В курсе 200 уроков, тест есть у трети. Методист пишет пять вопросов за полчаса, и ещё столько же уходит на проверку. Обновили урок — тест устарел.

Через API тест к каждому уроку пишется по его тексту, а вторая модель решает его, не видя ключа. Методист читает только вопросы, где ответы разошлись, — в нашем тесте таких было 2 из 60.

Для кого

Везде, где уроков больше, чем методистов.

Онлайн-школы

Тест к каждому уроку курса и новый тест после обновления урока. Банк вопросов растёт вместе с курсом.

Сотни уроков за вечер.

Учителя и репетиторы

Проверочные по параграфу учебника или своему конспекту: пять вопросов с пояснениями для разбора.

Тест за минуту, а не за час.

Корпоративное обучение

Охрана труда, регламенты, продукт компании. Тест проверяет, что сотрудник прочитал документ.

Вопросы только по тексту регламента.

Авторы курсов и платформы

Генерация тестов как функция платформы: автор загружает урок — получает черновик теста.

Через API, под своим интерфейсом.

Как тест попадает в курс

Четыре шага: уроки, генерация, проверка, импорт.

  1. Шаг 1

    Уроки

    Тексты уроков из курса: таблица, выгрузка из LMS или папка с файлами.

    lessons.csv

  2. Шаг 2

    Генерация

    Модель пишет 5 вопросов к уроку, скрипт перемешивает варианты.

    python make_quiz.py

  3. Шаг 3

    Проверка

    Вторая модель решает тест без ключа. Расхождения уходят методисту.

    60 вопросов · 2 на проверку

  4. Шаг 4

    Курс

    Файл GIFT импортируется в банк вопросов Moodle, по категории на урок.

    quizzes.gift

Формат GIFT для Moodle

GIFT — текстовый формат банка вопросов Moodle. Знак = отмечает верный вариант, ~ — неверные, после #### идёт пояснение, которое ученик видит после ответа. Каждый урок ложится в свою категорию. Для GetCourse и любой другой LMS с импортом вопросов скрипт отдаёт JSON: из него собирается CSV или XML под формат импорта платформы.

quizzes.gift · реальный фрагмент
$CATEGORY: Первая помощь при термическом ожоге

::L06-1:: Сколько минут рекомендуется охлаждать обожжённое место проточной водой? {
=20 минут
~30 минут
~10 минут
~5 минут
####В тексте указано\: «Обожжённое место охлаждают прохладной проточной водой около 20 минут».
}

Как это выглядит в курсе

Реальные вопросы из теста: до ответа, после ответа с пояснением и в банке вопросов после импорта.

Охрана труда · Первая помощь при термическом ожоге

Вопрос 5 из 5

Взрослый получил ожог предплечья горячим паром. Ожог поверхностный, без пузырей, размером примерно с ладонь. Какие действия будут правильными?

○ Смазать обожжённое место маслом, наложить повязку и вызвать врача

○ Охладить прохладной водой около 20 минут, закрыть чистой неплотной повязкой, скорую не вызывать

○ Приложить лёд на 10 минут, нанести антибактериальный крем и вскрыть пузыри

○ Нанести мазь от ожогов, охладить водой и обрезать одежду вокруг раны

Ученик видит вопрос и варианты
Охрана труда · Первая помощь при термическом ожоге

Вопрос 3 из 5

Почему при термическом ожоге нельзя прикладывать лёд?

○ Лёд вызывает сильную боль

○ Холод не помогает при термических ожогах

● Лёд может повредить ткани

○ Лёд замедляет образование пузырей

Пояснение

Верно. Прямая причина указана в тексте: лёд может повредить ткани.

После ответа — пояснение из урока
Банк вопросов · импорт GIFT

Импортировано 60 вопросов

12 категорий по темам уроков

Фотосинтез — 5 вопросов

Закон Ома для участка цепи — 5 вопросов

Списки — 5 вопросов

Первая помощь при термическом ожоге — 5 вопросов

Коды ответа HTTP — 5 вопросов

…ещё 7 категорий

Вопросы в банке разложены по темам

Сколько стоят тесты к 1 000 уроков

Замер — фактический расход по полю cost_rub на трёх самых трудных уроках, пересчитанный на 1 000 уроков по 5 вопросов. Короткое рассуждение включено у всех моделей. Стоимость «сейчас» Polza.ai оценивает по текущим ценам каталога.

Стоимость по текущим ценам каталога
Модель1 000 уроков, замер 6 октябряОдин урокФлаги проверкиВерный — первым1 000 уроков, оценка сейчас
GPT-5 Mini257 ₽11,8 с0 из 1511 из 15257 ₽
Gemini 2.5 Flash780 ₽17,6 с2 из 150 из 15320 ₽
DeepSeek V4 Pro189 ₽88,0 с1 из 152 из 15601 ₽
Grok 4.3502 ₽13,6 с1 из 151 из 15786 ₽
Claude Sonnet 51 204 ₽10,1 с1 из 153 из 152 681 ₽

Замер — 6 октября 2026, по ценам того дня.

«Оценка сейчас» — по текущим ценам каталога для объёмов, которые оценила редакция, а не замерил тест: 1 300 токенов на входе (промпт и текст урока) и 2 000 на выходе (тест в JSON вместе с рассуждением; у моделей, которые рассуждают дольше, выход больше) на один урок.

Проверка решением на Gemini 2.5 Flash стоила 0,7 ₽ на 12 уроков по ценам 6 октября. Последняя колонка — сколько раз верный ответ стоял первым до перемешивания: у GPT-5 Mini 11 из 15, поэтому скрипт перемешивает варианты сам. Как не платить за лишнее — в сценарии про SEO-тексты: как не переплатить за рассуждение и провайдера.

Готовый скрипт на Python

Читает уроки из таблицы, пишет тесты параллельно, перемешивает варианты и печатает расход. Второй скрипт собирает файл GIFT. Нужен пакет openai и ключ в POLZA_API_KEY.

Вход: lessons.csv

Курс, тема и текст урока. Чем точнее текст, тем точнее вопросы: модель спрашивает только то, что в нём есть.

lessons.csv
id,course,topic,text
L10,Веб-разработка,Коды ответа HTTP,"Сервер отвечает на каждый HTTP-запрос трёхзначным кодом состояния. Первая цифра показывает класс ответа: 2xx — успех, 3x…"

Выход: один вопрос

Вопрос, варианты, номер верного, пояснение и уровень. Реальный ответ из теста.

quizzes.jsonl · вопрос
{
  "question": "Как правильно поступить с одеждой, прилипшей к термическому ожогу?",
  "options": [
    "Аккуратно оторвать её от кожи",
    "Обрезать одежду вокруг прилипшего участка",
    "Оставить до осмотра врачом",
    "Смазать маслом и снять"
  ],
  "correct": 1,
  "explanation": "Текст прямо указывает: прилипшую к коже одежду не отрывают — её обрезают вокруг.",
  "level": "запоминание"
}
Python · make_quiz.py
# make_quiz.py — тесты по урокам из CSV через Polza
import asyncio, csv, json, os, random
from openai import AsyncOpenAI, APIStatusError

MODEL = "deepseek/deepseek-v4-pro"
PROVIDER = "streamlake/fp8"  # самый дешёвый провайдер модели: top_provider.name в каталоге
CONCURRENCY = 10

ai = AsyncOpenAI(base_url="https://polza.ai/api/v1", api_key=os.environ["POLZA_API_KEY"])
SYSTEM = open("prompt.txt", encoding="utf-8").read()

QUESTION = {
    "type": "object",
    "properties": {
        "question": {"type": "string"},
        "options": {"type": "array", "items": {"type": "string"}},
        "correct": {"type": "integer"},
        "explanation": {"type": "string"},
        "level": {"type": "string", "enum": ["запоминание", "понимание", "применение"]},
    },
    "required": ["question", "options", "correct", "explanation", "level"],
    "additionalProperties": False,
}
SCHEMA = {"name": "quiz", "strict": True, "schema": {
    "type": "object", "properties": {"questions": {"type": "array", "items": QUESTION}},
    "required": ["questions"], "additionalProperties": False}}

async def make(row, sem, stats):
    prompt = f"Курс: {row['course']}\nТема: {row['topic']}\n\nТекст урока:\n{row['text']}"
    async with sem:
        for attempt in range(5):
            try:
                r = await ai.chat.completions.create(
                    model=MODEL,
                    messages=[{"role": "system", "content": SYSTEM},
                              {"role": "user", "content": prompt}],
                    response_format={"type": "json_schema", "json_schema": SCHEMA},
                    extra_body={"reasoning": {"effort": "low"},  # короткое рассуждение: в тесте без него было 5 неверных ключей на 60 вопросов, с ним — ни одного
                                "provider": {"only": [PROVIDER], "allow_fallbacks": False}},
                )
                break
            except APIStatusError as e:
                if e.status_code in (429, 500, 502, 503) and attempt < 4:
                    await asyncio.sleep(2 ** attempt)
                    continue
                raise
    stats["rub"] += r.usage.model_extra.get("cost_rub", 0)
    quiz = json.loads(r.choices[0].message.content)
    rnd = random.Random(row["id"])  # перемешиваем варианты: модели ставят верный ответ в одни и те же позиции
    for q in quiz["questions"]:
        right = q["options"][q["correct"]]
        rnd.shuffle(q["options"])
        q["correct"] = q["options"].index(right)
    return {"id": row["id"], "topic": row["topic"], **quiz}

async def main():
    rows = list(csv.DictReader(open("lessons.csv", encoding="utf-8")))
    sem, stats = asyncio.Semaphore(CONCURRENCY), {"rub": 0}
    results = await asyncio.gather(*(make(r, sem, stats) for r in rows), return_exceptions=True)
    ok = 0
    with open("quizzes.jsonl", "w", encoding="utf-8") as out, open("errors.txt", "w", encoding="utf-8") as err:
        for row, res in zip(rows, results):
            if isinstance(res, Exception):
                err.write(f"{row['id']}\t{res}\n")
            else:
                out.write(json.dumps(res, ensure_ascii=False) + "\n")
                ok += 1
    print(f"Готово {ok} из {len(rows)}, расход {stats['rub']:.2f} ₽")

asyncio.run(main())
Python · to_gift.py
# to_gift.py — выгрузка тестов в формат GIFT для импорта в банк вопросов Moodle
import json

def esc(s):
    # служебные символы GIFT экранируются обратной косой чертой
    for ch in '\\~=#{}:':
        s = s.replace(ch, '\\' + ch)
    return s

with open("quizzes.gift", "w", encoding="utf-8") as out:
    for line in open("quizzes.jsonl", encoding="utf-8"):
        quiz = json.loads(line)
        out.write(f"$CATEGORY: {esc(quiz['topic'])}\n\n")
        for i, q in enumerate(quiz["questions"], 1):
            opts = "\n".join(("=" if k == q["correct"] else "~") + esc(o) for k, o in enumerate(q["options"]))
            out.write(f"::{quiz['id']}-{i}:: {esc(q['question'])} {{\n{opts}\n####{esc(q['explanation'])}\n}}\n\n")

print("quizzes.gift готов")

Для DeepSeek V4 Pro каталог перечисляет уровни рассуждения high и xhigh; в тесте передавали low.

Промпт для тестов

Промпт задаёт состав теста — два вопроса на запоминание, два на понимание, один на применение — и правила для вариантов. Главное правило: ответ однозначно следует из текста урока.

Вторая версия добавила четыре запрета по итогам первого прогона: варианты не повторяются, отвечают на сам вопрос, нет вопросов «что НЕ…», а задачу модель сначала решает сама. В первом прогоне были повторяющиеся варианты в тесте по английскому и вопрос «почему», в котором варианты были следствиями.

prompt.txt
Ты составляешь тест по учебному тексту для онлайн-
курса.

Сделай 5 вопросов:
- 2 на запоминание факта из текста,
- 2 на понимание: объяснить, сравнить, найти
  причину,
- 1 на применение: задача или ситуация, которую
  решают по правилу из текста.

Правила:
- Ответ на каждый вопрос однозначно следует из
  текста. Не спрашивай того, чего в тексте нет.
- У каждого вопроса 4 разных варианта и ровно один
  верный. Варианты не повторяются.
- Варианты отвечают на сам вопрос: на «почему» —
  причины, на «сколько» — числа, на «какой код» —
  код.
- Не задавай вопросов «что НЕ…» и вопросов, где
  подходят несколько вариантов.
- В задачах на применение сначала реши задачу сам и
  проверь, что верный вариант совпадает с решением.
- Неверные варианты правдоподобные: той же длины и
  формы, что верный, из той же темы.
- Не используй варианты «все ответы верны», «нет
  верного ответа», «оба варианта».
- Верный вариант ставь в разные позиции, не всегда
  первым.
- Пояснение — одно-два предложения: почему ответ
  верный, со ссылкой на мысль из текста.
- Формулировки короткие, на «ты» не обращайся.

Верни JSON: questions — список из 5 вопросов, у
каждого:
question — текст вопроса, options — 4 варианта,
correct — номер верного варианта от 0 до 3,
explanation — пояснение, level — «запоминание»,
«понимание» или «применение».

Проверка теста

Модель-автор ошибается в ключах. Поэтому тест проверяет вторая модель — решает его так же, как ученик: проверка по эталону, как в протоколах.

Решение без ключа

Gemini 2.5 Flash получает текст урока и вопросы без ответов. Если её ответ не совпал с ключом или она считает вопрос двусмысленным — флаг. В первом прогоне так нашлись 9 из 11 ошибок, без единого ложного флага.

Опасные ошибки

В первом прогоне к уроку о первой помощи верным был отмечен вариант «вскрыть пузыри и наложить повязку». Проверка решением его поймала. Тесты по охране труда и медицине методист читает целиком.

Повторы вариантов

Одинаковые варианты внутри вопроса ловит одна строка кода. В первом прогоне их было 5 вопросов, во втором — ни одного.

Позиции верных ответов

Модели ставят верный ответ в одни и те же места: Claude Sonnet ни разу не поставила его четвёртым, GPT-5 Mini в 11 из 15 ставила первым. Скрипт перемешивает варианты.

Самый длинный — верный

Верный вариант часто длиннее и подробнее остальных: так было в 25 из 60 вопросов при 25% случайных. Перемешивание это не исправит — смотрите на длину при вычитке.

Методист читает флаги

После проверки на человека остаются вопросы с флагами и выборка остальных. Это минуты на урок вместо получаса на написание теста.

Через Claude, OpenAI и Grok — или без кода

Скрипт генерации, проверку и файл для Moodle соберёт ИИ-агент. Модели — в том же каталоге Polza.ai.

Claude Code и Claude Desktop

Положите уроки и промпт в папку и отдайте Claude задание ниже: тесты, проверка и GIFT за один заход.

Claude Sonnet 5: тесты к 1 000 уроков — 2 681 ₽, оценка по ценам каталога.

Codex и ChatGPT Desktop

То же задание выполняет Codex CLI. Модели GPT подключаются тем же ключом Polza.

GPT-5 Mini: тесты к 1 000 уроков — 257 ₽, оценка по ценам каталога.

Grok

Модели xAI в том же API: MODEL = "x-ai/grok-4.3" в скрипте.

Grok 4.3: тесты к 1 000 уроков — 786 ₽, оценка по ценам каталога.

Задание для агента

Подходит для Claude Code, Codex и других агентов из интеграций.

задание для Claude Code или Codex
В папке лежат lessons.csv и prompt.txt.
Напиши и запусти скрипт на Python:
для каждого урока запрос к https://polza.ai/api/v1
через OpenAI SDK, ключ — в переменной POLZA_API_KEY,
модель deepseek/deepseek-v4-pro
с коротким рассуждением (reasoning: {effort: low}),
системный промпт — prompt.txt, ответ — JSON
с полями question, options, correct, explanation, level.
Перемешай варианты и пересчитай correct.
Потом проверь тест: google/gemini-2.5-flash отвечает
на вопросы по тексту урока без ключа,
расхождения выведи списком.
В конце собери quizzes.gift для Moodle.

Без кода: n8n и Dify

Новый урок в таблице или CMS — нода OpenAI Chat Model с адресом https://polza.ai/api/v1 — тест в таблицу методисту на проверку.

n8n

Обновили урок — сценарий пересобрал тест и прислал методисту ссылку.

Нода OpenAI Chat Model с адресом Polza.

Dify

Workflow: генерация, проверка решением, выгрузка.

Облако или self-hosted.

Тест редакции: 12 уроков, 60 вопросов

Мы написали 12 коротких уроков: от фотосинтеза и закона Ома до списков в Python и первой помощи при ожоге. Редактор прочитал все вопросы каждого прогона, где это было нужно для оценки. Замер 6 октября 2026: весь тест, включая сравнение пяти моделей, стоил 16 ₽ по ценам того дня.

Уроков
12
Вопросов
60
Неверных ключей
0
На проверку методисту
2

Три прогона DeepSeek V4 Pro

ПрогонРасходВремяОшибки по вычиткеФлаги проверкиБез повторов
v1: без рассуждения0,51 ₽72 с11 из 60955 из 60
v2: новый промпт, без рассуждения0,52 ₽188 с≥5660 из 60
v2: новый промпт, короткое рассуждение2,59 ₽207 с0 ключей, 3 спорных260 из 60

Во втором прогоне редактор прочитал только вопросы с флагами — из 6 настоящими ошибками оказались 5. Третий прочитан целиком: неверных ключей нет, в 3 вопросах неудачные варианты. Расход — по ценам 6 октября 2026.

Опасный ключ

К уроку о первой помощи верным отмечен вариант «вскрыть пузыри и наложить повязку», хотя в тексте прямо сказано: пузыри не вскрывают.

Неверные ответы

Для среза [5, 10, 15][1:3] верным отмечено «1, 2» вместо [10, 15]. В тесте по английскому — повторяющиеся варианты и неверная форма глагола.

Вопрос и ответы не сходятся

На «почему увеличение сопротивления уменьшает ток» варианты: «уменьшение силы тока», «увеличение напряжения».

Пять моделей на трёх трудных уроках

Модель1 000 уроков, замерФлаги проверкиЧто увидел редактор
DeepSeek V4 Pro189 ₽1 из 15Ключи верные. Медленная с рассуждением: полторы минуты на урок.
GPT-5 Mini257 ₽0 из 15Ни одного флага, быстрая. Верный ответ почти всегда ставит первым — без перемешивания не обойтись.
Gemini 2.5 Flash780 ₽2 из 15Ключи верные, но задачи перегружены лишними условиями.
Grok 4.3502 ₽1 из 15Ключи верные, вопросы короткие и чёткие. Один вопрос «почему» с ответом, которого нет в тексте.
Claude Sonnet 51 204 ₽1 из 15Аккуратные формулировки. Ни разу не ставит верный ответ последним.

Уроки: списки в Python, Present Perfect, первая помощь при ожоге. Промпт v2, короткое рассуждение. Неверных ключей не было ни у одной модели. Стоимость — замер 6 октября 2026 по ценам того дня, текущая — в разделе «Стоимость».

Вывод

Для тестов рассуждение окупается: без него неверных ключей в разы больше, с ним — ни одного на 60 вопросах. Генерация на DeepSeek V4 Pro или GPT-5 Mini — по оценке на текущих ценах каталога 601 ₽ и 257 ₽ за 1 000 уроков, проверка решением на Gemini 2.5 Flash, перемешивание вариантов в коде. Методист читает флаги и тесты по безопасности целиком.

Вопросы

Можно ли выдавать тесты ученикам без проверки?

Нет. Даже с рассуждением и проверкой решением методист читает вопросы с флагами, а тесты по охране труда и медицине — целиком. В первом прогоне модель отметила верным опасный совет при ожоге.

Почему проверяет другая модель?

Модель, которая написала вопрос, склонна соглашаться со своим ключом. Вторая модель решает тест как ученик: по тексту урока и без ответов.

Сколько вопросов делать к уроку?

Пять — хватает, чтобы проверить ключевые мысли короткого урока. Для длинного урока разбейте текст на части и делайте тест к каждой.

Можно ли загрузить тесты в Moodle и другие LMS?

В Moodle — через импорт в формате GIFT: скрипт со страницы собирает файл, каждый урок — отдельная категория банка вопросов. Для GetCourse и других LMS с импортом вопросов соберите из JSON файл в формате импорта платформы.

Подойдут ли тесты для школьной программы?

Да, если в запросе текст параграфа или конспекта. Модель спрашивает только то, что есть в тексте, поэтому качество теста зависит от качества материала.

Можно ли платить юрлицом?

Да. Polza.ai работает по договору: счёт, УПД и НДС. Расход виден в кабинете по ключам и моделям.

Другие сценарии: SEO-тексты · Ответы на отзывы · Объявления для Авито · Письма клиентам · Протоколы встреч

Сделайте тесты к первым 10 урокам

Ключ, тексты уроков и скрипт со страницы. Прогон с проверкой показывает, сколько вопросов придётся править.

Остались вопросы? Документация Polza.AI, поддержка в Telegram или support@polza.ai

Страницу проверила редакция Polza.AI, обновлено . Цифры теста — замер 6 октября 2026 по ценам того дня; стоимость «сейчас» Polza.ai считает по каталогу и обновляет каждый час.

Разработчикам: вход через Polza

Связанные страницы: модели для текста, Dify, для бизнеса.

Сайт использует cookie.