Appearance
企業エンリッチメント
概要
企業エンリッチメントバッチは、Gemini API(Google Search Grounding 有効)を使って企業の公式情報を自動取得し、面談シート用フィールドを補完するスクリプトです。
| 項目 | 内容 |
|---|---|
| 目的 | 企業の公式情報(HP、所在地、従業員数、上場市場、会社概要)を自動取得 |
| 使用 API | Gemini 3 Flash Preview(Google Search Grounding 有効) |
| 実行方法 | npm run enrich:companies [OPTIONS] |
| 対象 | enrichment_status = 'pending' の企業(デフォルト) |
処理フロー
ステップ詳細
- CLI 起動:
enrich-companies.tsがコマンドライン引数をパースし、環境変数を検証 - 対象企業取得:
companiesテーブルからenrichment_statusでフィルタリングして取得 - カテゴリマスタ取得:
company_typesテーブルから全カテゴリを取得(バッチ内でキャッシュ) - 企業ループ: 各企業に対して順次処理(2 秒間隔)
- Gemini API 呼び出し: 企業カテゴリマスタを含むプロンプトで Google Search Grounding を使い企業の公式情報を検索・抽出
- 成功時: 面談シート用フィールド(HP、最寄り駅、従業員数、上場市場、会社概要)と情報源 URL を保存し、カテゴリマッピングの DELETE & INSERT を実行(
status = 'success') - 失敗時: エラーメッセージを記録(
status = 'failed')
CLI オプション
| オプション | 短縮形 | 型 | 説明 |
|---|---|---|---|
--name | -n | string | 企業名で絞り込み(部分一致) |
--dry-run | -d | boolean | DB 保存せず結果を表示のみ |
--force | -f | boolean | 処理済み(success/failed/skipped)も再実行 |
--limit | -l | number | 処理件数の上限を指定 |
--entry-platform-id | -e | number | エントリー媒体IDで絞り込み |
--help | -h | boolean | ヘルプを表示 |
使用例
bash
# 全 pending 企業を処理
npm run enrich:companies
# 結果確認のみ(DB保存しない)
npm run enrich:companies -- --dry-run
# 5件だけ処理
npm run enrich:companies -- --limit 5
# 処理済みも含めて全企業を再処理
npm run enrich:companies -- --force
# 特定企業のみ処理
npm run enrich:company -- --name "株式会社〇〇"
# 特定のエントリー媒体の企業のみ処理
npm run enrich:companies -- --entry-platform-id 3終了コード
| コード | 意味 |
|---|---|
0 | 全件成功 |
1 | 1 件以上の失敗、または致命的エラー |
データモデル
companies テーブル(エンリッチメント関連カラム)
| カラム | 型 | 説明 |
|---|---|---|
homepage_url | text | 企業の公式サイト URL |
nearest_station | varchar(100) | 本社最寄り駅 |
employee_count | varchar(50) | 従業員数(例: 1,759名) |
stock_market | varchar(50) | 上場市場(例: 東証プライム, 未上場) |
company_overview | text | 会社概要(約 300 文字) |
source_urls | jsonb | 情報取得元の公式ページ URL 一覧 |
enrichment_status | varchar(20) | ステータス(下記参照) |
enrichment_error | text | 失敗時のエラーメッセージ |
enriched_at | timestamptz | 最終エンリッチメント実行日時 |
enrichment_status 遷移
| 値 | 意味 |
|---|---|
pending | 未処理(新規企業のデフォルト) |
success | エンリッチメント完了 |
failed | エンリッチメント失敗 |
skipped | 意図的にスキップ |
出力データの例
json
{
"homepage_url": "https://example.co.jp",
"nearest_station": "渋谷駅",
"employee_count": "1,759名",
"stock_market": "東証プライム",
"company_overview": "株式会社〇〇は2005年設立のIT企業で、クラウドサービスの開発・運用を主力事業としています。...",
"source_urls": ["https://example.co.jp/company/", "https://example.co.jp/recruit/"],
"confidence": "high",
"notes": null,
"company_type_ids": [1, 3]
}Gemini API 連携
モデル設定
| 項目 | 値 |
|---|---|
| モデル | gemini-3-flash-preview |
| Temperature | 0.0(決定的出力) |
| レスポンス形式 | application/json |
| ツール | Google Search Grounding |
プロンプト構成
GeminiClient.buildPrompt() が以下の情報を含む単一プロンプトを構築します:
- 入力データ: 企業名
- タスク 1 — 企業情報抽出: 企業の公式情報のみを使用して、HP URL・最寄り駅・従業員数・上場市場・会社概要を抽出
- タスク 2 — 企業カテゴリ分類: カテゴリマスタ一覧(
ID {id}: {name}形式)を埋め込み、該当するカテゴリ ID を全て選択
情報ソースの制限
Gemini に対して、参照可能な情報ソースを厳格に制限しています:
使用可能:
- 当該企業の公式コーポレートサイト
- 当該企業の公式採用サイト
- 当該企業が発行したプレスリリース
- IR 情報ページ・有価証券報告書
使用禁止:
- 転職サイト(Green, Wantedly, doda 等)
- 口コミサイト(OpenWork, 転職会議等)
- ニュースサイト・メディア記事
- Wikipedia
- 企業データベース(Baseconnect, FUMA 等)
- SNS
リトライ・エラーハンドリング
リトライ条件
以下のキーワードがエラーメッセージに含まれる場合にリトライ:
rate limittimeout503429temporarily
指数バックオフ
| 試行 | 待機時間 | 計算式 |
|---|---|---|
| 1 回目失敗 | 1 秒 | 1000 * 2^0 |
| 2 回目失敗 | 2 秒 | 1000 * 2^1 |
| 3 回目失敗 | — | 最大試行回数に到達、エラー返却 |
JSON パースエラー
Gemini のレスポンスが JSON としてパースできない場合は即座にエラーとして処理されます(リトライ対象外)。
環境変数
| 変数名 | 必須 | 説明 |
|---|---|---|
GEMINI_API_KEY | ○ | Gemini API キー |
SUPABASE_URL | ○ | Supabase プロジェクト URL |
SUPABASE_SERVICE_ROLE_KEY | ○ | Supabase サービスロールキー(RLS バイパス) |
NODE_ENV | — | production 以外の場合 .env.local を自動読み込み |
ローカル開発時は backend/.env.local に設定します(.env.example がテンプレート)。
関連ファイル
| 役割 | パス |
|---|---|
| CLI エントリーポイント | backend/src/scripts/enrich-companies.ts |
| アプリケーションサービス | backend/src/application/services/CompanyEnrichmentService.ts |
| Gemini API クライアント | backend/src/infrastructure/external/gemini/GeminiClient.ts |
| Gemini 型定義 | backend/src/infrastructure/external/gemini/types.ts |
| Company エンティティ | backend/src/domain/entities/Company.ts |
| CompanyRepository 実装 | backend/src/infrastructure/repositories/supabase/CompanyRepository.ts |
| MasterRepository 実装 | backend/src/infrastructure/repositories/supabase/MasterRepository.ts |
| 環境変数テンプレート | backend/.env.example |