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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user