Reflection.py 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. from typing import List, Dict, Any
  2. # 假设 llm_client.py 文件已存在,并从中导入 HelloAgentsLLM 类
  3. from llm_client import HelloAgentsLLM
  4. # --- 模块 1: 记忆模块 ---
  5. class Memory:
  6. """
  7. 一个简单的短期记忆模块,用于存储智能体的行动与反思轨迹。
  8. """
  9. def __init__(self):
  10. # 初始化一个空列表来存储所有记录
  11. self.records: List[Dict[str, Any]] = []
  12. def add_record(self, record_type: str, content: str):
  13. """
  14. 向记忆中添加一条新记录。
  15. 参数:
  16. - record_type (str): 记录的类型 ('execution' 或 'reflection')。
  17. - content (str): 记录的具体内容 (例如,生成的代码或反思的反馈)。
  18. """
  19. self.records.append({"type": record_type, "content": content})
  20. print(f"📝 记忆已更新,新增一条 '{record_type}' 记录。")
  21. def get_trajectory(self) -> str:
  22. """
  23. 将所有记忆记录格式化为一个连贯的字符串文本,用于构建提示词。
  24. """
  25. trajectory = ""
  26. for record in self.records:
  27. if record['type'] == 'execution':
  28. trajectory += f"--- 上一轮尝试 (代码) ---\n{record['content']}\n\n"
  29. elif record['type'] == 'reflection':
  30. trajectory += f"--- 评审员反馈 ---\n{record['content']}\n\n"
  31. return trajectory.strip()
  32. def get_last_execution(self) -> str:
  33. """
  34. 获取最近一次的执行结果 (例如,最新生成的代码)。
  35. """
  36. for record in reversed(self.records):
  37. if record['type'] == 'execution':
  38. return record['content']
  39. return None
  40. # --- 模块 2: Reflection 智能体 ---
  41. # 1. 初始执行提示词
  42. INITIAL_PROMPT_TEMPLATE = """
  43. 你是一位资深的Python程序员。请根据以下要求,编写一个Python函数。
  44. 你的代码必须包含完整的函数签名、文档字符串,并遵循PEP 8编码规范。
  45. 要求: {task}
  46. 请直接输出代码,不要包含任何额外的解释。
  47. """
  48. # 2. 反思提示词
  49. REFLECT_PROMPT_TEMPLATE = """
  50. 你是一位极其严格的代码评审专家和资深算法工程师,对代码的性能有极致的要求。
  51. 你的任务是审查以下Python代码,并专注于找出其在**算法效率**上的主要瓶颈。
  52. # 原始任务:
  53. {task}
  54. # 待审查的代码:
  55. ```python
  56. {code}
  57. ```
  58. 请分析该代码的时间复杂度,并思考是否存在一种**算法上更优**的解决方案来显著提升性能。
  59. 如果存在,请清晰地指出当前算法的不足,并提出具体的、可行的改进算法建议(例如,使用筛法替代试除法)。
  60. 如果代码在算法层面已经达到最优,才能回答“无需改进”。
  61. 请直接输出你的反馈,不要包含任何额外的解释。
  62. """
  63. # 3. 优化提示词
  64. REFINE_PROMPT_TEMPLATE = """
  65. 你是一位资深的Python程序员。你正在根据一位代码评审专家的反馈来优化你的代码。
  66. # 原始任务:
  67. {task}
  68. # 你上一轮尝试的代码:
  69. ```python
  70. {last_code_attempt}
  71. ```
  72. # 评审员的反馈:
  73. {feedback}
  74. 请根据评审员的反馈,生成一个优化后的新版本代码。
  75. 你的代码必须包含完整的函数签名、文档字符串,并遵循PEP 8编码规范。
  76. 请直接输出优化后的代码,不要包含任何额外的解释。
  77. """
  78. class ReflectionAgent:
  79. def __init__(self, llm_client, max_iterations=3):
  80. self.llm_client = llm_client
  81. self.memory = Memory()
  82. self.max_iterations = max_iterations
  83. def run(self, task: str):
  84. print(f"\n--- 开始处理任务 ---\n任务: {task}")
  85. # --- 1. 初始执行 ---
  86. print("\n--- 正在进行初始尝试 ---")
  87. initial_prompt = INITIAL_PROMPT_TEMPLATE.format(task=task)
  88. initial_code = self._get_llm_response(initial_prompt)
  89. self.memory.add_record("execution", initial_code)
  90. # --- 2. 迭代循环:反思与优化 ---
  91. for i in range(self.max_iterations):
  92. print(f"\n--- 第 {i+1}/{self.max_iterations} 轮迭代 ---")
  93. # a. 反思
  94. print("\n-> 正在进行反思...")
  95. last_code = self.memory.get_last_execution()
  96. reflect_prompt = REFLECT_PROMPT_TEMPLATE.format(task=task, code=last_code)
  97. feedback = self._get_llm_response(reflect_prompt)
  98. self.memory.add_record("reflection", feedback)
  99. # b. 检查是否需要停止
  100. if "无需改进" in feedback or "no need for improvement" in feedback.lower():
  101. print("\n✅ 反思认为代码已无需改进,任务完成。")
  102. break
  103. # c. 优化
  104. print("\n-> 正在进行优化...")
  105. refine_prompt = REFINE_PROMPT_TEMPLATE.format(
  106. task=task,
  107. last_code_attempt=last_code,
  108. feedback=feedback
  109. )
  110. refined_code = self._get_llm_response(refine_prompt)
  111. self.memory.add_record("execution", refined_code)
  112. final_code = self.memory.get_last_execution()
  113. print(f"\n--- 任务完成 ---\n最终生成的代码:\n{final_code}")
  114. return final_code
  115. def _get_llm_response(self, prompt: str) -> str:
  116. """一个辅助方法,用于调用LLM并获取完整的流式响应。"""
  117. messages = [{"role": "user", "content": prompt}]
  118. # 确保能处理生成器可能返回None的情况
  119. response_text = self.llm_client.think(messages=messages) or ""
  120. return response_text
  121. if __name__ == '__main__':
  122. # 1. 初始化LLM客户端 (请确保你的 .env 和 llm_client.py 文件配置正确)
  123. try:
  124. llm_client = HelloAgentsLLM()
  125. except Exception as e:
  126. print(f"初始化LLM客户端时出错: {e}")
  127. exit()
  128. # 2. 初始化 Reflection 智能体,设置最多迭代2轮
  129. agent = ReflectionAgent(llm_client, max_iterations=2)
  130. # 3. 定义任务并运行智能体
  131. task = "编写一个Python函数,找出1到n之间所有的素数 (prime numbers)。"
  132. agent.run(task)