feat(chat): 优化回复内容过滤器,杜绝格式模仿

核心问题:
修复了模型在生成回复时,偶尔会模仿并输出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。
最终效果:
通过以上修改,我们构建了一套健壮、精准且可观测的回复内容过滤机制,彻底解决了模型模仿系统消息格式的问题,显著提升了回复内容的质量与规范性
This commit is contained in:
tt-P607
2025-11-09 01:07:27 +08:00
parent 130a0fdb31
commit 402644900f

View File

@@ -557,11 +557,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"]
)
@@ -1747,6 +1747,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