ChatGPTのAPIコストを削減したい【OpenAI Agent SDK】

# ChatGPTのAPIコストを削減したい
OpenAI Agent SDKでファイルサーチ（RAGに相当）を実装したのですが、データ量が多いと結構な料金になります。
節約する方法を考えたという記事です。

## 背景(私の個人的な事情)
AIエージェントで自動化をすることを前提にサイトを作っていますが、コストが高すぎて、困っています。
ひとまず節約の策を考える必要がありました。

https://qiita.com/tetsujin_081/items/1836b210f05389c76d32

## 方針
 - 精度は落とさない
 - 処理時間は長くても気にしない

## 試したこと
 - モデルを安いものにする → 精度が落ちる
 - データを分割してAIでの検索を最適化する →本記事で解説

## 「データを分割してAIでの検索を最適化する」とは
ベクターストアを二つ準備します。
 - 頻度が高いものだけが含まれるデータ
 - 全てが含まれるデータ

そして、「頻度が高いものだけが含まれるデータ」を検索した後にデータが見つからなければ「全てが含まれるデータ」を検索することで、高頻度なデータの場合はAPIコストが少なくなる、というカラクリです。

### データ

```すべてのデータ.json
[
    {"id":1,"japanese_name":"とくせいガード","english_name":"Ability Shield"},
    {"id":2,"japanese_name":"きゅうこん","english_name":"Absorb Bulb"},
    {"id":3,"japanese_name":"だいこんごうだま","english_name":"Adamant Crystal"},
    {"id":4,"japanese_name":"こんごうだま","english_name":"Adamant Orb"},
    {"id":5,"japanese_name":"バンジのみ","english_name":"Aguav Berry"},
    {"id":6,"japanese_name":"ふうせん","english_name":"Air Balloon"},
    {"id":7,"japanese_name":"おまもりこばん","english_name":"Amulet Coin"},
    .....
    {"id":222,"japanese_name":"フォーカスレンズ","english_name":"Zoom Lens"}
]
```

以下は上記から高頻度に選ばれるデータを適当に30個抜粋しました。
```高頻度データ.json
[
    {"id":6,"japanese_name":"ふうせん","english_name":"Air Balloon"},
    {"id":10,"japanese_name":"とつげきチョッキ","english_name":"Assault Vest"},
    {"id":14,"japanese_name":"おおきなねっこ","english_name":"Big Root"},
    {"id":15,"japanese_name":"しめつけバンド","english_name":"Binding Band"},
    {"id":18,"japanese_name":"くろいヘドロ","english_name":"Black Sludge"},
    {"id":29,"japanese_name":"こだわりハチマキ","english_name":"Choice Band"},
    ....
    {"id":67,"japanese_name":"きあいのタスキ","english_name":"Focus Sash"},
```

### コード
```py
from agents import Agent, FileSearchTool, Runner
from pydantic import BaseModel

class ItemOutput(BaseModel):
    item_id: int

item_id_agent = Agent(
    name="item_id_searcher",
    instructions="""
    #命令
    アイテム（持ち物）からidを特定してください。
    #条件
    idは公式の番号ではありません。
    id番号のみを答えてください。
    """,
    tools=[
        FileSearchTool(
            vector_store_ids=["vs_******すべてのデータ*****"],
        ),
    ],
    output_type=ItemOutput,
    model="gpt-4.1-mini"
)


item_id_frequently_agent = Agent(
    name="frequently_item_id_searcher",
    instructions="""
    #命令
    高頻度なアイテム（持ち物）リストからidを特定してください。
    #条件
    idは公式の番号ではありません。
    id番号のみを答えてください。
    該当するアイテムがない場合は、すべてのアイテムリストからidを特定する
    """,
    tools=[
        item_id_agent.as_tool(
            tool_name="item_id_searcher",
            tool_description="すべてのアイテム（持ち物）リストからidを特定してください。",
        ),
        FileSearchTool(
            vector_store_ids=["vs_******高頻度なデータ*****"],
        )
    ],
    output_type=ItemOutput,
    model="gpt-4.1-mini"
)

prompt = "こだわりハチマキ" # 高頻度リストにあるもの

result = Runner.run_sync(item_id_agent, prompt)
print(result.final_output)

result = Runner.run_sync(item_id_frequently_agent, prompt)
print(result.final_output)

prompt = "ズリのみ" # 高頻度リストにないもの

result = Runner.run_sync(item_id_agent, prompt)
print(result.final_output)

result = Runner.run_sync(item_id_frequently_agent, prompt)
print(result.final_output)
```

 - ```item_id_agent```：すべてのデータの検索するエージェント
 - ```item_id_frequently_agent```：高頻度なデータの検索するエージェント、ただし、該当がない場合は```item_id_agent```に助けを求める

## 結果
狙い通りうまく行きました。
結果はどちらも正解
```py
item_id=29 #item_id_agent こだわりハチマキ
item_id=29 #item_id_frequently_agent こだわりハチマキ
item_id=160 #item_id_agent ズリのみ
item_id=160 #item_id_frequently_agent ズリのみ
```


#### こだわりハチマキ（高頻度データ）
 - ```item_id_agent```
11,439トークン
![スクリーンショット 2025-06-10 22.24.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/18174095-4052-4f24-a99a-65f1dd400268.png)

 - ```item_id_frequently_agent```
  3,378トークン 
 ![スクリーンショット 2025-06-10 22.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/5198f5dd-efd0-4ade-bc4b-06566c137150.png)
  **約1/3ですね！！誤動作もしていない**
#### ズリのみ（高頻度データに含まれない）
 - ```item_id_agent```
 11,413 トークン
![スクリーンショット 2025-06-10 22.32.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/a05214b8-df09-48f0-b604-766410a9609e.png)


- ```item_id_frequently_agent```
3,347 + 11,413 + 2,154 = 16,914 トークン
![スクリーンショット 2025-06-10 22.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724198/f5454c99-6ff6-4dbf-a4b4-3f6a84f1f815.png)
  **こちらは連携している部分と高頻度データを検索する分でちょっと多くなっています**

## 結論
単純に少なくなるというわけではないので、バランスを考えてやっていくと思います。
「高頻度データはどこまで取るか」を検討していく感じになりそう。