コンテンツにスキップ

画像からの抽出

レシート、請求書、身分証、名刺などの画像から構造化データを取り出すレシピ。3 ステップ:

  1. Files で画像をアップロード。
  2. チャットメッセージで file_id を参照。
  3. JSON Schema で出力を制約。
from openai import OpenAI
from pydantic import BaseModel
from typing import List
client = OpenAI(base_url="https://api.aiand.com/v1", api_key="sk-...")
class LineItem(BaseModel):
description: str
quantity: int
unit_price_jpy: float
class Receipt(BaseModel):
merchant: str
date: str
items: List[LineItem]
total_jpy: float
uploaded = client.files.create(
file=open("receipt.jpg", "rb"),
purpose="vision",
)
response = client.chat.completions.parse(
model="zai-org/glm-5.3-flash",
messages=[
{"role": "system", "content": "Extract structured data from receipts."},
{
"role": "user",
"content": [
{"type": "text", "text": "Parse this receipt into JSON."},
{"type": "file", "file": {"file_id": uploaded.id}},
],
},
],
response_format=Receipt,
)
receipt = response.choices[0].message.parsed
for item in receipt.items:
print(f"{item.description}: ¥{item.unit_price_jpy}")
print(f"Total: ¥{receipt.total_jpy}")
  • client.files.create(..., purpose="vision") で画像を ai& のストレージにアップロード。purpose 省略時は MIME から推論されます。
  • file コンテンツパート — {type: "file", file: {file_id}} — を指定すると、ai& がファイルを参照し、短時間有効な署名付き URL を生成して image_url パートに書き換えた上でモデルに転送します。詳細は ビジョン を参照。
  • response_format=Receipt で Pydantic スキーマを strict な JSON Schema として送信。

ファイルはストレージコストを消費するため、使い終わったら削除します:

client.files.delete(uploaded.id)

30 日間の有効期限 に任せることもできます。