code refactoring and agent improvement
This commit is contained in:
@@ -1,91 +1,78 @@
|
||||
import { Agent } from 'node:https';
|
||||
import { GigaChat } from "langchain-gigachat";
|
||||
import { z } from "zod";
|
||||
import gigachat from './gigachat';
|
||||
|
||||
const httpsAgent = new Agent({
|
||||
rejectUnauthorized: false,
|
||||
});
|
||||
export interface ModerationResult {
|
||||
comment: string;
|
||||
isApproved: boolean;
|
||||
success: boolean;
|
||||
error?: string;
|
||||
}
|
||||
|
||||
const llm = new GigaChat({
|
||||
credentials: "MGIzODY1N2MtYzMwMS00N2I4LWI1YzQtM2U4NzAxZGI5NmMzOjJmNzcyYzBmLWU0NjUtNGNmZC1iMDM2LTRjNmY0N2JhNDdiOA==",
|
||||
temperature: 0.2,
|
||||
model: 'GigaChat-2',
|
||||
httpsAgent,
|
||||
});
|
||||
export class ChatModerationAgent {
|
||||
private moderationLlm: any;
|
||||
|
||||
// возвращаю комментарий + булево значение (удалять или нет) + финальный текст сообщения
|
||||
const moderationLlm = llm.withStructuredOutput(z.object({
|
||||
comment: z.string(),
|
||||
isApproved: z.boolean(),
|
||||
}) as any)
|
||||
|
||||
export const moderationText = async (title: string, body: string): Promise<[string, boolean, string]> => {
|
||||
const startTime = Date.now();
|
||||
const messagePreview = body.length > 50 ? body.substring(0, 50) + '...' : body;
|
||||
|
||||
console.log(`🤖 [AI Agent] Начинаем анализ сообщения: "${messagePreview}"`);
|
||||
console.log(`🤖 [AI Agent] Длина сообщения: ${body.length} символов`);
|
||||
console.log(`🤖 [AI Agent] Модель: GigaChat-2, Temperature: 0.2`);
|
||||
|
||||
const prompt = `
|
||||
Ты модерируешь сообщения в чате. Твоя задача - проверить сообщение на нецензурную лексику, брань и неприемлемый контент.
|
||||
|
||||
Сообщение: ${body}
|
||||
|
||||
Твои задачи:
|
||||
1. Проверь сообщение на наличие нецензурной лексики, мата, ругательств и брани.
|
||||
2. Проверь на оскорбления, угрозы и агрессивное поведение.
|
||||
3. Проверь на спам и рекламу.
|
||||
4. Проверь на неприемлемый контент (дискриминация, экстремизм и т.д.).
|
||||
|
||||
- Если сообщение не содержит запрещенного контента, оно одобряется (isApproved: true).
|
||||
- Если сообщение содержит запрещенный контент, оно отклоняется (isApproved: false).
|
||||
|
||||
Правила написания комментария:
|
||||
- Если сообщение одобряется, оставь поле comment пустым.
|
||||
- Если сообщение отклоняется, пиши комментарий со следующей формулировкой:
|
||||
"Сообщение удалено. Причина: (укажи конкретную причину: нецензурная лексика, оскорбления, спам и т.д.)"
|
||||
|
||||
`
|
||||
|
||||
try {
|
||||
console.log(`🤖 [AI Agent] Отправляем запрос к GigaChat...`);
|
||||
|
||||
const result = await moderationLlm.invoke(prompt);
|
||||
|
||||
const processingTime = Date.now() - startTime;
|
||||
console.log(`🤖 [AI Agent] Получен ответ от GigaChat за ${processingTime}мс`);
|
||||
console.log(`🤖 [AI Agent] Результат анализа:`, {
|
||||
isApproved: result.isApproved,
|
||||
comment: result.comment || 'нет комментария',
|
||||
hasComment: !!result.comment
|
||||
});
|
||||
|
||||
// Дополнительная проверка
|
||||
if(!result.isApproved && result.comment.trim() === '') {
|
||||
console.log(`⚠️ [AI Agent] Сообщение отклонено, но комментарий пустой. Добавляем стандартный комментарий.`);
|
||||
result.comment = 'Сообщение удалено. Причина: нарушение правил чата.'
|
||||
}
|
||||
|
||||
// Определяем итоговый текст сообщения
|
||||
let finalMessage = body;
|
||||
if (!result.isApproved) {
|
||||
finalMessage = '[Удалено модератором]';
|
||||
console.log(`🚫 [AI Agent] Сообщение будет заменено на: "${finalMessage}"`);
|
||||
} else {
|
||||
console.log(`✅ [AI Agent] Сообщение одобрено, остается без изменений`);
|
||||
}
|
||||
|
||||
console.log(`🤖 [AI Agent] Анализ завершен. Общее время: ${Date.now() - startTime}мс`);
|
||||
|
||||
return [result.comment, result.isApproved, finalMessage];
|
||||
|
||||
} catch (error) {
|
||||
const processingTime = Date.now() - startTime;
|
||||
console.error(`❌ [AI Agent] Ошибка при анализе сообщения (${processingTime}мс):`, error);
|
||||
console.error(`❌ [AI Agent] Сообщение будет одобрено из-за ошибки модерации`);
|
||||
|
||||
// В случае ошибки одобряем сообщение
|
||||
return ['', true, body];
|
||||
constructor(GIGA_AUTH) {
|
||||
// Создаем структурированный вывод для модерации
|
||||
this.moderationLlm = gigachat(GIGA_AUTH).withStructuredOutput(z.object({
|
||||
comment: z.string(),
|
||||
isApproved: z.boolean(),
|
||||
}) as any);
|
||||
}
|
||||
|
||||
private getSystemPrompt(): string {
|
||||
return `Ты модерируешь сообщения в чате. Твоя задача - проверить сообщение на нецензурную лексику, брань и неприемлемый контент.
|
||||
|
||||
Твои задачи:
|
||||
1. Проверь сообщение на наличие нецензурной лексики, мата, ругательств и брани.
|
||||
2. Проверь на оскорбления, угрозы и агрессивное поведение.
|
||||
3. Проверь на спам и рекламу.
|
||||
4. Проверь на неприемлемый контент (дискриминация, экстремизм и т.д.).
|
||||
|
||||
- Если сообщение не содержит запрещенного контента, оно одобряется (isApproved: true).
|
||||
- Если сообщение содержит запрещенный контент, оно отклоняется (isApproved: false).
|
||||
|
||||
Правила написания комментария:
|
||||
- Если сообщение одобряется, оставь поле comment пустым.
|
||||
- Если сообщение отклоняется, пиши комментарий со следующей формулировкой:
|
||||
"Сообщение удалено. Причина: (укажи конкретную причину: нецензурная лексика, оскорбления, спам и т.д.)"`;
|
||||
}
|
||||
|
||||
public async moderateMessage(message: string): Promise<ModerationResult> {
|
||||
try {
|
||||
const prompt = `${this.getSystemPrompt()}
|
||||
|
||||
Сообщение: ${message}`;
|
||||
|
||||
const result = await this.moderationLlm.invoke(prompt);
|
||||
|
||||
// Дополнительная проверка
|
||||
if (!result.isApproved && result.comment.trim() === '') {
|
||||
result.comment = 'Сообщение удалено. Причина: нарушение правил чата.';
|
||||
}
|
||||
|
||||
return {
|
||||
comment: result.comment,
|
||||
isApproved: result.isApproved,
|
||||
success: true
|
||||
};
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ [Chat Moderation] Ошибка при модерации:', error);
|
||||
|
||||
// В случае ошибки одобряем сообщение
|
||||
return {
|
||||
comment: '',
|
||||
isApproved: true,
|
||||
success: false,
|
||||
error: error instanceof Error ? error.message : 'Неизвестная ошибка'
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Экспортируем функцию для обратной совместимости
|
||||
export const moderationText = async (title: string, body: string, GIGA_AUTH): Promise<[string, boolean, string]> => {
|
||||
const agent = new ChatModerationAgent(GIGA_AUTH);
|
||||
const result = await agent.moderateMessage(body);
|
||||
return [result.comment, result.isApproved, body];
|
||||
};
|
||||
Reference in New Issue
Block a user