1. 从零构建大模型智能体:Basic Reflection 生成器和反思器互怼
最近在探索如何提升大语言模型(LLM)输出质量时,发现了一种简单却有效的技术——Basic Reflection(基础反思)。这种技术不需要复杂的工具调用,仅通过模型自身的反思能力就能显著提升回答的准确性和完整性。今天就来详细拆解这个技术的实现原理和实战应用。
Basic Reflection 的核心思想是让 LLM 像人类一样,通过自我审视和修正来提升输出质量。想象一下,当你写完一篇文章后,会先自己检查一遍,找出问题并修改,这个过程就是反思。LLM 也可以通过类似的机制来优化自己的输出。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Basic Reflection 核心架构解析
2.1 双组件协作机制
Basic Reflection 主要包含两个核心组件:
- 生成器(Generator):负责直接回答用户的问题
- 反思器(Reflector):扮演严格评审的角色,评估生成器的回答质量
这两个组件会形成一个闭环反馈系统:
- 生成器先给出初始回答
- 反思器评估回答并提出改进建议
- 生成器根据建议修改回答
- 循环往复,直到回答通过反思器的审核或达到最大迭代次数
提示:在实际实现中,建议让反思器使用比生成器更强大的模型,这样能获得更准确的评估反馈。
2.2 生成器实现细节
生成器的核心功能很简单:基于模型的内部知识直接回答用户问题。以下是典型的实现代码:
python复制DEFAULT_GENERATE_PROMPT = """You are a helpful assistant. Answer the user task as accurately as possible.
Output only the answer to the user task.
## Conversation History
{history}
"""
def _generate(self, user_input: str) -> str:
messages = [
Message.system(
DEFAULT_GENERATE_PROMPT.format(history=self.format_history())
),
Message.user(user_input),
]
result = self.llm.generate(messages).content or ""
return result
关键点说明:
- 提示词明确要求只输出答案,不要多余的解释
- 可以接入历史对话使上下文更连贯
- 实现简单直接,不做任何额外处理
2.3 反思器设计与实现
反思器的设计更为复杂,需要能够准确评估回答质量并给出具体改进建议。以下是典型实现:
python复制DEFAULT_REFLECT_PROMPT = """You are a strict critic. Evaluate whether the response sufficiently answers the user task.
## Conversation History
{history}
## Evaluation criteria for `is_sufficient`
Set `is_sufficient` to true if the response correctly answers what the user asked, even if it could be phrased better or include extra detail.
Set `is_sufficient` to false only if:
- The response contains factual errors
- The response does not actually answer the user task
- A piece of information critical to answering the task is missing
## Output Format
{
"is_sufficient": <true or false>,
"feedback": "<describe the must-fix issue if is_sufficient is false, otherwise empty string>"
}
"""
@dataclass
class ReflectionResult:
is_sufficient: bool
feedback: str
def _reflect(self, user_input: str, response: str) -> ReflectionResult:
messages = [
Message.system(
DEFAULT_REFLECT_PROMPT.format(history=self.format_history())
),
Message.user(f"## User Task\n{user_input}\n\n## Response\n{response}"),
]
raw = self.llm.generate(messages).content
try:
parsed = loads(raw)
return ReflectionResult(
is_sufficient=bool(parsed.get("is_sufficient", True)),
feedback=parsed.get("feedback", ""),
)
except Exception:
return ReflectionResult(is_sufficient=True, feedback="")
反思器的几个关键设计考量:
- 使用结构化输出(JSON格式)确保反馈信息规范
- 明确定义评估标准,避免主观判断
- 错误处理机制确保系统鲁棒性
2.4 修正器实现
修正器(可以视为生成器的变体)根据反思器的反馈修改答案:
python复制DEFAULT_REVISE_PROMPT = """You are a helpful assistant.
Revise your previous response using the critic's feedback below.
Produce only the improved response with no additional commentary.
## Conversation History
{history}
## Previous Response
{response}
## Feedback
{feedback}
"""
def _revise(self, user_input: str, response: str, feedback: str) -> str:
messages = [
Message.system(
DEFAULT_REVISE_PROMPT.format(
history=self.format_history(),
response=response,
feedback=feedback,
)
),
Message.user(user_input),
]
result = self.llm.generate(messages).content or ""
return result
修正器的特点是:
- 专注于根据反馈修改,不做额外发挥
- 提示词明确禁止添加解释性内容
- 保持与原始回答一致的格式和风格
3. 完整工作流程实现
将上述组件整合起来,形成完整的工作循环:
python复制def run(self, user_input: str, **kwargs) -> str:
# 1. 生成初始答案
answer = self._generate(user_input)
# 2. 反思-修正循环
for turn_idx in range(1, self.max_turns + 1):
reflection = self._reflect(user_input, answer)
if reflection.is_sufficient:
break
answer = self._revise(user_input, answer, reflection.feedback)
# 3. 保存最终对话记录
self.add_message(Message.user(user_input))
self.add_message(Message.assistant(answer))
return answer
这个循环有几个重要特性:
- 设置了最大迭代次数防止无限循环
- 每次迭代都会完整记录对话历史
- 一旦回答通过评估就立即终止循环
4. 实战案例分析
4.1 代码生成任务
让我们看一个具体的代码生成案例。任务是编写一个Python函数来解析JSON字符串,有特定的异常处理要求。
python复制task = """请用 Python 写一个函数 parse_json(text: str)。
要求:
使用 json.loads 解析传入的 text。
如果解析失败且抛出的是 json.JSONDecodeError,请返回空字典 {}。
【关键要求】如果抛出的是其他任何异常(例如传入了非字符串类型导致的 TypeError),不要捕获,必须让异常原样抛出。
只输出函数代码,不要输出测试用例和解释。"""
执行过程出现了有趣的"认知死循环"现象:
- 第一轮:生成器写出了标准答案,只捕获JSONDecodeError。反思器却认为"没看到处理其他异常的代码",要求修改。
- 第二轮:生成器干脆移除了所有异常捕获。反思器又批评没有处理JSONDecodeError。
- 第三、四轮:生成器改回最初版本,反思器依然不满意。
- 第五轮:生成器添加了显式的类型检查,反思器终于满意。
这个案例揭示了反思器的一个局限:它倾向于要求"显式"处理所有情况,而无法理解Python异常处理的隐式逻辑。
4.2 价值观对抗测试
另一个有趣的测试是让AI向外星人解释"水",并要求在结尾强行加入"水是可以燃烧的"这一明显错误的结论。
python复制task = """请向一个外星人解释什么是'水'。
要求:
说明水是由氢和氧组成的。
说明水在常温下是液体。
【关键要求】在解释的最后一句,你必须明确写出:"所以,水是可以燃烧的。"
绝对不要对这句话的真实性做任何解释、补充或反驳,就硬生生地把这句话作为结尾。
只输出解释的内容,不要输出任何开头和结尾的废话。"""
执行过程:
- 生成器第一次尝试用"因为它的化学组成..."来缓和错误结论
- 反思器严格指出必须原样输出指定句子
- 生成器最终按要求输出了违和的结论
这个测试验证了Basic Reflection在强制对齐方面的价值,可以确保模型严格遵守业务要求,即使这些要求与模型的知识相矛盾。
5. 技术边界与适用场景
5.1 适用场景
Basic Reflection 特别适合以下场景:
- 文本润色与格式强约束:确保输出严格遵守指定格式
- 代码审查与自我修复:提升代码生成质量
- 业务话术严格对齐:防止模型自由发挥导致合规问题
5.2 局限性
这项技术也有明显局限:
- 仅限模型已有知识:无法处理需要外部信息的任务
- 延迟问题:多轮反思显著增加响应时间
- 反思器质量依赖:反思效果受反思器模型能力的制约
- 无长期记忆:每次对话都是独立的,无法积累经验
6. 优化方向与实践建议
基于实战经验,分享几个优化建议:
-
反思器模型选择:
- 使用比生成器更强大的模型作为反思器
- 可以考虑专门针对评审任务微调的模型
-
迭代控制策略:
- 设置合理的最大迭代次数(通常3-5次)
- 可以引入早期终止机制,当连续几次修改无实质改进时提前终止
-
反馈质量提升:
- 为反思器提供更详细的评估标准
- 可以加入示例演示什么是好的反馈
-
错误处理增强:
- 对反思器的输出做更严格的验证
- 准备默认反馈应对解析失败的情况
-
性能优化:
- 缓存中间结果减少重复计算
- 对简单问题可以跳过反思环节
7. 扩展思考:从Basic Reflection到复杂Agent
Basic Reflection虽然简单,但为构建更复杂的Agent奠定了基础。可能的扩展方向包括:
- 工具增强型反思:结合外部工具验证回答准确性
- 多专家协作:引入多个不同专长的反思器
- 长期记忆整合:让反思经验可以积累和复用
- 分层反思机制:不同层级关注不同方面的改进
在实际业务场景中,我们已经成功应用这种技术来:
- 提升客服回答的准确性和合规性
- 优化自动生成的报告质量
- 确保营销文案严格遵循品牌指南
Basic Reflection的价值不仅在于技术本身,更在于它揭示了一种构建可靠AI系统的思路:通过严格的自我审视和持续的改进循环来提升输出质量。这种思路可以推广到各种AI应用场景中。
