Gemini Vision APIでの構造化データ抽出(Zodスキーマ活用)
TypeScript
Zod
Gemini
Vision API
@google/generative-ai を使った画像解析とZodによる構造化出力
基本実装
import { GoogleGenerativeAI } from "@google/generative-ai";
import { z } from "zod";
const genAI = new GoogleGenerativeAI(process.env.GOOGLE_GENERATIVE_AI_API_KEY);
// 抽出データのスキーマ定義
const extractionSchema = z.object({
title: z.string().describe("タイトル"),
date: z.string().describe("日付(YYYY-MM-DD形式)"),
content: z.string().describe("内容"),
participants: z.array(z.string()).optional().describe("参加者"),
});
async function analyzeImage(imageUrl: string) {
const model = genAI.getGenerativeModel({ model: "gemini-2.5-flash-exp" });
// Base64画像の処理
const base64Data = imageUrl.split(",")[1];
const prompt = `画像から以下の情報を抽出してJSON形式で返してください:
- title: タイトル
- date: 日付(YYYY-MM-DD形式)
- content: 内容
- participants: 参加者リスト`;
const result = await model.generateContent([
prompt,
{
inlineData: {
mimeType: "image/jpeg",
data: base64Data,
},
},
]);
const text = result.response.text();
// JSONパース(柔軟な抽出)
try {
const parsed = JSON.parse(text);
return extractionSchema.parse(parsed);
} catch (parseError) {
// テキスト内からJSON部分を抽出
const jsonMatch = text.match(/\{[\s\S]*\}/);
if (jsonMatch) {
const parsed = JSON.parse(jsonMatch[0]);
return extractionSchema.parse(parsed);
}
throw new Error("Failed to parse vision API response");
}
}
OCRテキスト抽出
async function extractTextFromImage(imageUrl: string): Promise<string> {
const model = genAI.getGenerativeModel({ model: "gemini-2.0-flash-exp" });
const base64Data = imageUrl.split(",")[1];
const result = await model.generateContent([
"画像に含まれるすべてのテキストを抽出してください。",
{
inlineData: {
mimeType: "image/jpeg",
data: base64Data,
},
},
]);
return result.response.text();
}
用途別スキーマパターン
// 名刺情報 const businessCardSchema = z.object({ name: z.string(), company: z.string().optional(), email: z.string().optional(), phone: z.string().optional(), position: z.string().optional(), }); // 汎用抽出 const generalSchema = z.object({ text: z.string(), entities: z.array(z.object({ type: z.string(), value: z.string(), })), });
モデル選択
gemini-2.5-flash-exp: 最新の実験的モデルgemini-2.0-flash-exp: OCR専用- バランス: 速度と精度のトレードオフ