こんにちは!今回はOpenAIの新しいResponses APIのファイル検索ツールをGoogle Colabで実際に試してみる方法を紹介します。カレーレシピ情報を活用したハンズオン形式で、実用的なデモを作っていきましょう。
1. はじめに: Responses APIとファイル検索ツールとは?
OpenAIが2025年3月に発表した新しい「Responses API」は、Chat Completions APIのシンプルさとAssistants APIのツール利用機能を統合したものです。
ファイル検索ツールはResponses APIの重要な機能の一つで、大量のドキュメントから関連情報を抽出できます。この仕組みは「RAG (Retrieval Augmented Generation)」と呼ばれる手法のOpenAI版実装です。複数のファイル形式に対応し、クエリ最適化、メタデータ絞り込み、カスタムリランキングなど高度な機能も提供されています。
今回は「カレーレシピ情報」をファイルとして用意し、そこから情報を検索・抽出する例を実装します。
2. Google Colabでの環境準備
まずはGoogle Colabで環境を整えましょう。
# OpenAI APIキーの設定
import os
from google.colab import userdata
# APIキーを設定(Colabのシークレット機能を使用)
api_key = userdata.get('OPENAI_API_KEY')
os.environ['OPENAI_API_KEY'] = api_key
# OpenAIライブラリのインストール
!pip install --upgrade openai
# クライアントの初期化
from openai import OpenAI
client = OpenAI(api_key=os.environ.get('OPENAI_API_KEY'))
注意: Google Colabでシークレット変数を設定するには、左側のメニューから「🔑シークレット」を選び、OPENAI_API_KEY
という名前で自分のAPIキーを追加してください。
3. カレーレシピデータを準備する
まずは複数のカレーレシピを含むテキストファイルを作成し、それをOpenAIのシステムにアップロードします。
# カレーレシピのテキストファイルを作成
curry_recipes = """
# 基本のカレー
材料(4人前):
- 豚肉 300g
- たまねぎ 2個
- にんじん 1個
- じゃがいも 2個
- カレールー 1箱
- 水 800ml
- 油 大さじ1
- 塩こしょう 少々
作り方:
1. 野菜と肉を一口大に切る
2. 鍋に油をひき、肉を炒める
3. 肉の色が変わったら野菜を加えて炒める
4. 水を加えて20分煮込む
5. 火を止め、ルーを割り入れて溶かす
6. 弱火で5分煮込んで完成
# ベジタリアンカレー
材料(4人前):
- なす 2個
- ズッキーニ 1本
- パプリカ(赤・黄) 各1個
- たまねぎ 2個
- トマト 2個
- ココナッツミルク 200ml
- カレー粉 大さじ2
- クミン 小さじ1
- ターメリック 小さじ1
- 塩 小さじ1
- オリーブオイル 大さじ2
作り方:
1. 野菜を全て一口大に切る
2. 鍋にオリーブオイルを熱し、たまねぎを透き通るまで炒める
3. スパイス類を加えて香りが出るまで炒める
4. 他の野菜を加えて5分炒める
5. ココナッツミルクと水100mlを加え、15分煮込む
6. 塩で味を調えて完成
# チキンカレー
材料(4人前):
- 鶏もも肉 400g
- たまねぎ 2個
- にんにく 2片
- しょうが 1片
- トマト 2個
- プレーンヨーグルト 100g
- カレー粉 大さじ2
- ガラムマサラ 小さじ1
- クミン 小さじ1
- コリアンダー 小さじ1
- ターメリック 小さじ1/2
- 塩 小さじ1
- サラダ油 大さじ2
作り方:
1. 鶏肉を一口大に切る
2. たまねぎ、にんにく、しょうがをみじん切りにする
3. トマトは角切りにする
4. 鍋に油を熱し、たまねぎ、にんにく、しょうがを炒める
5. スパイス類を加えて香りが出るまで炒める
6. 鶏肉を加えて炒め、色が変わったらトマトを加える
7. 5分ほど炒めたらヨーグルトを加え、水100mlを足す
8. 弱火で20分煮込み、塩で味を調える
9. ガラムマサラを振りかけて完成
# シーフードカレー
材料(4人前):
- えび 200g
- いか 200g
- たまねぎ 1個
- にんじん 1本
- ピーマン 2個
- カレー粉 大さじ2
- ココナッツミルク 200ml
- レモングラス 1本
- にんにく 2片
- 魚醤 小さじ1
- 砂糖 小さじ1
- 塩 小さじ1/2
- オリーブオイル 大さじ2
作り方:
1. えびは殻をむき、いかは一口大に切る
2. 野菜も一口大に切る
3. レモングラスは軽くつぶし、にんにくはみじん切りにする
4. 鍋にオリーブオイルを熱し、レモングラスとにんにくを炒める
5. たまねぎを加えて透き通るまで炒め、カレー粉を加える
6. 他の野菜を加えて3分炒める
7. ココナッツミルクと水100mlを加え、10分煮込む
8. 魚醤、砂糖、塩で味を調える
9. えびといかを加え、3分煮込んで完成
"""
# テキストファイルとして保存
with open('curry_recipes.txt', 'w', encoding='utf-8') as f:
f.write(curry_recipes)
print("カレーレシピファイルを作成しました!")
4. ファイル検索ツールを使ってみる
次に、作成したレシピファイルをOpenAIにアップロードし、ベクトルストアを準備します。
import time
# テキストファイルをアップロード
file = client.files.create(
file=open('curry_recipes.txt', 'rb'),
purpose="assistants",
)
print(f"ファイルをアップロードしました: {file.id}")
# ベクトルストアを作成し、ファイルを登録
vector_store = client.vector_stores.create(
name="curry-recipes",
file_ids=[file.id],
)
print(f"ベクトルストアを作成しました: {vector_store.id}")
# ベクトルストアが利用可能になるまで待つ
while True:
status = client.vector_stores.retrieve(vector_store.id).status
print(f"ベクトルストア状態: {status}")
if status == "completed":
break
time.sleep(2)
print("ベクトルストアの準備が完了しました!")
これで準備完了です。ファイル検索ツールを使って、レシピに関する質問をしてみましょう。
def ask_about_curry(question):
"""レシピに関する質問をする関数"""
print(f"質問: {question}")
print("回答を取得中...")
response = client.responses.create(
model="gpt-4o",
tools=[{"type": "file_search", "vector_store_ids": [vector_store.id]}],
input=question
)
print("\n回答:")
print(response.output_text)
return response.output_text
# いくつか質問してみる
ask_about_curry("ベジタリアン向けのカレーレシピはありますか?材料を教えてください。")
出力例:
質問: ベジタリアン向けのカレーレシピはありますか?材料を教えてください。
回答を取得中...
回答:
ベジタリアン向けのカレーの材料は以下の通りです:
- なす: 2個
- ズッキーニ: 1本
- パプリカ(赤・黄): 各1個
- たまねぎ: 2個
- トマト: 2個
- ココナッツミルク: 200ml
- カレー粉: 大さじ2
- クミン: 小さじ1
- ターメリック: 小さじ1
- 塩: 小さじ1
- オリーブオイル: 大さじ2
これで、美味しいベジタリアンカレーを作ることができます!
ベジタリアン向けのカレーの材料は以下の通りです:\n\n- なす: 2個\n- ズッキーニ: 1本\n- パプリカ(赤・黄): 各1個\n- たまねぎ: 2個\n- トマト: 2個\n- ココナッツミルク: 200ml\n- カレー粉: 大さじ2\n- クミン: 小さじ1\n- ターメリック: 小さじ1\n- 塩: 小さじ1\n- オリーブオイル: 大さじ2\n\nこれで、美味しいベジタリアンカレーを作ることができます!
5. 複数の質問を試してみる
様々な角度からカレーレシピについて質問してみましょう。
# 質問リスト
questions = [
"シーフードカレーの作り方を教えてください。",
"チキンカレーとシーフードカレーの違いは何ですか?",
"全てのレシピに共通して使われるスパイスはありますか?",
"カレーの種類の中で最も簡単に作れるのはどれですか?その理由も教えてください。",
"ココナッツミルクを使うレシピはどれですか?"
]
# 全ての質問を順番に実行
for q in questions:
print("\n" + "="*50)
ask_about_curry(q)
print("="*50)
6. カレーレシピアシスタントを作る
次に、ユーザーが対話形式で質問できる簡単なアシスタントを作ってみましょう。
def curry_recipe_assistant():
"""カレーレシピについて対話形式で質問できるアシスタント"""
print("🍛 カレーレシピアシスタントへようこそ!")
print("カレーレシピについて質問してください。終了するには 'exit' と入力してください。")
while True:
user_input = input("\n質問を入力してください: ")
if user_input.lower() in ['exit', 'quit', '終了']:
print("アシスタントを終了します。お役に立てて嬉しかったです!")
break
response = client.responses.create(
model="gpt-4o",
tools=[{"type": "file_search", "vector_store_ids": [vector_store.id]}],
input=user_input
)
print("\n回答:")
print(response.output_text)
# アシスタントを起動
curry_recipe_assistant()
7. 応用: より複雑な質問と検索
より複雑な質問をして、AIがどのように情報を抽出するか試してみましょう。
# より複雑な質問のリスト
advanced_questions = [
"どのカレーレシピが最も短時間で作れますか?調理時間を教えてください。",
"ココナッツミルクを使っているレシピは何種類ありますか?それぞれの名前を教えてください。",
"材料リストでスパイスの種類が最も多いレシピはどれですか?",
"全ての種類のカレーでよく使われている食材トップ3は何ですか?",
"肉を使わないレシピはありますか?もしあれば、その代わりに何を使っていますか?"
]
# 複雑な質問を試す
for question in advanced_questions:
print("\n" + "="*60)
ask_about_curry(question)
print("="*60)
この実行結果から、ファイル検索ツールがいかに柔軟に情報を抽出できるかがわかります。特に注目すべきなのは:
- カレーの種類ごとの特徴の比較
- 複数のレシピにまたがる共通点の抽出
- レシピの内容を理解した上での質問応答
これは、単純なキーワード検索ではなく、文脈を理解した検索が行われていることを示しています。
# カレーレシピ情報分析の例
def analyze_curry_recipes():
"""カレーレシピの全体的な分析をする関数"""
print("カレーレシピの分析を行います...")
response = client.responses.create(
model="gpt-4o",
tools=[{"type": "file_search", "vector_store_ids": [vector_store.id]}],
input="""
アップロードされたカレーレシピについて包括的な分析をしてください。
以下の点について詳しく説明してください:
1. 各レシピの主な特徴と違い
2. 使用されるスパイスの共通点と相違点
3. 調理時間の違い
4. 栄養面での比較(可能であれば)
5. どのレシピが初心者向けか、上級者向けか
"""
)
print("\n分析結果:")
print(response.output_text)
return response.output_text
# 分析を実行
analyze_curry_recipes()
8. まとめ
OpenAI Responses APIのファイル検索ツールは、ドキュメントに含まれる情報を効率的に検索・活用できる強力な機能です。今回はカレーレシピという親しみやすいテーマで試しましたが、この技術は以下のような実用的なシナリオで活用できます:
- カスタマーサポートFAQボット
- 社内マニュアル検索システム
- 製品仕様書のインタラクティブナビゲーション
- 研究論文や技術文書の検索・要約
主なメリット:
- シンプルな API で複雑な RAG を実装可能
- メタデータを使った高度な検索フィルタリング
- クエリ最適化による精度の高い検索結果
- 複数のファイル形式に対応
詳細な料金や制限については、OpenAI公式ドキュメントを参照してください。
参考リンク
注: この記事は2025年3月時点の情報に基づいています。APIの仕様は変更される可能性があるため、最新の公式ドキュメントを確認することをお勧めします。