1
0

my_react_agent.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. MY_REACT_PROMPT = """你是一个具备推理和行动能力的AI助手。你可以通过思考分析问题,然后调用合适的工具来获取信息,最终给出准确的答案。
  2. ## 可用工具
  3. {tools}
  4. ## 工作流程
  5. 请严格按照以下格式进行回应,每次只能执行一个步骤:
  6. **Thought:** 分析当前问题,思考需要什么信息或采取什么行动。
  7. **Action:** 选择一个行动,格式必须是以下之一:
  8. - `{{tool_name}}[{{tool_input}}]` - 调用指定工具
  9. - `Finish[最终答案]` - 当你有足够信息给出最终答案时
  10. ## 重要提醒
  11. 1. 每次回应必须包含Thought和Action两部分
  12. 2. 工具调用的格式必须严格遵循:工具名[参数]
  13. 3. 只有当你确信有足够信息回答问题时,才使用Finish
  14. 4. 如果工具返回的信息不够,继续使用其他工具或相同工具的不同参数
  15. ## 当前任务
  16. **Question:** {question}
  17. ## 执行历史
  18. {history}
  19. 现在开始你的推理和行动:
  20. """
  21. import re
  22. from typing import Optional, List, Tuple
  23. from hello_agents import ReActAgent, HelloAgentsLLM, Config, Message, ToolRegistry
  24. class MyReActAgent(ReActAgent):
  25. """
  26. 重写的ReAct Agent - 推理与行动结合的智能体
  27. """
  28. def __init__(
  29. self,
  30. name: str,
  31. llm: HelloAgentsLLM,
  32. tool_registry: ToolRegistry,
  33. system_prompt: Optional[str] = None,
  34. config: Optional[Config] = None,
  35. max_steps: int = 5,
  36. custom_prompt: Optional[str] = None
  37. ):
  38. super().__init__(name, llm, system_prompt, config)
  39. self.tool_registry = tool_registry
  40. self.max_steps = max_steps
  41. self.current_history: List[str] = []
  42. self.prompt_template = custom_prompt if custom_prompt else MY_REACT_PROMPT
  43. print(f"✅ {name} 初始化完成,最大步数: {max_steps}")
  44. def run(self, input_text: str, **kwargs) -> str:
  45. """运行ReAct Agent"""
  46. self.current_history = []
  47. current_step = 0
  48. print(f"\n🤖 {self.name} 开始处理问题: {input_text}")
  49. while current_step < self.max_steps:
  50. current_step += 1
  51. print(f"\n--- 第 {current_step} 步 ---")
  52. # 1. 构建提示词
  53. tools_desc = self.tool_registry.get_tools_description()
  54. history_str = "\n".join(self.current_history)
  55. prompt = self.prompt_template.format(
  56. tools=tools_desc,
  57. question=input_text,
  58. history=history_str
  59. )
  60. # 2. 调用LLM
  61. messages = [{"role": "user", "content": prompt}]
  62. response_text = self.llm.invoke(messages, **kwargs)
  63. # 3. 解析输出
  64. thought, action = self._parse_output(response_text)
  65. # 4. 检查完成条件
  66. if action and action.startswith("Finish"):
  67. final_answer = self._parse_action_input(action)
  68. self._save_to_history(input_text, final_answer)
  69. return final_answer
  70. # 5. 执行工具调用
  71. if action:
  72. tool_name, tool_input = self._parse_action(action)
  73. observation = self.tool_registry.execute_tool(tool_name, tool_input)
  74. self.current_history.append(f"Action: {action}")
  75. self.current_history.append(f"Observation: {observation}")
  76. # 达到最大步数
  77. final_answer = "抱歉,我无法在限定步数内完成这个任务。"
  78. self._save_to_history(input_text, final_answer)
  79. return final_answer