OpenAI o1 系列模型是通过强化学习训练的新型大语言模型,旨在执行复杂的推理。o1 模型在回答之前进行思考,并且在回应用户之前能够产生长时间的内部思考链。o1 模型在科学推理方面表现出色,在竞争编程问题(Codeforces)中排名第 89 百分位,在美国数学奥林匹克(AIME)预选赛中位列美国前 500 名学生,并在物理、生物和化学问题的基准测试(GPQA)中超过人类博士生水平的准确性。
API 中提供了两种推理模型:
1. o1-preview
:我们 o1 模型的早期预览,旨在使用广泛的世界常识来推理困难问题。
2. o1-mini
:o1 的一个更快且更便宜的版本,特别擅长编码、数学和科学任务,而不需要广泛的常识。
o1 模型在推理方面提供了显著的 进展,但它们 并不打算替代所有用例中的 GPT-4o。
对于需要图像输入、函数调用或持续快速响应时间的应用,GPT-4o 和 GPT-4o mini 模型仍然是正确的选择。然而,如果您希望开发需要深度推理且能够容纳较长响应时间的应用,o1 模型可能是一个优秀的选择。我们很期待您用它们创造的成果!
🧪 o1 模型目前处于测试阶段
o1 模型目前处于 测试阶段,功能有限。访问仅限于 第 5 级 开发者在 这里 检查您的使用级别,并且速率限制较低。我们正在努力添加更多功能,增加 速率限制,并在接下来的几周内扩大对更多开发者的访问!
快速开始
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)
根据模型解决问题所需的推理量,这些请求可能需要几秒到几分钟的时间。
Beta 限制
在 Beta 阶段,许多 chat completion API 参数尚不可用。最显著的有:
- 模态:仅支持文本,不支持图像。
- 消息类型:仅支持用户消息和助手消息,不支持系统消息。
- 流式传输:不支持。
- 工具:不支持工具、函数调用以及响应格式参数。
- Logprobs:不支持。
- 其他:`
temperature
`、`top_p
` 和 `n
` 固定为 `1
`,而 `presence_penalty
` 和 `frequency_penalty
` 固定为 `0
`。 - Assistants 和 Batch:这些模型不支持 Assistants API 或 Batch API。
随着我们逐步退出 Beta 阶段,将会添加对其中一些参数的支持。o1 系列的未来模型将包含多模态和工具使用等功能。
推理工作原理
o1 模型引入了 推理 tokens。这些模型使用推理 tokens 进行“思考”,分解对提示的理解,并考虑多种生成响应的方式。在生成推理 tokens 后,模型会生成答案作为可见的 completion tokens,且将推理 tokens 从其上下文中丢弃。
下面是用户与助手之间的多步对话示例。每个步骤的输入和输出 tokens 被保留,而推理 tokens 则被丢弃。
虽然推理 tokens 不能通过 API 显示,但它们仍然占据模型的上下文窗口空间,并作为 output tokens 收费。
管理上下文窗口
o1-preview 和 o1-mini 模型提供了 128,000 个 tokens 的上下文窗口。每次生成内容时都有一个最大输出 tokens 的上限——这包括不可见的推理 tokens 和可见的生成 tokens。最大输出 tokens 限制如下:
- o1-preview: 最多 32,768 个 tokens
- o1-mini: 最多 65,536 个 tokens
在生成内容时,确保在上下文窗口中为推理 tokens 留出足够的空间非常重要。根据问题的复杂程度,模型可能会生成从几百到几万不等的推理 tokens。使用的具体推理 tokens 数量可以在 聊天生成响应对象的 usage 对象 中的 completion_tokens_details
查看:
usage: { total_tokens: 1000, prompt_tokens: 400, completion_tokens: 600, completion_tokens_details: { reasoning_tokens: 500 } }
控制成本
要管理 o1 系列模型的成本,您可以使用 max_completion_tokens
参数限制模型生成的总 tokens 数量(包括推理和生成 tokens)。
在之前的模型中,`max_tokens
` 参数控制生成的 tokens 数量和用户可见的 tokens 数量,这两者始终相等。然而,在 o1 系列中,生成的总 tokens 数量可以超过可见的 tokens 数量,因为内部推理 tokens 的存在。
由于一些应用可能依赖 `max_tokens
` 与从 API 接收的 tokens 数量一致,o1 系列引入了 `max_completion_tokens
` 来明确控制模型生成的总 tokens 数量,包括推理和可见的生成 tokens。这种显式的选择确保在使用新模型时不会破坏现有的应用程序。对于之前的所有模型,`max_tokens
` 参数仍保持原有功能。
为推理预留空间
如果生成的 tokens 达到上下文窗口的限制或您设置的 `max_completion_tokens
` 值,您将收到 `finish_reason
` 设置为 `length
` 的聊天生成响应。这可能会在任何可见的生成 tokens 生成之前发生,意味着您可能会为输入和推理 tokens 付费,而没有收到可见的响应。
为了防止这种情况,请确保在上下文窗口中留出足够的空间,或将 `max_completion_tokens
` 值调整为更高的数字。OpenAI 建议在开始使用这些模型时,预留至少 25,000 个 tokens 用于推理和输出。当您熟悉提示所需的推理 tokens 数量后,可以相应调整这个缓冲区。
关于提示词的建议
这些模型在使用简洁明确的提示词时表现最佳。一些提示词工程技巧(如 few-shot 提示或让模型“逐步思考”)可能无法提升表现,有时甚至会起到反效果。以下是一些最佳实践:
- 保持提示简洁明了: 这些模型擅长理解并回应简短、清晰的指令,无需提供过多指导。
- 避免链式思维提示: 由于这些模型在内部进行推理,引导它们“逐步思考”或“解释你的推理”并非必要。
- 使用分隔符提高清晰度: 使用三重引号、XML 标签或章节标题等分隔符来清晰标示输入的不同部分,有助于模型正确理解各个部分。
- 在检索增强生成 (RAG) 中限制额外上下文:** 提供额外上下文或文档时,只包含最相关的信息,避免模型的回复过于复杂化。
提示词示例
编码(重构)
OpenAI o1 系列模型能够实现复杂算法并生成代码。以下提示要求 o1 基于一些特定标准重构一个 React 组件。
from openai import OpenAI client = OpenAI() prompt = """ 指令: - 对下面的 React 组件进行修改,使得非小说类书籍的文字变为红色。 - 回复中只返回代码,不要包含任何额外的格式,如 markdown 代码块。 - 在格式上,使用四个空格缩进,且代码行不超过 80 列。 const books = [ { title: '沙丘', category: 'fiction', id: 1 }, { title: '科学怪人', category: 'fiction', id: 2 }, { title: '魔球', 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)
编码(规划)
OpenAI o1 系列模型也擅长创建多步骤的计划。此示例提示要求 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 研究
OpenAI 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)
用例示例
一些使用 o1 进行现实世界用例的示例可以在 the cookbook 中找到。