プログラマーのメモ書き

伊勢在住のプログラマーが気になることを気ままにメモったブログです

OpenAI API で RAG (file search) をやってみた

生成 AI を使っていると、これで何かアプリケーション作って遊べそうだなと思えてきます。いろいろと調べていくと、 API 経由でアクセスできることがわかってきました。

ChatGPT なら GPTs というカスタム GPT を作る機能があるんですが、残念ながらこの記事を書いている時点( 2025 年 5 月)ではカスタム GPT は API 経由では利用できずに、 ChatGPT の UI から使う必要があるようです。

ま、これでももちろんいいんですが、せっかくなので、カスタマイズした ChatGPT を外部から利用するようなものを作ってみようかなと思い立ちました。ということで、いろいろと試したので、メモっておきます。

RAG という技術

生成 AI のカスタマイズについていろいろと調べていくと、RAG (Retrieval Augmented Generator, 検索拡張生成) というのが一つのキーワードになってくるようです。

一般的に生成 AI って知識のカットオフとかがあって、最新の情報は反映されていないというような話がよくあると思います。

それに対して、質問に対する補助的な情報を検索して、それを利用することで回答を生成する、というのが RAG という技術になるようです。なるほどね。

なんとなくイメージはわかりますが、具体的にはどうするんですかね?

と思いつつ、いろいろと調べていくと、OpenAI API の response API の file search という機能がまさにこの RAG を簡単に実現できるものとなっていることに気づきました。ということで、まずはこれを試します。

OpenAI API は 2025 年に入ったころから、時間ができたらちょっと触ってみるという感じで使ってます。以前は completions API というのだったのですが、いつのまにやら response API というのを使うのが推奨されていました

で、この response API にはツールという機能があり、テキスト生成時にこれを指定するだけで簡単にツールの機能を使うことができるようです。

今回、気になったのはこのうちの一つである file search というツールです。というのは、これはファイルをアップロードして置いて、それを参照する形で、 API を呼ぶことで、ファイルに書かれている情報を参照できるというものです。

これって、まんま RAG でやってることとおんなじですよね?

いやー、便利になってるんですね。

実装

ということで、 OpenAI API のサンプルをそのまんまやってみます。環境は、 VSCode で Python です。

まずは、 file search を利用するための vector store というのを準備してやります。

from openai import OpenAI

client = OpenAI()

# vector store の作成
vector_store = client.vector_stores.create(
    name="sample_vector_store",
)
print(f"vector store id: {vector_store.id}")

次にローカルにあるファイルをアップロードする部分です。

# ファイルのアップロード
def create_file(client, file_path):
    with open(file_path, "rb") as f:
        file = client.files.create(file=f, purpose="assistants")
    print(f"file id: {file.id}")
    return file.id

file_id = create_file(client, "2025gaiyou.pdf")  # 2025年版中小企業白書

ファイルはなかなかいいものが見つからなかったんですが、とりあえず令和7年版の中小企業白書の概要版をダウンロードしてきてこれを渡すようにしてみました。

ファイルがアップロードできたら、 vector store に追加してやります。

client.vector_stores.files.create(
    vector_store_id=vector_store.id,
    file_id=file_id,
)

result = client.vector_stores.files.list(
    vector_store_id=vector_store.id,
)
print(f"vector store status: {result}")

これで準備完了です。

問い合わせ部分を作ります。とりあえず、アップロードした資料に関する質問を投げるだけの簡単なものとしておきます。

response = client.responses.create(
    model="gpt-4o-mini",
    input="令和7年時点の日本の中小企業のおかれた状況を簡潔に教えてください",
    tools=[
        {
            "type": "file_search",
            "vector_store_ids": [vector_store.id],
        }
    ],
)

#print(response)
print(response.output_text)

テスト

ここまで出来たら、テストしてみます。上記を1つの .py のファイルにまとめて、これを実行すると、

.venvmor@DESKTOP-DE7IL4F:~/tmp/openai/samples/firstSample$ /home/mor/tmp/openai/samples/firstSample/.venv/bin/python /home/mor/tmp/openai/samples/firstSample/sample_file_search.py
file id: file-VH8VbH4wPscBFFG1JzCQuG
vector store id: vs_6828186a12ec81919e892716553d47bb
vector store status: SyncCursorPage[VectorStoreFile](data=[VectorStoreFile(id=(略), first_id='file-VH8VbH4wPscBFFG1JzCQuG', last_id='file-VH8VbH4wPscBFFG1JzCQuG')
令和7年(2025年)の時点で、日本の中小企業は以下のような状況にあります。

1. **厳しい経済環境**:
   - 円安や物価高、金利上昇などによるコスト増加が中小企業に影響を与えており、特に借入金依存度の高い企業は利益が圧迫されています。
   - 人手不足の問題も深刻で、従業員の確保が困難となっています。

2. **賃上げと利益圧迫**:
   - 2024年の春季労使交渉で高水準の賃上げが実施されたものの、大企業との格差は拡大しています。中小企業の労働分配率は約80%に達しており、賃上げ余力が厳しい状況です。

3. **デジタル化の進展と課題**:
   - デジタル化に取り組む中小企業は増えているものの、依然として進展が遅れている企業も多く見られます。設備投資に占めるソフトウェア関連の投資が少ないため、業務効率化の取り組みが必要とされています。

4. **地域経済への期待**:
   - 中小企業は地域経済やコミュニティの維持に重要な役割を果たしており、雇用の約70%を担っています。地域のニーズに応じた柔軟な対応が期待されています。

このように、厳しい外部環境に対して中小企業は抗うための経営力向上や柔軟な対応が求められています。
.venvmor@DESKTOP-DE7IL4F:~/tmp/openai/samples/firstSample$ 

なんとなく、それっぽいことを返してくれますね。

ちなみに、 file search をつかわず、同じ質問を response API で問い合わせると、

.venvmor@DESKTOP-DE7IL4F:~/tmp/openai/samples/firstSample$ /home/mor/tmp/openai/samples/firstSample/.venv/bin/python /home/mor/tmp/openai/samples/firstSample/sample_conversation_responses_api.py
質問をどうぞ。

ユーザー: 令和7年時点の日本の中小企業のおかれた状況を簡潔に教えてください
responce id: resp_682818cf21d48191874b4147319faa420dc282afa2c39083

アシスタント: 令和7年時点の日本の中小企業は、少子高齢化やコロナ禍からの回復過程にあり、デジタル化やグリーン化の推進が求められています。また、人手不足や事業承継の問題も深刻です。政府の支援策を活用しながら、競争力を高めるための取り組みが進められています。

ユーザー: quit

会話を終了します。

まあ、それらしきことは返してくれますが、具体的な数値とかがない分、一般的な回答の範囲に収まっているのかな?という感じですね( file search ありのほうは PDF 中の数値なども参照してくれてます)。

file search の料金

あと、気になるのは料金だと思います。 file search に関してかかる費用としては、トークンで決まる API の使用料のほかに、

  • ストレージの使用料
  • file search の使用料

が必要になるようです。ま、ストレージに関しては、全 vector store の合計が 1GB までは無料のようです。

後始末

いろいろと試した後、ダッシュボードの Storage をみると

こんな感じにアップロードしたファイルや作成した vector store を確認することができます。もう不要ということであれば、ダッシュボードから消してしまえば OK です。

まとめ

file search を使った RAG (と呼ぶのは一般的なんだろうか?)はめっちゃ簡単に試すことができました。もっとも、サンプルとして使ったファイルがちょっと微妙かな?というのもあり、劇的な違いは感じなかったのですが、使いたい分野のファイルを数多く登録するなどしていけば、いろいろと便利に使うこともできそうです。

次は、せっかくなので、次は一般的な RAG も試してみようと思います。