益阳市网站建设_网站建设公司_表单提交_seo优化
2026/1/18 9:15:18 网站建设 项目流程

之前探索了GRPO优化方法

https://blog.csdn.net/liliang199/article/details/157061810

这里尝试进一步探索GRPO训练LLM的训练数据示例。

所用示例参考和修改自网络内容。

1 训练数据示例

1.1 输入prompt格式

采用思维链格式,示例如下

SYSTEM_PROMPT = "“”Respond in the following format:\n

<think>

\n...

\n</think>

\n<answer>

\n...

\n</answer>"

用户问题:如果小明有5个苹果,吃了2个,又买了3个,现在有几个苹果?

1.2 期望思维链输出

结合上述问题,思维链输出格式示例如下

<think>
首先,小明开始有5个苹果。
然后他吃了2个,所以剩下:5 - 2 = 3个苹果。
接着他又买了3个苹果,所以现在有:3 + 3 = 6个苹果。
</think>
<answer>
6
</answer>

1.3 训练数据批次示例

一下示一个组的训练数据示例

# 训练数据批次(简化的JSONL格式)
{
"prompt": "SYSTEM_PROMPT + \n用户问题:如果小明有5个苹果,吃了2个,又买了3个,现在有几个苹果?",
"completion": "<think>\n首先,小明开始有5个苹果。\n然后他吃了2个,所以剩下:5 - 2 = 3个苹果。\n接着他又买了3个苹果,所以现在有:3 + 3 = 6个苹果。\n</think>\n<answer>\n6\n</answer>",
"reference_answer": "6"
}

{
"prompt": "SYSTEM_PROMPT + \n用户问题:一个长方形的长是8厘米,宽是5厘米,它的面积是多少?",
"completion": "<think>\n长方形的面积公式是:长 × 宽。\n所以面积 = 8 × 5 = 40平方厘米。\n</think>\n<answer>\n40\n</answer>",
"reference_answer": "40"
}

2 奖励函数设计

针对部分应用,比如数学计算,如果答案明确,可以直接设计奖励函数来代替训练奖励模型。

2.1 奖励函数

以下示多个奖励函数的设计示例。

def extract_xml_answer(text: str) -> str: answer = text.split("<answer>")[-1] answer = answer.split("</answer>")[0] return answer.strip() def extract_hash_answer(text: str) -> str | None: if "####" not in text: return None return text.split("####")[1].strip() def count_xml(text) -> float: count = 0.0 if text.count("<think>\n") == 1: count += 0.125 if text.count("\n</think>\n") == 1: count += 0.125 if text.count("\n<answer>\n") == 1: count += 0.125 count -= len(text.split("\n</answer>\n")[-1])*0.001 if text.count("\n</answer>") == 1: count += 0.125 count -= (len(text.split("\n</answer>")[-1]) - 1)*0.001 return count def xmlcount_reward_func(completions, **kwargs) -> list[float]: contents = [completion[0]["content"] for completion in completions] return [count_xml(c) for c in contents] # 1. 正确性奖励(最高权重) def correctness_reward_func(prompts, completions, answer, **kwargs): responses = [completion[0]['content'] for completion in completions] extracted_responses = [extract_xml_answer(r) for r in responses] return [2.0 if r == a else 0.0 for r, a in zip(extracted_responses, answer)] # 2. 格式遵循奖励(严格格式) def strict_format_reward_func(completions, **kwargs): pattern = r"^<think>\n.*?\n</think>\n<answer>\n.*?\n</answer>\n$" responses = [completion[0]["content"] for completion in completions] matches = [re.match(pattern, r) for r in responses] return [0.5 if match else 0.0 for match in matches] # 3. 格式遵循奖励(宽松格式) def soft_format_reward_func(completions, **kwargs): pattern = r"<think>.*?</think>\s*<answer>.*?</answer>" responses = [completion[0]["content"] for completion in completions] matches = [re.match(pattern, r) for r in responses] return [0.5 if match else 0.0 for match in matches] # 4. 数值答案奖励 def int_reward_func(completions, **kwargs): responses = [completion[0]['content'] for completion in completions] extracted_responses = [extract_xml_answer(r) for r in responses] return [0.5 if r.isdigit() else 0.0 for r in extracted_responses]

2.2 奖励函数说明

正确性奖励权重应最高,格式奖励可适当调整避免过拟合,注意奖励函数的梯度信号。

一下示针对上述奖励函数的详细说明。

extract_xml_answer查找<answer>和</answer>括起来的字符串文本,并返回提取的字符串。

extract_hash_answer从文本中以####开头的分隔符提取答案,没有找到####,则返回None。

correctness_reward_func比较生成与真实答案,一致则给予高奖励,否则给予较低奖励。

int_reward_func检查生成的答案是否为数字,如果是,则给予一定奖励。

strict_format_reward_func和soft_format_reward_func检查答案的格式是否符合严格或宽松的正则表达式,符合则给予奖励,以鼓励模型生成正确格式的回答。

xmlcount_reward_func和count_xml依据特定标记数量和位置给予奖励,鼓励生成正确结构。

3 更多数据示例

这里展示了GRPO训练数据的多样性和复杂度。

可以根据具体训练目标调整不同类型数据的比例和难度分布。

示例1:基础算术

{
"prompt": "SYSTEM_PROMPT + \n用户问题:一个商店有120个苹果,第一天卖出了总数的1/3,第二天卖出了剩下的1/4,第三天又卖出了剩余的1/5,问最后剩下多少个苹果?",
"completion": "<think>\n第一步:第一天卖出总数的1/3,120 × 1/3 = 40个,剩余120 - 40 = 80个。\n第二步:第二天卖出剩下的1/4,80 × 1/4 = 20个,剩余80 - 20 = 60个。\n第三步:第三天卖出剩余的1/5,60 × 1/5 = 12个,剩余60 - 12 = 48个。\n验证:计算过程为120 × (1 - 1/3) × (1 - 1/4) × (1 - 1/5) = 120 × 2/3 × 3/4 × 4/5 = 48。\n</think>\n<answer>\n48\n</answer>",
"reference_answer": "48"
}

示例2:代数问题

{
"prompt": "SYSTEM_PROMPT + \n用户问题:解方程:2(x - 3) + 5 = 3(x + 1) - 4",
"completion": "<think>\n第一步:展开括号\n左边:2(x - 3) + 5 = 2x - 6 + 5 = 2x - 1\n右边:3(x + 1) - 4 = 3x + 3 - 4 = 3x - 1\n\n第二步:移项合并同类项\n2x - 1 = 3x - 1\n2x - 3x = -1 + 1\n-x = 0\n\n第三步:解得\nx = 0\n\n验证:将x=0代入原方程\n左边:2(0 - 3) + 5 = 2(-3) + 5 = -6 + 5 = -1\n右边:3(0 + 1) - 4 = 3(1) - 4 = 3 - 4 = -1\n两边相等,验证正确。\n</think>\n<answer>\n0\n</answer>",
"reference_answer": "0"
}

示例3:几何问题

{
"prompt": "SYSTEM_PROMPT + \n用户问题:一个直角三角形的两条直角边分别是6厘米和8厘米,求斜边的长度。",
"completion": "<think>\n已知直角三角形两直角边:a = 6 cm, b = 8 cm\n根据勾股定理:c² = a² + b²\n计算:\na² = 6² = 36\nb² = 8² = 64\nc² = 36 + 64 = 100\nc = √100 = 10\n\n因此,斜边长为10厘米。\n</think>\n<answer>\n10\n</answer>",
"reference_answer": "10"
}

示例4:逻辑排列

{
"prompt": "SYSTEM_PROMPT + \n用户问题:甲、乙、丙三人进行赛跑,已知:1.甲不是第一名;2.乙不是最后一名;3.丙不是第一名也不是最后一名。问三人名次排列是什么?",
"completion": "<think>\n分析条件:\n1. 甲不是第一名 → 甲可能是第二或第三\n2. 乙不是最后一名 → 乙可能是第一或第二\n3. 丙不是第一名也不是最后一名 → 丙只能是第二\n\n推理过程:\n- 从条件3可知:丙是第二名\n- 结合条件2:乙不是最后一名,且丙已经是第二名,所以乙只能是第一名\n- 结合条件1:甲不是第一名,且第一、第二名已确定,所以甲只能是第三名\n\n验证:甲第三,乙第一,丙第二\n符合所有条件:\n1. 甲不是第一名 ✓(甲是第三)\n2. 乙不是最后一名 ✓(乙是第一)\n3. 丙不是第一名也不是最后一名 ✓(丙是第二)\n</think>\n<answer>\n乙第一,丙第二,甲第三\n</answer>",
"reference_answer": "乙第一,丙第二,甲第三"
}

示例5:真假判断

{
"prompt": "SYSTEM_PROMPT + \n用户问题:有人说:'如果明天下雨,我就不去公园。'今天下雨了,但这个人去了公园。请问这个人的话是真是假?",
"completion": "<think>\n分析逻辑关系:\n原命题:如果明天下雨(P),那么我不去公园(Q)\n逻辑形式:P → Q\n\n已知事实:\n1. 今天下雨了(注意:是今天,不是明天)\n2. 这个人去了公园\n\n关键点:原命题的条件是'明天下雨',但事实是'今天下雨'。\n原命题没有对'今天下雨'的情况做出任何承诺。\n因此,当今天下雨而这个人去公园时,并不违反原命题。\n\n结论:原命题没有被证伪,也无法被证实,因为没有满足条件'明天下雨'的情况发生。\n但从逻辑上,这个人的行为与原命题不冲突。\n</think>\n<answer>\n无法判断真假\n</answer>",
"reference_answer": "无法判断真假"
}

示例6:时间计算

{
"prompt": "SYSTEM_PROMPT + \n用户问题:如果现在是北京时间上午10点,那么伦敦时间是多少?(不考虑夏令时)",
"completion": "<think>\n已知:\n1. 北京时间是东八区(UTC+8)\n2. 伦敦时间是格林尼治标准时间(UTC+0)\n3. 时差:北京时间比伦敦时间早8小时\n\n计算:\n北京时间10:00 - 8小时 = 伦敦时间02:00\n\n注意:这是当天的凌晨2点。\n验证:如果伦敦时间是2:00,那么北京时间确实是2:00 + 8小时 = 10:00。\n</think>\n<answer>\n02:00(凌晨2点)\n</answer>",
"reference_answer": "02:00"
}

示例7:物理常识

{
"prompt": "SYSTEM_PROMPT + \n用户问题:一个物体从20米高的地方自由落体,需要多少秒到达地面?(重力加速度取10m/s²)",
"completion": "<think>\n使用自由落体公式:h = (1/2)gt²\n其中:\nh = 高度 = 20米\ng = 重力加速度 = 10 m/s²\n\n代入公式:\n20 = (1/2) × 10 × t²\n20 = 5 × t²\nt² = 20 ÷ 5 = 4\nt = √4 = 2\n\n因此,需要2秒到达地面。\n\n验证:\n计算2秒内下落距离:\n(1/2) × 10 × 2² = 5 × 4 = 20米 ✓\n</think>\n<answer>\n2\n</answer>",
"reference_answer": "2"
}

示例8:综合应用题

{
"prompt": "SYSTEM_PROMPT + \n用户问题:一个水池有进水管和出水管。单独开进水管,4小时可以注满水池;单独开出水管,6小时可以排空水池。如果同时打开进水管和出水管,需要多少小时可以注满水池?",
"completion": "<think>\n第一步:计算单独工作时的效率\n进水管效率:1/4(每小时注满水池的1/4)\n出水管效率:1/6(每小时排空水池的1/6)\n\n第二步:计算同时工作时的净效率\n净效率 = 进水管效率 - 出水管效率\n= 1/4 - 1/6\n= 3/12 - 2/12\n= 1/12\n\n第三步:计算注满时间\n时间 = 1 ÷ 净效率\n= 1 ÷ (1/12)\n= 12小时\n\n验证:\n12小时内,进水管注水量:12 × (1/4) = 3个水池\n出水管排水量:12 × (1/6) = 2个水池\n净注水量:3 - 2 = 1个水池 ✓\n</think>\n<answer>\n12\n</answer>",
"reference_answer": "12"
}

示例9:比例问题

{
"prompt": "SYSTEM_PROMPT + \n用户问题:甲、乙、丙三人合伙投资,甲投资是乙的2倍,乙投资是丙的3倍。如果总利润是8800元,按投资比例分配,丙能得到多少元?",
"completion": "<think>\n设丙的投资为x元\n则乙的投资 = 3x元\n甲的投资 = 2 × 乙的投资 = 2 × 3x = 6x元\n\n总投资 = 甲 + 乙 + 丙 = 6x + 3x + x = 10x元\n\n丙的投资比例 = x / 10x = 1/10\n\n丙应得利润 = 总利润 × 丙的比例 = 8800 × 1/10 = 880元\n\n验证:\n甲的比例:6/10 = 0.6,应得8800×0.6=5280元\n乙的比例:3/10 = 0.3,应得8800×0.3=2640元\n丙的比例:1/10 = 0.1,应得8800×0.1=880元\n总和:5280+2640+880=8800元 ✓\n</think>\n<answer>\n880\n</answer>",
"reference_answer": "880"
}

示例10:选择题推理

{
"prompt": "SYSTEM_PROMPT + \n用户问题:下列哪个选项最可能是正确的?\nA. 所有的猫都会飞\nB. 有些哺乳动物是胎生的\nC. 水在100℃时结冰\nD. 太阳从西边升起",
"completion": "<think>\n分析每个选项:\nA. 所有的猫都会飞:错误,猫不会飞\nB. 有些哺乳动物是胎生的:正确,大多数哺乳动物是胎生的\nC. 水在100℃时结冰:错误,水在0℃时结冰,100℃时沸腾\nD. 太阳从西边升起:错误,太阳从东边升起\n\n因此,最可能正确的选项是B。\n</think>\n<answer>\nB\n</answer>",
"reference_answer": "B"
}

示例11:推理总结

{
"prompt": "SYSTEM_PROMPT + \n用户问题:根据以下信息推理:\n1. 所有A都是B\n2. 有些B是C\n3. 没有C是D\n问:能否确定'有些A是D'是否正确?",
"completion": "<think>\n已知条件:\n1. 所有A都是B → A ⊆ B\n2. 有些B是C → B ∩ C ≠ ∅\n3. 没有C是D → C ∩ D = ∅\n\n推理:\n- 从条件1:所有A都是B\n- 从条件2:有些B是C,但不知道这些C是否包含A\n- 从条件3:所有C都不是D\n\n由于A是B的子集,而有些B是C,但A可能完全不在C中。\n即使A中有元素在C中,由于C与D没有交集,所以A中也不可能有元素在D中。\n\n结论:'有些A是D'一定为假。\n因为如果A中有元素,该元素一定在B中,如果在C中则不在D中,如果不在C中则更不可能在D中(因为D只可能与C之外的B有交集,但条件没有说明)。\n实际上,A可能与C完全没有交集,也可能有交集,但无论如何,A中元素不可能在D中。\n</think>\n<answer>\n错误\n</answer>",
"reference_answer": "错误"
}

示例12:简单算法推理

{
"prompt": "SYSTEM_PROMPT + \n用户问题:一个程序执行以下操作:\n1. 输入一个数字n\n2. 如果n是偶数,除以2\n3. 如果n是奇数,乘以3再加1\n4. 重复直到n=1\n问:输入数字6,需要多少步才能得到1?",
"completion": "<think>\n跟踪计算过程:\n初始值:n=6\n第1步:6是偶数,6÷2=3\n第2步:3是奇数,3×3+1=10\n第3步:10是偶数,10÷2=5\n第4步:5是奇数,5×3+1=16\n第5步:16是偶数,16÷2=8\n第6步:8是偶数,8÷2=4\n第7步:4是偶数,4÷2=2\n第8步:2是偶数,2÷2=1\n\nn=1,停止。\n总共需要8步。\n</think>\n<answer>\n8\n</answer>",
"reference_answer": "8"
}

reference

---

simple_GRPO

https://github.com/lsdefine/simple_GRPO

simple_GRPO是如何复现DeepSeek的GRPO算法的?

https://www.zhihu.com/question/12750157686

qwen-grpo-zero

https://github.com/core-power/qwen-grpo-zero

低资源复现deepseek r1 zero强化学习过程

https://zhuanlan.zhihu.com/p/31472656298

基于策略梯度的高效强化学习算法-GRPO

https://blog.csdn.net/liliang199/article/details/157061810

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询