fix:记忆提取Prompt重复导致不调用工具的问题

pull/1364/head
SengokuCola 2025-11-18 14:13:52 +08:00
parent b136a4142c
commit ab4052823a
1 changed files with 64 additions and 76 deletions

View File

@ -135,57 +135,16 @@ def init_memory_retrieval_prompt():
在思考中分析
- 当前信息是否足够回答问题
- **如果信息足够且能找到明确答案**在思考中直接给出答案格式为found_answer(answer="你的答案内容")
- **如果信息不足或无法找到答案**在思考中给出not_enough_info(reason="信息不足或无法找到答案的原因")
- 如果还需要继续查询说明最需要查询什么并输出为纯文本说明
- **如果需要尝试搜集更多信息进一步调用工具进入第二步行动环节
- **如果已有信息不足或无法找到答案**在思考中给出not_enough_info(reason="信息不足或无法找到答案的原因")
**第二步行动Action**
根据思考结果立即行动
- 如果思考中已给出found_answer 无需调用工具直接结束
- 如果思考中已给出not_enough_info 无需调用工具直接结束
- 如果信息不足且需要继续查询 调用相应工具查询可并行调用多个工具
- 如果信息不足且需要继续查询说明最需要查询什么并输出为纯文本说明然后调用相应工具查询可并行调用多个工具
**重要规则**
- **只有在检索到明确有关的信息并得出答案时才使用found_answer**
- **如果信息不足无法确定找不到相关信息必须使用not_enough_info不要使用found_answer**
- 答案必须在思考中给出格式为 found_answer(answer="...") not_enough_info(reason="...")不要调用工具
""",
name="memory_retrieval_react_prompt",
)
# 第二步ReAct Agent prompt使用function calling要求先思考再行动
Prompt(
"""
你的名字是{bot_name}现在是{time_now}
你正在参与聊天你需要搜集信息来回答问题帮助你参与聊天
你需要通过思考(Think)行动(Action)观察(Observation)的循环来回答问题
**重要限制**
- 最大查询轮数{max_iterations}当前第{current_iteration}剩余{remaining_iterations}
- 必须尽快得出答案避免不必要的查询
- 思考要简短直接切入要点
- 必须严格使用检索到的信息回答问题不要编造信息
当前问题{question}
**执行步骤**
**第一步思考Think**
在思考中分析
- 当前信息是否足够回答问题
- **如果信息足够且能找到明确答案**在思考中直接给出答案格式为found_answer(answer="你的答案内容")
- **如果信息不足或无法找到答案**在思考中给出not_enough_info(reason="信息不足或无法找到答案的原因")
- 如果还需要继续查询说明最需要查询什么并输出为纯文本说明
**第二步行动Action**
根据思考结果立即行动
- 如果思考中已给出found_answer 无需调用工具直接结束
- 如果思考中已给出not_enough_info 无需调用工具直接结束
- 如果信息不足且需要继续查询 调用相应工具查询可并行调用多个工具
**重要规则**
- **只有在检索到明确具体的答案时才使用found_answer**
- **如果信息不足无法确定找不到相关信息必须使用not_enough_info不要使用found_answer**
- 答案必须在思考中给出格式为 found_answer(answer="...") not_enough_info(reason="...")不要调用工具
- 答案必须在思考中给出格式为 found_answer(answer="...") not_enough_info(reason="...")
""",
name="memory_retrieval_react_prompt_head",
)
@ -435,36 +394,41 @@ async def _react_agent_solve_question(
remaining_iterations = max_iterations - current_iteration
is_final_iteration = current_iteration >= max_iterations
# 构建prompt不再需要工具文本描述
prompt_type = "memory_retrieval_react_prompt"
if is_final_iteration:
prompt_type = "memory_retrieval_react_final_prompt"
# 最后一次迭代使用最终prompt
tool_definitions = []
logger.info(f"ReAct Agent 第 {iteration + 1} 次迭代,问题: {question}|可用工具数量: 0最后一次迭代不提供工具调用")
prompt = await global_prompt_manager.format_prompt(
"memory_retrieval_react_final_prompt",
bot_name=bot_name,
time_now=time_now,
question=question,
collected_info=collected_info if collected_info else "暂无信息",
current_iteration=current_iteration,
remaining_iterations=remaining_iterations,
max_iterations=max_iterations,
)
logger.info(f"ReAct Agent 第 {iteration + 1} 次Prompt: {prompt}")
success, response, reasoning_content, model_name, tool_calls = await llm_api.generate_with_model_with_tools(
prompt,
model_config=model_config.model_task_config.tool_use,
tool_options=tool_definitions,
request_type="memory.react",
)
else:
# 非最终迭代使用head_prompt
tool_definitions = tool_registry.get_tool_definitions()
logger.info(f"ReAct Agent 第 {iteration + 1} 次迭代,问题: {question}|可用工具数量: {len(tool_definitions)}")
prompt = await global_prompt_manager.format_prompt(
prompt_type,
bot_name=bot_name,
time_now=time_now,
question=question,
collected_info=collected_info if collected_info else "暂无信息",
current_iteration=current_iteration,
remaining_iterations=remaining_iterations,
max_iterations=max_iterations,
)
if not is_final_iteration:
head_prompt = await global_prompt_manager.format_prompt(
"memory_retrieval_react_prompt_head",
bot_name=bot_name,
time_now=time_now,
question=question,
collected_info=collected_info if collected_info else "",
current_iteration=current_iteration,
remaining_iterations=remaining_iterations,
max_iterations=max_iterations,
@ -474,7 +438,6 @@ async def _react_agent_solve_question(
_client,
*,
_head_prompt: str = head_prompt,
_prompt: str = prompt,
_conversation_messages: List[Message] = conversation_messages,
) -> List[Message]:
messages: List[Message] = []
@ -482,14 +445,47 @@ async def _react_agent_solve_question(
system_builder = MessageBuilder()
system_builder.set_role(RoleType.System)
system_builder.add_text_content(_head_prompt)
if _prompt.strip():
system_builder.add_text_content(f"\n{_prompt}")
messages.append(system_builder.build())
messages.extend(_conversation_messages)
# for msg in messages:
# print(msg)
# 优化日志展示 - 合并所有消息到一条日志
log_lines = []
for idx, msg in enumerate(messages, 1):
role_name = msg.role.value if hasattr(msg.role, 'value') else str(msg.role)
# 处理内容 - 显示完整内容,不截断
if isinstance(msg.content, str):
full_content = msg.content
content_type = "文本"
elif isinstance(msg.content, list):
text_parts = [item for item in msg.content if isinstance(item, str)]
image_count = len([item for item in msg.content if isinstance(item, tuple)])
full_content = "".join(text_parts) if text_parts else ""
content_type = f"混合({len(text_parts)}段文本, {image_count}张图片)"
else:
full_content = str(msg.content)
content_type = "未知"
# 构建单条消息的日志信息
msg_info = f"\n[消息 {idx}] 角色: {role_name}"
msg_info += f"\n 内容类型: {content_type}"
if full_content:
msg_info += f"\n 内容:\n{full_content}"
if msg.tool_calls:
msg_info += f"\n 工具调用: {len(msg.tool_calls)}"
for tool_call in msg.tool_calls:
msg_info += f"\n - {tool_call}"
if msg.tool_call_id:
msg_info += f"\n 工具调用ID: {msg.tool_call_id}"
log_lines.append(msg_info)
# 合并所有消息为一条日志输出
logger.info(f"消息列表 (共{len(messages)}条):{''.join(log_lines)}")
return messages
@ -499,14 +495,6 @@ async def _react_agent_solve_question(
tool_options=tool_definitions,
request_type="memory.react",
)
else:
logger.info(f"ReAct Agent 第 {iteration + 1} 次Prompt: {prompt}")
success, response, reasoning_content, model_name, tool_calls = await llm_api.generate_with_model_with_tools(
prompt,
model_config=model_config.model_task_config.tool_use,
tool_options=tool_definitions,
request_type="memory.react",
)
logger.info(f"ReAct Agent 第 {iteration + 1} 次迭代 模型: {model_name} ,调用工具数量: {len(tool_calls) if tool_calls else 0} ,调用工具响应: {response}")