プロンプト最適化の基本原則
| 原則 | 説明 | 悪い例 | 良い例 |
|---|---|---|---|
| 明確性 | タスク、境界、形式を明確に指定 | 「経費処理をお願いします」 | 「ユーザーメッセージから経費番号、金額、理由を抽出し、JSON形式で返却してください」 |
| ロール設定 | 特定の役割をモデルに付与 | ロールなし | 「あなたは経費処理を専門とする財務アシスタントです」 |
| 単一タスク集中 | 一度に一つのタスクのみ実行 | 経費と勤怠を同時に処理 | 経費関連タスクに専念 |
| 制約条件 | 出力長さ、スタイルなどを制限 | 制限なし | 「回答は100文字以内で、友好的な口調で」 |
コア最適化テクニック
1. 少数ショット学習(Few-Shot Prompting)
入力-出力の例を示すことで、モデルに期待する形式と内容を理解させる。
@SystemMessage("""
経費分類アシスタントとして、ユーザーの説明に基づいて以下のカテゴリから一つを選択してください:
- 交通費
- 飲食費
- 事務用品
- その他
例1:
入力:空港までタクシーで顧客と面談
カテゴリ:交通費
例2:
入力:顧客との昼食代300元
カテゴリ:飲食費
以下のメッセージを分類:
""")
String categorizeExpense(@UserMessage String description);
2. 連鎖的思考(Chain-of-Thought)
段階的な推論を誘導し、複雑な計算や論理タスクの精度を向上させる。
@SystemMessage("""
経費計算アシスタントとして以下の手順で処理:
1. 全ての経費項目と金額をリスト化
2. 会社ポリシーに基づき各項目の妥当性を確認
3. 適格部分の合計金額を計算
4. 最終的な払戻金額と内訳を出力
段階的に推論し最終回答を提供。
""")
String computeReimbursable(@UserMessage String expenses);
3. 出力形式の制約
構造化された形式で出力させ、プログラムによる解析を容易にする。
@SystemMessage("""
ユーザーメッセージから経費情報を抽出し、以下のフィールドを含むJSON形式で返却:
- expenseId: 経費ID(存在しない場合はnull)
- cost: 金額(数値、ない場合は0)
- category: 経費種別
- details: 詳細説明
JSONのみを返却し、他のテキストは含めない。
""")
String extractExpenseData(@UserMessage String message);
LangChain4jでの実装例
public interface ExpenseAssistant {
@SystemMessage("""
ABC社の経費処理専門アシスタントとして:
- 経費申請の支援
- 申請状態の照会
- 経費ポリシーの説明
行動規範:
- 常に友好的で専門的な口調を維持
- 必要な情報が不足している場合は明確に指摘
回答形式:
- 簡潔な段落を使用
- 重要情報は強調表示
""")
String handleQuery(@MemoryId String userId, @UserMessage String query);
}
高度な設定パラメータ
ChatLanguageModel model = OpenAiChatModel.builder()
.apiKey(apiKey)
.temperature(0.2) // 経費処理では低めの温度設定
.maxTokens(500) // 出力長の制限
.build();