HAGAKUREプログラミング塾 2026.09.13
Web検索とCSV分析
Google Colaboratoryで、Responses APIを手を動かして試します。
画面共有は見えていますか?
音声ははっきりと聞こえていますか?
チャットはSlackの方でお願いします。
各手順に、OpenAI公式ドキュメントへのリンクを付けています。
ChatGPTの画面ではなく、
APIとして「検索する・ファイルを渡す・コードを実行する・画像を作る」まで触る
文章を出すAIから、作業するAPIへ
store=False を指定します。
ColabのシークレットにAPIキーを置く
OPENAI_API_KEY として登録する
ライブラリとクライアント
# 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)
使えない場合は、自分のプロジェクトで利用可能なモデル名に変更してください。
Chat Completions。文章を返すだけ。
Responses API。tools を渡す。
作る → 上げる → 実行 → 保存。
Images API、または Responses で続き編集。
資料を見ながら、原点のページも開いてください
まずは今も使える 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)に切り替えます。
ここから 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)
公式:Web search
画面の文章以外に、検索語や参照元がある
for item in web_response.output:
if item.type == "web_search_call":
print(item.model_dump_json(indent=2))
公式:Web search
実在する患者・病院のデータではありません。勉強会用の架空データです。
columns = ["月", "診療科", "患者数", "売上", "費用"]
# 2026-01〜04 / 内科・整形外科・小児科
df["利益"] = df["売上"] - df["費用"]
df.to_csv("hospital_sales_sample.csv", index=False, encoding="utf-8-sig")
初期はサンプル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)
個人情報・機密情報はアップロードしないでください。
モデル入力として使うので 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)
公式:File inputs(purpose は user_data)
隔離環境で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)
書かせるより、実行させる
コンテナは最終使用から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)
公式:Code Interpreter(生成ファイルの取得)
品質重視は sunburst、速度重視は flare
IMAGE_MODEL = "gpt-image-2.5-sunburst" # IMAGE_MODEL = "gpt-image-2.5-flare" prompt = """ 明るく清潔感のある日本の地域病院で、 医療従事者とAIロボットが協力してデータ分析をしている様子。 現代的なフラットイラスト。 青と白を基調とした配色。 勉強会のスライドに使える構図。 画像内に文字は入れない。 """
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)
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"))
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"))
公式:Conversation state(previous_response_id)
analysis_prompt を変えて試してみましょう
DELETE_UPLOADED_FILE = False
if DELETE_UPLOADED_FILE:
client.files.delete(api_file.id)
print("API上の元CSVを削除しました。")
実行後は同じ File ID を再利用できません。
公式:File inputs
実業務では、個人情報・検証・利用上限・エラー処理を足す
うまくいかない所は画面共有で一緒に解決します。
感想や、自分ならこのCSVで何を見たいかはSlackへどうぞ。
HAGAKUREプログラミング塾