
OpenAI o1 APIの使い方
以下の記事が面白かったので、簡単にまとめました。
1. OpenAI o1
「OpenAI o1」シリーズは、複雑な推論を行うために強化学習を用いて学習された新しい大規模言語モデルです。回答する前に考える特性があり、ユーザーに応答する前に長い内部思考の過程を生み出すことができます。これにより、科学的な推論に優れ、競技プログラミングの問題 (Codeforces) では89パーセンタイルにランクインし、米国数学オリンピック (AIME) の予選で全米の上位500人の学生に入る成績を収めています。また、物理学、生物学、化学の問題に関するベンチマーク (GPQA) では、人間の博士レベルの精度を上回る成績を達成しています。
APIでは、次の2つのモデルが提供されています。
・o1
世界に関する幅広い一般知識を使用して難しい問題を推論できるように設計されている。
・o1-mini
より高速で安価なo1モデル。広範な一般知識を必要としないコーディング、数学、科学のタスクに長けている。
2. クイックスタート
「o1」「o1-mini」の両方は、「chat completions」エンドポイントで利用できます。
from openai import OpenAI
client = OpenAI()
prompt = """
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.
"""
response = client.chat.completions.create(
model="o1",
messages=[
{
"role": "user",
"content": prompt
}
]
)
print(response.choices[0].message.content)
【翻訳】
'[1,2],[3,4],[5,6]' という形式の文字列として表される行列を受け取り、同じ形式で転置を出力する bash スクリプトを作成します。
モデルが問題を解決するために必要とされる推論の量に応じて、これらのリクエストは他のモデルよりもかなり時間がかかる可能性があります。
3. Reasoningの仕組み
「o1」は「Reasoningトークン」を導入します。モデルはこれらの「Reasoningトークン」を使用して「考える」ことを行い、プロンプトの理解を分解し、応答を生成するための複数のアプローチを検討します。「Reasoningトークン」を生成した後、モデルは目に見える「Completionトークン」として答えを生成し、その文脈から「Reasoningトークン」を破棄します。
以下は、ユーザーとアシスタントの間で行われるマルチステップの会話の例です。各ステップの「入力トークン」と「出力トークン」は引き継がれ、「Reasoningトークン」は破棄されます。

「o1」と「o1-mini」は、それぞれ 200,000 トークンと 128,000 トークンのコンテキストウィンドウを提供します。「Completion」には、出力トークンの最大数の上限があります。これには、目に見えない「Reasoningトークン」と目に見える「Comptionトークン」の両方が含まれます。最大出力トークンの制限は次のとおりです。
・o1 : 最大100,000トークン
・o1-mini : 最大65,536トークン
「Completion」を作成する時、コンテキストウィンドウの「Reasoningトークン」に十分なスペースがあることを確認することが重要です。問題の複雑さに応じて、モデルは数百から数万の「Reasoningトークン」を生成する可能性があります。使用される「Reasoningトークン」の正確な数は、Completionのレスポンスのusageのcompletion_tokens_detailsの下に表示されます。
{
"usage": {
"prompt_tokens": 9, # 入力トークン
"completion_tokens": 12, # 出力トークン
"total_tokens": 21, # 入力トークンと出力トークンの合計
"completion_tokens_details": {
"reasoning_tokens": 0, # Reasoningトークン
"accepted_prediction_tokens": 0, # モデルの最終出力に含まれたトークン
"rejected_prediction_tokens": 0 # モデルの最終出力に含まれなかったトークン
}
}
}
4. コストの管理
「o1」でコストを管理するには、max_completion_tokensを使用して、モデルが生成するトークンの総数(「Reasoningトークン」と「Completionトークン」の両方を含む)を制限できます。
以前のモデルでは、max_tokensは、生成されたトークンの数とユーザーに表示されるトークンの数の両方を制御していました。ただし、「o1」では、「Reasoningトークン」により、生成されたトークンの合計が目に見えるトークンの数を超える可能性があります。
一部のアプリケーションは、APIから受信したトークンの数に一致するmax_tokensに依存する可能性があるため、「o1」は、「Reasoningトークン」と目に見える「Completionトークン」の両方を含む、モデルによって生成されたトークンの総数を明示的に制御するためにmax_completion_tokensを導入します。この明示的なオプトインにより、新しいモデルを使用するときに既存のアプリケーションが壊れないことが保証されます。max_tokensは、以前のすべてのモデルで以前と同じように機能し続けます。
5. Reasoning のためのスペースの割り当て
生成されたトークンがコンテキストウィンドウの制限または設定した max_completion_tokens に達すると、finish_reason が length に設定されたChatCompletionレスポンスを受け取ります。これは、目に見える「Completionトークン」が生成される前に発生する可能性があります。つまり、目に見えるレスポンスを受け取らずに、入力トークンと「Reasoning トークン」のコストが発生する可能性があります。
これを防ぐには、コンテキストウィンドウに十分なスペースがあることを確認するか、max_completion_tokens をより高い数値に調整します。「OpenAI」では、これらのモデルで実験を開始するときに、「Reasoning」と出力用に少なくとも 25,000 トークンを予約することを推奨しています。プロンプトに必要な「Reasoningトークン」の数に慣れてきたら、それに応じてこのバッファを調整できます。
6. プロンプトのアドバイス
これらのモデルは、簡単なプロンプトで最もよく機能します。Few-Shot学習やモデルに「think step by step」ように指示するなどのプロンプトエンジニアリング手法では、性能が向上しない場合があります (低下する場合もあります)。
ベストプラクティスをいくつか紹介します。
・Developer Message
新しいシステムメッセージです。o1-2024-12-17 以降、「o1」はモデル仕様で説明されているコマンドチェーンの動作に合わせて、システムメッセージではなく「Developer Message」をサポートします。
・プロンプトをシンプルかつ直接的にする
モデルは、詳細なガイダンスを必要とせずに、簡潔で明確な指示を理解して応答することに優れています。
・思考の連鎖プロンプトを避ける
これらのモデルは内部でReasoningを実行するため、「think step by step」のように促す必要はありません。
・明確にするために区切り文字を使用する
三重引用符、XML タグ、セクションタイトルなどの区切り文字を使用して、入力の異なる部分を明確に示し、モデルがさまざまなセクションを適切に解釈できるようにします。
・RAGで追加のコンテキストを制限
追加のコンテキストまたはドキュメントを提供する場合は、モデルが応答を過度に複雑にしないように、最も関連性の高い情報のみを含めます。
・Markdownフォーマット
o1-2024-12-17 以降、APIの「o1」はMarkdownフォーマットを使用した応答の生成を回避します。応答でMarkdownフォーマットが必要な場合にモデルに通知するには、プロンプトまたは「Developer Message」に文字列「Formatting reenabled」を含めます。
7. プロンプト例
7-1. コーディング (リファクタリング)
「o1」のモデルは、複雑なアルゴリズムを実装し、コードを生成できます。このプロンプトは、「o1」に特定の基準に基づいて Reactコンポーネントをリファクタリングするように要求します。
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)
【翻訳】
手順:
- 以下の Reactコンポーネントを使用して、ノンフィクションブックのテキストが赤になるように変更します。
- 返信ではコードのみを返します
- Markdownコードブロックなどの追加の書式設定は含めないでください
- 書式設定には4つのスペース タブを使用し、コード行が80列を超えないようにしてください
7-2. コーディング (プランニング)
「o1」は、マルチステッププランの作成にも適しています。このサンプルプロンプトは、「o1」に、完全なソリューションのファイルシステム構造と、目的のユース ケースを実装するPythonコードを作成するように要求します。
from openai import OpenAI
client = OpenAI()
prompt = """
I want to build a Python app that takes user questions and looks
them up in a database where they are mapped to answers. If there
is close match, it retrieves the matched answer. If there isn't,
it asks the user to provide an answer and stores the
question/answer pair in the database. Make a plan for the directory
structure you'll need, then return each file in full. Only supply
your reasoning at the beginning and end, not throughout the code.
"""
response = client.chat.completions.create(
model="o1-preview",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": prompt
},
],
}
]
)
print(response.choices[0].message.content)
【翻訳】
ユーザーの質問を受け取り、回答にマッピングされているデータベースを検索する Python アプリを構築したいと考えています。近い回答がある場合は、一致した回答を取得します。一致しない場合は、ユーザーに回答を求め、質問と回答のペアをデータベースに保存します。必要なディレクトリ構造を計画してから、各ファイルを完全に返します。コード全体ではなく、最初と最後にのみ理由を記述します。
7-3. STEM 研究
「o1」は、STEM研究で優れた性能を示しています。基礎研究タスクのサポートを求めるプロンプトは、強力な結果を示すはずです。
from openai import OpenAI
client = OpenAI()
prompt = """
What are three compounds we should consider investigating to
advance research into new antibiotics? Why should we consider
them?
"""
response = client.chat.completions.create(
model="o1",
messages=[
{
"role": "user",
"content": prompt
}
]
)
print(response.choices[0].message.content)
【翻訳】
新しい抗生物質の研究を進めるために調査を検討すべき 3 つの化合物は何ですか? なぜそれらを検討する必要があるのですか?
8. 制限
現在の「o1」には、注意すべき制限がいくつかあります。
・「Tier 5」のユーザーのみが利用できます
・「REST API」ではストリーミングをサポートしていません。
・「Parallel Tool Calling」はまだサポートしていません。
・「Batch API」では利用できません
・現在サポートされていないAPIパラメータ
・temperature
・top_p
・presence_penalty
・freq_penalty
・logprobs
・top_logprobs
・logit_bias
9. ユースケース
「o1」の実際のユースケースのいくつかは、Cookbookで見つけることができます。