Jev Recipe / 営業パイプライン

Jev で作る AI リードスコアリング:型安全 Score スキーマと CRM ルーティング

リード記録を優先度スコア・ホットリード判定・CRM セグメントへ一括変換。しきい値はプロンプトではなくアプリケーションコード側で管理します。

AIリードスコアリング導入 6 ステップ

01優先度判定に直接影響する項目(企業規模、業種、役職、問い合わせ本文、価格ページ閲覧数などの意図シグナル)だけを State に集約し、判定に無関係な個人情報は除外する。
02Score の criteria を ICP の順序付きラダーとして設計する。1(不適合)から 4(即フォロー)まで、各ティアに対応する営業アクションを一意に紐付ける。
03priority Score、is_hot_lead Noul(担当者への即時通知要否)、segment Choice(CRM セグメント)を 1 回の evaluate 呼び出しにまとめる。
04しきい値はアプリケーションコードに置く。priority ≥ 3 かつ確度 ≥ 0.85 なら CRM へ自動登録し、それ未満は SDR のレビューキューへフォールバックさせる。
05受注・失注済みの過去リードでバックテストし、実際の成約率に基づいてティア定義としきい値を再較正する。ICP が変わったタイミングで見直す。
06CRM に接続する。priority をリードステータスへ、segment を顧客セグメント項目へマッピングし、しきい値未満の確度は自動でヒューマンタスクを生成する。
schema / リードスコアリング判定コントラクト
{
  "priority": {
    "type": "score",
    "instructions": "このリードの営業フォロー優先度を評価",
    "criteria": {
      "1": "不適合:対象セグメント外で予算兆候なし",
      "2": "可能性あり:課題は実在するが育成が必要",
      "3": "高適合:ICP に合致し明確な意図あり",
      "4": "即フォロー:適合度と意図がどちらも高い"
    }
  },
  "is_hot_lead": {
    "type": "noul",
    "instructions": "1営業時間以内に担当営業へ通知すべきか?"
  },
  "segment": {
    "type": "choice",
    "instructions": "CRM セグメントを判定",
    "criteria": {
      "enterprise": "従業員500名以上またはエンタープライズドメイン",
      "mid_market": "従業員50〜499名",
      "smb": "従業員50名未満",
      "self_serve": "個人またはトライアル登録"
    }
  }
}
実際のリード情報を State として送り、priority・is_hot_lead・segment の判定と確度を確認できます。
インタラクティブデモ / リードスコアリング

Jev AIリードスコアリング & CRM ルーティングシミュレーター

サンプルリードを選んで Score スキーマを実行。確度が誰の手元に先に届くかを確認できます:

較正済み確度が有効
priority / is_hot_lead / segment
companyAcme Cloudtitleエンジニアリング担当 VP employees800 pricing_page_views_7d6 messageQ4 の展開前に SSO とセキュリティレビューが必要です。400 シートの見積もりをいただけますか?
Jev 判定出力
~95ms / $0.00004
priority · scoreconfidence
4 / 497.0%
is_hot_lead · noul true
segment · choiceエンタープライズ
ルーティング判定(ポリシーはコード側)
PAGE_REP_NOW(担当者へ即時通知)

ホットリード: priority 4 かつ高確度 — 1営業時間以内に担当者へ通知します。

コード側のポリシー: priority ≥ 3 かつ confidence ≥ 0.85 → CRM 自動登録(is_hot_lead = true なら即時通知)· それ未満 → SDR レビューキュー · priority 1 → ナーチャリング

リードスコアリング比較:Jev 型安全スコア vs 生成系 LLM スコアリング

METRIC
Jev
生成系 LLM スコアリング
中央値レイテンシ (P50)
~95ms

単一フォワードパス、生成なし

1500〜3000ms

トークン単位の JSON 生成

1000リードあたりコスト
約 $0.05

入力のみ課金、出力トークンゼロ

$0.30〜$1.20

入力+生成トークンの双方課金

出力の決定性
決定論的

同一リードは常に同一ティアに判定

確率的

サンプリング揺らぎで境界リードの判定がブレる

確度の品質
較正済み確率

しきい値で自動化ゲートを直接制御

自己申告

未較正、logprob の追加実装が必要

フォーマットエラー率
0%

Score / Noul / Choice はネイティブ出力

2〜8% が不正 JSON、パースリトライループが必要
自由文の意図理解
問い合わせ本文と行動シグナルを同一パスで採点
可能だが、リード規模では低速かつ高コスト

実装コード:リード採点と CRM ルーティング

typescript / jev リードスコアリングと CRM ルーティング
type LeadState = {
  company: string;
  employees: number;
  title: string;
  message: string;
  pricing_page_views_7d: number;
};

// ポリシーはプロンプトではなくアプリケーションコードに置く
const AUTO_ROUTE_MIN_SCORE = 3;
const AUTO_ROUTE_MIN_CONFIDENCE = 0.85;

export async function scoreLead(lead: LeadState) {
  const response = await fetch("https://api.typesafe.ai/v1/jev/evaluate", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({
      state: lead,
      questions: {
        priority: {
          type: "score",
          instructions: "営業フォロー優先度を評価",
          criteria: {
            "1": "不適合",
            "2": "可能性あり",
            "3": "高適合",
            "4": "即フォロー",
          },
        },
        is_hot_lead: {
          type: "noul",
          instructions: "1営業時間以内に担当営業へ通知すべきか?",
        },
        segment: {
          type: "choice",
          instructions: "CRM セグメントを判定",
          criteria: {
            enterprise: "従業員500名以上",
            mid_market: "従業員50〜499名",
            smb: "従業員50名未満",
          },
        },
      },
    }),
  });
  if (!response.ok) throw new Error("Jev evaluate failed");
  const data = await response.json();

  const { priority, is_hot_lead, segment } = data;
  const confident = priority.confidence >= AUTO_ROUTE_MIN_CONFIDENCE;

  if (priority.answer >= AUTO_ROUTE_MIN_SCORE && confident) {
    return {
      route: is_hot_lead.answer ? "page_rep_now" : "crm_auto",
      priority: priority.answer,
      segment: segment.answer,
      confidence: priority.confidence,
    };
  }
  // スコアまたは確度がしきい値未満 → SDR レビューキューへ
  return {
    route: "sdr_review",
    priority: priority.answer,
    segment: segment.answer,
    confidence: priority.confidence,
  };
}

// 典型パス:1リードあたり ~95ms、入力トークンのみ課金、スキーマエラー 0%
python / jev バッチリードスコアリング
import requests

JEV_ENDPOINT = "https://api.typesafe.ai/v1/jev/evaluate"
AUTO_ROUTE_MIN_SCORE = 3
AUTO_ROUTE_MIN_CONFIDENCE = 0.85

QUESTIONS = {
    "priority": {
        "type": "score",
        "instructions": "営業フォロー優先度を評価",
        "criteria": {
            "1": "不適合",
            "2": "可能性あり",
            "3": "高適合",
            "4": "即フォロー",
        },
    },
    "is_hot_lead": {
        "type": "noul",
        "instructions": "1営業時間以内に担当営業へ通知すべきか?",
    },
}

def score_lead(lead: dict) -> dict:
    resp = requests.post(
        JEV_ENDPOINT,
        json={"state": lead, "questions": QUESTIONS},
        timeout=5,
    )
    resp.raise_for_status()
    result = resp.json()
    priority = result["priority"]
    hot = result["is_hot_lead"]

    if (
        priority["answer"] >= AUTO_ROUTE_MIN_SCORE
        and priority["confidence"] >= AUTO_ROUTE_MIN_CONFIDENCE
    ):
        route = "page_rep_now" if hot["answer"] else "crm_auto"
    else:
        route = "sdr_review"

    return {
        "lead_id": lead.get("id"),
        "priority": priority["answer"],
        "confidence": priority["confidence"],
        "route": route,
    }

def score_batch(leads: list[dict]) -> list[dict]:
    # 1リード ~95ms: 夜間バッチで 1 万リードなら約 16 分で完了し、
    # CRM API のレート制限にも余裕で収まります。
    return [score_lead(lead) for lead in leads]

スコアリングパイプラインを運用へ