67 lines
4.1 KiB
TypeScript
67 lines
4.1 KiB
TypeScript
import { Agent } from 'node:https';
|
||
import { GigaChat } from "langchain-gigachat";
|
||
import { z } from "zod";
|
||
|
||
const httpsAgent = new Agent({
|
||
rejectUnauthorized: false,
|
||
});
|
||
|
||
const llm = new GigaChat({
|
||
credentials: process.env.GIGA_AUTH,
|
||
temperature: 0.2,
|
||
model: 'GigaChat-2',
|
||
httpsAgent,
|
||
});
|
||
|
||
// возвращаю комментарий + исправленное предложение + булево значение
|
||
const moderationLlm = llm.withStructuredOutput(z.object({
|
||
comment: z.string(),
|
||
fixedText: z.string().optional(),
|
||
isApproved: z.boolean(),
|
||
}) as any)
|
||
|
||
export const moderationText = async (title: string, body: string): Promise<[string, string | undefined, boolean]> => {
|
||
const prompt = `
|
||
Представь, что ты модерируешь предложения от жильцов многоквартирного дома (это личная инициатива по улучшения,
|
||
не имеющая отношения к Управляющей компании).
|
||
|
||
Заголовок: ${title}
|
||
Основной текст: ${body}
|
||
|
||
Твои задачи:
|
||
1. Проверь предложение и заголовок на спам.
|
||
2. Проверь, чтобы заголовок и текст были на одну тему.
|
||
3. Проверь само предложение пользователя на отсутствие грубой лексики и пошлостей.
|
||
4. Проверь грамматику.
|
||
5. Проверь на бессмысленность предложения. Оно не должно содержать только случайные символы.
|
||
6. Не должно быть рекламы, ссылок и т.д.
|
||
7. Проверь предложение на информативность, предложение не может быть коротким, оно должно ясно отражжать суть инициативы.
|
||
8. Предложение должно быть в вежливой форме.
|
||
|
||
- Если все правила соблюдены, то предложение принимается!
|
||
|
||
- Если предложение отклонено, всегда пиши комментарий и fixedText!
|
||
|
||
Правила написания комментария:
|
||
- Если предложение отклоняется, пиши комментарий со следующей формулировкой:
|
||
"Предложение отклонено. Причина: (укажи проблему)"
|
||
|
||
Правила написания fixedText:
|
||
- Если предложение отклонено, то верни в поле "fixedText" измененный текст, который будет соответствовать правилам.
|
||
- Если предложение отклонено и содержит запрещённый контент (рекламу, личные данные), удали всю информацию,
|
||
которая противоречит правилам, и верни в только подходящий фрагмент, сохраняя общий смысл.
|
||
- Если текст не представляет никакой ценности, возврати в поле "fixedText" правило,
|
||
по которому оно не прошло.
|
||
-Если предложение принимается, то ничего не возвращай в поле fixedText.
|
||
`
|
||
|
||
const result = await moderationLlm.invoke(prompt);
|
||
console.log(result)
|
||
// Дополнительная проверка
|
||
if(!result.isApproved && result.comment.trim() === '' && result.fixedText.trim() === '') {
|
||
result.comment = 'Предложение отклонено. Причина: несоблюдение требований к оформлению или содержанию.',
|
||
result.fixedText = body
|
||
}
|
||
|
||
return [result.comment, result.fixedText, result.isApproved];
|
||
}; |