推理模型
试用版

探索高级推理和问题解决模型。

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 模型可能是一个很好的选择。我们很高兴看到您将用它们创造什么!

快速入门

和 均可通过 chat completions 端点使用。o1-previewo1-mini

使用 o1-preview 模型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from openai import OpenAI
client = OpenAI()

response = client.chat.completions.create(
    model="o1-preview",
    messages=[
        {
            "role": "user", 
            "content": "Write a bash script that takes a matrix represented as a string with format '[1,2],[3,4],[5,6]' and prints the transpose in the same format."
        }
    ]
)

print(response.choices[0].message.content)

根据模型解决问题所需的推理量,这些请求可能需要几秒钟到几分钟不等。

Beta 版限制

在 Beta 版阶段,许多聊天完成 API 参数尚不可用。尤其是:

  • 模式:仅限文本,不支持图像。
  • 消息类型:仅限用户和助手消息,不支持系统消息。
  • 工具:不支持工具、函数调用和响应格式参数。
  • Logprobs:不支持。
  • 其他:和 固定在 ,而 和 固定在 。temperaturetop_p1presence_penaltyfrequency_penalty0
  • Assistants 和 Batch:Assistants API 或 Batch API 不支持这些模型。

随着我们退出 Beta 版,我们将在未来几周内添加对其中一些参数的支持。多模态和工具使用等功能将包含在 o1 系列的未来型号中。

推理的工作原理

o1 模型引入了推理标记。这些模型使用这些推理标记进行 “思考”,分解他们对提示的理解,并考虑多种方法来生成响应。生成推理标记后,模型会生成一个答案作为可见的完成标记,并从其上下文中丢弃推理标记。

以下是用户和助手之间的多步骤对话示例。每个步骤的输入和输出标记将被保留,而推理标记将被丢弃。

Reasoning tokens aren't retained in context

虽然推理令牌无法通过 API 显示,但它们仍然在模型的上下文窗口中占据空间,并作为输出令牌计费。

管理上下文窗口

o1-preview 和 o1-mini 模型提供 128,000 个令牌的上下文窗口。每个完成都有输出标记的最大数量上限,这包括不可见的推理标记和可见的完成标记。最大输出令牌限制为:

  • o1-preview:最多 32,768 个令牌
  • o1-mini:最多 65,536 个代币

在创建完成时,确保上下文窗口中有足够的空间来推理标记,这一点很重要。根据问题的复杂程度,模型可能会生成几百到数万个推理标记。使用的推理令牌的确切数量在聊天完成响应对象的 usage 对象中可见,位于 :completion_tokens_details

聊天完成次数使用情况
1
2
3
4
5
6
7
8
usage: {
  total_tokens: 1000,
  prompt_tokens: 400,
  completion_tokens: 600,
  completion_tokens_details: {
    reasoning_tokens: 500
  }
}

控制成本

要使用 o1 系列模型管理成本,您可以使用 max_completion_tokens 参数限制模型生成的令牌总数(包括推理令牌和完成令牌)。

在以前的模型中,该参数控制生成的令牌数量和用户可见的令牌数量,两者始终相等。但是,对于 o1 系列,由于内部推理令牌,生成的令牌总数可能会超过可见令牌的数量。max_tokens

由于某些应用程序可能依赖于匹配从 API 接收的令牌数,因此 o1 系列引入了显式控制模型生成的令牌总数,包括推理令牌和可见完成令牌。这种显式选择加入可确保在使用新模型时不会中断现有应用程序。对于所有以前的模型,该参数将继续像以前一样起作用。max_tokensmax_completion_tokensmax_tokens

分配推理空间

如果生成的令牌达到上下文窗口限制或您设置的值,您将收到设置为 的聊天完成响应。这可能发生在生成任何可见的完成令牌之前,这意味着您可能会产生输入和推理令牌的费用,而不会收到可见的响应。max_completion_tokensfinish_reasonlength

为防止这种情况,请确保上下文窗口中有足够的空间或将值调整为更高的数字。OpenAI 建议在开始试验这些模型时至少保留 25,000 个令牌用于推理和输出。当您熟悉 Prompts 所需的推理标记数量后,您可以相应地调整此缓冲区。max_completion_tokens

关于提示的建议

这些模型在简单的提示下表现最佳。某些提示工程技术(如小样本提示或指示模型“逐步思考”)可能不会提高性能,有时可能会阻碍性能。以下是一些最佳实践:

  • 保持提示简单直接:这些模型擅长理解和响应简短、清晰的说明,而无需广泛的指导。
  • 避免思路链提示:由于这些模型在内部执行推理,因此没有必要提示它们 “一步一步思考 ”或 “解释你的推理 ”。
  • 为清楚起见,请使用分隔符:使用三引号、XML 标签或部分标题等分隔符来清楚地指示输入的不同部分,从而帮助模型适当地解释不同的部分。
  • 限制检索增强生成 (RAG) 中的其他上下文:在提供其他上下文或文档时,请仅包含最相关的信息,以防止模型使其响应过于复杂。

提示示例

OpenAI o1 系列模型能够实现复杂的算法并生成代码。此提示要求 o1 根据某些特定标准重构 React 组件。

要求 o1 模型重构代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from openai import OpenAI

client = OpenAI()

prompt = """
Instructions:
- Given the React component below, change it so that nonfiction books have red
  text. 
- Return only the code in your reply
- Do not include any additional formatting, such as markdown code blocks
- For formatting, use four space tabs, and do not allow any lines of code to 
  exceed 80 columns

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 用于实际使用案例的一些示例。