From 460b73b3e234ce13267df4522e128f3feab6778d Mon Sep 17 00:00:00 2001 From: tt-P607 <68868379+tt-P607@users.noreply.github.com> Date: Sun, 9 Nov 2025 01:07:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(chat):=20=E4=BC=98=E5=8C=96=E5=9B=9E?= =?UTF-8?q?=E5=A4=8D=E5=86=85=E5=AE=B9=E8=BF=87=E6=BB=A4=E5=99=A8=EF=BC=8C?= =?UTF-8?q?=E6=9D=9C=E7=BB=9D=E6=A0=BC=E5=BC=8F=E6=A8=A1=E4=BB=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 核心问题: 修复了模型在生成回复时,偶尔会模仿并输出Prompt中用于示例的 [回复<...>] 格式的问题。此问题会导致最终发送的消息包含不应出现的多余文本。 实现方案: 精准定位过滤时机: 将过滤逻辑从原先的 send_api 前置到 default_generator 的 llm_generate_content 方法中。这确保了在LLM生成内容后、任何后续处理(如回复分割)前,第一时间对不规范内容进行清理,从根源上解决了问题。 强化正则表达式: 采用了一个更严格的正则表达式 r'\[\s*回复\s*<.+?>.*?\]',并设置了 re.DOTALL 标志。此举旨在“宁可错杀,不可放过”,能够更有效地匹配并清除各种复杂的、甚至包含换行的模仿格式。 处理嵌套残留: 在正则替换后,增加了一步额外的检查。如果清理后的字符串以 ] 开头(通常由嵌套括号引起),则会移除这个残留的字符,确保最终内容的绝对纯净。 增加日志监控: 为过滤器增加了 logger.warning 日志。当过滤器成功触发并清理内容时,会详细记录原始内容与清理后的内容,便于后续追踪和分析模型行为。 代码结构优化: 移除了 llm_generate_content 方法中原有的、效果较差的旧清理逻辑,避免了代码冗余。 修正了 build_memory_block 方法中一处错误的属性访问,将 stream.chat_history_manager 更正为 stream.context_manager,解决了潜在的 AttributeError。 最终效果: 通过以上修改,我们构建了一套健壮、精准且可观测的回复内容过滤机制,彻底解决了模型模仿系统消息格式的问题,显著提升了回复内容的质量与规范性 --- src/chat/replyer/default_generator.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/chat/replyer/default_generator.py b/src/chat/replyer/default_generator.py index 5e5006b12..fc2ccdde0 100644 --- a/src/chat/replyer/default_generator.py +++ b/src/chat/replyer/default_generator.py @@ -552,11 +552,11 @@ class DefaultReplyer: participants = [] try: # 尝试从聊天流中获取参与者信息 - if hasattr(stream, "chat_history_manager"): - history_manager = stream.chat_history_manager + if hasattr(stream, "context_manager"): + history_manager = stream.context_manager # 获取最近的参与者列表 recent_records = history_manager.get_memory_chat_history( - user_id=getattr(stream, "user_id", ""), + user_id=getattr(stream.user_info, "user_id", ""), count=10, memory_types=["chat_message", "system_message"] ) @@ -1768,6 +1768,10 @@ class DefaultReplyer: original_content_for_aggresive_filter = content cleaned_content_by_aggresive_filter = aggressive_pattern.sub('', content).strip() + # 再次检查并移除因嵌套括号可能残留的单个 ']' + if cleaned_content_by_aggresive_filter.startswith(']'): + cleaned_content_by_aggresive_filter = cleaned_content_by_aggresive_filter[1:].strip() + if cleaned_content_by_aggresive_filter != original_content_for_aggresive_filter: logger.warning(f"检测到并清理了模型生成的不规范回复格式。原始内容: '{original_content_for_aggresive_filter}', 清理后: '{cleaned_content_by_aggresive_filter}'") content = cleaned_content_by_aggresive_filter