feat: 添加历史消息长度限制,优化上下文管理和消息处理逻辑

This commit is contained in:
Windpicker-owo
2025-11-19 13:59:40 +08:00
parent edc1cd5555
commit 75b806cd41
7 changed files with 245 additions and 71 deletions

View File

@@ -232,7 +232,8 @@ class SingleStreamContextManager:
failed_ids = []
for message_id in message_ids:
try:
self.context.mark_message_as_read(message_id)
# 传递最大历史消息数量限制
self.context.mark_message_as_read(message_id, max_history_size=self.max_context_size)
marked_count += 1
except Exception as e:
failed_ids.append(str(message_id)[:8])
@@ -374,11 +375,11 @@ class SingleStreamContextManager:
from src.chat.utils.chat_message_builder import get_raw_msg_before_timestamp_with_chat
# 加载历史消息限制数量为max_context_size的2倍用于丰富上下文
# 加载历史消息限制数量为max_context_size
db_messages = await get_raw_msg_before_timestamp_with_chat(
chat_id=self.stream_id,
timestamp=time.time(),
limit=self.max_context_size * 2,
limit=self.max_context_size,
)
if db_messages:
@@ -401,6 +402,12 @@ class SingleStreamContextManager:
logger.warning(f"转换历史消息失败 (message_id={msg_dict.get('message_id', 'unknown')}): {e}")
continue
# 应用历史消息长度限制
if len(self.context.history_messages) > self.max_context_size:
removed_count = len(self.context.history_messages) - self.max_context_size
self.context.history_messages = self.context.history_messages[-self.max_context_size:]
logger.debug(f"📝 [历史加载] 移除了 {removed_count} 条过旧的历史消息以保持上下文大小限制")
logger.info(f"✅ [历史加载] 成功加载 {loaded_count} 条历史消息到内存: {self.stream_id}")
else:
logger.debug(f"没有历史消息需要加载: {self.stream_id}")

View File

@@ -104,7 +104,19 @@ class HeartFCSender:
# 将MessageSending转换为DatabaseMessages
db_message = await self._convert_to_database_message(message)
if db_message and message.chat_stream.context_manager:
message.chat_stream.context_manager.context.history_messages.append(db_message)
context = message.chat_stream.context_manager.context
# 应用历史消息长度限制
from src.config.config import global_config
max_context_size = getattr(global_config.chat, "max_context_size", 40)
if len(context.history_messages) >= max_context_size:
# 移除最旧的历史消息以保持长度限制
removed_count = 1
context.history_messages = context.history_messages[removed_count:]
logger.debug(f"[{chat_id}] Send API添加前移除了 {removed_count} 条历史消息以保持上下文大小限制")
context.history_messages.append(db_message)
logger.debug(f"[{chat_id}] Send API消息已添加到流上下文: {message_id}")
except Exception as context_error:
logger.warning(f"[{chat_id}] 将Send API消息添加到流上下文失败: {context_error}")

View File

@@ -607,12 +607,12 @@ class DefaultReplyer:
# 添加感知记忆(最近的消息块)
if perceptual_blocks:
memory_parts.append("#### 🌊 感知记忆")
for block in perceptual_blocks[:2]: # 最多显示2个块
for block in perceptual_blocks:
messages = block.messages if hasattr(block, 'messages') else []
if messages:
block_content = "\n".join([
f"{msg.get('sender_name', msg.get('sender_id', ''))}: {msg.get('content', '')[:30]}"
for msg in messages[:3]
for msg in messages
])
memory_parts.append(f"- {block_content}")
memory_parts.append("")
@@ -620,7 +620,7 @@ class DefaultReplyer:
# 添加短期记忆(结构化活跃记忆)
if short_term_memories:
memory_parts.append("#### 💭 短期记忆")
for mem in short_term_memories[:3]: # 最多显示3条
for mem in short_term_memories:
content = format_memory_for_prompt(mem, include_metadata=False)
if content:
memory_parts.append(f"- {content}")
@@ -629,7 +629,7 @@ class DefaultReplyer:
# 添加长期记忆(图谱记忆)
if long_term_memories:
memory_parts.append("#### 🗄️ 长期记忆")
for mem in long_term_memories[:3]: # 最多显示3条
for mem in long_term_memories:
content = format_memory_for_prompt(mem, include_metadata=False)
if content:
memory_parts.append(f"- {content}")