OpenAI o1 の APIの使い方
以下の記事が面白かったので、簡単にまとめました。
1. OpenAI o1
「OpenAI o1」シリーズは、複雑な推論を行うために強化学習を用いて学習された新しい大規模言語モデルです。回答する前に考える特性があり、ユーザーに応答する前に長い内部思考の過程を生み出すことができます。これにより、科学的な推論に優れ、競技プログラミングの問題 (Codeforces) では89パーセンタイルにランクインし、米国数学オリンピック (AIME) の予選で全米の上位500人の学生に入る成績を収めています。また、物理学、生物学、化学の問題に関するベンチマーク (GPQA) では、人間の博士レベルの精度を上回る成績を達成しています。
APIでは、次の2つのモデルが提供されています。
「o1」は推論能力において大幅な進歩を提供しますが、すべてのユースケースで「GPT-4o」を置き換えることを目的としているわけではありません。
画像入力、Function Calling、一貫した高速な応答時間が必要なアプリケーションにおいては、引き続き「GPT-4o」「GPT-4o-mini」が最適な選択となります。深い推論が求められ、より長い応答時間が許容できるアプリケーションを開発する場合には、「o1」が優れた選択肢となります。
2. クイックスタート
「o1-preview」「o1-mini」の両方は、「chat completions」エンドポイントで利用できます。
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)
モデルが問題を解決するために必要とされる推論の量に応じて、これらのリクエストには数秒から数分かかることがあります。
3. ベータ版の制限事項
ベータ版では、多くの「chat completions」のパラメータがまだ利用できません。特に次の点が挙げられます。
ベータ版が終了次第、これらのパラメータの一部はサポートされる予定です。マルチモダリティやツールの使用などの機能は、今後のo1シリーズのモデルに含まれる予定です。
4. 推論の仕組み
「o1」は「推論トークン」(reasoning tokens) を導入しています。これらの「reasoning tokens」を使用して、モデルは「think」プロセスを行い、プロンプトの理解を分解し、複数のアプローチを検討しながら応答を生成します。「推論トークン」を生成した後、モデルは最終的に可視の「補完トークン」(completion tokens) として答えを出力し、「推論トークン」はそのコンテキストから破棄されます。
以下は、ユーザーとアシスタントの間で行われるマルチステップの会話の例です。各ステップで「入力トークン」(input tokens)「出力トークン」(output tokens)が引き継がれますが、「推論トークン」は破棄されます。
5. コンテキストウィンドウの管理
「o1-preview」「o1-mini」は、128,000トークンのコンテキストウィンドウを提供しています。各補完には、「出力トークン」の最大数に上限があります。この上限には、不可視の「推論トークン」と可視の「補完トークン」の両方が含まれます。「出力トークン」の最大数の上限は次の通りです。
補完を作成する際には、「推論トークン」用のスペースがコンテキストウィンドウ内に十分確保されていることが重要です。問題の複雑さに応じて、モデルは数百から数万の「推論トークン」を生成することがあります。使用された正確な「推論トークン」数は、completion_tokens_details下のreasoning_tokensで確認できます。
usage: {
total_tokens: 1000,
prompt_tokens: 400,
completion_tokens: 600,
completion_tokens_details: {
reasoning_tokens: 500
}
}
6. コストの管理
以前のモデルでは、max_tokensが生成されるトークン数とユーザーが確認できるトークン数の両方を制御しており、これらは常に等しいものでした。しかし、「o1」では、生成されるトークンの総数がユーザーに表示されるトークン数を超える場合があります。
「o1」で生成されるトークンの総数 (「推論トークン」と「出力トークン」の合計) を制限するために、max_completion_tokensを使用できます。OpenAIは、これらのモデルの使用を開始する際、推論や出力のために最低でも25,000トークンを確保することを推奨しています。
7. プロンプトのアドバイス
「o1」は、シンプルなプロンプトで最も高いパフォーマンスを発揮します。「few-shot」や「段階的に考える」といった指示は、パフォーマンス向上につながらない場合があり、時には逆効果になることもあります。
ベストプラクティスは、次のとおりです。
8. プロンプトの例
8-1. コーディング (リファクタリング)
「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)
8-2. コーディング (プランニング)
「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 ia 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)
8-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-preview",
messages=[
{
"role": "user",
"content": prompt
}
]
)
print(response.choices[0].message.content)
9. ユースケース
「o1」の実際のユースケースのいくつかは、Cookbookで見つけることができます。