Skip to content

企業エンリッチメント

概要

企業エンリッチメントバッチは、Gemini API(Google Search Grounding 有効)を使って企業の公式情報を自動取得し、面談シート用フィールドを補完するスクリプトです。

項目内容
目的企業の公式情報(HP、所在地、従業員数、上場市場、会社概要)を自動取得
使用 APIGemini 3 Flash Preview(Google Search Grounding 有効)
実行方法npm run enrich:companies [OPTIONS]
対象enrichment_status = 'pending' の企業(デフォルト)

処理フロー

ステップ詳細

  1. CLI 起動: enrich-companies.ts がコマンドライン引数をパースし、環境変数を検証
  2. 対象企業取得: companies テーブルから enrichment_status でフィルタリングして取得
  3. カテゴリマスタ取得: company_types テーブルから全カテゴリを取得(バッチ内でキャッシュ)
  4. 企業ループ: 各企業に対して順次処理(2 秒間隔)
  5. Gemini API 呼び出し: 企業カテゴリマスタを含むプロンプトで Google Search Grounding を使い企業の公式情報を検索・抽出
  6. 成功時: 面談シート用フィールド(HP、最寄り駅、従業員数、上場市場、会社概要)と情報源 URL を保存し、カテゴリマッピングの DELETE & INSERT を実行(status = 'success'
  7. 失敗時: エラーメッセージを記録(status = 'failed'

CLI オプション

オプション短縮形説明
--name-nstring企業名で絞り込み(部分一致)
--dry-run-dbooleanDB 保存せず結果を表示のみ
--force-fboolean処理済み(success/failed/skipped)も再実行
--limit-lnumber処理件数の上限を指定
--entry-platform-id-enumberエントリー媒体IDで絞り込み
--help-hbooleanヘルプを表示

使用例

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全件成功
11 件以上の失敗、または致命的エラー

データモデル

companies テーブル(エンリッチメント関連カラム)

カラム説明
homepage_urltext企業の公式サイト URL
nearest_stationvarchar(100)本社最寄り駅
employee_countvarchar(50)従業員数(例: 1,759名
stock_marketvarchar(50)上場市場(例: 東証プライム, 未上場
company_overviewtext会社概要(約 300 文字)
source_urlsjsonb情報取得元の公式ページ URL 一覧
enrichment_statusvarchar(20)ステータス(下記参照)
enrichment_errortext失敗時のエラーメッセージ
enriched_attimestamptz最終エンリッチメント実行日時

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
Temperature0.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 limit
  • timeout
  • 503
  • 429
  • temporarily

指数バックオフ

試行待機時間計算式
1 回目失敗1 秒1000 * 2^0
2 回目失敗2 秒1000 * 2^1
3 回目失敗最大試行回数に到達、エラー返却

JSON パースエラー

Gemini のレスポンスが JSON としてパースできない場合は即座にエラーとして処理されます(リトライ対象外)。

環境変数

変数名必須説明
GEMINI_API_KEYGemini API キー
SUPABASE_URLSupabase プロジェクト URL
SUPABASE_SERVICE_ROLE_KEYSupabase サービスロールキー(RLS バイパス)
NODE_ENVproduction 以外の場合 .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