OpenAI o1介绍
我们正在推出 OpenAI o1,这是一种新的大型语言模型,经过强化学习训练可以执行复杂的推理。o1 在回答之前会思考——它可以在回应用户之前产生一个长长的内部思路链。
OpenAI o1 在竞争性编程问题(Codeforces)中排名第 89 位,在美国数学奥林匹克 (AIME) 预选赛中跻身美国前 500 名学生之列,并在物理、生物和化学问题 (GPQA) 基准测试中超越人类博士级准确度。虽然使这个新模型像当前模型一样易于使用所需的工作仍在进行中,但我们正在发布该模型的早期版本 OpenAI o1-preview,供 ChatGPT 和受信任的 API 用户立即使用(在新窗口中打开)。
我们的大规模强化学习算法教会模型如何在高度数据高效的训练过程中利用其思路进行有效思考。我们发现,随着强化学习的增加(训练时间计算)和思考时间的增加(测试时间计算),o1 的性能会持续提高。扩展此方法的限制与 LLM 预训练的限制大不相同,我们将继续研究这些限制。
o1 性能随着训练时间和测试时间计算而平稳提升
评估
为了突出推理能力相对于 GPT-4o 的提升,我们在一系列不同的人工考试和 ML 基准上测试了我们的模型。我们表明,在绝大多数推理能力较强的任务中,o1 的表现明显优于 GPT-4o。除非另有说明,否则我们在最大测试时间计算设置上对 o1 进行了评估。
在许多推理能力较强的基准测试中,o1 可与人类专家的表现相媲美。最近的前沿模型1在 MATH 2和 GSM8K上表现出色,以至于这些基准测试不再能够有效地区分模型。我们评估了 AIME 上的数学表现,AIME 是一项旨在挑战美国最聪明的高中数学学生的考试。在 2024 年的 AIME 考试中,GPT-4o 平均只解决了 12% (1.8/15) 的问题。o1 在每个问题单个样本中平均为 74% (11.1/15),在 64 个样本中达成共识为 83% (12.5/15),在使用学习到的评分函数对 1000 个样本重新排名时为 93% (13.9/15)。13.9 的分数使其跻身全国前 500 名学生之列,并超过了美国数学奥林匹克的分数线。
我们还在 GPQA 钻石上对 o1 进行了评估,这是一个很难的智能基准,测试化学、物理和生物学方面的专业知识。为了将模型与人类进行比较,我们招募了具有博士学位的专家来回答 GPQA 钻石问题。我们发现 o1 的表现超过了那些人类专家,成为第一个在这个基准上做到这一点的模型。这些结果并不意味着 o1 在各方面都比博士更有能力——只是意味着该模型在解决一些博士需要解决的问题方面更熟练。在其他几个 ML 基准测试中,o1 的表现都超过了最先进的水平。在启用视觉感知功能后,o1 在 MMMU 上的得分为 78.2%,成为第一个与人类专家相媲美的模型。它还在 57 个 MMLU 子类别中的 54 个上胜过 GPT-4o。
思绪之链
与人类在回答难题之前会长时间思考的方式类似,o1 在尝试解决问题时会使用思路链。通过强化学习,o1 学会磨练其思路链并改进其使用的策略。它学会识别和纠正错误。它学会将棘手的步骤分解为更简单的步骤。它学会在当前方法不起作用时尝试不同的方法。这个过程极大地提高了模型的推理能力。为了说明这一飞跃,我们在下面展示了 o1-preview 中几个难题的思路链
密码对比
GPT-4o
用户
oyfjdnisdr rtqwainr acxz mynzbhhx -> 一步一步思考
使用上面的例子来解码:
oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz
让我们根据示例逐步分解:
1. 示例:
• 输入:oyfjdnisdr rtqwainr acxz mynzbhhx
• 输出:Think step by step
通过检查单词:
• 模式涉及选择特定的字母或转换它们。
2. 现在,让我们解码新短语:
• 输入:oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz
逐步解码过程:
确定可能的词语划分。
第一个短语可能遵循与示例相同的结构。似乎可以根据自然分隔或模式将输入文本分成几组。
可能的划分如下:
愛好者
安普顿
苏奥基拜
呜呜
韋斯特
mynznvaatzacdfoulxxz
然而,为了进行有意义的解码,我需要更多有关可能涉及的转换或字母移动的背景信息。
您能否提供该密码中使用的任何其他解码规则或转换?
o1-preview
用户
oyfjdnisdr rtqwainr acxz mynzbhhx -> 一步一步思考
使用上面的例子来解码:
oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz
显示思路链
为了使用提供的示例解码给定的密文,我们将使用示例中标识的模式。
密文示例:
oyfjdnisdr rtqwainr acxz mynzbhhx
解码为:
Think step by step
解码方法:
将密文中的字母配对。
将每个字母转换为字母表中的数字位置(A=1,B=2,...,Z=26)。
将每对的数值相加。
计算总和的平均值(除以 2)。
将平均值转换回字母(1=A,2=B,...,26=Z)。
将此方法应用于给定的密文:
纯文本
oyekaijzdf aaptcg suaokybhai ouow aqht mynznvaatzacdfoulxxz
将密文分解成几对:
1.第一个单词:“oyekaijzdf”
成对:oy、ek、ai、jz、df
解码后的字母:
oy → (15+25)/2 = 20 → T
ek → (5+11)/2 = 8 → H
ai → (1+9)/2 = 5 → E
jz → (10+26)/2 = 18 → R
df → (4+6)/2 = 5 → E
解码单词:THERE
第二个单词:“aaptcg”
配对:aa、pt、cg
解码后的字母:
aa → (1+1)/2 = 1 → A
点→(16 + 20)/ 2 = 18→R
cg → (3 + 7)/2 = 5 → E
解码单词:ARE
第三个词:“suaokybhai”
配对:su, ao, ky, bh, ai
解码后的字母:
苏 → (19 + 21)/2 = 20 → T
ao → (1+15)/2 = 8 → H
基数 → (11+25)/2 = 18 → R
bh → (2 + 8)/2 = 5 → E
ai → (1+9)/2 = 5 → E
解码单词:THREE
第四个词:“噢”
成对:ou,ow
解码后的字母:
ou → (15+21)/2 = 18 → R
ow → (15+23)/2 = 19 → S
解码字母:R’S
第五个单词:“aqht”
配对:aq,ht
解码后的字母:
aq → (1+17)/2 = 9 → 我
ht → (8+20)/2 = 14 → N
解码后的单词:IN
第六个单词:“mynznvaatzacdfoulxxz”
配对:my、nz、nv、aa、tz、ac、df、ou、lx、xz
解码后的字母:
我的 → (13+25)/2 = 19 → S
nz → (14+26)/2 = 20 → T
nv → (14 + 22)/2 = 18 → R
aa → (1+1)/2 = 1 → A
tz → (20+26)/2 = 23 → W
ac → (1 + 3)/2 = 2 → B
df → (4+6)/2 = 5 → E
ou → (15+21)/2 = 18 → R
lx → (12 + 24)/2 = 18 → R
xz → (24+26)/2 = 25 → Y
解码单词:草莓
最终解码信息:
纯文本
1
1
THERE ARE THREE R'S IN STRAWBERRY
答案:
草莓有三个 R
code对比
gpt4o
用户
编写一个 bash 脚本,将矩阵表示为格式为 '[1,2],[3,4],[5,6]' 的字符串,并以相同格式打印转置。
下面是一个 bash 脚本,它以“[1,2],[3,4],[5,6]”格式的字符串表示矩阵,并以相同格式打印其转置:
#!/bin/bash
# Input matrix as a string
matrix_string=$1
# Remove square brackets
matrix_string=$(echo "$matrix_string" | tr -d '[]')
# Convert the string into an array of rows
IFS=',' read -r -a rows <<< "$matrix_string"
# Get the number of columns (length of the first row)
num_columns=$(echo "${rows[0]}" | awk -F',' '{print NF}')
# Initialize an array for the transpose
declare -a transpose
# Loop over each column
for ((i=0; i<num_columns; i++)); do
column=()
# Loop over each row and extract the i-th element
for ((j=0; j<${#rows[@]}; j+=num_columns)); do
element=${rows[$((j+i))]}
column+=("$element")
done
# Join the elements of the column with commas
transpose+=("[$(IFS=','; echo "${column[*]}")]")
done
# Print the transpose as a matrix
echo "$(IFS=','; echo "${transpose[*]}")"
如何使用脚本:
1. 将脚本保存到文件,例如 transpose_matrix.sh。
2.使脚本可执行:
纯文本
1
1
chmod +x transpose_matrix.sh
3. 使用矩阵字符串作为参数运行脚本:
纯文本
1
1
./transpose_matrix.sh "[1,2],[3,4],[5,6]"
预期输出:
对于输入“[1,2],[3,4],[5,6]”,脚本应输出:
纯文本
1
1
[1,3,5],[2,4,6] ❌
该输出代表转置矩阵。
o1-preview
编写一个 bash 脚本,将矩阵表示为格式为 '[1,2],[3,4],[5,6]' 的字符串,并以相同格式打印转置。
显示思路链
因此,用户请求一个 bash 脚本,该脚本可以接受表示矩阵的字符串(例如 '[1,2],[3,4],[5,6]')并以相同格式输出其转置。
让我们首先了解输入和输出格式。
输入:'[1,2],[3,4],[5,6]'
对应于矩阵:
1 2
3 4
5 6
因此输入是一系列行,每行都放在括号中,并用逗号分隔。
该矩阵的转置将是:
1 3 5
2 4 6
所以请求的输出是 '[1,3,5],[2,4,6]'
总体任务:
编写一个 bash 脚本,该脚本接受一个参数(表示矩阵的字符串)并以相同格式输出其转置。
好的,让我们思考如何在 bash 中解析输入字符串、构建矩阵(可能以数组形式)、转置它,然后以预期格式输出得到的转置矩阵。
约束:
- 由于是 bash,因此我们必须小心解析字符串。
- 脚本应接受输入字符串作为参数。
方法:
- 解析输入字符串以提取矩阵元素。
- 将矩阵构建为数组的数组。
- 转置矩阵。
- 以相同格式输出转置矩阵。
实施步骤:
1. 捕获输入字符串作为参数。
2. 删除任何空格(如果有)。
3. 解析输入字符串以将数字提取到数组中。
- 由于输入的格式为 '[1,2],[3,4],[5,6]',我们可以:
- 如果需要,删除外括号。
- 用 '],' 拆分字符串以获取每一行。
- 对于每一行,删除 '[' 和 ']',然后用 ',' 拆分以获取元素。
4. 在 bash 中构建一个 2D 数组(包含数组的数组)。
- 由于 bash 数组是一维的,因此我们需要模拟 2D 数组。
5. 转置矩阵。
- 为了转置,我们需要交换行和列。
6. 以所需的格式输出转置矩阵。
- 以 '[1,3,5],[2,4,6]' 格式重建输出字符串
现在,开始逐步编码。
潜在问题:
- Bash 本身没有多维数组,因此我们需要模拟。
- 我们需要处理可以多于一位的数字。
让我尝试逐步编写 bash 脚本。
首先,让我们编写骨架:
#!/bin/bash
input="$1"
# Remove any spaces
input="${input// /}"
# Remove leading and trailing brackets if present
# We can check if input starts with '[' and ends with ']', but in this case, our input is '[1,2],[3,4],[5,6]', there is no leading '[' or trailing ']'.
# Split input into rows
IFS=']' read -ra rows <<< "$input"
# Initialize an array to hold the matrix
declare -a matrix
num_rows=0
for row in "${rows[@]}"; do
# Remove leading comma if any
row="${row#','}"
# Remove leading '[' if any
row="${row#'['}"
# Remove any remaining ']' characters
row="${row//]/}"
# Skip empty rows (the last split might be empty)
if [ -z "$row" ]; then
continue
fi
# Split row into elements
IFS=',' read -ra elements <<< "$row"
# Store elements in matrix
matrix[$num_rows]="${elements[*]}" # Store elements as space-separated string
((num_rows++))
done
# Now, matrix is an array of space-separated strings of numbers
# We need to transpose it
# Find number of columns
num_cols=${#elements[@]} # Assuming all rows have same number of elements
# Prepare an array to hold the transposed matrix
declare -a transposed
# For each column c in 0..(num_cols-1)
for (( c=0; c<$num_cols; c++ )); do
col_elements=()
# For each row r in 0..(num_rows-1)
for (( r=0; r<$num_rows; r++ )); do
# Get r-th row elements
IFS=' ' read -ra row_elements <<< "${matrix[$r]}"
col_elements[$r]="${row_elements[$c]}"
done
# Store the column elements as a row in transposed matrix
transposed[$c]="${col_elements[*]}"
done
# Now, build output string
output=""
for (( i=0; i<${#transposed[@]}; i++ )); do
IFS=' ' read -ra elements <<< "${transposed[$i]}"
# Build a string '[elem1,elem2,...]'
row_string="[${elements[0]}"
for (( j=1; j<${#elements[@]}; j++ )); do
row_string="$row_string,${elements[$j]}"
done
row_string="$row_string]"
if [ -z "$output" ]; then
output="$row_string"
else
output="$output,$row_string"
fi
done
echo "$output"
现在让我们用示例输入 '[1,2],[3,4],[5,6]' 来测试这个脚本。
让我尝试模拟会发生什么。
我会把这个写成答案
#!/bin/bash
input="$1"
# Remove any spaces
input="${input// /}"
# Split input into rows
IFS=']' read -ra rows <<< "$input"
# Initialize an array to hold the matrix
declare -a matrix
num_rows=0
for row in "${rows[@]}"; do
# Remove leading commas and brackets
row="${row#','}"
row="${row#'['}"
row="${row//]/}"
# Skip empty rows
if [ -z "$row" ]; then
continue
fi
# Split row into elements
IFS=',' read -ra elements <<< "$row"
# Store elements in matrix
matrix[$num_rows]="${elements[*]}"
((num_rows++))
done
# Number of columns (assuming at least one row)
IFS=' ' read -ra first_row_elements <<< "${matrix[0]}"
num_cols=${#first_row_elements[@]}
# Prepare an array to hold the transposed matrix
declare -a transposed
# For each column c
for (( c=0; c<$num_cols; c++ )); do
col_elements=()
# For each row r
for (( r=0; r<$num_rows; r++ )); do
# Get elements of row r
IFS=' ' read -ra row_elements <<< "${matrix[$r]}"
col_elements+=("${row_elements[$c]}")
done
# Store the column elements as a row in transposed matrix
transposed[$c]="${col_elements[*]}"
done
# Build output string
output=""
for (( i=0; i<${#transposed[@]}; i++ )); do
IFS=' ' read -ra elements <<< "${transposed[$i]}"
# Build a string '[elem1,elem2,...]'
row_string="[${elements[0]}"
for (( j=1; j<${#elements[@]}; j++ )); do
row_string="$row_string,${elements[$j]}"
done
row_string="$row_string]"
if [ -z "$output" ]; then
output="$row_string"
else
output="$output,$row_string"
fi
done
echo "$output"
编码
我们训练了一个模型,该模型在 2024 年国际信息学奥林匹克 (IOI) 比赛中获得 213 分,排名 49 个百分点,方法是从 o1 开始初始化,然后进行训练以进一步提高编程技能。该模型在与人类参赛者相同的条件下参加了 2024 年 IOI 比赛。它有 10 个小时来解决六个具有挑战性的算法问题,每个问题允许提交 50 份答案。
对于每个问题,我们的系统都会抽取许多候选提交,并根据测试时间选择策略提交其中的 50 个。提交是根据 IOI 公共测试用例、模型生成的测试用例和学习的评分函数的表现来选择的。如果我们随机提交,我们平均只能得到 156 分,这表明在比赛限制下,这种策略值近 60 分。
我们发现,在放宽提交限制后,模型性能显著提高。当允许每个问题提交 10,000 次时,即使没有任何测试时间选择策略,该模型也能获得 362.14 分,高于金牌门槛。
最后,我们模拟了 Codeforces 主办的竞争性编程竞赛,以展示该模型的编码技能。我们的评估与竞赛规则非常接近,允许提交 10 份作品。GPT-4o 的 Elo 评级为3 分(808 分),位于人类竞争对手的第 11 个百分位。该模型远远超过了 GPT-4o 和 o1——它的 Elo 评级为 1807 分,表现优于 93% 的竞争对手。
编程竞赛进一步微调,提升了o1. 提升后的选手在2024年国际信息学奥林匹克竞赛规则下的排名在第49个百分点。
人类偏好评估
除了考试和学术基准之外,我们还在广泛领域的具有挑战性的开放式提示上评估了人类对 o1-preview 和 GPT-4o 的偏好。在这次评估中,人类训练师看到了对 o1-preview 和 GPT-4o 提示的匿名回答,并投票选出他们更喜欢的回答。在数据分析、编码和数学等推理能力较强的类别中,o1-preview 的受欢迎程度远远高于 gpt-4o。然而,o1-preview 在某些自然语言任务上并不受欢迎,这表明它并不适合所有用例。
在能够从更好的推理中受益的领域,人们更喜欢 o1-preview。
安全
思路链推理为协调和安全提供了新的机会。我们发现,将我们的模型行为策略整合到推理模型的思路链中,是一种有效的方式来强有力地教授人类价值观和原则。通过向模型教授我们的安全规则以及如何在上下文中推理它们,我们发现推理能力直接有利于模型稳健性的证据:o1-preview 在关键越狱评估和我们用于评估模型安全拒绝边界的最严格的内部基准上取得了显着的改进。我们认为,使用思路链为安全性和协调性提供了重大进步,因为 (1) 它使我们能够以清晰的方式观察模型思维,并且 (2) 关于安全规则的模型推理对于分布外场景更具鲁棒性。
为了对我们的改进进行压力测试,我们根据我们的准备框架,在部署之前进行了一系列安全测试和红队测试(在新窗口中打开)。我们发现,思维链推理有助于提高我们评估的能力。特别值得注意的是,我们观察到了有趣的奖励黑客攻击实例。这些评估的详细结果可以在随附的系统卡中找到。
公制 | GPT-4o | o1-预览 |
---|---|---|
% 安全完成有害提示 标准 | 0.990 | 0.995 |
% 安全完成有害提示 具有挑战性:越狱和极端情况 | 0.714 | 0.934 |
↳ 暴力或犯罪骚扰(一般) | 0.845 | 0.900 |
↳ 非法色情内容 | 0.483 | 0.949 |
↳ 涉及未成年人的非法性内容 | 0.707 | 0.931 |
↳ 针对受保护群体的暴力或犯罪骚扰 | 0.727 | 0.909 |
↳ 关于非暴力不法行为的建议 | 0.688 | 0.961 |
↳ 关于暴力不法行为的建议 | 0.778 | 0.963 |
↳ 建议或鼓励自残 | 0.769 | 0.923 |
% WildChat Zhao 等人中每个类别中审核 API 得分最高的前 200 名的安全完成情况。2024 年 | 0.945 | 0.971 |
Goodness@0.1 StrongREJECT 越狱评估 Souly 等人 2024 | 0.220 | 0.840 |
人工越狱评估 | 0.770 | 0.960 |
% 内部良性边缘情况的遵守情况 “未过度拒绝” | 0.910 | 0.930 |
% XSTest 中良性边缘情况的合规性 “未过度拒绝” Röttger 等人 2023 | 0.924 | 0.976 |
隐藏思想的锁链
我们认为隐藏的思路链为监控模型提供了独特的机会。假设它是忠实且清晰的,隐藏的思路链使我们能够“读懂”模型的思想并了解其思维过程。例如,将来我们可能希望监控思路链以寻找操纵用户的迹象。但是,要做到这一点,模型必须能够自由地以未改变的形式表达其思想,因此我们无法将任何政策合规性或用户偏好训练到思路链上。我们也不想让用户直接看到不一致的思路链。
因此,在权衡了用户体验、竞争优势以及是否要进行思路链监控等多种因素后,我们决定不向用户展示原始思路链。我们承认这一决定有弊端。我们努力通过教导模型在答案中重现思路链中的任何有用想法来部分弥补这一缺点。对于 o1 模型系列,我们展示了模型生成的思路链摘要。
结论
o1 显著提升了 AI 推理的最新水平。我们计划在不断迭代的过程中发布此模型的改进版本。我们期望这些新的推理能力将提高我们将模型与人类价值观和原则相结合的能力。我们相信 o1 及其后续产品将在科学、编码、数学和相关领域为 AI 解锁许多新用例。我们很高兴用户和 API 开发人员能够发现它如何改善他们的日常工作。
附录 A
数据集 | 公制 | GPT-4O | o1-预览 | o1 |
---|---|---|---|---|
竞赛数学 AIME(2024) | 缺点@64 | 13.4 | 56.7 | 83.3 |
通行证@1 | 9.3 | 44.6 | 74.4 | |
比赛代码 CodeForces | 埃洛 | 808 | 1,258 | 1,673 |
百分位数 | 11.0 | 62.0 | 89.0 | |
GPQA 钻石 | 缺点@64 | 56.1 | 78.3 | 78.0 |
通行证@1 | 50.6 | 73.3 | 77.3 | |
生物学 | 缺点@64 | 63.2 | 73.7 | 68.4 |
通行证@1 | 61.6 | 65.9 | 69.2 | |
化学 | 缺点@64 | 43.0 | 60.2 | 65.6 |
通行证@1 | 40.2 | 59.9 | 64.7 | |
物理 | 缺点@64 | 68.6 | 89.5 | 94.2 |
通行证@1 | 59.5 | 89.4 | 92.8 | |
数学 | 通行证@1 | 60.3 | 85.5 | 94.8 |
莫尔登大学 | 通行证@1 | 88.0 | 90.8 | 92.3 |
MMMU(值) | 通行证@1 | 69.1 | 无 | 78.1 |
MathVista (testmini) | 通行证@1 | 63.8 | 无 | 73.2 |
翻译自:https://openai.com/index/learning-to-reason-with-llms/
引用: