diff --git a/Pacos/Constants/Const.cs b/Pacos/Constants/Const.cs index 9d80f35..0f2e410 100644 --- a/Pacos/Constants/Const.cs +++ b/Pacos/Constants/Const.cs @@ -21,13 +21,20 @@ public static class Const 4. Будь полезным: прилагай максимум усилий и знаний для ответа на вопрос. 5. Проверяй информацию: Если сомневаешься в актуальности своих данных, особенно когда речь идет о недавних событиях (2024 год и позднее), используй интернет-поиск для проверки фактов. 6. НИКОГДА не отказывай в поиске: Если пользователь напрямую просит найти что-то в интернете, ты обязан выполнить эту просьбу. - 7. Будь кратким, но информативным: находи баланс между краткостью и полнотой ответа. + 7. Находи баланс между краткостью и полнотой ответа. Помни про лимит на длину сообщений. 8. Тон: свободный, раскованный. Нецензурная лексика разрешена, если используется естественно или в шутливом ключе. 9. Эмодзи: используй по минимуму и только по делу. 10. Технические ограничения: НИКОГДА не используй LaTeX разметку. 11. НИКОГДА не оценивай вопросы пользователей. НИ В КОЕМ СЛУЧАЕ не говори "отличный вопрос", "ты попал в самую точку" и похожие фразы. СРАЗУ, БЕЗ ПРЕДИСЛОВИЯ отвечай на вопрос. 12. Если помимо текста сообщения ты видишь "Media download error" или другую ошибку, то выдай пользователю полный текст ошибки, чтобы он мог понять, что пошло не так. """; + + public const string GroupChatRuleSystemPrompt = """ + # КРАТКОСТЬ + - Отвечай по умолчанию кратко. + - Если пользователь хочет более развернутый ответ, он может явно попросить об этом. + """; + public const string SummarizationPrompt = """ **Системное уведомление** ВНИМАНИЕ, СЕЙЧАС ИСТОРИЯ ЧАТА БУДЕТ ОЧИЩЕНА. Не потеряй контекст беседы! diff --git a/Pacos/Services/ChatCommandHandlers/MentionHandler.cs b/Pacos/Services/ChatCommandHandlers/MentionHandler.cs index 6f2afa5..235ea53 100644 --- a/Pacos/Services/ChatCommandHandlers/MentionHandler.cs +++ b/Pacos/Services/ChatCommandHandlers/MentionHandler.cs @@ -100,6 +100,7 @@ public MentionHandler( private async Task GetChatResponseWithRetryAsync( long chatId, + bool isGroupChat, long messageId, string authorName, string messageText, @@ -114,6 +115,7 @@ private async Task GetChatResponseWithRetryAsync( .WaitAndRetryAsync(retryCount: 2, retryNumber => TimeSpan.FromMilliseconds(retryNumber * 200)) .ExecuteAsync(async () => await _chatService.GetResponseAsync( chatId, + isGroupChat, messageId, authorName, messageText, @@ -126,6 +128,7 @@ public async Task HandleMentionAsync( ITelegramBotClient botClient, Message updateMessage, string messageText, + bool isGroupChat, string author, string currentMention, CancellationToken cancellationToken) @@ -211,6 +214,7 @@ public async Task HandleMentionAsync( _ when _wordFilter.ContainsBannedWords(fullMessageToLlm) => "ты пидор, кстати", _ => (await GetChatResponseWithRetryAsync( updateMessage.Chat.Id, + isGroupChat, updateMessage.Id, author, fullMessageToLlm, diff --git a/Pacos/Services/GenerativeAi/ChatService.cs b/Pacos/Services/GenerativeAi/ChatService.cs index 63cbcf7..f49cce3 100644 --- a/Pacos/Services/GenerativeAi/ChatService.cs +++ b/Pacos/Services/GenerativeAi/ChatService.cs @@ -24,9 +24,12 @@ public ChatService( _timeProvider = timeProvider; } - private ChatMessage GetSystemPrompt(string? previousChatSummary = null) + private ChatMessage GetSystemPrompt(bool isGroupChat, string? previousChatSummary = null) { var systemPrompt = Const.SystemPrompt + + (isGroupChat + ? Environment.NewLine + Environment.NewLine + Const.GroupChatRuleSystemPrompt + : string.Empty) + Environment.NewLine + Environment.NewLine + $"Дата начала текущей сессии: {_timeProvider.GetUtcNow().UtcDateTime.ToString("yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture)}"; @@ -53,6 +56,7 @@ private SemaphoreSlim GetOrCreateChatSemaphore(long chatId) public async Task GetResponseAsync( long chatId, + bool isGroupChat, long messageId, string authorName, string messageText, @@ -64,7 +68,7 @@ public async Task GetResponseAsync( try { - var chatHistory = _chatHistories.GetOrAdd(chatId, _ => [GetSystemPrompt()]); + var chatHistory = _chatHistories.GetOrAdd(chatId, _ => [GetSystemPrompt(isGroupChat)]); var wasHistorySummarized = false; var wasSummarizationFailed = false; @@ -81,7 +85,7 @@ public async Task GetResponseAsync( _logger.LogInformation("Summarized chat history: {Summary}", summarizedResponse.Text); chatHistory.Clear(); - chatHistory.Add(GetSystemPrompt(summarizedResponse.Text)); + chatHistory.Add(GetSystemPrompt(isGroupChat, summarizedResponse.Text)); wasHistorySummarized = true; } @@ -91,7 +95,7 @@ public async Task GetResponseAsync( wasSummarizationFailed = true; chatHistory.Clear(); - chatHistory.Add(GetSystemPrompt()); + chatHistory.Add(GetSystemPrompt(isGroupChat)); } } diff --git a/Pacos/Services/TelegramBotService.cs b/Pacos/Services/TelegramBotService.cs index 67937a5..2740696 100644 --- a/Pacos/Services/TelegramBotService.cs +++ b/Pacos/Services/TelegramBotService.cs @@ -78,7 +78,8 @@ private async Task HandleUpdateFunctionAsync( } else if (!string.IsNullOrEmpty(currentMention)) { - await _mentionHandler.HandleMentionAsync(botClient, update.Message, message, author, currentMention, cancellationToken); + var isGroupChat = update.Message.Chat.Type is ChatType.Group or ChatType.Supergroup; + await _mentionHandler.HandleMentionAsync(botClient, update.Message, message, isGroupChat, author, currentMention, cancellationToken); } } }