dspy.Refine 是 DSPy 的模块包装器,用于对输出进行迭代自我改进。它把另一个模块最多运行 N 次,每次用 reward 函数打分,返回首个达到 threshold 的输出;若都未达标,则返回得分最高的一次。与随机重试不同,未达标的尝试会生成自然语言反馈并注入下一次尝试的提示,使后续尝试从前次失败中改进。
用途与能力:可包裹任意 DSPy 模块(ChainOfThought、Predict、ReAct 或自定义模块);每次尝试以 temperature=1.0 和不同 rollout ID 运行,产生多样输出;达标即提前返回以节省 LM 调用;全部失败时优雅回退到最佳尝试。
基本用法:需要三样东西——被包装模块、reward 函数、阈值。 import dspy dspy.configure(lm=dspy.LM("openai/gpt-4o-mini")) qa = dspy.ChainOfThought("question -> answer") def concise_answer(args, pred): return 1.0 if len(pred.answer.split()) == 1 else 0.0 refined_qa = dspy.Refine(module=qa, N=3, reward_fn=concise_answer, threshold=1.0) result = refined_qa(question="What is the capital of Belgium?")
构造参数:module(被精炼模块)、N(最大尝试次数)、reward_fn(Callable(args_dict, prediction) -> float)、threshold(接受输出的目标分数)、fail_count(可选,报错前最大失败数,默认 N)。reward_fn 接收 args(输入 kwargs 字典)与 pred(模块输出),必须返回 float,越高越好;可用二值或分级评分,也可用外部校验。
N 的取值:2-3 用于格式校验与小约束;3-5 用于质量与多因子评分;5-10 用于高风险、严格需求。多数场景 N=3 到 5 较合适。
与 BestOfN 的差异:Refine 生成反馈并改进后续尝试,顺序执行,可提前停止;BestOfN 无反馈、尝试独立、可并行,总是跑满 N 次。能靠反馈改进时用 Refine(写作、格式合规、多标准质量);尝试独立时用 BestOfN(创意生成、采样)。
适用场景:输出须满足可测质量标准(格式、长度、准确性)、能写出量化评分函数、希望模型在单次请求内从错误中学习、且可接受额外 LM 调用成本(N 次约 2-5 倍)时使用。
限制与注意:若无法清晰评分,不要用 Refine(改用 dspy.ChainOfThought);需要人工介入反馈时用 dspy.Suggest 自建模块;速度优先时用单次 dspy.Predict;仅想要多次独立尝试时用 dspy.BestOfN。reward 函数要快(每次尝试都运行,避免在其中调用 LM),阈值要设得现实,必要时用 fail_count 限制重试。建议从 N=3 起步,使用 0.0 到 1.0 的分级奖励以便挑选最佳接近项。
相关主题:链式思考作为内部模块、用断言校验输出、用优化提升准确率。