OpenAI Responses APIのファイル検索機能をGoogle Colabで試してみよう

こんにちは！今回はOpenAIの新しいResponses APIのファイル検索ツールをGoogle Colabで実際に試してみる方法を紹介します。カレーレシピ情報を活用したハンズオン形式で、実用的なデモを作っていきましょう。


## 1. はじめに: Responses APIとファイル検索ツールとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/01b42e31-f346-43fc-bf15-e0a6868d7ec3.png)

OpenAIが2025年3月に発表した新しい「Responses API」は、Chat Completions APIのシンプルさとAssistants APIのツール利用機能を統合したものです。

**ファイル検索ツール**はResponses APIの重要な機能の一つで、大量のドキュメントから関連情報を抽出できます。この仕組みは「RAG (Retrieval Augmented Generation)」と呼ばれる手法のOpenAI版実装です。複数のファイル形式に対応し、クエリ最適化、メタデータ絞り込み、カスタムリランキングなど高度な機能も提供されています。

今回は「カレーレシピ情報」をファイルとして用意し、そこから情報を検索・抽出する例を実装します。

## 2. Google Colabでの環境準備

まずはGoogle Colabで環境を整えましょう。

```python
# 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. カレーレシピデータを準備する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/a1fb8fc6-3d7f-42cb-a517-5787e29b7059.png)

まずは複数のカレーレシピを含むテキストファイルを作成し、それをOpenAIのシステムにアップロードします。

```python
# カレーレシピのテキストファイルを作成
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にアップロードし、ベクトルストアを準備します。

```python
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("ベクトルストアの準備が完了しました！")
```

これで準備完了です。ファイル検索ツールを使って、レシピに関する質問をしてみましょう。

```python
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("ベジタリアン向けのカレーレシピはありますか？材料を教えてください。")
```

出力例:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/de0b3190-f37f-4709-9273-283087050646.png)

```
質問: ベジタリアン向けのカレーレシピはありますか？材料を教えてください。
回答を取得中...

回答:
ベジタリアン向けのカレーの材料は以下の通りです:

- なす: 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. 複数の質問を試してみる

様々な角度からカレーレシピについて質問してみましょう。

```python
# 質問リスト
questions = [
    "シーフードカレーの作り方を教えてください。",
    "チキンカレーとシーフードカレーの違いは何ですか？",
    "全てのレシピに共通して使われるスパイスはありますか？",
    "カレーの種類の中で最も簡単に作れるのはどれですか？その理由も教えてください。",
    "ココナッツミルクを使うレシピはどれですか？"
]

# 全ての質問を順番に実行
for q in questions:
    print("\n" + "="*50)
    ask_about_curry(q)
    print("="*50)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/bc7e616c-bfde-45e5-bd53-7f34a14b6df6.png)

## 6. カレーレシピアシスタントを作る

次に、ユーザーが対話形式で質問できる簡単なアシスタントを作ってみましょう。

```python
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()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/abde8bf0-32e8-4152-8415-6654e23ed78e.png)


## 7. 応用: より複雑な質問と検索

より複雑な質問をして、AIがどのように情報を抽出するか試してみましょう。

```python
# より複雑な質問のリスト
advanced_questions = [
    "どのカレーレシピが最も短時間で作れますか？調理時間を教えてください。",
    "ココナッツミルクを使っているレシピは何種類ありますか？それぞれの名前を教えてください。",
    "材料リストでスパイスの種類が最も多いレシピはどれですか？",
    "全ての種類のカレーでよく使われている食材トップ3は何ですか？",
    "肉を使わないレシピはありますか？もしあれば、その代わりに何を使っていますか？"
]

# 複雑な質問を試す
for question in advanced_questions:
    print("\n" + "="*60)
    ask_about_curry(question)
    print("="*60)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/28be4c4e-b63c-44ba-9ecc-a4c97ef0e2e3.png)


この実行結果から、ファイル検索ツールがいかに柔軟に情報を抽出できるかがわかります。特に注目すべきなのは：

1. カレーの種類ごとの特徴の比較
2. 複数のレシピにまたがる共通点の抽出
3. レシピの内容を理解した上での質問応答

これは、単純なキーワード検索ではなく、文脈を理解した検索が行われていることを示しています。

```python
# カレーレシピ情報分析の例
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. まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/25611550-c70c-4ee5-9398-e4f30bbf633a.png)

OpenAI Responses APIのファイル検索ツールは、ドキュメントに含まれる情報を効率的に検索・活用できる強力な機能です。今回はカレーレシピという親しみやすいテーマで試しましたが、この技術は以下のような実用的なシナリオで活用できます：

- カスタマーサポートFAQボット
- 社内マニュアル検索システム
- 製品仕様書のインタラクティブナビゲーション
- 研究論文や技術文書の検索・要約

主なメリット：
- シンプルな API で複雑な RAG を実装可能
- メタデータを使った高度な検索フィルタリング
- クエリ最適化による精度の高い検索結果
- 複数のファイル形式に対応

詳細な料金や制限については、[OpenAI公式ドキュメント](https://openai.com/pricing)を参照してください。

---

## 参考リンク
- [OpenAI エージェント開発のための新たなツール](https://openai.com/ja-JP/index/new-tools-for-building-agents/)

*注: この記事は2025年3月時点の情報に基づいています。APIの仕様は変更される可能性があるため、最新の公式ドキュメントを確認することをお勧めします。*