HAGAKUREプログラミング塾 2026.09.13

OpenAI API 最新機能体験

Web検索とCSV分析

Google Colaboratoryで、Responses APIを手を動かして試します。

手を振るHAGAKURE君

環境確認

画面共有は見えていますか?
音声ははっきりと聞こえていますか?
チャットはSlackの方でお願いします。

HAGAKURE君

講座の概要

指差しHAGAKURE君

今日のゴール

ChatGPTの画面ではなく、
APIとして「検索する・ファイルを渡す・コードを実行する・画像を作る」まで触る

文章を出すAIから、作業するAPIへ

ノートPCを使うHAGAKURE君

先に注意

APIはChatGPTの月額契約とは別の従量課金です。
患者名、患者IDなどの個人情報は入力しないでください。
このNotebookでは store=False を指定します。
従量課金 個人情報NG store=False 見るだけ参加OK
驚くHAGAKURE君

0. 事前準備

ColabのシークレットにAPIキーを置く

考えるHAGAKURE君

セットアップ

ライブラリとクライアント

# pandasとmatplotlibはColab標準版を使う
!pip install -q --upgrade openai

from google.colab import userdata
from openai import OpenAI

api_key = userdata.get("OPENAI_API_KEY")
client = OpenAI(api_key=api_key)
MODEL = "gpt-5.6-terra"
print("準備完了:", MODEL)

使えない場合は、自分のプロジェクトで利用可能なモデル名に変更してください。

ノートPCを使うHAGAKURE君

今日の流れ

1. 普通の回答

Chat Completions。文章を返すだけ。

2. Web検索以降

Responses API。tools を渡す。

3〜7. CSV分析

作る → 上げる → 実行 → 保存。

8. 画像生成

Images API、または Responses で続き編集。

指差しHAGAKURE君

公式ドキュメント

資料を見ながら、原点のページも開いてください

考えるHAGAKURE君

1. 普通のAI回答

まずは今も使える Chat Completions。文章を返すだけ

response = client.chat.completions.create(
    model=MODEL,
    messages=[{
        "role": "user",
        "content": "医療機関が生成AIを利用するときの注意点を3つ、簡潔に説明してください。",
    }],
)
print(response.choices[0].message.content)

次のWeb検索からは、Responses API(client.responses.create)に切り替えます。

HAGAKURE君

2. API内蔵のWeb検索

ここから Responses API。tools に web_search を渡す

web_response = client.responses.create(
    model=MODEL,
    tools=[{
        "type": "web_search",
        "filters": {
            "allowed_domains": ["mhlw.go.jp", "digital.go.jp"]
        },
    }],
    tool_choice="required",
    include=["web_search_call.action.sources"],
    input="厚労省とデジタル庁の公開情報から、医療DXの最近の動向を3つ。",
    store=False,
)
print(web_response.output_text)
考えるHAGAKURE君

検索処理の中身

画面の文章以外に、検索語や参照元がある

for item in web_response.output:
    if item.type == "web_search_call":
        print(item.model_dump_json(indent=2))
allowed_domains tool_choice=required sources を include
指差しHAGAKURE君

3. 分析用のサンプルCSV

実在する患者・病院のデータではありません。勉強会用の架空データです。

columns = ["月", "診療科", "患者数", "売上", "費用"]
# 2026-01〜04 / 内科・整形外科・小児科
df["利益"] = df["売上"] - df["費用"]
df.to_csv("hospital_sales_sample.csv", index=False, encoding="utf-8-sig")
個人情報は入れない 架空データで十分
驚くHAGAKURE君

4. 使用するCSVを選ぶ

初期はサンプルCSV。自分のCSVは USE_OWN_CSV = True

USE_OWN_CSV = False

if USE_OWN_CSV:
    uploaded = files.upload()
    CSV_PATH = Path(next(iter(uploaded.keys())))
else:
    CSV_PATH = SAMPLE_CSV_PATH

print("分析対象:", CSV_PATH)

個人情報・機密情報はアップロードしないでください。

考えるHAGAKURE君

5. CSVをAPIへアップロード

モデル入力として使うので purpose="user_data"

with open(CSV_PATH, "rb") as f:
    api_file = client.files.create(
        file=f,
        purpose="user_data",
    )

print("File ID:", api_file.id)
ノートPCを使うHAGAKURE君

6. Code Interpreterで分析

隔離環境でPythonを実行し、集計CSVとグラフPNGを作らせる

analysis_response = client.responses.create(
    model=MODEL,
    tools=[{
        "type": "code_interpreter",
        "container": {"type": "auto", "file_ids": [api_file.id]},
    }],
    tool_choice="required",
    input=analysis_prompt,
    store=False,
)
print(analysis_response.output_text)
ノートPCを使うHAGAKURE君

プロンプトのコツ

書かせるより、実行させる

指差しHAGAKURE君

7. 生成ファイルをColabへ保存

コンテナは最終使用から20分で期限切れ。すぐ取得する

container_files = list(client.containers.files.list(container_id=container_id))

for container_file in container_files:
    filename = Path(container_file.path or container_file.id).name
    if filename == CSV_PATH.name:
        continue  # 入力CSVは除外
    content.write_to_file(OUTPUT_DIR / filename)
眠そうなHAGAKURE君

8. Images APIで画像生成

品質重視は sunburst、速度重視は flare

IMAGE_MODEL = "gpt-image-2.5-sunburst"
# IMAGE_MODEL = "gpt-image-2.5-flare"

prompt = """
明るく清潔感のある日本の地域病院で、
医療従事者とAIロボットが協力してデータ分析をしている様子。

現代的なフラットイラスト。
青と白を基調とした配色。
勉強会のスライドに使える構図。
画像内に文字は入れない。
"""
1024x1024 quality=high 画像生成も従量課金
考えるHAGAKURE君

8. 生成してPNG保存

Base64をデコードして Colab に書き出す

import base64
from pathlib import Path
from IPython.display import display, Image

result = client.images.generate(
    model=IMAGE_MODEL,
    prompt=prompt,
    size="1024x1024",
    quality="high",
)

image_base64 = result.data[0].b64_json
image_bytes = base64.b64decode(image_base64)
IMAGE_PATH = Path("generated_image.png")
IMAGE_PATH.write_bytes(image_bytes)
display(Image(filename=str(IMAGE_PATH)))
print("保存しました:", IMAGE_PATH)
ノートPCを使うHAGAKURE君

9. Responses APIで画像生成

tools に image_generation。続き編集のため store=True

import base64
from IPython.display import display, Image

response1 = client.responses.create(
    model="gpt-5.6-luna",
    input="""
    日本の地域病院で、医療従事者とAIロボットが
    データ分析している明るいイラストを作ってください。
    画像内に文字は入れないでください。
    """,
    tools=[{
        "type": "image_generation",
        "model": "gpt-image-2.5-sunburst",
        "quality": "high",
    }],
    store=True,
)

image_data1 = [
    item.result
    for item in response1.output
    if item.type == "image_generation_call"
][0]

with open("image_v1.png", "wb") as f:
    f.write(base64.b64decode(image_data1))
display(Image(filename="image_v1.png"))
指差しHAGAKURE君

9. さっきの画像を変更する

previous_response_id で構図と人物を引き継ぐ

response2 = client.responses.create(
    model="gpt-5.6-luna",
    previous_response_id=response1.id,
    input="""
    さっきの画像の構図と人物を維持したまま、
    AIロボットを小さくし、背景にグラフ画面を追加してください。
    """,
    tools=[{
        "type": "image_generation",
        "model": "gpt-image-2.5-sunburst",
        "quality": "high",
    }],
    store=True,
)

image_data2 = [
    item.result
    for item in response2.output
    if item.type == "image_generation_call"
][0]

with open("image_v2.png", "wb") as f:
    f.write(base64.b64decode(image_data2))
display(Image(filename="image_v2.png"))
驚くHAGAKURE君

10. 自由課題

analysis_prompt を変えて試してみましょう

考えるHAGAKURE君

11. 後片付け(任意)

DELETE_UPLOADED_FILE = False

if DELETE_UPLOADED_FILE:
    client.files.delete(api_file.id)
    print("API上の元CSVを削除しました。")

実行後は同じ File ID を再利用できません。

HAGAKURE君

まとめ

実業務では、個人情報・検証・利用上限・エラー処理を足す

指差しHAGAKURE君

お疲れ様でした

うまくいかない所は画面共有で一緒に解決します。
感想や、自分ならこのCSVで何を見たいかはSlackへどうぞ。

HAGAKUREプログラミング塾

手を振るHAGAKURE君