🏃

推論モデルをAPIから呼び出してみよう!o3-mini/claude-3.7/gemini-thinking/deepseek-r1

2025/02/12に公開

2025/2/26追記 claude-3.7-sonnetの登場とDeepSeek APIが使えるようになったので更新しました

皆さん、推論モデルは活用していますか?gpt-4oやclaude-3.5-sonnetなどの既存のモデルと比較して、より論理的で精度の高い推論ができるようになっており、AIの進化を実感しますね。まさに、新しい時代の幕開けを感じさせます。

推論モデルは各社から提供されており、さまざまなプラットフォームで利用できます。さらにAPIを活用すれば、独自のアプリケーションやシステムに組み込むことも可能です。これにより、推論モデルを活用したサービスやツールの開発がますます容易になっています。

本記事ではo3-mini/claude-3.7-sonnet/gemini-thinking/deepseek-r1のAPIの呼び出し方法をまとめてみました。

推論モデルベストプラティクス

推論モデルのユースケース、プロンプトエンジニアリングは以下リンクが参考になります!
https://docs.anthropic.com/ja/docs/build-with-claude/prompt-engineering/extended-thinking-tips
https://platform.openai.com/docs/guides/reasoning-best-practices

o3-mini

https://platform.openai.com/docs/guides/reasoning?lang=python
執筆時点でo3-miniはtierによるアクセス制限があります。API登録したてだと使えない可能性があります。
APIキーの取得方法は以下リンクが参考になります。
https://qiita.com/kurata04/items/a10bdc44cc0d1e62dad3

ライブラリのインストール

pip install -U openai

クライアントの設定

from openai import OpenAI
import os
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))

呼び出し

プロンプトはよく話題になる「英語の苺のスペルにrは何個ある?」です。推論モデルじゃないと正解するの結構難しいみたいです。それぞれ正解できるか確認してみましょう!

prompt = "英語の苺のスペルにrは何個ある?"

response = client.chat.completions.create(
    model="o3-mini",
    reasoning_effort="high",
    messages=[
        {
            "role": "user", 
            "content": prompt
        }
    ]
)

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

o3-miniの大事な変数としてreasoning_effortがあります。プロンプトに対する応答を作成する前に、モデルがどれだけの推論トークンを生成すべきかを指定するために使用されています。このパラメータには low(低)、medium(中)、high(高)のいずれかを指定できます。low を選択すると、速度とトークンの節約が優先され、high を選択すると、より完全な推論が行われる一方で、生成されるトークンが増え、応答が遅くなります。デフォルト値は medium で、速度と推論の正確性のバランスを取る設定になっています。

回答

自分はtier1なのでo3-miniにアクセスできず、o1-miniでの回答ですw
でも合っていますね!
OpenAIは思考プロセスを見せてくれないみたいです😭
思考プロセスを学習されたくないって聞きました

英語で「苺」は「**strawberry**」と表記します。この単語には **3つの「r」** が含まれています。

スペルを分解すると以下の通りです:

**s** **t** **r** a w b e **r** **r** y

- 最初の「r」
- 中央の「r」
- 最後の「r」

したがって、「strawberry」には「r」が3個あります。

もし「berry(ベリー)」という単語を指している場合は、こちらには「r」が**2**含まれています:

**b** e **r** **r** y

ご参考になれば幸いです。

Claude-3.7-sonnet

2025/2/25にClaude-3.7-sonnetが発表されましたね。3.7ってなんだよって思いましたが性能は発表時点ではめちゃ良いみたいです。
APIキー取得は以下リンクが参考になります。
https://note.com/noa813/n/n307d62b5820b

ライブラリのインストール

pip install -U anthropic

クライアントの設定

import anthropic
import os
client = anthropic.Anthropic(api_key=os.getenv("ANTHROPIC_API_KEY"))

呼び出し

cluade-3.7-sonnetは推論なしにも対応できるみたいで、推論ありにする場合にはthinkingのtypeをenabledにする必要があります。budget_tokensパラメータは、推論時の最大トークンです。openaiのreasoning_efforの数字版って感じでしょうか。
詳細は以下ドキュメントを参考ください。
https://docs.anthropic.com/ja/docs/build-with-claude/extended-thinking

prompt = "英語の苺のスペルにrは何個ある?"
response = client.messages.create(
    model="claude-3-7-sonnet-20250219",
    max_tokens=20000,
    thinking={
        "type": "enabled",
        "budget_tokens": 16000
    },
    messages=[{
        "role": "user",
        "content": prompt
    }]
)

for block in response.content:
    if block.type == "thinking":
        print("思考プロセス:")
        print(block.thinking)
    elif block.type == "text":
        print("回答:")
        print(block.text)

回答

正解ですね!claudeは思考プロセスを見せてくれます。

思考プロセス:
この質問は「英語の苺のスペルにrは何個ある?」と聞いています。これは「英語で"苺"という単語のスペルにアルファベットの"r"は何個含まれるかを教えてほしい」という意味です。

英語で「苺」は "strawberry" です。

"strawberry" のスペルを見ると:
s-t-r-a-w-b-e-r-r-y

この単語の中で "r"3箇所に出てきます:
1. st**r**awberry の3文字目
2. strawbe**r**ry の7文字目
3. strawbe**r**ry の8文字目

したがって、英語の「苺」のスペルである "strawberry" には "r"3個含まれています。

答えは3個です。
回答:
英語で「苺」は "strawberry" と書きます。

この "strawberry" という単語の中には、"r"3個含まれています。

1. st**r**awberry
2. strawbe**r**ry
3. strawbe**r**ry

したがって、英語の苺のスペルには「r」は3個あります。

gemini-thinking-exp

https://ai.google.dev/gemini-api/docs/thinking?hl=ja
https://colab.research.google.com/github/google-gemini/cookbook/blob/main/quickstarts/Get_started_thinking.ipynb?hl=ja

次はgoogleの推論モデルです。googleは太っ腹でapiにexpと名前がついているモデル、試験運用モデルは無料で使わせてくれます。性能もめちゃくちゃい良いので個人的に遊びたい場合には実験モデルを使うのが良いでしょう!
https://ai.google.dev/gemini-api/docs/models/experimental-models?hl=ja
goodleのapiキーはGoogle AI Studioから取得する必要があります。以下の記事が参考になります。
https://zenn.dev/peishim/articles/2e2e8408888f59

ライブラリのインストール

pip install -U google-genai

クライアントの設定

from google import genai
from google.genai import types
import os

client = genai.Client(
    api_key=os.getenv("GOOGLE_API_KEY"),
    http_options={'api_version':'v1alpha'},
)

呼び出し

geminiは私の記憶だと推論モデル登場時は思考プロセス見せてくれてた気がするんですが今は見せてくれないみたいです。

response = client.models.generate_content(
    model='gemini-2.0-flash-thinking-exp',
    contents='英語の苺のスペルにrは何個ある?',
)
print(response.text)

回答

英語の苺は「strawberry」とスペルします。

「strawberry」の中に「r」は **2** あります。

不正解でした😭
geminiの推論モデルは画像入力にも対応しています。PILで画像を開いてオブジェクト化すればOKです。

from PIL import Image
im = Image.open("XXX.png").resize((256,256))
response = client.models.generate_content(
    model="gemini-2.0-flash-thinking-exp",
    contents=[
        im,  
        "この画像について教えて"  
    ]
)

deepseek-r1

最後はdeepseekです。
deepseekのAPIは以下からアカウント開設して取得できます。しかし継続的にサーバー攻撃受けているみたいで執筆時点では新規の課金を停止しています。当分使えないかも??
使えるようになったので更新しました😊
https://platform.deepseek.com/sign_in
以下はDeepSeekのドキュメントです。
https://api-docs.deepseek.com

ライブラリのインストール

pip install -U openai

クライアントの設定

DeepSeekはopenaiライブラリを使用しています。baseurlにdeepseek指定のurlを指定することでDeepSeekのapiを使うことが出来ます。メッセージの指定方法もopenaiと同じです。分かりやすいですね!

from openai import OpenAI
import os
client = OpenAI(api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com")

呼び出し

prompt = "英語の苺のスペルにrは何個ある?"
messages=[
    {
        "role": "user", 
        "content": prompt
    }
]
response = client.chat.completions.create(
    model="deepseek-reasoner",
    messages=messages
)

reasoning_content = response.choices[0].message.reasoning_content
print("思考プロセス:")
print(reasoning_content)

content = response.choices[0].message.content
print("回答:")
print(content)

DeepSeekが思考プロセスを見せてくれるみたいです。嬉しい!

回答

今回の思考プロセスは中国語でよくわからないのですが正解です。

思考プロセス:
嗯,用户问的是英语中“草莓”的拼写里有多少个字母r。首先我要确定“草莓”在英语中的正确拼写。草莓的英语是strawberry对吧?让我再仔细想想,s-t-r-a-w-b-e-r-r-y。这里中间有一个r,然后后面在berry部分有两个r吗?

等一下,可能我记错了。分开来看的话,straw和berry组合起来是strawberry吗?还是分开的?有时候可能会有拼写错误。正确的拼写应该是s-t-r-a-w-b-e-r-r-y,也就是strawberry?或者是不是straw后面加berry的时候去掉一个w?或者可能中间有重复的字母?

让我再确认一下。正确的拼写应该是strawberry,分开的话是straw和berry。Straw的拼写是s-t-r-a-w,而berry是b-e-r-r-y。所以合起来的时候是strawberry,也就是s-t-r-a-w-b-e-r-r-y。这样的话,中间的r出现在straw中的r一次,然后在berry中的两个r,所以总共是三个r?或者可能straw中的r和berry中的两个r加起来是三个?

不过可能我犯了一个错误,因为实际上,正确的拼写是strawberry,其中straw后面跟berry,所以拼写是s-t-r-a-w-b-e-r-r-y。这时候r出现在straw里的一个,然后在berry里的两个,也就是三个r?或者可能straw中的r是第一个,然后berry中的两个r,所以总共有三个r?不过我需要再仔细检查一下。

或者可能straw的拼写是s-t-r-a-w,所以里面有一个r,然后berry是b-e-r-r-y,里面有两个r,所以合起来strawberry有三个r?或者可能strawberry中的r数目是三个?

不过等一下,正确的拼写应该是strawberry,对吗?让我用键盘打出来确认一下:strawberry。是的,正确拼写是strawberry,中间有两个r吗?或者是一个?让我分解一下:

s t r a w b e r r y。是的,在straw后面是b,然后是erry。所以从分解来看,s-t-r-a-w-b-e-r-r-y,中间有三个r?不,straw中的r是第一个,然后后面在berry中有两个r,所以总共三个r?或者straw的r是第3个字母,然后berry中的两个r在第7和第8的位置?所以总共有三个r?

但等一下,正确的拼写是strawberry,其中straw是s-t-r-a-w,然后berry是b-e-r-r-y,所以合起来是strawberry,也就是s-t-r-a-w-b-e-r-r-y。所以r出现在第3个位置(straw里的r),然后在后面是e-r-r-y,所以第7和第8个字母都是r,对吗?那么总共有三个r吗?

但用户的问题是“英语的苺のスペルにrは何個ある?”,也就是英语中草莓的拼写有几个r。正确的拼写是strawberry吗?或者是不是strawberry?或者可能我记错了拼写?

或者是不是strawberry的正确拼写是s-t-r-a-w-b-e-r-r-y?这时候有三个r:一个在straw,两个在berry。所以总共有三个r?或者可能straw中的r和berry中的两个r,加起来三个?

不过现在我需要确认正确的拼写。比如,查一下字典的话,strawberry的正确拼写是S-T-R-A-W-B-E-R-R-Y,对吗?是的,正确的拼写是strawberry,所以r出现在三个地方吗?

或者可能straw中的r是一个,而berry中的r是两个,所以总共有三个r。所以答案应该是三个?

但是让我再仔细数一遍字母。s(1), t(2), r(3), a(4), w(5), b(6), e(7), r(8), r(9), y(10)。所以从位置389有三个r?是的,这样的话有三个r。因此答案是3个?

不过用户的问题可能认为正确的拼写中r的数量是2个?可能我之前搞错了?

或者可能我分解错了。比如,strawberry的正确拼写是s-t-r-a-w-b-e-r-r-y,也就是在berry部分有两个r,而在straw中有一个r,所以总共有三个r?

是的,这样的话,正确的拼写中有三个r。所以答案应该是3个?
回答:
英語で「苺」は「strawberry」ではなく、「strawberry」と綴ります。  
**正しいスペル: strawberry**  
(s-t-r-a-w-b-e-r-r-y)

この単語の中に **r は3** 含まれています。  
- 1個目: straw の中の **r**  
- 2個目: berry の中の最初の **r**  
- 3個目: berry の中の2つ目の **r**  

**答え: 3**

langchain

これまでに各社のAPI呼び出し方法を紹介してきましたが、各社ごとにAPIの呼び出し方が異なり、そのたびにドキュメントを確認するのは大変ですよね。そんな悩みを解決してくれるのが LangChain です。
LangChainは、異なるAIモデルを統一的に扱えるパッケージを提供しており、一貫したインターフェースで簡単に利用できます。最初は少しとっつきにくいかもしれませんが、慣れると非常に便利ですよ!

ライブラリのインストール

pip install -U langchain langchain_core langchain_openai langchain_google_genai langchain_deepseek

モデルのインポート

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_deepseek import ChatDeepSeek
from langchain_anthropic import ChatAnthropic

https://python.langchain.com/docs/integrations/providers/

メッセージの指定

LangChainのプロンプトテンプレートを使えば統一的なフォーマットで扱えます。
以下の例はシンプルなヒューマンメッセージですが、システムプロンプトを追加したり、マルチターンのチャットボット的な構造も指定できます。

prompt = ChatPromptTemplate.from_messages(
    [
        ("human", "{question}"),
    ]
)

https://python.langchain.com/docs/concepts/prompt_templates/

モデルの指定

LangChainでは、モデルの指定を変更するだけでさまざまなAIモデルを利用可能です。

llm = ChatOpenAI(model="o3-mini")
llm = ChatDeepSeek(model="deepseek-reasoner")
llm = ChatGoogleGenerativeAI(model="gemini-2.0-flash-thinking-exp")
llm = ChatAnthropic(model_name="claude-3-7-sonnet-20250219",max_tokens=20000,thinking={"type": "enabled", "budget_tokens": 16000})

回答の生成!

LangChainはchainという概念があり、プロンプトとモデルを組み合わせて簡単に推論を実行することが出来ます。

chain = prompt | llm | StrOutputParser()

response = chain.invoke({"question": "英語の苺のスペルにrは何個ある?"})

print(response)

思考プロセスの表示

DeepSeekとClaudeは思考プロセスの表示が出来ます。執筆時点では統一されていないんですが以下で表示できます。
StrOutputParser()があると最終回答しか出てこないのでchainを組み直します。

chain = prompt | llm

DeepSeek

print("思考プロセス:")
print(response.content)
print("回答:")
print(response.additional_kwargs.get('reasoning_content', 'No reasoning content available'))

Claude

print("思考プロセス:")
for item in response.content:
    if item.get('type') == 'thinking':
        print(item.get('thinking', ''))

print("回答:")
for item in response.content:
    if item.get('type') == 'text':
        print(item.get('text', ''))

LangChainを活用すれば、異なるモデルをシームレスに扱うことができるため、AIを活用したアプリケーション開発がより柔軟に行えます! 🚀

終わりに

いかがでしたでしょうか?各社ごとにAPIの呼び出し方法を紹介し、最後にLangChainの統一的な呼び出し方法を紹介しました。LangChainは統一的なインターフェースを提供してくれるため、とても便利ですが、その一方で、内部の処理がブラックボックスになりやすいという側面もあります。

個人的にはAIがどのような思考プロセスを経て回答を導き出しているのかを見たいと思っているのですが、OpenAIやGeminiはAPIでは推論の過程を公開してくれません。開発者としては、そうした情報をあまり見せたくないのですかね??

一方で、DeepSeekは思考過程を可視化できるようですが、まだAPIが安定して利用できる段階ではないようです。早く試せるようになることを期待したいですね!

Discussion