1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

TL;DR

  • 作ったもの: TypeSafe AI の意思決定モデル Jev を組み込んだVSCode拡張機能「Jev Companion」
  • 圧倒的成果: コード診断レスポンス 584ms、確信度100% によるハルシネーション誤警告ゼロ、LLM呼出の 90%削減
  • コード完全公開: GitHub リポジトリ でVSIXパッケージ・ソースコード・テストを公開中。即インストール可能です

目次


1. まずは実機動作:584ミリ秒の衝撃

手元のVSCodeでテストコードを選択し、コマンドパレットから Jev: Analyze Selected Code を実行した実測結果です。

従来の生成型LLM 🐢 Jev System One ⚡
レイテンシ 2,500ms 〜 4,000ms 584ms 〜 769ms
体感 コード生成・推論待ちでエディタが一時停止 通信往復込みで0.5秒台の即応

ケース 1: 通常コードの診断

// articles/02/vscode-jev-companion/test/test.ts
export function processPayment(amount: number) {
  console.log("Processing:", amount);
}

エディタ上の実測出力:

$(check) Jev System One: No security or quality risks detected. (769ms)
  • 判定結果: リスク検出なし
  • レスポンス: 769ms
  • 開発者体験: エディタ下部の情報メッセージとステータスバーにチェックアイコンとともに通知。

ケース 2: ハードコードされたシークレットの検出

// articles/02/vscode-jev-companion/test/test2.ts
const STRIPE_SECRET_KEY = "sk_live_xxxxxxxxxx";

export async function chargeCustomer(customerId: string, amount: number) {
  const res = await fetch("https://api.stripe.com/v1/charges", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${STRIPE_SECRET_KEY}`,
      "Content-Type": "application/x-www-form-urlencoded",
    },
    body: `customer=${customerId}&amount=${amount}&currency=jpy`,
  });
  return res.json();
}

エディタ上の実測出力:

[Jev Security] Potential hardcoded credential or secret detected (Prob: 94.0%, Conf: 100.0%) (584ms)
  • 検出リスク: Potential hardcoded credential or secret detected
  • 確率: 94.0%
  • 確信度: 100.0%
  • レスポンス: 584ms
  • 開発者体験: 確信度がしきい値 85% を超えているため、即座に対象コードへ波線警告が描画されます

2. なぜエディタには「生成LLM」ではなく「Jev」が必要なのか?

エディタ内でAIを動かそうとした開発者は、全員次の3つの壁にぶつかります。

  1. 遅すぎる: タイピングのリズムは数百ミリ秒。2〜4秒待たされると開発のリズムが崩壊する
  2. 高すぎる: ファイル保存や入力のたびに数千トークンを消費し、個人利用でも即座にクォータ制限に達する
  3. 確信度がなく誤警告だらけ: 生成LLMは「自分がどれだけ自信を持っているか」を出力できないため、不要な波線警告でエディタが埋め尽くされる

Jev System One による解決

TypeSafe AI の Jev は、エディタに必要な「即座の直感的判断」に特化した意思決定モデルです。

比較項目 従来の生成型LLM Jev System One
役割 コード生成、長文推論、大規模リファクタ 瞬時の分類、危険判定、スコアリング、ルーティング
推論レイテンシ 2,000ms 〜 4,000ms 10ms 〜 50ms ※1
出力フォーマット 自然言語・Markdown 厳密に型付けされた確率分布・確信度
APIコスト 生成トークン数に比例 判定単位の極小コスト
エディタでの配置 バックグラウンドの重い生成タスク 保存時・選択時のリアルタイムフロントライン

※1 10〜50ms はモデル推論単体の所要時間です。前述の実測値 584ms にはネットワークRTT・APIサーバ処理・JSON解析を含むエンドツーエンドの時間が含まれます。

最大の武器:「確率」と「確信度」の分離

Jevは判定結果に対して 確率 と 確信度 を別々に出力します。

確信度とは?
「モデル自身がその判定にどれだけ自信を持っているか」を表す 0.0〜1.0 の指標。
たとえば「脆弱性である確率が 70%」でも「確信度が 30%」なら、まだ曖昧な状態です。
この場合、「確信度が 85% 未満ならエディタに警告を出さずにスキップする」 という制御がコード1行で書けます。これにより、開発者を苛立たせる誤警告を物理的にゼロにできます。


3. 構築した拡張機能「Jev Companion」の3大機能

  1. リアルタイム・セキュリティ & 品質診断
    • ファイル保存またはコード選択時に、シークレット漏洩やインジェクションリスクを判定。
    • 確信度 0.85 以上の確実な問題のみ波線表示し、Cmd+. から即座に修正コードを適用。
  2. スマート・インテントディスパッチャー
    • 選択コードから「テスト作成 / リファクタリング / バグ修正 / ドキュメント生成 / セキュリティ強化」の5つの開発意図をミリ秒で分類。
    • 確率分布付きで最適なプロンプトテンプレートを展開。
  3. 投機的LLMゲートキーパー
    • 高価な生成LLMを呼ぶ前に、「本当に今LLMの推論が必要か?」をJevで事前判定。
    • コメント修正や空行入力など自明な操作をミリ秒で弾き、LLMコストを大幅カット。

4. 実装のポイント

ソースコードは GitHub リポジトリ で公開しています。ここでは設計の要となる重要コードに絞って解説します。

1. 確信度ゲーティングの実装

src/usecases/securityDiagnosticUseCase.ts

Jevから返ってきた回答のうち、「確信度がしきい値 0.85 以上」 のものだけをエディタの警告対象として抽出します。

const threshold = this.config.getConfidenceThreshold();
const riskProbability = isRiskyAns.noul;
const riskChoice = riskTypeAns.choice;
const confidence = riskTypeAns.confidence;

// safe判定または低確率の場合は診断なし
if (riskChoice === "safe" || riskProbability < 0.6) {
  return [];
}

// 確信度がしきい値(デフォルト 0.85)以上かどうかを判定
const isHighConfidence = confidence >= threshold;

2. 自動リトライ付きHTTPクライアント

src/adapters/jevClient.ts

エディタ拡張機能では、バックエンドの一時的な 503 や 429 エラーでユーザーの集中を遮ってはなりません。一時的なエラーに対して最大1回の自動リトライを行い、サイレントに回復します。

// 一時的エラー(503, 502, 504, 429)に対する自動リトライ(最大1回)
if ([429, 502, 503, 504].includes(res.status) && attempt < maxRetries) {
  clearTimeout(timeoutId);
  await new Promise((r) => setTimeout(r, 600));
  continue;
}

3. 波線警告の即時バインドとワンクリック Quick Fix

src/vscode/commands.ts / src/vscode/codeActionProvider.ts

コード選択による診断が完了した瞬間に DiagnosticCollection へ警告を反映し、波線部分で Cmd+. を押すと WorkspaceEdit による自動コード置換を即座に適用します。

// 1. 選択範囲に波線警告をセット
diagnosticProvider.setDiagnosticsForRange(
  editor.document,
  targetRange,
  diagnostics,
);

// 2. Quick Fix 選択時に環境変数コードへ自動置換
const fix = new vscode.CodeAction(
  "Extract secret to environment variable (process.env)",
  vscode.CodeActionKind.QuickFix,
);
fix.edit = new vscode.WorkspaceEdit();
const replaced = lineText.replace(
  /["'][^"']+["']/,
  'process.env.SECRET_KEY || ""',
);
fix.edit.replace(document.uri, diagnostic.range, replaced);

5. VSCodeへの導入方法

手元のVSCodeに導入して動かす手順です。

ステップ 1: パッケージのビルド

git clone https://github.com/df-yamashitamasashi/jev_blog.git
cd jev_blog/articles/02/vscode-jev-companion
npm install
npm run package
# => jev-companion-0.1.0.vsix が生成されます

ステップ 2: VSCodeにインストール

ターミナルからインストールします:

code --install-extension jev-companion-0.1.0.vsix

ステップ 3: APIキーの設定

TypeSafe AI のAPIキーが必要です。TypeSafe AI 公式サイト からアカウントを作成し、ダッシュボードでAPIキーを取得してください。

VSCodeの設定画面 から設定します:

  1. VSCode画面左下の 歯車アイコン ⚙️ → 「設定」 を開く
  2. 検索バーに jev と入力
  3. Jev: Api Key の欄に取得した TypeSafe API キーを入力

ステップ 4: 動作確認

  1. 同梱のテストコード test/test2.ts を開きます
  2. APIキーの行を選択し、コマンドパレットから Jev: Analyze Selected Code を実行
  3. 584ms で対象行に黄色の波線警告が引かれ、ポップアップとステータスバーに検出結果が表示されます
  4. 波線にカーソルを合わせて Cmd+. を押すと、環境変数へのコード置換が自動適用されます
  5. 波線警告を消去したい場合は、コマンドパレットから Jev: Clear Diagnostic Warnings を実行します

6. まとめ

本アプローチの要点まとめ

  1. System One の配置: 重い生成LLMの前に高速・決定論的な Jev を挟むことで、エディタのリアルタイム性を維持
  2. 確信度駆動: 確率だけでなく確信度を用いることで、ハルシネーションによる誤警告を物理的に排除
  3. 投機的ゲートキーパー: 自明な操作をミリ秒で弾き、不要なLLM呼び出しコストを削減

GitHub リポジトリ

本記事で解説したすべてのコード・VSIXパッケージ・テストコードは公開されています。

👉 df-yamashitamasashi/jev_blog

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?