緊急特集RAG × Jev ― ベクトル検索の次を、いま設計する(全5章)

URGENT FEATURECHAPTER 04 / 05

RAG×Jevハイブリッド設計
3ホップ実行と弱点の回避策

探索はJev、執筆はLLM。この分業を本番で破綻させないために、確信度による分岐と3つのガードレールを組み込みます。

公開 2026年11月3日読了目安 11分キーワード RAG/Jev/Corpus2Skill
  1. 概要
  2. 第1章
  3. 第2章
  4. 第3章
  5. 第4章
  6. 第5章
壁面ディスプレイの多層システム構成図を見つめるエンジニアたち
この章の要点
  • RAG×Jevの実行系は3ホップで組みます。Jevが2回(ルーティングと文書選別)、生成LLMが1回(回答の執筆)です。
  • Jevが返す確信度(confidence)で「直行・並列探索・打ち切り」を分けるのが設計の要です。
  • 当編集部の試算では、Corpus2Skill単体の実測値(1クエリ0.089〜0.172ドル)に対し、6〜9割程度のコスト削減余地があります。数字は前提しだいで大きく動きます。
  • 社内固有の用語、日本語の表記揺れ、部署をまたぐ固有名詞の3つはリスクとして想定し、ガードレールを先に設計しておきます。

第2章ではCorpus2Skillの「精度は高いが、遅くて高い」というジレンマを、第3章では判断だけを返すJevの性質を見てきました。この章では両者を1本の実行パイプラインにまとめ、実際のシステムとして動かすための設計を示します。「RAGにJevを足して速くしたい」と考えている方にとって、Jevをどこに置けば最も効くのかという問いへの、本特集としての答えになります。

結論を先に書くと、Jevはベクトル検索の結果を並べ替える役よりも、スキルツリーの分岐を選ぶ役に置いたときに最も力を発揮します。分岐の選択は「有限の選択肢から1つを選ぶ」作業であり、Jevが得意とする判断そのものだからです。

3ホップで動く実行パイプライン

ユーザーが質問を送ってから回答が表示されるまでの処理を、3つのホップに分けます。最初の2ホップは判断の工程なのでJevが担い、最後の1ホップだけを文章を書ける生成LLMに任せます。人間の思考になぞらえれば、System 1(直感的な判断)で道を選び、System 2(熟考)で文章を書く分業です。

ユーザーの 質問 再発行手順は? HOP 1 ・ Jev ゲートキーピング choice:第1層を選択 noul:緊急度を判定 1リクエストで並列 確信度を同時に取得 70〜500ms(公表値) HOP 2 ・ Jev 確信度で分岐 高→1クラスタへ直行 中→上位を並列探索 低→探索を打ち切り 候補をnoulで一括判定 上位doc_idを抽出 70〜500ms(公表値) HOP 3 ・ 生成LLM 原文取得と回答生成 documents.jsonから 原文全文を取り出す 質問+原文だけを渡す 回答に出典doc_idを付与 体感速度を決める工程 System 1:探索と選別(文章を書かない) System 2:執筆
図1:RAG×Jevの3ホップ実行パイプライン。判断の工程はJev、文章を書く工程だけを生成LLMが受け持ちます。

Hop 1:ゲートキーピングと第1層ルーティング

たとえば「インボイスの再発行手順は?」という質問が届いたとします。システムはまずJevのchoiceで、事前にコンパイルした第1層の知識クラスタから参照先を選ばせます。Jevのchoiceは、ラベルと説明文の対応(criteria)を最大255個まで受け付け、選んだラベルに加えてconfidence(確信度)と選択肢ごとのprobabilities(確率)を返します。

同じリクエストに、緊急度を問うnoul(Yes/Noの確率を返す判定)も入れておきます。Jevは1回のリクエストに含めた複数の質問を並列に評価するため、問いを1つ足しても往復の回数は増えません。ここで「この質問は業務停止や期限切迫に関わるか」を同時に見ておけば、後段で有人窓口への通知を並走させる判断にそのまま使えます。

POST /v1/decide — Hop 1 のリクエスト例(JSON)
{
  "model": "jev-1.13.0",
  "state": { "query": "インボイスの再発行手順は?" },
  "questions": {
    "target_cluster": {
      "type": "choice",
      "instructions": "state.query に答えるために参照すべき知識クラスタを1つ選ぶ。",
      "criteria": {
        "billing": "請求・支払い・適格請求書(インボイス)の発行と再発行、返金。給与の支払いは含まない",
        "hr_payroll": "給与・賞与・源泉徴収・年末調整。取引先への支払いは含まない",
        "other": "上記のいずれにも当てはまらない質問、雑談、社外の一般知識"
      }
    },
    "is_urgent": {
      "type": "noul",
      "instructions": "利用者は業務停止や期限切迫のため、至急の対応を求めている。"
    }
  }
}

返ってくるanswers.target_clusterにはchoice・confidence・probabilitiesが、answers.is_urgentにはnoul(Yesの確率)が入ります。文章を解析する必要がなく、型の決まった値をそのまま分岐に使えることが、生成LLMでルーティングする場合との大きな違いです。

Hop 2:確信度による分岐と文書の一括選別

Hop 2の前半は、Hop 1の確信度に応じて探索の範囲を決める工程です(詳しくは次節)。範囲が決まったら、対象クラスタのINDEXに載っている候補文書をすべて集め、「この質問に答えるには、この文書を参照する必要がある」というnoulを文書の数だけ並べて、1回のリクエストで判定させます。数十件の候補でも、生成LLMのように1件ずつ読ませる必要はありません。

注意したいのは入力の上限です。Jevは「state+すべての質問」で64kトークン、「state+最も長い質問」で32kトークンという上限を設けています。候補が数百件に及ぶ場合は、文書の要約を短く保ったうえで、バッチに分けて同時に送ります。

hop2_batches.py — 候補文書を入力上限内のバッチに分ける
# 日本語は1文字≒1トークン以上と見て、安全側に文字数で見積もる
BUDGET_TOKENS = 48_000   # 上限64kに対し余裕を残す

def split_batches(query: str, candidates: dict[str, str]) -> list[dict[str, str]]:
    batches, current, used = [], {}, len(query) + 500
    for doc_id, summary in candidates.items():
        cost = len(summary) + 80   # 要約+定型の指示文
        if current and used + cost > BUDGET_TOKENS:
            batches.append(current)
            current, used = {}, len(query) + 500
        current[doc_id] = summary
        used += cost
    if current:
        batches.append(current)
    return batches   # 各バッチを並列に /v1/decide へ送る

Hop 3:原文全文の取得と回答生成

Hop 2で抽出した上位数件のdoc_idをもとに、documents.jsonからチャンク分割されていない原文全文を取り出します。生成LLM(Claude Sonnet 4.6などの汎用モデル)には、ユーザーの質問と原文だけを渡し、回答の末尾に参照したdoc_idと文書名を出典として書かせます。探索の過程で読んだ要約は渡しません。要約の伝言ゲームで事実が歪むのを防ぎ、根拠を原文に限定するためです。

確信度で分岐させる設計

このアーキテクチャの要は、Jevの確信度を使って探索の範囲を変えることにあります。Corpus2Skill単体では、エージェントが枝を間違えたら親に戻ってやり直す「バックトラック」で回復していました。確実ですが、戻るたびに生成LLMの呼び出しが1回増え、待ち時間が延びます。RAG×Jevの構成では、迷いを確率として先に受け取れるので、戻る代わりに最初から複数の枝を同時に開くことができます。

Hop 1 の choice 結果 confidence と probabilities 0.75以上 0.35〜0.75 0.35未満 高確信度 選ばれた1クラスタへ直行 候補文書が最も少ない 最短・最安の経路 想定:質問の多数派 中確信度 確率0.15以上の上位を 最大3クラスタ並列探索 戻らずに取りこぼし防止 投機的ファンアウト 低確信度・other 探索をここで打ち切る 定型応答か有人窓口へ 生成LLMを呼ばない コスト削減の要 ※閾値は初期値の例です。自社のQAセットで必ず校正してください
図2:確信度による3分岐。迷いを確率で受け取れるため、バックトラックの代わりに並列探索で回復します。

高確信度:1つのクラスタへ直行する

確信度が十分に高ければ、選ばれたクラスタだけを開きます。候補文書が最も少なく、Hop 2の入力も最小で済むため、速度とコストの両面で最も有利な経路です。社内ヘルプデスクの問い合わせのように、話題の偏りが大きい用途では、この経路を通る質問が多数を占めると見込めます。

中確信度:投機的ファンアウトで並列探索する

ここがハイブリッド構成の肝です。「請求のクラスタかもしれないし、契約のクラスタかもしれない」とJevが迷った場合、順番に試すのではなく、probabilitiesが一定以上の上位クラスタ(最大3つ程度)の候補文書をまとめてHop 2の判定にかけます。バッチは同時に送れるので、開く枝が増えても待ち時間はほとんど延びません。増えるのはJevの入力トークンだけで、その単価は生成LLMより桁違いに安いため、取りこぼしを防ぐ保険として割に合います。

低確信度:生成LLMを動かす前に止める

どのクラスタの確率も低い、あるいはotherが選ばれた場合は、その時点で探索を打ち切ります。コーパスに答えがない質問に対して生成LLMを呼べば、費用がかかるうえに、根拠のない回答を作るリスクも高まります。「該当する社内資料が見つかりませんでした」という定型応答を返すか、問い合わせフォームや有人窓口に案内します。最も高価な工程を省けるこの分岐は、コスト削減の要でもあります。

表1:閾値パラメータの設計(初期値は例。自社データで校正する前提)
パラメータ初期値の例役割調整の方向
high_conf0.75これ以上なら1クラスタへ直行誤ルーティングが多ければ上げる
min_conf0.35これ未満なら探索を打ち切る「見つからない」の誤判定が多ければ下げる
branch_cutoff0.15ファンアウト対象にする確率の下限日本語環境では低めに設定し広く開く
max_fanout3並列探索するクラスタ数の上限入力トークンと再現率のバランスで決める
doc_noul0.55文書を回答の根拠に採用する下限値が団子状なら相対順位の上位k件に切り替える
top_k_docs3Hop 3に渡す原文の最大件数原文が長いほど小さくする(費用に直結)
routing_policy.json — 閾値は設定ファイルに外出しする
{
  "model": "jev-1.13.0",
  "high_conf": 0.75,
  "min_conf": 0.35,
  "branch_cutoff": 0.15,
  "max_fanout": 3,
  "doc_selection": { "mode": "threshold", "doc_noul": 0.55, "top_k": 3 },
  "fallback": { "message_id": "not_found_v2", "notify_if_urgent": true }
}

閾値をコードに埋め込まず設定ファイルに出しておくと、モデルのバージョンを上げたときや、評価で傾向が変わったときに、デプロイせずに調整できます。doc_selection.modeを"rank"に切り替えれば、絶対値ではなく相対順位の上位k件を採る運用にも移れます。

コストとレイテンシの試算

原稿段階では「84〜94%のコスト削減」「2秒前後で回答開始」という見積もりを掲げていましたが、これはベンダーや論文が公表した値ではありません。ここでは前提を明示した編集部の試算として、計算の過程ごと示します。比較の基準は、Corpus2SkillのWixQAベンチマークで報告された1クエリあたり0.172ドル(プロンプトキャッシュなし)と0.089ドル(キャッシュあり)です(コスト構造とプロンプトキャッシュ参照)。

表2:1クエリあたりのコスト試算(編集部試算・前提つき)
工程前提試算A(原文が長め)試算B(原文が短め)
Hop 1(Jev)質問+第1層60クラスタの説明で約2,500トークン約0.0001ドル(公式単価 $0.042/100万トークン)
Hop 2(Jev)3クラスタ×30文書×約100トークンで約9,000トークン約0.0004ドル(再販経由 $0.42 なら約0.004ドル)
Hop 3 入力指示1,000トークン+原文3件。生成LLMの単価は入力$3/100万トークンと仮定原文3×2,500 → 8,500トークン:約0.026ドル原文3×1,200 → 4,600トークン:約0.014ドル
Hop 3 出力回答400トークン、出力単価$15/100万トークンと仮定約0.006ドル約0.006ドル
合計Jevは再販単価でも1セント未満約0.032ドル約0.020ドル
削減率(対0.172ドル)キャッシュなしのCorpus2Skill約81%約88%
削減率(対0.089ドル)キャッシュありのCorpus2Skill約64%約78%

試算から読み取れるのは、Jevの費用は全体の数パーセント以下にとどまり、総額を決めるのはHop 3に渡す原文の長さと件数だという点です。規程集のように1文書が長いコーパスでは、Hop 2で件数を絞る精度がそのまま費用に効きます。一方で、Corpus2Skill単体で効いていたプロンプトキャッシュの割引(入力の約70%がキャッシュ読み取り)は、毎回中身の変わるHop 3には効きにくい点にも注意が必要です。

表3:回答の書き出しまでのレイテンシ予算(Jev以外の値は仮定)
工程目安根拠
Hop 1(Jev)150〜500ms公表値70〜500ms、利用者の報告でp50約150ms・p95約350ms
Hop 2(Jev・並列バッチ)150〜500ms同上。バッチは同時送信するため件数で直列に延びない
原文の読み出し数十ms以内ローカルのdocuments.jsonをメモリに保持する前提
Hop 3 最初のトークン0.8〜1.5秒生成LLMの応答開始時間を仮定(モデルと混雑で変動)
合計(書き出しまで)約1.1〜2.5秒ストリーミング表示を前提
参考:LLMで探索する場合探索4ステップ×2〜4秒+回答1判断ごとに生成LLMを呼ぶと仮定した場合の目安
3回
1クエリあたりのAPI呼び出し(Jev 2回+生成LLM 1回)
1〜2.5秒
回答の書き出しまでの試算(仮定を含む)
6〜9割
Corpus2Skill単体比のコスト削減余地(編集部試算)
要実測
自社コーパスでの評価なしに数字を約束しない

Jev前提のツリー設計

Corpus2Skillの既定設定は、子ノード数(分岐率)--p 10、トップレベルスキル数--max-top 8です。これは生成LLMが目次を読んで枝を選ぶ前提で、1回に見せる選択肢を少なめに抑えた形といえます。Jevで分岐を選ぶ場合、1回のchoiceで最大255の選択肢を扱えるため、浅く広い木に組み替える余地が生まれます。段数が減れば、そのまま呼び出し回数と待ち時間が減ります。

ただし、255個を使い切るのが最適とは限りません。選択肢が増えるほど似た説明のクラスタが並び、確率が分散して中確信度の判定が増えるからです。実務では第1層を数十〜百程度に収め、2層目をINDEXの文書リストにする2階層構成から始め、評価結果を見て広げるのが堅実です。リーフのINDEXを親に統合する--compactも、浅い木を作る手段になります。

criteria は「要約」ではなく「判定基準」として書く
  • 何を含むかだけでなく、何を含まないか(隣接クラスタとの境界)を書く。
  • 社内のシステム名・略語・旧称は、正式名称と並べて定義する。
  • 説明の長さをクラスタ間でそろえる。説明の長いクラスタに確率が偏るのを防ぐ。
  • 必ずother(該当なし)を用意し、打ち切りの経路を確保する。

想定すべき3つのリスクと対策

ここまでの設計は、Jevの判断がおおむね正しいことを前提にしています。しかしJevは、判断の理由を説明しません。多段の推論も行いません。出力の形式が崩れないことと、選んだ答えが正しいことは別問題で、選択肢を取り違える可能性は常に残ります。ベンダーが公表する性能も自社による評価が中心で、独立した検証はまだ乏しい段階です。そこで、次の3つを「起こりうるもの」として先に手当てしておきます。

リスク1:社内固有の用語とルール

Jevは一般的な語彙の判断は得意と考えられますが、学習データにない社内のプロジェクト名や独自ルールについては、知らないまま高い確信度で誤る可能性があります。対策は、Corpus2Skillのコンパイル段階で生成される要約を、そのままcriteriaに流用しないことです。社内システム名の定義、略語の正式名称、除外条件を判定基準として書き足した「ルールブック版」のcriteriaを別に管理します。判断材料を言語化して渡すほど、Jevの選択は安定します。

リスク2:日本語の曖昧さと表記揺れ

日本語での精度について、公開された独立検証は見当たりません。ただ、当サイトの運営で日本語ページの広告配置の判定にJevを使った際、noulの値がページを問わず0.65〜0.71の狭い幅に固まり、絶対的な閾値では差がつかなかった経験があります。このときは、ページ内での相対順位で採否を決める方式に切り替えました。日本語環境では、閾値を初期値のまま信じず、自社のQAセットで分布を確かめてから決めるべきです。ファンアウトの下限(branch_cutoff)はやや低めにし、迷ったら広く探す側に倒しておくと安全です。

リスク3:部署をまたぐ固有名詞

Corpus2Skillは文書を話題で分類するため、「A社とのこれまでのやり取り」のように、営業・法務・開発の各クラスタに散らばる固有名詞の質問を苦手とします。木構造の外側に、社名・製品名から文書IDを引ける逆引き辞書(エンティティ索引)を用意しておき、質問に登録済みの固有名詞が含まれていれば、該当文書をHop 2の候補に合流させます。ツリーの代わりに実体と文書のグラフで索引を作るCorpusMapという提案もあり、この弱点に対する一つの方向を示しています。

A社との 契約の経緯は? Jevのツリー探索 トピック軸:営業クラスタ 逆引き辞書の照合 実体軸:法務・開発の文書 候補を合流し noulで一括判定 Hop3
図3:固有名詞を含む質問では、トピック軸の探索結果と実体軸の索引結果を合流させてから選別します。
表4:リスクとガードレールの対応
リスク起こりうる症状ガードレール効果の確かめ方
社内固有の用語知らない略語で高確信度の誤ルーティングcriteriaに定義・別名・除外条件を明記社内用語を含む質問だけを集めた評価セット
日本語の表記揺れ確率が団子状になり閾値が効かない閾値の校正、相対順位方式、広めのファンアウト確信度の分布と正答率の対応表
部署横断の固有名詞1クラスタの文書しか集まらない逆引き辞書で候補を合流根拠文書への到達率(コンテキスト再現率)

本番運用で守ること

最後に、運用面の決まりごとを挙げます。第一に、モデルのバージョンを固定します(例:jev-1.13.0)。確率の出方はバージョンで変わりうるため、jev-latestのまま本番を回すと、ある日突然閾値の意味が変わります。更新は評価セットで比較してから切り替えます。

第二に、障害と残高への備えです。Jevは残高不足で402、上流の障害で502を返します。502はバックオフしながら再試行し、それでも失敗したら、ルーティングだけを生成LLMに肩代わりさせる経路に落とします。遅く高くはなりますが、回答は止まりません。前払いのクレジットで運用する場合は、応答に含まれる残高を監視し、尽きる前に切り替えておくと安全です。

第三に、判断ログと評価の継続です。各ホップで選ばれたクラスタ、確信度、採用したdoc_idを記録しておけば、誤答の原因が「枝の選択」「文書の選別」「回答の執筆」のどこにあるかを切り分けられます。Corpus2Skillに同梱された評価モジュールでQAセットを定期的に回し、品質と1クエリあたりの費用を同じ表で追う運用は、エンタープライズ活用で触れた適用判断にもそのまま役立ちます。

次章では実装コードを公開します

この章で設計したHop 1とHop 2を、Jevの/v1/decideを直接呼ぶPythonコードとして実装し、Hop 3の生成LLMへの受け渡しまでを示します。続きは第5章:実装コードとユースケースへ。

参考資料・情報ソース

  1. Yiqun Sun, Pengfei Wei, Lawrence B. Hsieh「Corpus2Skill: Distilling Enterprise Knowledge into Navigable Agent Skills for QA and RAG」arXiv:2604.14572(EMNLP 2026 Findings採択) https://arxiv.org/abs/2604.14572
  2. Corpus2Skill 公式リポジトリ(GitHub) https://github.com/dukesun99/Corpus2Skill
  3. JevTypeSafeAI API Docs(/v1/decide の質問型・応答形式・入力上限・エラー体系) https://jevtypesafeai.com/docs
  4. Vercel「AI Gateway now supports TypeSafe clients and an HTTP API for Jev」(2026年9月21日) https://vercel.com/changelog/ai-gateway-now-supports-typesafe-clients-and-an-http-api-for-jev
  5. DataCamp「System One モデル Jev」解説記事 https://www.datacamp.com/ja/blog/system-one-models-jev
  6. Pasquale Pillitteri「TypeSafe launches Jev, a chatless AI model」 https://pasqualepillitteri.it/en/news/16460/typesafe-jev-chatless-ai-beats-claude
  7. Data Science Ocean「CorpusMap」論文紹介 https://datasciocean.com/en/paper-intro/corpusmap/
  8. 当サイト「コスト構造とプロンプトキャッシュ」(WixQAでの0.172→0.089ドルの内訳)