本文概述了关于 OpenAI o1 系列模型的能力,它于 24 年 9 月 13 日凌晨由 OpenAI 发布,具体的可移步官方地址:https://openai.com/o1/
OpenAI o1
“OpenAI o1”系列是一种新的大规模语言模型,通过强化学习训练以执行复杂的推理任务。此模型具有在回应之前进行思考的特性,在回应用户前会产生较长的内部思考过程。这使得它在科学推理方面表现出色,在编程竞赛平台 Codeforces 上达到了第 89 百分位,在美国数学奥林匹克(AIME)预赛中取得了进入全美前 500 名学生的成绩。此外,在物理、生物、化学问题上的基准测试(GPQA)中,其表现超过了人类博士级别的准确度。
API 提供了以下两个模型:
- o1-preview:o1 模型的早期预览版本,设计用于利用广泛的通用知识来推理复杂的问题。
- o1-mini:速度更快且成本更低的 o1 模型版本,擅长不需要广泛通用知识的编码、数学和科学任务。
虽然“o1”在推理能力上提供了显著的进步,但它并不是旨在取代所有用例中的“GPT-4o”。
对于需要图像输入、函数调用以及一致快速响应时间的应用程序,继续使用“GPT-4o”和“GPT-4o-mini”仍然是最佳选择。而对于需要深入推理并且能够接受更长响应时间的应用开发,“o1”是一个更好的选择。
注意:o1 目前仍处于功能受限的测试阶段,仅限于[Tier 5]的开发者使用,并且速率限制较低,设置为每分钟 20 次请求(RPM)。未来几周内计划增加更多功能,提高速率限制,并向更多开发者开放访问权限。
快速入门
“o1-preview”和“o1-mini”都可以通过“chat completions”接口来调用。
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": "编写一个bash脚本,该脚本接收格式为'[1,2],[3,4],[5,6]'的字符串表示的矩阵,并以相同的格式打印转置。"
}
]
)
print(response.choices[0].message.content)
你可以访问 Apifox 上的 API Hub 并轻松访问 OpenAI API 项目(地址为 https://openai.apifox.cn/),将 OpenAI API 项目「克隆」到自己的项目中,查看和调试 OpenAI o1 API,并使用 Apifox 方便地进行管理。
访问 Apifox 上的 OpenAI API 项目,从左侧菜单中选择 Chat Completions API(创建聊天补全) ,在“Body”选项卡中,以 JSON 格式写入要发送到 ChatGPT 的消息。需要注意的是,使用 OpenAI o1 API,需要通过 "model":"o1-preview"
将模型指定为“o1-preview”或者“o1-mini”,你想用其他模型比如“gpt-4o”,也是同样的指定方法。
你需要有 OpenAI 的 API_KEY 才可以调用接口,没有的话可以准备一个,然后切换到“Headers”选项卡,添加授权参数以使用 ChatGPT API 进行身份验证,输入你获得的 ChatGPT API 密钥,然后单击“发送”按钮。
在 Apifox 中,你也可以将 OpenAI API 密钥存储为环境变量。将 OpenAI API 密钥存储为环境变量,以后就可以直接引用环境,无需重复重新输入,非常方便。
测试版限制
在测试版中,许多“chat completions”的参数尚不可用,具体包括:
- Modalities(模态):仅支持文本,不支持图像。
- Message types(消息类型):仅支持用户和助手的消息,不支持系统消息。
- Streaming(流式传输):不支持。
- Tools(工具):不支持工具、函数调用和响应格式参数。
- 其他:temperature、top_p 和 n 固定为 1,presence_penalty 和 frequency_penalty 固定为 0。
- Assistants and Batch(助手和批量处理):不支持助手 API 或批量 API。
随着测试版的结束,部分这些参数预计将得到支持。多模态和工具使用等功能预计将在未来的 o1 系列模型中包含。
推理机制
“o1”引入了“推理令牌”(reasoning tokens)。通过这些“推理令牌”,模型执行“思考”过程,对提示的理解进行分解,并考虑多种方法生成响应。“推理令牌”生成后,模型最终输出可见的“补全令牌”(completion tokens),而“推理令牌”则从上下文中丢弃。
以下是用户与助手之间多步骤对话的一个例子。每个步骤中,“输入令牌”(input tokens)和“输出令牌”(output tokens)会被传递,但是“推理令牌”会被丢弃。
注意:“推理令牌”虽然不会通过 API 显示,但仍占用模型上下文窗口的空间,并作为“输出令牌”计费。
上下文窗口管理
“o1-preview”和“o1-mini”提供了 128,000 令牌的上下文窗口。每个补全的最大令牌数量有限制,这一限制包括不可见的“推理令牌”和可见的“补全令牌”。最大输出令牌数量如下:
- o1-preview:32,768 令牌
- o1-mini:65,536 令牌
在创建补全时,确保上下文窗口中有足够的空间用于“推理令牌”非常重要。根据问题的复杂程度,模型可能会生成几百到数千个“推理令牌”。使用的确切“推理令牌”数量可以在 completion_tokens_details 下的 reasoning_tokens 中查看。
usage: {
total_tokens: 1000,
prompt_tokens: 400,
completion_tokens: 600,
completion_tokens_details: {
reasoning_tokens: 500
}
}
成本管理
在之前的模型中,max_tokens 控制生成的令牌数量和用户可以看到的令牌数量,并且这两者始终相等。然而,在“o1”中,生成的总令牌数量可能会超过用户看到的数量。
为了限制“o1”生成的总令牌数量(“推理令牌”加上“输出令牌”),可以使用 max_completion_tokens。OpenAI 建议在开始使用这些模型时,至少预留 25,000 令牌用于推理和输出。
提示建议
“o1”在简单的提示下能发挥最高性能。“few-shot”或“逐步思考”等指令有时不仅不能提升性能,反而可能适得其反。
最佳实践包括:
- 提示应简单直接:模型通过简洁明确的指令就能理解并作出回应。
- 避免促进思考链的提示:由于模型内部进行推理,“逐步思考”或“解释推理”的指令是不必要的。
- 使用分隔符进行明确区分:使用三引号、XML 标签、节标题等分隔符明确区分输入的不同部分,使模型更容易正确解释各个部分。
- 限制检索增强(RAG)中的附加上下文:当提供额外的上下文或文档时,只包含最相关的部分,以防止模型做出过度复杂的响应。
提示示例
编程(重构)
“o1”能够实现复杂的算法和生成代码。在这个提示中,按照特定标准对 React 组件进行重构。
from openai import OpenAI
client = OpenAI()
prompt = """
说明:
- 给定下面的React组件,修改它,使非小说书籍显示为红色文本。
- 在回复中仅返回代码。
- 不包括任何额外的格式,如markdown代码块。
- 对于格式化,请使用四个空格的缩进,并且不要让任何一行代码超过80列。
const books = [
{ title: 'Dune', category: 'fiction', id: 1 },
{ title: 'Frankenstein', category: 'fiction', id: 2 },
{ title: 'Moneyball', category: 'nonfiction', id: 3 },
];
export default function BookList() {
const listItems = books.map(book =>
<li>
{book.title}
</li>
);
return (
<ul>{listItems}</ul>
);
}
"""
response = client.chat.completions.create(
model="o1-mini",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
},
],
}
]
)
print(response.choices[0].message.content)
编程(规划)
“o1”也擅长制定多步计划。在这个提示中,请求创建一个文件系统结构,并基于使用案例实现 Python 代码。
from openai import OpenAI
client = OpenAI()
prompt = """
我想构建一个Python应用程序,它可以接收用户的提问并在数据库中查找答案。如果有接近匹配的答案,则检索匹配的答案。如果没有,则询问用户提供答案并将问题/答案对存储在数据库中。请规划所需目录结构,然后完整地返回每个文件。仅在开头和结尾提供你的推理,而不是在整个代码中。
"""
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
},
],
}
]
)
print(response.choices[0].message.content)
STEM 研究
“o1”在 STEM 研究领域表现优异。寻求基础研究任务支持的提示应该产生强大的结果。
from openai import OpenAI
client = OpenAI()
prompt = """
我们应该考虑调查哪三种化合物以推进新型抗生素的研究?为什么我们应该考虑它们?
"""
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": prompt
}
]
)
print(response.choices[0].message.content)
总结
OpenAI o1 是一系列通过强化学习训练的大规模语言模型,专为复杂推理任务设计。它包括 o1-preview 和 o1-mini 两个版本,前者适用于需要广泛知识推理的任务,后者则更加经济高效,适合特定领域的任务。尽管处于测试阶段且存在一些限制,但 o1 在科学推理和解决复杂问题上展现出了卓越的能力。如果你需要省事的调用这个模型的接口,可到 https://openai.apifox.cn/ 实现快速调试。