From accd0d85a859114d6416b8aff0e08a90f6ff1038 Mon Sep 17 00:00:00 2001 From: SXP-Simon Date: Sun, 2 Nov 2025 17:39:51 +0800 Subject: [PATCH] =?UTF-8?q?[feat]=20=E4=BC=98=E5=8C=96=E5=88=86=E6=9E=90?= =?UTF-8?q?=E5=99=A8=E6=89=A7=E8=A1=8C=E6=83=85=E5=86=B5=EF=BC=8C=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E7=BD=91=E7=BB=9C=E8=AF=B7=E6=B1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/analysis/llm_analyzer.py | 63 +++++++++++++++++++++++++++++++++++- src/utils/helpers.py | 47 ++++++++++++++++----------- 2 files changed, 91 insertions(+), 19 deletions(-) diff --git a/src/analysis/llm_analyzer.py b/src/analysis/llm_analyzer.py index 370e6cd..973aa05 100644 --- a/src/analysis/llm_analyzer.py +++ b/src/analysis/llm_analyzer.py @@ -3,6 +3,7 @@ LLM分析器模块 负责协调各个分析器进行话题分析、用户称号分析和金句分析 """ +import asyncio from typing import List, Dict, Tuple from astrbot.api import logger from ..models.data_models import SummaryTopic, UserTitle, GoldenQuote, TokenUsage @@ -95,8 +96,68 @@ class LLMAnalyzer: logger.error(f"金句分析失败: {e}") return [], TokenUsage() + async def analyze_all_concurrent(self, messages: List[Dict], user_analysis: Dict, umo: str = None) -> Tuple[List[SummaryTopic], List[UserTitle], List[GoldenQuote], TokenUsage]: + """ + 并发执行所有分析任务(话题、用户称号、金句) + + Args: + messages: 群聊消息列表 + user_analysis: 用户分析统计 + umo: 模型唯一标识符 + + Returns: + (话题列表, 用户称号列表, 金句列表, 总Token使用统计) + """ + try: + logger.info("开始并发执行所有分析任务") + + # 并发执行三个分析任务 + results = await asyncio.gather( + self.topic_analyzer.analyze_topics(messages, umo), + self.user_title_analyzer.analyze_user_titles(messages, user_analysis, umo), + self.golden_quote_analyzer.analyze_golden_quotes(messages, umo), + return_exceptions=True + ) + + # 处理结果 + topics, topic_usage = [], TokenUsage() + user_titles, title_usage = [], TokenUsage() + golden_quotes, quote_usage = [], TokenUsage() + + # 话题分析结果 + if isinstance(results[0], Exception): + logger.error(f"话题分析失败: {results[0]}") + else: + topics, topic_usage = results[0] + + # 用户称号分析结果 + if isinstance(results[1], Exception): + logger.error(f"用户称号分析失败: {results[1]}") + else: + user_titles, title_usage = results[1] + + # 金句分析结果 + if isinstance(results[2], Exception): + logger.error(f"金句分析失败: {results[2]}") + else: + golden_quotes, quote_usage = results[2] + + # 合并Token使用统计 + total_usage = TokenUsage( + prompt_tokens=topic_usage.prompt_tokens + title_usage.prompt_tokens + quote_usage.prompt_tokens, + completion_tokens=topic_usage.completion_tokens + title_usage.completion_tokens + quote_usage.completion_tokens, + total_tokens=topic_usage.total_tokens + title_usage.total_tokens + quote_usage.total_tokens + ) + + logger.info(f"并发分析完成 - 话题: {len(topics)}, 称号: {len(user_titles)}, 金句: {len(golden_quotes)}") + return topics, user_titles, golden_quotes, total_usage + + except Exception as e: + logger.error(f"并发分析失败: {e}") + return [], [], [], TokenUsage() + # 向后兼容的方法,保持原有调用方式 - async def _call_provider_with_retry(self, provider, prompt: str, max_tokens: int, + async def _call_provider_with_retry(self, provider, prompt: str, max_tokens: int, temperature: float, umo: str = None): """ 向后兼容的LLM调用方法 diff --git a/src/utils/helpers.py b/src/utils/helpers.py index 0eefd9b..339d263 100644 --- a/src/utils/helpers.py +++ b/src/utils/helpers.py @@ -37,31 +37,42 @@ class MessageAnalyzer: # 用户分析 user_analysis = self.user_analyzer.analyze_users(messages) - # LLM分析 + # LLM分析 - 使用并发方式 topics = [] user_titles = [] golden_quotes = [] total_token_usage = TokenUsage() - # 话题分析 - if self.config_manager.get_topic_analysis_enabled(): - topics, topic_tokens = await self.llm_analyzer.analyze_topics(messages, umo=unified_msg_origin) - total_token_usage.prompt_tokens += topic_tokens.prompt_tokens - total_token_usage.completion_tokens += topic_tokens.completion_tokens - total_token_usage.total_tokens += topic_tokens.total_tokens + # 检查各个分析功能是否启用 + topic_enabled = self.config_manager.get_topic_analysis_enabled() + user_title_enabled = self.config_manager.get_user_title_analysis_enabled() + golden_quote_enabled = self.config_manager.get_golden_quote_analysis_enabled() + + # 如果三个分析都启用,使用并发执行 + if topic_enabled and user_title_enabled and golden_quote_enabled: + # 并发执行所有三个分析任务 + topics, user_titles, golden_quotes, total_token_usage = await self.llm_analyzer.analyze_all_concurrent( + messages, user_analysis, umo=unified_msg_origin + ) + else: + # 如果只启用部分分析,则按需执行 + if topic_enabled: + topics, topic_tokens = await self.llm_analyzer.analyze_topics(messages, umo=unified_msg_origin) + total_token_usage.prompt_tokens += topic_tokens.prompt_tokens + total_token_usage.completion_tokens += topic_tokens.completion_tokens + total_token_usage.total_tokens += topic_tokens.total_tokens - # 用户称号分析 - if self.config_manager.get_user_title_analysis_enabled(): - user_titles, title_tokens = await self.llm_analyzer.analyze_user_titles(messages, user_analysis, umo=unified_msg_origin) - total_token_usage.prompt_tokens += title_tokens.prompt_tokens - total_token_usage.completion_tokens += title_tokens.completion_tokens - total_token_usage.total_tokens += title_tokens.total_tokens + if user_title_enabled: + user_titles, title_tokens = await self.llm_analyzer.analyze_user_titles(messages, user_analysis, umo=unified_msg_origin) + total_token_usage.prompt_tokens += title_tokens.prompt_tokens + total_token_usage.completion_tokens += title_tokens.completion_tokens + total_token_usage.total_tokens += title_tokens.total_tokens - # 金句分析 - golden_quotes, quote_tokens = await self.llm_analyzer.analyze_golden_quotes(messages, umo=unified_msg_origin) - total_token_usage.prompt_tokens += quote_tokens.prompt_tokens - total_token_usage.completion_tokens += quote_tokens.completion_tokens - total_token_usage.total_tokens += quote_tokens.total_tokens + if golden_quote_enabled: + golden_quotes, quote_tokens = await self.llm_analyzer.analyze_golden_quotes(messages, umo=unified_msg_origin) + total_token_usage.prompt_tokens += quote_tokens.prompt_tokens + total_token_usage.completion_tokens += quote_tokens.completion_tokens + total_token_usage.total_tokens += quote_tokens.total_tokens # 更新统计数据 statistics.golden_quotes = golden_quotes