reflection_agent.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. """Reflection Agent实现 - 自我反思与迭代优化的智能体"""
  2. from typing import Optional, List, Dict, Any
  3. from core.agent import Agent
  4. from core.llm import HelloAgentsLLM
  5. from core.config import Config
  6. from core.message import Message
  7. # 默认提示词模板
  8. DEFAULT_PROMPTS = {
  9. "initial": """
  10. 请根据以下要求完成任务:
  11. 任务: {task}
  12. 请提供一个完整、准确的回答。
  13. """,
  14. "reflect": """
  15. 请仔细审查以下回答,并找出可能的问题或改进空间:
  16. # 原始任务:
  17. {task}
  18. # 当前回答:
  19. {content}
  20. 请分析这个回答的质量,指出不足之处,并提出具体的改进建议。
  21. 如果回答已经很好,请回答"无需改进"。
  22. """,
  23. "refine": """
  24. 请根据反馈意见改进你的回答:
  25. # 原始任务:
  26. {task}
  27. # 上一轮回答:
  28. {last_attempt}
  29. # 反馈意见:
  30. {feedback}
  31. 请提供一个改进后的回答。
  32. """
  33. }
  34. class Memory:
  35. """
  36. 简单的短期记忆模块,用于存储智能体的行动与反思轨迹。
  37. """
  38. def __init__(self):
  39. self.records: List[Dict[str, Any]] = []
  40. def add_record(self, record_type: str, content: str):
  41. """向记忆中添加一条新记录"""
  42. self.records.append({"type": record_type, "content": content})
  43. print(f"📝 记忆已更新,新增一条 '{record_type}' 记录。")
  44. def get_trajectory(self) -> str:
  45. """将所有记忆记录格式化为一个连贯的字符串文本"""
  46. trajectory = ""
  47. for record in self.records:
  48. if record['type'] == 'execution':
  49. trajectory += f"--- 上一轮尝试 (代码) ---\n{record['content']}\n\n"
  50. elif record['type'] == 'reflection':
  51. trajectory += f"--- 评审员反馈 ---\n{record['content']}\n\n"
  52. return trajectory.strip()
  53. def get_last_execution(self) -> str:
  54. """获取最近一次的执行结果"""
  55. for record in reversed(self.records):
  56. if record['type'] == 'execution':
  57. return record['content']
  58. return ""
  59. class ReflectionAgent(Agent):
  60. """
  61. Reflection Agent - 自我反思与迭代优化的智能体
  62. 这个Agent能够:
  63. 1. 执行初始任务
  64. 2. 对结果进行自我反思
  65. 3. 根据反思结果进行优化
  66. 4. 迭代改进直到满意
  67. 特别适合代码生成、文档写作、分析报告等需要迭代优化的任务。
  68. 支持多种专业领域的提示词模板,用户可以自定义或使用内置模板。
  69. """
  70. def __init__(
  71. self,
  72. name: str,
  73. llm: HelloAgentsLLM,
  74. system_prompt: Optional[str] = None,
  75. config: Optional[Config] = None,
  76. max_iterations: int = 3,
  77. custom_prompts: Optional[Dict[str, str]] = None
  78. ):
  79. """
  80. 初始化ReflectionAgent
  81. Args:
  82. name: Agent名称
  83. llm: LLM实例
  84. system_prompt: 系统提示词
  85. config: 配置对象
  86. max_iterations: 最大迭代次数
  87. custom_prompts: 自定义提示词模板 {"initial": "", "reflect": "", "refine": ""}
  88. """
  89. super().__init__(name, llm, system_prompt, config)
  90. self.max_iterations = max_iterations
  91. self.memory = Memory()
  92. # 设置提示词模板:用户自定义优先,否则使用默认模板
  93. self.prompts = custom_prompts if custom_prompts else DEFAULT_PROMPTS
  94. def run(self, input_text: str, **kwargs) -> str:
  95. """
  96. 运行Reflection Agent
  97. Args:
  98. input_text: 任务描述
  99. **kwargs: 其他参数
  100. Returns:
  101. 最终优化后的结果
  102. """
  103. print(f"\n🤖 {self.name} 开始处理任务: {input_text}")
  104. # 重置记忆
  105. self.memory = Memory()
  106. # 1. 初始执行
  107. print("\n--- 正在进行初始尝试 ---")
  108. initial_prompt = self.prompts["initial"].format(task=input_text)
  109. initial_result = self._get_llm_response(initial_prompt, **kwargs)
  110. self.memory.add_record("execution", initial_result)
  111. # 2. 迭代循环:反思与优化
  112. for i in range(self.max_iterations):
  113. print(f"\n--- 第 {i+1}/{self.max_iterations} 轮迭代 ---")
  114. # a. 反思
  115. print("\n-> 正在进行反思...")
  116. last_result = self.memory.get_last_execution()
  117. reflect_prompt = self.prompts["reflect"].format(
  118. task=input_text,
  119. content=last_result
  120. )
  121. feedback = self._get_llm_response(reflect_prompt, **kwargs)
  122. self.memory.add_record("reflection", feedback)
  123. # b. 检查是否需要停止
  124. if "无需改进" in feedback or "no need for improvement" in feedback.lower():
  125. print("\n✅ 反思认为结果已无需改进,任务完成。")
  126. break
  127. # c. 优化
  128. print("\n-> 正在进行优化...")
  129. refine_prompt = self.prompts["refine"].format(
  130. task=input_text,
  131. last_attempt=last_result,
  132. feedback=feedback
  133. )
  134. refined_result = self._get_llm_response(refine_prompt, **kwargs)
  135. self.memory.add_record("execution", refined_result)
  136. final_result = self.memory.get_last_execution()
  137. print(f"\n--- 任务完成 ---\n最终结果:\n{final_result}")
  138. # 保存到历史记录
  139. self.add_message(Message(input_text, "user"))
  140. self.add_message(Message(final_result, "assistant"))
  141. return final_result
  142. def _get_llm_response(self, prompt: str, **kwargs) -> str:
  143. """调用LLM并获取完整响应"""
  144. messages = [{"role": "user", "content": prompt}]
  145. return self.llm.invoke(messages, **kwargs) or ""