| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- """Reflection Agent实现 - 自我反思与迭代优化的智能体"""
- from typing import Optional, List, Dict, Any
- from core.agent import Agent
- from core.llm import HelloAgentsLLM
- from core.config import Config
- from core.message import Message
- # 默认提示词模板
- DEFAULT_PROMPTS = {
- "initial": """
- 请根据以下要求完成任务:
- 任务: {task}
- 请提供一个完整、准确的回答。
- """,
- "reflect": """
- 请仔细审查以下回答,并找出可能的问题或改进空间:
- # 原始任务:
- {task}
- # 当前回答:
- {content}
- 请分析这个回答的质量,指出不足之处,并提出具体的改进建议。
- 如果回答已经很好,请回答"无需改进"。
- """,
- "refine": """
- 请根据反馈意见改进你的回答:
- # 原始任务:
- {task}
- # 上一轮回答:
- {last_attempt}
- # 反馈意见:
- {feedback}
- 请提供一个改进后的回答。
- """
- }
- class Memory:
- """
- 简单的短期记忆模块,用于存储智能体的行动与反思轨迹。
- """
- def __init__(self):
- self.records: List[Dict[str, Any]] = []
- def add_record(self, record_type: str, content: str):
- """向记忆中添加一条新记录"""
- self.records.append({"type": record_type, "content": content})
- print(f"📝 记忆已更新,新增一条 '{record_type}' 记录。")
- def get_trajectory(self) -> str:
- """将所有记忆记录格式化为一个连贯的字符串文本"""
- trajectory = ""
- for record in self.records:
- if record['type'] == 'execution':
- trajectory += f"--- 上一轮尝试 (代码) ---\n{record['content']}\n\n"
- elif record['type'] == 'reflection':
- trajectory += f"--- 评审员反馈 ---\n{record['content']}\n\n"
- return trajectory.strip()
- def get_last_execution(self) -> str:
- """获取最近一次的执行结果"""
- for record in reversed(self.records):
- if record['type'] == 'execution':
- return record['content']
- return ""
- class ReflectionAgent(Agent):
- """
- Reflection Agent - 自我反思与迭代优化的智能体
- 这个Agent能够:
- 1. 执行初始任务
- 2. 对结果进行自我反思
- 3. 根据反思结果进行优化
- 4. 迭代改进直到满意
- 特别适合代码生成、文档写作、分析报告等需要迭代优化的任务。
- 支持多种专业领域的提示词模板,用户可以自定义或使用内置模板。
- """
- def __init__(
- self,
- name: str,
- llm: HelloAgentsLLM,
- system_prompt: Optional[str] = None,
- config: Optional[Config] = None,
- max_iterations: int = 3,
- custom_prompts: Optional[Dict[str, str]] = None
- ):
- """
- 初始化ReflectionAgent
- Args:
- name: Agent名称
- llm: LLM实例
- system_prompt: 系统提示词
- config: 配置对象
- max_iterations: 最大迭代次数
- custom_prompts: 自定义提示词模板 {"initial": "", "reflect": "", "refine": ""}
- """
- super().__init__(name, llm, system_prompt, config)
- self.max_iterations = max_iterations
- self.memory = Memory()
- # 设置提示词模板:用户自定义优先,否则使用默认模板
- self.prompts = custom_prompts if custom_prompts else DEFAULT_PROMPTS
-
- def run(self, input_text: str, **kwargs) -> str:
- """
- 运行Reflection Agent
- Args:
- input_text: 任务描述
- **kwargs: 其他参数
- Returns:
- 最终优化后的结果
- """
- print(f"\n🤖 {self.name} 开始处理任务: {input_text}")
- # 重置记忆
- self.memory = Memory()
- # 1. 初始执行
- print("\n--- 正在进行初始尝试 ---")
- initial_prompt = self.prompts["initial"].format(task=input_text)
- initial_result = self._get_llm_response(initial_prompt, **kwargs)
- self.memory.add_record("execution", initial_result)
- # 2. 迭代循环:反思与优化
- for i in range(self.max_iterations):
- print(f"\n--- 第 {i+1}/{self.max_iterations} 轮迭代 ---")
- # a. 反思
- print("\n-> 正在进行反思...")
- last_result = self.memory.get_last_execution()
- reflect_prompt = self.prompts["reflect"].format(
- task=input_text,
- content=last_result
- )
- feedback = self._get_llm_response(reflect_prompt, **kwargs)
- self.memory.add_record("reflection", feedback)
- # b. 检查是否需要停止
- if "无需改进" in feedback or "no need for improvement" in feedback.lower():
- print("\n✅ 反思认为结果已无需改进,任务完成。")
- break
- # c. 优化
- print("\n-> 正在进行优化...")
- refine_prompt = self.prompts["refine"].format(
- task=input_text,
- last_attempt=last_result,
- feedback=feedback
- )
- refined_result = self._get_llm_response(refine_prompt, **kwargs)
- self.memory.add_record("execution", refined_result)
- final_result = self.memory.get_last_execution()
- print(f"\n--- 任务完成 ---\n最终结果:\n{final_result}")
- # 保存到历史记录
- self.add_message(Message(input_text, "user"))
- self.add_message(Message(final_result, "assistant"))
- return final_result
-
- def _get_llm_response(self, prompt: str, **kwargs) -> str:
- """调用LLM并获取完整响应"""
- messages = [{"role": "user", "content": prompt}]
- return self.llm.invoke(messages, **kwargs) or ""
|