llm について
プロジェクトの LLM 機能を開発・保守する担当者向けの実装ガイドです。コード構成、プロンプト、出力検証、ログ、エラー処理、型安全性、草稿の帰属バージョン管理を扱います。
主な機能
- 01LLM 関連ディレクトリと主要ファイルの説明
- 02プロンプトと Zod による出力検証
- 03ログ、エラー処理、リトライの説明
- 04入力形式と型安全性の重視
- 05草稿変更時のバージョン更新要件
活用シーン
- 01スキーマ検証付きの LLM 機能の実装
- 02AI 呼び出しへのログとフォールバック追加
- 03返信草稿の変更と帰属バージョンの更新
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ elie222/ inbox-zero --skill llmインストール後、Claude Code で/llmを入力して読み込まれたか確認します。
詳細
LLM 実装ガイドライン
ディレクトリ構成
LLM 関連のコードは、用途に応じた特定のディレクトリに整理されています。
apps/web/utils/ai/- 主な LLM 実装apps/web/utils/llms/- LLM のコアユーティリティと設定apps/web/__tests__/- LLM 専用のテスト
主なファイル
utils/llms/index.ts- LLM のコア機能utils/llms/model.ts- モデル定義と設定utils/usage.ts- 使用状況の追跡と監視
実装パターン
LLM 関連の関数には、次の標準的な構成に従ってください。
import { z } from "zod";
import { createScopedLogger } from "@/utils/logger";
import { chatCompletionObject } from "@/utils/llms";
import type { EmailAccountWithAI } from "@/utils/llms/types";
import { createGenerateObject } from "@/utils/llms";
export async function featureFunction(options: {
inputData: InputType;
emailAccount: EmailAccountWithAI;
}) {
const { inputData, user } = options;
if (!inputData || [other validation conditions]) {
logger.warn("Invalid input for feature function");
return null;
}
const system = `[Detailed system prompt that defines the LLM's role and task]`;
const prompt = `[User prompt with context and specific instructions]
<data>
...
</data>
${emailAccount.about ? `<user_info>${emailAccount.about}</user_info>` : ""}`;
const modelOptions = getModel(emailAccount.user);
const generateObject = createGenerateObject({
userEmail: emailAccount.email,
label: "Feature Name",
modelOptions,
});
const result = await generateObject({
...modelOptions,
system,
prompt,
schema: z.object({
field1: z.string(),
field2: z.number(),
nested: z.object({
subfield: z.string(),
}),
array_field: z.array(z.string()),
}),
});
return result.object;
}
ベストプラクティス
-
システムプロンプトとユーザープロンプト:
- システムプロンプトとユーザープロンプトは分けてください
- システムプロンプトでは、LLM の役割とタスクの仕様を定義してください
- ユーザープロンプトには、実際のデータとコンテキストを含めてください
-
スキーマ検証:
- レスポンスを検証するため、必ず Zod スキーマを定義してください
- LLM の出力を適切に導けるよう、スキーマは可能な限り具体的にしてください
-
ロギング:
- 各機能に説明的なスコープ付きロガーを使用してください
- 適切なログレベルで入力と出力を記録してください
- ログメッセージには関連するコンテキストを含めてください
-
エラー処理:
- 無効な入力に対して早期リターンを実装してください
- 適切なエラー型とロギングを使用してください
- AI の失敗に備えてフォールバックを実装してください
- 一時的な障害に対して、
withRetryを使用したリトライロジックを追加してください
-
入力のフォーマット:
- プロンプト内のデータ構造化には、XML 風のタグを使用してください
- 過剰な空白を削除し、長い入力は切り詰めてください
- 類似する関数間でデータ形式を統一してください
-
型安全性:
- すべてのパラメーターと戻り値に TypeScript の型を使用してください
- 複雑な入出力構造には、明確なインターフェースを定義してください
-
コードの整理:
- 関連する AI 関数は、同じファイルまたはディレクトリにまとめてください
- 共通パターンはユーティリティ関数に切り出してください
- 複雑な AI ロジックには、わかりやすいコメントを付けてください
-
AI を優先する動作:
- モデルの推論を模倣する脆弱な語彙的ヒューリスティクスよりも、汎用的なプロンプト指示、構造化された出力、モデルの選択を優先してください
- モデルの外部に厳格なルールが本当に必要な場合に限り、決定論的なフィルターを追加してください
- テストに合格させるためだけに、評価用フィクスチャに酷似したプロンプトの例を追加しないでください
-
下書きのアトリビューションのバージョン管理:
- 下書き生成のプロンプト入力、検索コンテキスト、ルーティング、または後処理を変更する場合は、
apps/web/utils/ai/reply/draft-attribution.tsのDRAFT_PIPELINE_VERSIONを更新してください - このバージョンは、返信下書きの品質を比較するための分析上のアトリビューションとして扱ってください
- 下書き生成のプロンプト入力、検索コンテキスト、ルーティング、または後処理を変更する場合は、
テスト
llm-test.mdc を参照してください
コメント
Markdown 対応