feat(lesson-ai): новый шаблон промпта + предупреждение о дубле отчёта
- заменён дефолтный промпт редактуры отчёта о занятии на формат «сообщение тьютора»: связный текст от 3-го лица, 1 абзац 2–4 предложения, начало «На занятии ребята …», практика «В конце занятия …», без группы/даты/времени и markdown, обращение на «вы» убрано, «они» → «каждый» - синхронизированы три копии промпта: LESSON_AI_DEFAULT_PROMPT в server.js и сид lesson_ai_prompt в db/init.sql и db/migration.sql; добавлен пример «плохо → хорошо» с запретом переносить факты примера - дубль отчёта в модалке создания больше не автозаполняет форму: показывается баннер #lessonDup с кнопкой перехода к существующему отчёту - проверка на дубль срабатывает и при смене даты (#lessonDate), защищена счётчиком поколений lessonDupSeq от гонки при быстрой смене группы/даты - стили .lesson-dup в public/admin.css, уточнена подсказка в карточке шаблона отчёта на public/settings.html - DDL не менялся: ни таблиц, ни колонок, ни индексов
This commit is contained in:
+30
-16
@@ -343,25 +343,39 @@ ON CONFLICT (key) DO NOTHING;
|
|||||||
|
|
||||||
INSERT INTO settings (key, value) VALUES ('lesson_ai_enabled', 'true')
|
INSERT INTO settings (key, value) VALUES ('lesson_ai_enabled', 'true')
|
||||||
ON CONFLICT (key) DO NOTHING;
|
ON CONFLICT (key) DO NOTHING;
|
||||||
INSERT INTO settings (key, value) VALUES ('lesson_ai_prompt', 'Ты — редактор деловых отчётов образовательного центра.
|
INSERT INTO settings (key, value) VALUES ('lesson_ai_prompt', 'Ты — редактор сообщений тьютора детской IT-школы.
|
||||||
|
|
||||||
Твоя задача — привести текст отчёта о занятии, написанный тьютором, к деловому стилю по шаблону ниже.
|
Переработай исходный текст занятия так, чтобы он звучал естественно и грамотно, как будто его написал живой тьютор родителю, а не нейросеть.
|
||||||
|
|
||||||
ШАБЛОН ДЕЛОВОГО СООБЩЕНИЯ:
|
ГЛАВНОЕ:
|
||||||
Отчёт о проведённом занятии
|
- Не добавляй информацию, которой нет в исходном тексте. Сохрани все факты и смысл.
|
||||||
Дата: <дата занятия>
|
- Исправь ошибки, повторы и неудачные формулировки. Убери канцелярит, шаблонные фразы и «ИИ-язык».
|
||||||
Группа: <название группы>
|
- Не используй чрезмерную похвалу и не превращай обычное занятие в достижение мирового масштала.
|
||||||
Темы: <перечень тем>
|
|
||||||
Практика: <задания>
|
|
||||||
Домашнее задание: <что задано>
|
|
||||||
|
|
||||||
ПРАВИЛА:
|
СТИЛЬ И СТРУКТУРА:
|
||||||
1. Сначала сравни исходный текст с шаблоном. Если текст уже соответствует шаблону (та же структура, порядок и стиль) — верни его БЕЗ ИЗМЕНЕНИЙ, дословно.
|
- Один цельный абзац, 2–4 предложения, от третьего лица.
|
||||||
2. Если текст не соответствует шаблону — перепиши его по шаблону, сохранив весь смысл и факты.
|
- Первое предложение начинай со слов «На занятии ребята …».
|
||||||
3. НЕ выдумывай тем, дат, заданий и оценок, которых нет в исходном тексте. Если данных нет — не добавляй раздел.
|
- Если в исходном тексте описана практическая часть, начни её со слов «В конце занятия …» или «Затем …». Нет практики в исходнике — не придумывай её.
|
||||||
4. Обращение на «вы», без эмодзи и без восклицательных знаков, кратко и по делу.
|
- Вместо «они» пиши «каждый». Обращение на «вы» не используй.
|
||||||
5. Не добавляй приветствия, подписи и какие-либо пояснения.
|
- Коротко скажи, с чем познакомились или что изучали; затем — что конкретно делали; в конце — что сделал самостоятельно.
|
||||||
6. Верни ТОЛЬКО итоговый текст отчёта — без кавычек, без markdown и без названия формата.')
|
- Сократи перечисления, объединяй их через «и», «а также», не повторяй одно и то же разными словами.
|
||||||
|
- Убери разговорные и оценочные обороты: «было весело», «очень», «классно».
|
||||||
|
|
||||||
|
ФОРМАТ:
|
||||||
|
- Без заголовков, списков, markdown, подписей и пояснений.
|
||||||
|
- Не начинай со слов «Сегодня», «Вчера», «Дата», «Группа», «Время» и вообще не упоминай группу, дату и время занятия.
|
||||||
|
- Не начинай с «На данном занятии» или «В рамках занятия».
|
||||||
|
- Не оборачивай ответ в кавычки.
|
||||||
|
- Не добавляй лишних предложений: если исходный текст уже написан нормально, не переписывай его ради переписывания.
|
||||||
|
|
||||||
|
ПРИМЕР ПРЕОБРАЗОВАНИЯ (бери отсюда только формулировки, тему и факты примера в свой текст не переноси):
|
||||||
|
Исходный текст:
|
||||||
|
«Ребята познакомились с программой Scratch Jr, научились выбирать фон, добавлять, изменять и создавать своих персонажей. В завершении занятия они выполнили практическое индивидуальное задание по созданию собственной анимации и небольшой программы».
|
||||||
|
Хороший результат:
|
||||||
|
«На занятии ребята познакомились со Scratch Jr: научились выбирать фон, добавлять и изменять персонажей, а также создавать своих героев. В конце занятия каждый самостоятельно выполнил небольшое практическое задание — придумал свою анимацию и собрал простую программу».
|
||||||
|
|
||||||
|
ГЛАВНОЕ ПРАВИЛО:
|
||||||
|
Отрабатывай ровно по этому исходному тексту. Ничего из примера выше в свой текст не переноси: тема, программа, персонажи и детали из примера не твои.')
|
||||||
ON CONFLICT (key) DO NOTHING;
|
ON CONFLICT (key) DO NOTHING;
|
||||||
INSERT INTO settings (key, value) VALUES ('notify_lesson_ai_formatted', 'false')
|
INSERT INTO settings (key, value) VALUES ('notify_lesson_ai_formatted', 'false')
|
||||||
ON CONFLICT (key) DO NOTHING;
|
ON CONFLICT (key) DO NOTHING;
|
||||||
|
|||||||
+30
-16
@@ -339,23 +339,37 @@ CREATE TABLE IF NOT EXISTS lesson_report_versions (
|
|||||||
CREATE INDEX IF NOT EXISTS idx_lesson_report_versions_report ON lesson_report_versions(lesson_report_id, id DESC);
|
CREATE INDEX IF NOT EXISTS idx_lesson_report_versions_report ON lesson_report_versions(lesson_report_id, id DESC);
|
||||||
|
|
||||||
INSERT INTO settings (key, value) VALUES ('lesson_ai_enabled', 'true') ON CONFLICT (key) DO NOTHING;
|
INSERT INTO settings (key, value) VALUES ('lesson_ai_enabled', 'true') ON CONFLICT (key) DO NOTHING;
|
||||||
INSERT INTO settings (key, value) VALUES ('lesson_ai_prompt', 'Ты — редактор деловых отчётов образовательного центра.
|
INSERT INTO settings (key, value) VALUES ('lesson_ai_prompt', 'Ты — редактор сообщений тьютора детской IT-школы.
|
||||||
|
|
||||||
Твоя задача — привести текст отчёта о занятии, написанный тьютором, к деловому стилю по шаблону ниже.
|
Переработай исходный текст занятия так, чтобы он звучал естественно и грамотно, как будто его написал живой тьютор родителю, а не нейросеть.
|
||||||
|
|
||||||
ШАБЛОН ДЕЛОВОГО СООБЩЕНИЯ:
|
ГЛАВНОЕ:
|
||||||
Отчёт о проведённом занятии
|
- Не добавляй информацию, которой нет в исходном тексте. Сохрани все факты и смысл.
|
||||||
Дата: <дата занятия>
|
- Исправь ошибки, повторы и неудачные формулировки. Убери канцелярит, шаблонные фразы и «ИИ-язык».
|
||||||
Группа: <название группы>
|
- Не используй чрезмерную похвалу и не превращай обычное занятие в достижение мирового масштала.
|
||||||
Темы: <перечень тем>
|
|
||||||
Практика: <задания>
|
|
||||||
Домашнее задание: <что задано>
|
|
||||||
|
|
||||||
ПРАВИЛА:
|
СТИЛЬ И СТРУКТУРА:
|
||||||
1. Сначала сравни исходный текст с шаблоном. Если текст уже соответствует шаблону (та же структура, порядок и стиль) — верни его БЕЗ ИЗМЕНЕНИЙ, дословно.
|
- Один цельный абзац, 2–4 предложения, от третьего лица.
|
||||||
2. Если текст не соответствует шаблону — перепиши его по шаблону, сохранив весь смысл и факты.
|
- Первое предложение начинай со слов «На занятии ребята …».
|
||||||
3. НЕ выдумывай тем, дат, заданий и оценок, которых нет в исходном тексте. Если данных нет — не добавляй раздел.
|
- Если в исходном тексте описана практическая часть, начни её со слов «В конце занятия …» или «Затем …». Нет практики в исходнике — не придумывай её.
|
||||||
4. Обращение на «вы», без эмодзи и без восклицательных знаков, кратко и по делу.
|
- Вместо «они» пиши «каждый». Обращение на «вы» не используй.
|
||||||
5. Не добавляй приветствия, подписи и какие-либо пояснения.
|
- Коротко скажи, с чем познакомились или что изучали; затем — что конкретно делали; в конце — что сделал самостоятельно.
|
||||||
6. Верни ТОЛЬКО итоговый текст отчёта — без кавычек, без markdown и без названия формата.') ON CONFLICT (key) DO NOTHING;
|
- Сократи перечисления, объединяй их через «и», «а также», не повторяй одно и то же разными словами.
|
||||||
|
- Убери разговорные и оценочные обороты: «было весело», «очень», «классно».
|
||||||
|
|
||||||
|
ФОРМАТ:
|
||||||
|
- Без заголовков, списков, markdown, подписей и пояснений.
|
||||||
|
- Не начинай со слов «Сегодня», «Вчера», «Дата», «Группа», «Время» и вообще не упоминай группу, дату и время занятия.
|
||||||
|
- Не начинай с «На данном занятии» или «В рамках занятия».
|
||||||
|
- Не оборачивай ответ в кавычки.
|
||||||
|
- Не добавляй лишних предложений: если исходный текст уже написан нормально, не переписывай его ради переписывания.
|
||||||
|
|
||||||
|
ПРИМЕР ПРЕОБРАЗОВАНИЯ (бери отсюда только формулировки, тему и факты примера в свой текст не переноси):
|
||||||
|
Исходный текст:
|
||||||
|
«Ребята познакомились с программой Scratch Jr, научились выбирать фон, добавлять, изменять и создавать своих персонажей. В завершении занятия они выполнили практическое индивидуальное задание по созданию собственной анимации и небольшой программы».
|
||||||
|
Хороший результат:
|
||||||
|
«На занятии ребята познакомились со Scratch Jr: научились выбирать фон, добавлять и изменять персонажей, а также создавать своих героев. В конце занятия каждый самостоятельно выполнил небольшое практическое задание — придумал свою анимацию и собрал простую программу».
|
||||||
|
|
||||||
|
ГЛАВНОЕ ПРАВИЛО:
|
||||||
|
Отрабатывай ровно по этому исходному тексту. Ничего из примера выше в свой текст не переноси: тема, программа, персонажи и детали из примера не твои.') ON CONFLICT (key) DO NOTHING;
|
||||||
INSERT INTO settings (key, value) VALUES ('notify_lesson_ai_formatted', 'false') ON CONFLICT (key) DO NOTHING;
|
INSERT INTO settings (key, value) VALUES ('notify_lesson_ai_formatted', 'false') ON CONFLICT (key) DO NOTHING;
|
||||||
|
|||||||
@@ -665,6 +665,9 @@ body[data-page=settings] .page-head{align-items:flex-end}
|
|||||||
.lesson-modal .lesson-ai-toggle{background:var(--bg);border:1px solid var(--border);border-radius:10px}
|
.lesson-modal .lesson-ai-toggle{background:var(--bg);border:1px solid var(--border);border-radius:10px}
|
||||||
.lesson-ai-status{font-size:.78rem;color:var(--muted);line-height:1.45;margin-top:-4px}
|
.lesson-ai-status{font-size:.78rem;color:var(--muted);line-height:1.45;margin-top:-4px}
|
||||||
.lesson-ai-status.err{color:#ef4444}
|
.lesson-ai-status.err{color:#ef4444}
|
||||||
|
.lesson-dup{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 12px;border-radius:10px;border:1px solid var(--border);background:var(--bg);color:var(--muted);font-size:.8rem;line-height:1.45}
|
||||||
|
.lesson-dup[hidden]{display:none}
|
||||||
|
.lesson-dup .btn-link{padding:5px 10px;font-size:.75rem;flex-shrink:0}
|
||||||
.lesson-versions{display:flex;flex-direction:column;gap:8px;max-height:56vh;overflow-y:auto;margin:4px 0}
|
.lesson-versions{display:flex;flex-direction:column;gap:8px;max-height:56vh;overflow-y:auto;margin:4px 0}
|
||||||
.lesson-version{border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;background:var(--bg)}
|
.lesson-version{border:1px solid var(--border);border-radius:var(--radius);padding:10px 12px;background:var(--bg)}
|
||||||
.lesson-version.current{border-color:var(--accent);background:rgba(37,99,235,.06)}
|
.lesson-version.current{border-color:var(--accent);background:rgba(37,99,235,.06)}
|
||||||
|
|||||||
+33
-8
@@ -541,6 +541,10 @@ function ensureLessonModal() {
|
|||||||
placeholder="Например: разобрали циклы for и while, решали задачи на списки, домашнее задание — функции"></textarea>
|
placeholder="Например: разобрали циклы for и while, решали задачи на списки, домашнее задание — функции"></textarea>
|
||||||
<span class="hint" id="lessonHint">0 / 5000</span>
|
<span class="hint" id="lessonHint">0 / 5000</span>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="lesson-dup" id="lessonDup" hidden>
|
||||||
|
<span>За эту группу и дату отчёт уже есть — создать второй нельзя.</span>
|
||||||
|
<button type="button" class="btn-link" id="lessonDupGo">Перейти к существующему отчёту</button>
|
||||||
|
</div>
|
||||||
<label class="toggle lesson-ai-toggle" id="lessonAiRow">
|
<label class="toggle lesson-ai-toggle" id="lessonAiRow">
|
||||||
<input type="checkbox" id="lessonAiCheck" checked>
|
<input type="checkbox" id="lessonAiCheck" checked>
|
||||||
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
||||||
@@ -569,6 +573,13 @@ function ensureLessonModal() {
|
|||||||
if (id) openLessonVersions(id);
|
if (id) openLessonVersions(id);
|
||||||
});
|
});
|
||||||
groupSel.addEventListener('change', () => prefetchLessonForGroupDate());
|
groupSel.addEventListener('change', () => prefetchLessonForGroupDate());
|
||||||
|
modal.querySelector('#lessonDate').addEventListener('change', () => prefetchLessonForGroupDate());
|
||||||
|
modal.querySelector('#lessonDupGo').addEventListener('click', () => {
|
||||||
|
const id = modal.querySelector('#lessonDup').dataset.id;
|
||||||
|
if (!id) return;
|
||||||
|
closeLessonModal();
|
||||||
|
openLessonModal({ id });
|
||||||
|
});
|
||||||
modal.querySelector('#lessonForm').addEventListener('submit', e => submitLessonModal(e));
|
modal.querySelector('#lessonForm').addEventListener('submit', e => submitLessonModal(e));
|
||||||
return modal;
|
return modal;
|
||||||
}
|
}
|
||||||
@@ -601,9 +612,8 @@ async function submitLessonModal(e) {
|
|||||||
const data = await res.json().catch(() => ({}));
|
const data = await res.json().catch(() => ({}));
|
||||||
if (!res.ok) {
|
if (!res.ok) {
|
||||||
if (res.status === 409 && data.id) {
|
if (res.status === 409 && data.id) {
|
||||||
closeLessonModal();
|
showLessonDuplicate(modal, data.id);
|
||||||
openLessonModal({ id: data.id });
|
showToast('За эту группу и дату отчёт уже есть — новый создать нельзя');
|
||||||
showToast('За эту дату отчёт уже есть — открыт для редактирования');
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
showToast(data.error || 'Не удалось сохранить отчёт');
|
showToast(data.error || 'Не удалось сохранить отчёт');
|
||||||
@@ -625,22 +635,35 @@ async function submitLessonModal(e) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let lessonDupSeq = 0;
|
||||||
|
|
||||||
async function prefetchLessonForGroupDate() {
|
async function prefetchLessonForGroupDate() {
|
||||||
const modal = document.getElementById('lessonModal');
|
const modal = document.getElementById('lessonModal');
|
||||||
if (!modal || !modal.classList.contains('open')) return;
|
if (!modal || !modal.classList.contains('open')) return;
|
||||||
if (modal.querySelector('#lessonId').value) return;
|
if (modal.querySelector('#lessonId').value) return;
|
||||||
const groupId = modal.querySelector('#lessonGroup').value;
|
const groupId = modal.querySelector('#lessonGroup').value;
|
||||||
const date = modal.querySelector('#lessonDate').value;
|
const date = modal.querySelector('#lessonDate').value;
|
||||||
if (!groupId || !date) return;
|
if (!groupId || !date) { showLessonDuplicate(modal, null); return; }
|
||||||
|
const seq = ++lessonDupSeq;
|
||||||
try {
|
try {
|
||||||
const q = `group_id=${encodeURIComponent(groupId)}&date_from=${encodeURIComponent(date)}&date_to=${encodeURIComponent(date)}&limit=1`;
|
const q = `group_id=${encodeURIComponent(groupId)}&date_from=${encodeURIComponent(date)}&date_to=${encodeURIComponent(date)}&limit=1`;
|
||||||
const res = await fetch(`${API}/api/lesson-reports?${q}`, { headers: hdr() });
|
const res = await fetch(`${API}/api/lesson-reports?${q}`, { headers: hdr() });
|
||||||
if (!res.ok) return;
|
if (seq !== lessonDupSeq) return;
|
||||||
|
if (!res.ok) { showLessonDuplicate(modal, null); return; }
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
if (seq !== lessonDupSeq) return;
|
||||||
const item = (data.items || [])[0];
|
const item = (data.items || [])[0];
|
||||||
if (!item) return;
|
showLessonDuplicate(modal, item ? item.id : null);
|
||||||
fillLessonModalFromReport(modal, item);
|
} catch {
|
||||||
} catch {}
|
if (seq === lessonDupSeq) showLessonDuplicate(modal, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function showLessonDuplicate(modal, existingId) {
|
||||||
|
const row = modal.querySelector('#lessonDup');
|
||||||
|
if (!row) return;
|
||||||
|
row.dataset.id = existingId ? String(existingId) : '';
|
||||||
|
row.hidden = !existingId;
|
||||||
}
|
}
|
||||||
|
|
||||||
function fillLessonModalFromReport(modal, r) {
|
function fillLessonModalFromReport(modal, r) {
|
||||||
@@ -686,7 +709,9 @@ function updateLessonAiRow(modal, r) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function resetLessonModalFields(modal) {
|
function resetLessonModalFields(modal) {
|
||||||
|
lessonDupSeq++;
|
||||||
modal.querySelector('#lessonId').value = '';
|
modal.querySelector('#lessonId').value = '';
|
||||||
|
showLessonDuplicate(modal, null);
|
||||||
modal.querySelector('#lessonDate').value = lessonTodayIso();
|
modal.querySelector('#lessonDate').value = lessonTodayIso();
|
||||||
modal.querySelector('#lessonTime').value = lessonNowTime();
|
modal.querySelector('#lessonTime').value = lessonNowTime();
|
||||||
const textEl = modal.querySelector('#lessonText');
|
const textEl = modal.querySelector('#lessonText');
|
||||||
|
|||||||
@@ -171,7 +171,7 @@
|
|||||||
<div class="ic"><i data-lucide="notebook-pen"></i></div>
|
<div class="ic"><i data-lucide="notebook-pen"></i></div>
|
||||||
<h3>Шаблон отчёта о занятии</h3>
|
<h3>Шаблон отчёта о занятии</h3>
|
||||||
</div>
|
</div>
|
||||||
<p class="hint">Инструкция для нейросети: она сверяет текст отчёта тьютора с шаблоном делового сообщения. Если текст уже соответствует шаблону — остаётся без изменений, иначе приводится к деловому виду. Оригинал тьютора всегда сохраняется, результат можно посмотреть в истории версий.</p>
|
<p class="hint">Инструкция для нейросети: она переписывает текст отчёта тьютора в деловой стиль — связный текст от третьего лица, который начинается со слов «На занятии ребята …». Если текст уже написан нормально, он остаётся без изменений. Оригинал тьютора всегда сохраняется, результат можно посмотреть в истории версий.</p>
|
||||||
<label class="toggle">
|
<label class="toggle">
|
||||||
<input type="checkbox" id="lessonAiEnabled">
|
<input type="checkbox" id="lessonAiEnabled">
|
||||||
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
<span class="toggle-track"><span class="toggle-thumb"></span></span>
|
||||||
|
|||||||
@@ -3755,7 +3755,41 @@ app.delete('/api/modules/:id/photo', requireAdmin, async (req, res) => {
|
|||||||
const LESSON_REPORT_TEXT_MAX = 5000;
|
const LESSON_REPORT_TEXT_MAX = 5000;
|
||||||
const LESSON_REPORT_LIST_TTL_MS = 30 * 1000;
|
const LESSON_REPORT_LIST_TTL_MS = 30 * 1000;
|
||||||
const LESSON_AI_VERSION_LIMIT = 50;
|
const LESSON_AI_VERSION_LIMIT = 50;
|
||||||
const LESSON_AI_DEFAULT_PROMPT = 'Ты — редактор деловых отчётов образовательного центра.\n\nТвоя задача — привести текст отчёта о занятии, написанный тьютором, к деловому стилю по шаблону ниже.\n\nШАБЛОН ДЕЛОВОГО СООБЩЕНИЯ:\nОтчёт о проведённом занятии\nДата: <дата занятия>\nГруппа: <название группы>\nТемы: <перечень тем>\nПрактика: <задания>\nДомашнее задание: <что задано>\n\nПРАВИЛА:\n1. Сначала сравни исходный текст с шаблоном. Если текст уже соответствует шаблону (та же структура, порядок и стиль) — верни его БЕЗ ИЗМЕНЕНИЙ, дословно.\n2. Если текст не соответствует шаблону — перепиши его по шаблону, сохранив весь смысл и факты.\n3. НЕ выдумывай тем, дат, заданий и оценок, которых нет в исходном тексте. Если данных нет — не добавляй раздел.\n4. Обращение на «вы», без эмодзи и без восклицательных знаков, кратко и по делу.\n5. Не добавляй приветствия, подписи и какие-либо пояснения.\n6. Верни ТОЛЬКО итоговый текст отчёта — без кавычек, без markdown и без названия формата.';
|
const LESSON_AI_DEFAULT_PROMPT = [
|
||||||
|
'Ты — редактор сообщений тьютора детской IT-школы.',
|
||||||
|
'',
|
||||||
|
'Переработай исходный текст занятия так, чтобы он звучал естественно и грамотно, как будто его написал живой тьютор родителю, а не нейросеть.',
|
||||||
|
'',
|
||||||
|
'ГЛАВНОЕ:',
|
||||||
|
'- Не добавляй информацию, которой нет в исходном тексте. Сохрани все факты и смысл.',
|
||||||
|
'- Исправь ошибки, повторы и неудачные формулировки. Убери канцелярит, шаблонные фразы и «ИИ-язык».',
|
||||||
|
'- Не используй чрезмерную похвалу и не превращай обычное занятие в достижение мирового масштала.',
|
||||||
|
'',
|
||||||
|
'СТИЛЬ И СТРУКТУРА:',
|
||||||
|
'- Один цельный абзац, 2–4 предложения, от третьего лица.',
|
||||||
|
'- Первое предложение начинай со слов «На занятии ребята …».',
|
||||||
|
'- Если в исходном тексте описана практическая часть, начни её со слов «В конце занятия …» или «Затем …». Нет практики в исходнике — не придумывай её.',
|
||||||
|
'- Вместо «они» пиши «каждый». Обращение на «вы» не используй.',
|
||||||
|
'- Коротко скажи, с чем познакомились или что изучали; затем — что конкретно делали; в конце — что сделал самостоятельно.',
|
||||||
|
'- Сократи перечисления, объединяй их через «и», «а также», не повторяй одно и то же разными словами.',
|
||||||
|
'- Убери разговорные и оценочные обороты: «было весело», «очень», «классно».',
|
||||||
|
'',
|
||||||
|
'ФОРМАТ:',
|
||||||
|
'- Без заголовков, списков, markdown, подписей и пояснений.',
|
||||||
|
'- Не начинай со слов «Сегодня», «Вчера», «Дата», «Группа», «Время» и вообще не упоминай группу, дату и время занятия.',
|
||||||
|
'- Не начинай с «На данном занятии» или «В рамках занятия».',
|
||||||
|
'- Не оборачивай ответ в кавычки.',
|
||||||
|
'- Не добавляй лишних предложений: если исходный текст уже написан нормально, не переписывай его ради переписывания.',
|
||||||
|
'',
|
||||||
|
'ПРИМЕР ПРЕОБРАЗОВАНИЯ (бери отсюда только формулировки, тему и факты примера в свой текст не переноси):',
|
||||||
|
'Исходный текст:',
|
||||||
|
'«Ребята познакомились с программой Scratch Jr, научились выбирать фон, добавлять, изменять и создавать своих персонажей. В завершении занятия они выполнили практическое индивидуальное задание по созданию собственной анимации и небольшой программы».',
|
||||||
|
'Хороший результат:',
|
||||||
|
'«На занятии ребята познакомились со Scratch Jr: научились выбирать фон, добавлять и изменять персонажей, а также создавать своих героев. В конце занятия каждый самостоятельно выполнил небольшое практическое задание — придумал свою анимацию и собрал простую программу».',
|
||||||
|
'',
|
||||||
|
'ГЛАВНОЕ ПРАВИЛО:',
|
||||||
|
'Отрабатывай ровно по этому исходному тексту. Ничего из примера выше в свой текст не переноси: тема, программа, персонажи и детали из примера не твои.',
|
||||||
|
].join('\n');
|
||||||
|
|
||||||
async function lessonReportGroup(user, groupId) {
|
async function lessonReportGroup(user, groupId) {
|
||||||
const gid = Number(groupId);
|
const gid = Number(groupId);
|
||||||
|
|||||||
Reference in New Issue
Block a user