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 message“Q4 の展開前に SSO とセキュリティレビューが必要です。400 シートの見積もりをいただけますか?”
Jev 判定出力
~95ms / $0.00004priority · 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]