見出し画像

OpenAI o1 の APIの使い方

以下の記事が面白かったので、簡単にまとめました。

Reasoning models


1. OpenAI o1

OpenAI o1」シリーズは、複雑な推論を行うために強化学習を用いて学習された新しい大規模言語モデルです。回答する前に考える特性があり、ユーザーに応答する前に長い内部思考の過程を生み出すことができます。これにより、科学的な推論に優れ、競技プログラミングの問題 (Codeforces) では89パーセンタイルにランクインし、米国数学オリンピック (AIME) の予選で全米の上位500人の学生に入る成績を収めています。また、物理学、生物学、化学の問題に関するベンチマーク (GPQA) では、人間の博士レベルの精度を上回る成績を達成しています。

APIでは、次の2つのモデルが提供されています。

・o1-preview : o1モデルの早期プレビューモデル。世界に関する幅広い一般知識を使用して難しい問題を推論できるように設計されている。
・o1-mini : より高速で安価なo1モデル。広範な一般知識を必要としないコーディング、数学、科学のタスクに長けている。

「o1」は推論能力において大幅な進歩を提供しますが、すべてのユースケースで「GPT-4o」を置き換えることを目的としているわけではありません。

画像入力、Function Calling、一貫した高速な応答時間が必要なアプリケーションにおいては、引き続き「GPT-4o」「GPT-4o-mini」が最適な選択となります。深い推論が求められ、より長い応答時間が許容できるアプリケーションを開発する場合には、「o1」が優れた選択肢となります。

【注意】o1は現在、機能制限されたベータ版で提供されています。利用できるのはTier 5の開発者に限定されており (Tierはここで確認) 、レート制限は低めで、20 RPMに設定されています。今後数週間でさらに多くの機能を追加し、レート制限を引き上げ、より多くの開発者にアクセスを拡大していく予定です。

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)

【翻訳】
'[1,2],[3,4],[5,6]' という形式の文字列として表される行列を受け取り、同じ形式で転置を出力する bash スクリプトを作成します。

モデルが問題を解決するために必要とされる推論の量に応じて、これらのリクエストには数秒から数分かかることがあります。

3. ベータ版の制限事項

ベータ版では、多くの「chat completions」のパラメータがまだ利用できません。特に次の点が挙げられます。

・Modalities : テキストのみ、画像はサポートされていません。
・Message types : ユーザーおよびアシスタントのメッセージのみ、システムメッセージはサポートされていません。
・Streaming : サポートされていません。
・Tools : Tools、Function Calling、Response Formatのパラメータはサポートされていません。
・Logprobs : サポートされていません。
・Other : temperature、top_p、およびnは1に固定されており、presence_penaltyとfrequency_penaltyは0に固定されています。
・Assistants and Batch : Assistant APIやBatch APIではサポートされていません。

ベータ版が終了次第、これらのパラメータの一部はサポートされる予定です。マルチモダリティやツールの使用などの機能は、今後のo1シリーズのモデルに含まれる予定です。

4. 推論の仕組み

「o1」は「推論トークン」(reasoning tokens) を導入しています。これらの「reasoning tokens」を使用して、モデルは「think」プロセスを行い、プロンプトの理解を分解し、複数のアプローチを検討しながら応答を生成します。「推論トークン」を生成した後、モデルは最終的に可視の「補完トークン」(completion tokens) として答えを出力し、「推論トークン」はそのコンテキストから破棄されます。

以下は、ユーザーとアシスタントの間で行われるマルチステップの会話の例です。各ステップで「入力トークン」(input tokens)「出力トークン」(output tokens)が引き継がれますが、「推論トークン」は破棄されます。

OpenAI APIの利用料金

【注意】「推論トークン」はAPIを通じて可視化されませんが、それでもモデルのコンテキストウィンドウ内にスペースを占有し、「出力トークン」として課金されます。

5. コンテキストウィンドウの管理

「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
  }
}

6. コストの管理

以前のモデルでは、max_tokensが生成されるトークン数とユーザーが確認できるトークン数の両方を制御しており、これらは常に等しいものでした。しかし、「o1」では、生成されるトークンの総数がユーザーに表示されるトークン数を超える場合があります。

「o1」で生成されるトークンの総数 (「推論トークン」と「出力トークン」の合計) を制限するために、max_completion_tokensを使用できます。OpenAIは、これらのモデルの使用を開始する際、推論や出力のために最低でも25,000トークンを確保することを推奨しています。

7. プロンプトのアドバイス

「o1」は、シンプルなプロンプトで最も高いパフォーマンスを発揮します。「few-shot」や「段階的に考える」といった指示は、パフォーマンス向上につながらない場合があり、時には逆効果になることもあります。

ベストプラクティスは、次のとおりです。

・プロンプトはシンプルで直接的に
モデルは簡潔で明確な指示を与えることで、余計な説明なしに理解して応答します。
・思考の連鎖を促すプロンプトは避ける
モデルは内部で推論を行うため、「段階的に考える」や「推論を説明する」といった指示は不要です。
・デリミタを使用して明確化
三重引用符、XMLタグ、セクションタイトルなどのデリミタを使用して、入力の異なる部分を明示すると、モデルがそれぞれのセクションを適切に解釈しやすくなります。
・RAGでの追加コンテキストを制限
追加のコンテキストやドキュメントを提供する際は、最も関連性の高い情報のみを含めることで、モデルが過度に複雑な応答をするのを防ぎます。

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)

【翻訳】
- 以下の React コンポーネントを前提として、ノンフィクションの本が赤いテキストになるように変更します。
- 返信ではコードのみを返します
- マークダウン コード ブロックなどの追加の書式設定は含めないでください
- 書式設定には 4 つのスペース タブを使用し、コード行が 80 列を超えないようにしてください

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)

【翻訳】
ユーザーの質問を受け取り、回答にマッピングされているデータベースで検索する Python アプリを構築したいと考えています。近い回答がある場合は、一致した回答を取得します。ない場合は、ユーザーに回答を求め、質問と回答のペアをデータベースに保存します。必要なディレクトリ構造を計画してから、各ファイルを完全に返します。コード全体ではなく、最初と最後にのみ理由を記述します。

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)

【翻訳】
新しい抗生物質の研究を進めるために調査を検討すべき 3 つの化合物は何ですか? なぜそれらを検討する必要があるのですか?

9. ユースケース

「o1」の実際のユースケースのいくつかは、Cookbookで見つけることができます。



この記事が気に入ったらサポートをしてみませんか?