完善双AI对话

This commit is contained in:
997146918 2025-08-18 14:32:55 +08:00
parent c5b81be7fd
commit 7c8210039a
2 changed files with 99 additions and 67 deletions

View File

@ -593,24 +593,30 @@ class DualAIDialogueEngine:
print(f"上下文设置: 历史{history_context_count}轮, 信息{context_info_count}") print(f"上下文设置: 历史{history_context_count}轮, 信息{context_info_count}")
# 使用双模型系统生成对话 # 使用双模型系统生成对话
conversation_results = self.llm_generator.run_dual_character_conversation( for turn in range(turns):
topic=topic, # 获取对话历史
turns=turns, dialogue_history = self.conv_mgr.get_conversation_history(session_id)
context=context_str, conversation_results = self.llm_generator.run_dual_character_conversation(
temperature=0.8, topic=topic,
max_new_tokens=150 turn_index = turn,
) context=context_str,
dialogue_history = dialogue_history,
# 保存对话到数据库 history_context_count = history_context_count,
for result in conversation_results: temperature=0.8,
self.conv_mgr.add_dialogue_turn( max_new_tokens=150
session_id,
result['speaker'],
result['dialogue'],
[result.get('context_used', '')],
0.8 # 默认相关性分数
) )
# 保存对话到数据库
for result in conversation_results:
self.conv_mgr.add_dialogue_turn(
session_id,
result['speaker'],
result['dialogue'],
[result.get('context_used', '')],
0.8 # 默认相关性分数
)
return conversation_results return conversation_results
# def main(): # def main():

View File

@ -141,10 +141,11 @@ class NPCDialogueGenerator:
self, self,
character_name: str, character_name: str,
context: str = "", context: str = "",
user_input: str = "",
temperature: float = 0.8, temperature: float = 0.8,
max_new_tokens: int = 150, max_new_tokens: int = 150,
top_p: float = 0.9 top_p: float = 0.9,
dialogue_history: List[Dict] = None,
history_context_count: int = 3
) -> str: ) -> str:
""" """
生成指定角色的对话 生成指定角色的对话
@ -156,6 +157,8 @@ class NPCDialogueGenerator:
temperature: 采样温度 temperature: 采样温度
max_new_tokens: 最大生成token数 max_new_tokens: 最大生成token数
top_p: 核采样参数 top_p: 核采样参数
dialogue_history: 对话历史记录列表每个元素包含speaker和content
history_context_count: 使用的历史对话轮数默认3轮
Returns: Returns:
生成的对话内容 生成的对话内容
@ -165,12 +168,12 @@ class NPCDialogueGenerator:
profile = self.character_profiles[character_name] profile = self.character_profiles[character_name]
# 构建系统提示 # 构建系统提示,包含历史对话数据
system_prompt = self._build_system_prompt(profile, context) system_prompt = self._build_system_prompt(profile, context, dialogue_history, history_context_count)
# 构建用户输入 # 构建用户输入
if not user_input: user_input = "请说一段符合你角色设定的话。"
user_input = "请说一段符合你角色设定的话。"
# 准备消息 # 准备消息
messages = [ messages = [
@ -209,8 +212,15 @@ class NPCDialogueGenerator:
return dialogue return dialogue
def _build_system_prompt(self, profile: Dict, context: str = "") -> str: def _build_system_prompt(self, profile: Dict, context: str = "", dialogue_history: List[Dict] = None, history_context_count: int = 3) -> str:
"""构建系统提示""" """构建系统提示
Args:
profile: 角色配置信息
context: 当前情境
dialogue_history: 对话历史记录列表每个元素包含speaker和content
history_context_count: 使用的历史对话轮数默认3轮
"""
personality_str = "".join(profile["personality"]) personality_str = "".join(profile["personality"])
speech_pattern_str = "".join(profile["speech_patterns"]) speech_pattern_str = "".join(profile["speech_patterns"])
@ -219,9 +229,24 @@ class NPCDialogueGenerator:
性格特点{personality_str} 性格特点{personality_str}
说话风格{speech_pattern_str} 说话风格{speech_pattern_str}
请严格按照这个角色的设定来回应保持角色的一致性和独特性""" 请严格按照这个角色的设定来回应保持角色的一致性和独特性"""
# 添加当前情境
if context: if context:
system_prompt += f"\n\n当前情境:{context}" system_prompt += f"\n\n当前情境:{context}"
return system_prompt
# 添加历史对话数据参考generate_character_prompt的实现
if dialogue_history:
system_prompt += "\n\n最近的对话:"
# 使用参数控制历史对话轮数
history_to_use = dialogue_history[-history_context_count:] if history_context_count > 0 else []
for turn in history_to_use:
system_prompt += f"{turn.speaker}: {turn.content}"
# speaker = turn.get('speaker', '未知')
# content = turn.get('content', '')
# if content:
# system_prompt += f"\n{speaker}: {content}"
return system_prompt
def generate_dialogue_conversation(self, character1: str, character2: str, topic: str, turns: int = 4) -> List[Dict]: def generate_dialogue_conversation(self, character1: str, character2: str, topic: str, turns: int = 4) -> List[Dict]:
"""生成两个角色之间的对话 """生成两个角色之间的对话
@ -327,9 +352,10 @@ class DualModelDialogueGenerator:
def generate_dual_character_dialogue(self, def generate_dual_character_dialogue(self,
character_name: str, character_name: str,
context: str = "", context: str = "",
user_input: str = "",
temperature: float = 0.8, temperature: float = 0.8,
max_new_tokens: int = 150) -> str: max_new_tokens: int = 150,
dialogue_history: str = "",
history_context_count: int = 3) -> str:
""" """
生成指定角色的对话使用对应的模型 生成指定角色的对话使用对应的模型
@ -345,19 +371,21 @@ class DualModelDialogueGenerator:
""" """
if character_name == self.character1_config['name']: if character_name == self.character1_config['name']:
return self.character1_generator.generate_character_dialogue( return self.character1_generator.generate_character_dialogue(
character_name, context, user_input, temperature, max_new_tokens character_name, context, temperature, max_new_tokens, dialogue_history = dialogue_history, history_context_count=history_context_count,
) )
elif character_name == self.character2_config['name']: elif character_name == self.character2_config['name']:
return self.character2_generator.generate_character_dialogue( return self.character2_generator.generate_character_dialogue(
character_name, context, user_input, temperature, max_new_tokens character_name, context, temperature, max_new_tokens, dialogue_history = dialogue_history, history_context_count=history_context_count,
) )
else: else:
raise ValueError(f"Unknown character: {character_name}") raise ValueError(f"Unknown character: {character_name}")
def run_dual_character_conversation(self, def run_dual_character_conversation(self,
topic: str = "", topic: str = "",
turns: int = 4, turn_index: int = 4,
context: str = "", context: str = "",
dialogue_history: str = "",
history_context_count: int = 3,
temperature: float = 0.8, temperature: float = 0.8,
max_new_tokens: int = 150) -> List[Dict]: max_new_tokens: int = 150) -> List[Dict]:
""" """
@ -380,45 +408,43 @@ class DualModelDialogueGenerator:
# 构建完整上下文 # 构建完整上下文
full_context = f"现在{char1_name}{char2_name}在讨论关于{topic}的话题。{context}" full_context = f"现在{char1_name}{char2_name}在讨论关于{topic}的话题。{context}"
print(f"\n=== 开始双角色对话 ===") # print(f"\n=== 开始双角色对话 ===")
print(f"主题: {topic}") # print(f"主题: {topic}")
print(f"角色: {char1_name} vs {char2_name}") # print(f"角色: {char1_name} vs {char2_name}")
print(f"轮数: {turns}") # print("-" * 50)
print("-" * 50)
for turn in range(turns):
if turn % 2 == 0:
# 角色1说话
speaker = char1_name
if turn == 0:
user_input = f"开始和{char2_name}讨论{topic}这个话题。"
else:
last_dialogue = conversation[-1]["dialogue"]
user_input = f"{char2_name}刚才说:\"{last_dialogue}\"。请回应。"
else:
# 角色2说话
speaker = char2_name
last_dialogue = conversation[-1]["dialogue"]
user_input = f"{char1_name}刚才说:\"{last_dialogue}\"。请回应。"
print(f"\n[第{turn+1}轮] {speaker}正在思考...") if turn_index % 2 == 0:
# 角色1说话
speaker = char1_name
# if turn_index == 0:
# user_input = f"开始和{char2_name}讨论{topic}这个话题。"
# else:
# last_dialogue = conversation[-1]["dialogue"]
# user_input = f"{char2_name}刚才说:\"{last_dialogue}\"。请回应。"
else:
# 角色2说话
speaker = char2_name
# last_dialogue = conversation[-1]["dialogue"]
# user_input = f"{char1_name}刚才说:\"{last_dialogue}\"。请回应。"
# 使用对应角色的模型生成对话 print(f"\n[第{turn_index+1}轮] {speaker}正在思考...")
dialogue = self.generate_dual_character_dialogue(
speaker, full_context, user_input, temperature, max_new_tokens
)
conversation.append({ # 使用对应角色的模型生成对话
"turn": turn + 1, dialogue = self.generate_dual_character_dialogue(
"speaker": speaker, speaker, full_context, temperature, max_new_tokens, dialogue_history, history_context_count
"dialogue": dialogue, )
"context_used": full_context[:100] + "..." if len(full_context) > 100 else full_context
}) conversation.append({
"turn": turn_index + 1,
"speaker": speaker,
"dialogue": dialogue,
"context_used": full_context[:100] + "..." if len(full_context) > 100 else full_context
})
print(f"{speaker}: {dialogue}")
print(f"{speaker}: {dialogue}")
print("-" * 50)
print("✓ 双角色对话完成")
return conversation return conversation