🫣

【Responses API】最新のOpen AIのAPIでFile Search試してみた!!

2025/03/12に公開

はじめに

こんにちは!!
昨日Open AIから新しくResponses APIとAgents SDKの発表がされました!

今回はその中のResponse APIにフォーカスして実際に動かしましたのでまとめます。
まだ発表を見ていない方はこちらから確認できます。
https://youtu.be/hciNKcLwSes

概要

OpenAIの最新API、特にResponse APIに搭載されている「ファイル検索」ツールを試してみました。
このツールは、あらかじめアップロードしておいたファイルから、セマンティック検索やキーワード検索を用いて必要な情報を抽出し、モデルが参照できるようにする仕組みです。
たとえば、ベクトルストアに保存されたファイルの内容をもとに、ユーザーからの問い合わせに対して詳細な回答を自動で生成することができます。

今回の実験では、架空のマニュアル「dummy_pc.md」をアップロードし、ファイル検索を利用して「dummy_pcの電源が入らない時の対策を教えて」という問いに対する回答を取得しました。
なお、ベクトルストアやセマンティック検索の詳細については、OpenAIの検索ガイドをご参照ください。

構築

使用したコード

以下のコードは、ファイルのアップロード、ベクトルストアの作成、ファイルの登録、そしてResponse APIを用いたファイル検索による回答生成の一連の処理を実装しています。

import openai
import requests
from io import BytesIO

# OpenAIのAPIキー
API_KEY = "your_api_key"
BASE_URL = "https://api.openai.com/v1"

# OpenAIのクライアントインスタンスを作成
client = openai.OpenAI(api_key=API_KEY)


##############################
# 1. File API でファイルを作成
##############################
def create_file(file_path_or_url: str):
    """
    指定したローカルのパスまたはURLからファイルをアップロードし、
    Fileオブジェクトを作成する関数です。目的(purpose)は 'assistants' に設定しています。
    """
    if file_path_or_url.startswith("http://") or file_path_or_url.startswith("https://"):
        # URLからファイルをダウンロードする
        response = requests.get(file_path_or_url)
        file_content = BytesIO(response.content)
        file_name = file_path_or_url.split("/")[-1]
        result = client.files.create(
            file=(file_name, file_content), purpose="assistants"
        )
    else:
        # ローカルファイルを開いてアップロードする
        with open(file_path_or_url, "rb") as f:
            result = client.files.create(file=f, purpose="assistants")
    print(f"ファイル作成完了: {result.id}")
    return result.id


##############################
# 2. ベクトルストアの作成
##############################
def create_vector_store(store_name: str):
    """
    ベクトルストアを作成し、そのIDを返す関数です。
    client.beta.vector_storesが利用できないため、requestsで直接APIコールを行っています。
    """
    url = f"{BASE_URL}/vector_stores"
    headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
    payload = {"name": store_name}
    response = requests.post(url, headers=headers, json=payload)
    if response.status_code == 200:
        vector_store_id = response.json()["id"]
        print(f"ベクトルストア作成完了: {vector_store_id}")
        return vector_store_id
    else:
        print(f"ベクトルストア作成失敗: {response.status_code}, {response.text}")
        raise Exception(f"Failed to create vector store: {response.text}")


###################################
# 3. ファイルをベクトルストアに登録
###################################
def add_file_to_vector_store(vector_store_id: str, file_id: str):
    """
    アップロード済みのFileオブジェクトを、指定したベクトルストアに関連付ける関数です。
    """
    url = f"{BASE_URL}/vector_stores/{vector_store_id}/files"
    headers = {"Authorization": f"Bearer {API_KEY}", "Content-Type": "application/json"}
    payload = {"file_id": file_id}
    response = requests.post(url, headers=headers, json=payload)
    if response.status_code == 200:
        print("ファイルをベクトルストアに追加しました:")
        print(response.json())
    else:
        print(f"ファイル追加失敗: {response.status_code}, {response.text}")
        raise Exception(f"Failed to add file to vector store: {response.text}")


##################################################
# 4. ファイルを用いた検索ツールを使って回答を生成
##################################################
def generate_response_with_file_search(vector_store_id: str, query_text: str):
    """
    ファイル検索ツールを用いて、モデルに回答を生成してもらう関数です。
    toolsパラメータでファイル検索の情報を渡し、Response APIを呼び出しています。
    """
    response = client.responses.create(
        model="gpt-4o-mini",
        input=query_text,
        tools=[
            {
                "type": "file_search",
                "vector_store_ids": [vector_store_id],
                "max_num_results": 5,
            }
        ],
        include=["output[*].file_search_call.search_results"],
    )

    # レスポンス内容を出力する
    for output in response.output:
        if output.type == "message":
            print("\n[モデルからの回答]")
            print(output.content[0].text)
        elif output.type == "file_search_call":
            print("\n[検索結果]")
            print(output)

    return response


if __name__ == "__main__":
    # 1. ファイルを作成(アップロード)
    file_id = create_file("dummy_pc.md")

    # 2. ベクトルストアを作成
    vs_id = create_vector_store("knowledge_base")

    # 3. ファイルをベクトルストアに登録
    add_file_to_vector_store(vs_id, file_id)

    # 4. 生成したベクトルストアを使って検索&回答を生成
    user_query = "dummy_pcの電源が入らない時の対策を教えて"
    response_data = generate_response_with_file_search(vs_id, user_query)

    print("\n===== File Search + 回答生成結果 =====")
    print(response_data)

今回与えたデータ

以下は、今回アップロードした「dummy_pc.md」に記載されている内容です。
今回はGPTに架空のPCマニュアルをmd形式で作成してもらい使用しています

# Dummy PC 取扱マニュアル

## 目次
1. [はじめに](#はじめに)  
2. [仕様](#仕様)  
3. [セットアップ手順](#セットアップ手順)  
4. [基本操作](#基本操作)  
5. [トラブルシューティング](#トラブルシューティング)  
6. [よくある質問](#よくある質問)  
7. [お問い合わせ](#お問い合わせ)  

---

## はじめに
このたびは **Dummy PC** をお買い上げいただき、誠にありがとうございます。本マニュアルでは、Dummy PC のセットアップや基本操作、トラブル時の対応方法などを説明しています。

---

## 仕様
| 項目 | 詳細 |
|-------|-------|
| モデル名 | Dummy PC 2025 |
| CPU | Dummy Core i9-9900K |
| メモリ | 16GB DDR4 |
| ストレージ | 512GB SSD |
| GPU | Dummy RTX 3080 |
| OS | Dummy OS 2.0 |
| 重量 | 1.5 kg |
| バッテリー駆動時間 | 約12時間 |

---

## セットアップ手順
### 1. 開封
- 梱包内容を確認してください。  
- 内容物:
  - Dummy PC 本体  
  - ACアダプター  
  - ユーザーマニュアル  

---

### 2. 電源接続と起動
- ACアダプターを接続します。  
- 電源ボタンを 3 秒間長押しして起動します。  

---

### 3. 初期設定
1. 言語を選択します。  
2. Wi-Fi に接続します。  
3. ユーザー名とパスワードを設定します。  

---

## 基本操作
### 1. 電源オン・オフ
- **電源オン**:電源ボタンを 3 秒間長押し  
- **電源オフ**:スタートメニューから「シャットダウン」を選択  

---

### 2. Wi-Fi 設定
- 設定 → ネットワーク → Wi-Fi からネットワークを選択  

---

### 3. 画面の明るさ調整
- キーボードの「F5」「F6」で調整可能  

---

## トラブルシューティング
| トラブル内容 | 対処方法 |
|-------------|----------|
| 電源が入らない | ACアダプターが正しく接続されているか確認してください。 |
| インターネットに接続できない | Wi-Fi設定を確認し、再接続してください。 |
| 画面が映らない | ディスプレイの明るさがゼロになっていないか確認してください。 |

---

## よくある質問
**Q. 初期化方法を教えてください。**  
A. 設定 → システム → リカバリー → 初期化 を選択してください。  

**Q. バッテリーの持ちをよくする方法は?**  
A. 画面の明るさを下げ、Wi-FiやBluetoothを使用しない場合はオフにしてください。  

---

## お問い合わせ
- Dummy PC カスタマーサポート  
  - 電話番号:0120-XXX-XXXX  
  - メールアドレス:support@dummy-pc.com  
  - 受付時間:9:00〜18:00 (平日のみ)  

---

© 2025 Dummy Corporation All Rights Reserved.

レスポンスデータ

今回コンソールに出力した内容をそのまま記載いたします。
しっかりとアップロードしたファイルから情報検索を行い、回答を生成していることが確認できると思います。

[モデルからの回答]
dummy PCの電源が入らない場合の一般的な対策は以下の通りです:

1. **電源ケーブルの確認**:
   - 電源ケーブルがしっかりとコンセントとPC本体に接続されているか確認します。

2. **コンセントの確認**:
   - 別のコンセントに接続してみて、コンセント自体の故障がないか確認します。

3. **電源ボタンの確認**:
   - 正常に動作しているか、電源ボタン自体に問題がないか確認します。

4. **内部の接続確認**:
   - ケースを開けて、中のコンポーネント(マザーボード、電源ユニットなど)が正しく接続されているか確認します。

5. **ハードウェアのトラブルシューティング**:
   - RAMやGPU、その他のコンポーネントを再接続することで、接触不良を解消します。

6. **段階的なテスト**:
   - 最小限のハードウェア(CPU、1つのRAM、電源)で起動してみて、問題の切り分けを行います。

7. **電源ユニットの故障**:
   - 他の電源ユニットと交換して動作確認を行い、電源ユニット自体の故障をチェックします。

これらの手順を試すことで、電源が入らない原因を特定できるかもしれません。それでも問題が解決しない場合は、専門の技術者に相談することをおすすめします。

コンソールでは参照箇所もしっかりと確認できました!!

コスト

モデル利用(gpt-4o-mini)のコスト

  • 入力トークン: 1,741
  • 出力トークン: 425
  • 合計トークン: 2,166

gpt-4o-miniでは、1Mトークンあたり $0.60 です。
そのため今回のコストは$0.0013です

File Search Tool Call のコスト計算

File Search Tool Call は、1,000回あたり $2.50 となっています。
今回の実行では1回の呼び出しとなっているため、今回では$0.0025のコストです

File Search Storage のコスト

アップロードしたファイルの大きさによってかかってくる料金です。
こちらは1日1GBあたり$0.10の料金設定ですが、今回は1GB未満のためかかっていません。

合計コスト

  • モデル利用:約 $0.0013
  • File Search Tool Call:約 $0.0025
  • ストレージ:$0.00

今回の合計コストは約 $0.0038($1 = ¥150 換算で ¥0.57) となります。

まとめ

今回は、最新のAPIであるResponse APIを利用して、アップロード済みの「dummy_pc.md」から、
「dummy_pcの電源が入らない時の対策」を問い合わせた結果、しっかりとアップロードした情報をもとに回答を作成することが確認できました。

最新のOpenAI APIは、非常に柔軟で強力な機能を備えており、今後さらに多様な利用シーンが展開されると期待されます。

従来のクラウドプラットフォームなどで提供されているものに比べ、より安価でフレキシブルにな選択肢となるのではないでしょうか??

この記事を参考に、ぜひ皆様もResponse APIを試してみてください!

Solvio株式会社

Discussion