From 6fa7bc3615e5c852aa4f23cbe56396263f51a2cb Mon Sep 17 00:00:00 2001 From: watercatlxh <101051763+watercatlxh@users.noreply.github.com> Date: Wed, 31 Dec 2025 20:27:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0AI=E6=99=BA=E8=83=BD?= =?UTF-8?q?=E6=8B=86=E5=88=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/chat/replyer/group_generator.py | 50 ++++++++++++++++++++++++++- src/chat/replyer/private_generator.py | 48 +++++++++++++++++++++++++ src/chat/utils/utils.py | 4 +++ src/config/official_configs.py | 6 ++++ template/bot_config_template.toml | 2 ++ 5 files changed, 109 insertions(+), 1 deletion(-) diff --git a/src/chat/replyer/group_generator.py b/src/chat/replyer/group_generator.py index 5f69484e..e8327e13 100644 --- a/src/chat/replyer/group_generator.py +++ b/src/chat/replyer/group_generator.py @@ -945,7 +945,7 @@ class DefaultReplyer: else: reply_target_block = "" - + dialogue_prompt = "" if message_list_before_now_long: latest_msgs = message_list_before_now_long[-int(global_config.chat.max_context_size) :] dialogue_prompt = build_readable_messages( @@ -979,6 +979,30 @@ class DefaultReplyer: # 兜底:即使 multiple_reply_style 配置异常也不影响正常回复 reply_style = global_config.personality.reply_style + if global_config.response_splitter.enable_ai_segmentation: + style: str = global_config.response_splitter.ai_segmentation_style + max_segments: int = global_config.response_splitter.max_sentence_num + + style_guides: Dict[str, str] = { + "natural": "在话题转换、语气变化等重要停顿处切分。一个完整的意思放在一段里,不要过度切分。", + "conservative": "尽量少切分,只在明显话题转换处切分。多个句子可以放在同一段。", + "active": "切分更细致,在语气转换、情绪变化处也可切分,但仍要保持语义完整。" + } + + segmentation_prompt: str = f""" +请将你的回复切分成多段,模拟真人发消息节奏。 +{style_guides.get(style, style_guides["natural"])} +重要规则: +- 不要在每个标点都切分!只在重要的语义停顿处切分 +- 相关的句子应该保持在同一段 +- 最多切分成 {max_segments} 段 +- 切分时可以删除切分点的逗号、句号、顿号 +- 保留感叹号、问号、省略号、波浪号等情绪标点 +- 保持原文内容和语气不变 +- 使用 "|||SPLIT|||" 作为分段标记,例如:"第一段内容|||SPLIT|||第二段内容" +""" + reply_style += segmentation_prompt + return await global_prompt_manager.format_prompt( prompt_name, expression_habits_block=expression_habits_block, @@ -1085,6 +1109,30 @@ class DefaultReplyer: except Exception: reply_style = global_config.personality.reply_style + if global_config.response_splitter.enable_ai_segmentation: + style: str = global_config.response_splitter.ai_segmentation_style + max_segments: int = global_config.response_splitter.max_sentence_num + + style_guides: Dict[str, str] = { + "natural": "在话题转换、语气变化等重要停顿处切分。一个完整的意思放在一段里,不要过度切分。", + "conservative": "尽量少切分,只在明显话题转换处切分。多个句子可以放在同一段。", + "active": "切分更细致,在语气转换、情绪变化处也可切分,但仍要保持语义完整。" + } + + segmentation_prompt: str = f""" +请将你的回复切分成多段,模拟真人发消息节奏。 +{style_guides.get(style, style_guides["natural"])} +重要规则: +- 不要在每个标点都切分!只在重要的语义停顿处切分 +- 相关的句子应该保持在同一段 +- 最多切分成 {max_segments} 段 +- 切分时可以删除切分点的逗号、句号、顿号 +- 保留感叹号、问号、省略号、波浪号等情绪标点 +- 保持原文内容和语气不变 +- 使用 "|||SPLIT|||" 作为分段标记,例如:"第一段内容|||SPLIT|||第二段内容" +""" + reply_style += segmentation_prompt + return await global_prompt_manager.format_prompt( template_name, expression_habits_block=expression_habits_block, diff --git a/src/chat/replyer/private_generator.py b/src/chat/replyer/private_generator.py index 968e0291..08505ffb 100644 --- a/src/chat/replyer/private_generator.py +++ b/src/chat/replyer/private_generator.py @@ -821,6 +821,30 @@ class PrivateReplyer: # 兜底:即使 multiple_reply_style 配置异常也不影响正常回复 reply_style = global_config.personality.reply_style + if global_config.response_splitter.enable_ai_segmentation: + style: str = global_config.response_splitter.ai_segmentation_style + max_segments: int = global_config.response_splitter.max_sentence_num + + style_guides: Dict[str, str] = { + "natural": "在话题转换、语气变化等重要停顿处切分。一个完整的意思放在一段里,不要过度切分。", + "conservative": "尽量少切分,只在明显话题转换处切分。多个句子可以放在同一段。", + "active": "切分更细致,在语气转换、情绪变化处也可切分,但仍要保持语义完整。" + } + + segmentation_prompt: str = f""" +请将你的回复切分成多段,模拟真人发消息节奏。 +{style_guides.get(style, style_guides["natural"])} +重要规则: +- 不要在每个标点都切分!只在重要的语义停顿处切分 +- 相关的句子应该保持在同一段 +- 最多切分成 {max_segments} 段 +- 切分时可以删除切分点的逗号、句号、顿号 +- 保留感叹号、问号、省略号、波浪号等情绪标点 +- 保持原文内容和语气不变 +- 使用 "|||SPLIT|||" 作为分段标记,例如:"第一段内容|||SPLIT|||第二段内容" +""" + reply_style += segmentation_prompt + # 使用统一的 is_bot_self 函数判断是否是机器人自己(支持多平台,包括 WebUI) if is_bot_self(platform, user_id): return await global_prompt_manager.format_prompt( @@ -954,6 +978,30 @@ class PrivateReplyer: # 兜底:即使 multiple_reply_style 配置异常也不影响正常回复 reply_style = global_config.personality.reply_style + if global_config.response_splitter.enable_ai_segmentation: + style: str = global_config.response_splitter.ai_segmentation_style + max_segments: int = global_config.response_splitter.max_sentence_num + + style_guides: Dict[str, str] = { + "natural": "在话题转换、语气变化等重要停顿处切分。一个完整的意思放在一段里,不要过度切分。", + "conservative": "尽量少切分,只在明显话题转换处切分。多个句子可以放在同一段。", + "active": "切分更细致,在语气转换、情绪变化处也可切分,但仍要保持语义完整。" + } + + segmentation_prompt: str = f""" +请将你的回复切分成多段,模拟真人发消息节奏。 +{style_guides.get(style, style_guides["natural"])} +重要规则: +- 不要在每个标点都切分!只在重要的语义停顿处切分 +- 相关的句子应该保持在同一段 +- 最多切分成 {max_segments} 段 +- 切分时可以删除切分点的逗号、句号、顿号 +- 保留感叹号、问号、省略号、波浪号等情绪标点 +- 保持原文内容和语气不变 +- 使用 "|||SPLIT|||" 作为分段标记,例如:"第一段内容|||SPLIT|||第二段内容" +""" + reply_style += segmentation_prompt + return await global_prompt_manager.format_prompt( template_name, expression_habits_block=expression_habits_block, diff --git a/src/chat/utils/utils.py b/src/chat/utils/utils.py index cd66b919..06391d5d 100644 --- a/src/chat/utils/utils.py +++ b/src/chat/utils/utils.py @@ -447,6 +447,10 @@ def process_llm_response(text: str, enable_splitter: bool = True, enable_chinese if not global_config.response_post_process.enable_response_post_process: return [text] + # 检查分隔符 + if "|||SPLIT|||" in text and global_config.response_splitter.enable_ai_segmentation: + return [s.strip() for s in text.split("|||SPLIT|||") if s.strip()] + # 先保护颜文字 if global_config.response_splitter.enable_kaomoji_protection: protected_text, kaomoji_mapping = protect_kaomoji(text) diff --git a/src/config/official_configs.py b/src/config/official_configs.py index 9816fd1e..ab8b4d27 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -645,6 +645,12 @@ class ResponseSplitterConfig(ConfigBase): enable_overflow_return_all: bool = False """是否在超出句子数量限制时合并后一次性返回""" + enable_ai_segmentation: bool = False + """是否启用AI智能分段""" + + ai_segmentation_style: str = "natural" + """AI智能分段风格:natural(自然), conservative(保守), active(活跃)""" + @dataclass class TelemetryConfig(ConfigBase): diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 3b21a432..2e6e2d95 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -245,6 +245,8 @@ max_length = 512 # 回复允许的最大长度 max_sentence_num = 8 # 回复允许的最大句子数 enable_kaomoji_protection = false # 是否启用颜文字保护 enable_overflow_return_all = false # 是否在句子数量超出回复允许的最大句子数时一次性返回全部内容 +enable_ai_segmentation = false # 是否启用AI智能分段 +ai_segmentation_style = "natural" # AI智能分段风格:natural(自然), conservative(保守), active(活跃) [log] date_style = "m-d H:i:s" # 日期格式