feat: 添加历史消息长度限制,优化上下文管理和消息处理逻辑
This commit is contained in:
@@ -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}")
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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}")
|
||||
|
||||
Reference in New Issue
Block a user