mirror of
https://github.com/xinnan-tech/xiaozhi-esp32-server.git
synced 2026-07-23 23:53:55 +08:00
pref:优化大模型工具调用偷懒问题,调整基础提示词与新增临时工具记忆加深
This commit is contained in:
@@ -6,18 +6,20 @@ from datetime import datetime
|
||||
|
||||
class Message:
|
||||
def __init__(
|
||||
self,
|
||||
role: str,
|
||||
content: str = None,
|
||||
uniq_id: str = None,
|
||||
tool_calls=None,
|
||||
tool_call_id=None,
|
||||
self,
|
||||
role: str,
|
||||
content: str = None,
|
||||
uniq_id: str = None,
|
||||
tool_calls=None,
|
||||
tool_call_id=None,
|
||||
is_temporary=False,
|
||||
):
|
||||
self.uniq_id = uniq_id if uniq_id is not None else str(uuid.uuid4())
|
||||
self.role = role
|
||||
self.content = content
|
||||
self.tool_calls = tool_calls
|
||||
self.tool_call_id = tool_call_id
|
||||
self.is_temporary = is_temporary # 标记临时消息(如工具调用提醒)
|
||||
|
||||
|
||||
class Dialogue:
|
||||
@@ -59,8 +61,70 @@ class Dialogue:
|
||||
else:
|
||||
self.put(Message(role="system", content=new_content))
|
||||
|
||||
def trim_history(self, max_turns: int = 10) -> int:
|
||||
"""
|
||||
智能截断对话历史,保留工具调用的完整性
|
||||
|
||||
Args:
|
||||
max_turns: 保留的最大对话轮数(每轮 = user + assistant/tool 相关消息)
|
||||
|
||||
Returns:
|
||||
int: 被移除的消息数量
|
||||
"""
|
||||
if len(self.dialogue) <= max_turns * 2 + 1: # +1 是系统消息
|
||||
return 0
|
||||
|
||||
# 分离系统消息和对话消息
|
||||
system_messages = [msg for msg in self.dialogue if msg.role == "system"]
|
||||
conversation_messages = [msg for msg in self.dialogue if msg.role != "system"]
|
||||
|
||||
if len(conversation_messages) <= max_turns * 2:
|
||||
return 0
|
||||
|
||||
# 智能截断:保留完整的工具调用链路
|
||||
keep_messages = []
|
||||
i = len(conversation_messages) - 1
|
||||
turn_count = 0
|
||||
|
||||
while i >= 0 and turn_count < max_turns:
|
||||
msg = conversation_messages[i]
|
||||
|
||||
# 从后向前收集消息
|
||||
if msg.role == "user":
|
||||
# 遇到 user 消息,说明一轮对话开始
|
||||
keep_messages.insert(0, msg)
|
||||
turn_count += 1
|
||||
i -= 1
|
||||
elif msg.role == "assistant":
|
||||
# 收集 assistant 消息
|
||||
keep_messages.insert(0, msg)
|
||||
|
||||
# 如果这个 assistant 有 tool_calls,需要收集对应的 tool 响应
|
||||
if msg.tool_calls is not None:
|
||||
i -= 1
|
||||
# 继续向后收集所有相关的 tool 消息
|
||||
while i >= 0 and conversation_messages[i].role == "tool":
|
||||
keep_messages.insert(0, conversation_messages[i])
|
||||
i -= 1
|
||||
else:
|
||||
i -= 1
|
||||
elif msg.role == "tool":
|
||||
# tool 消息应该已经被上面的逻辑收集了
|
||||
# 如果单独遇到,也要保留(防止边界情况)
|
||||
keep_messages.insert(0, msg)
|
||||
i -= 1
|
||||
else:
|
||||
i -= 1
|
||||
|
||||
removed_count = len(conversation_messages) - len(keep_messages)
|
||||
|
||||
# 重建对话列表
|
||||
self.dialogue = system_messages + keep_messages
|
||||
|
||||
return removed_count
|
||||
|
||||
def get_llm_dialogue_with_memory(
|
||||
self, memory_str: str = None, voiceprint_config: dict = None
|
||||
self, memory_str: str = None, voiceprint_config: dict = None
|
||||
) -> List[Dict[str, str]]:
|
||||
# 构建对话
|
||||
dialogue = []
|
||||
|
||||
Reference in New Issue
Block a user