AIアプリケーション
LLM を組み込んだアプリケーションを作るときに、 従来のソフトウェアと何が変わるか。
決定的でない#
同じ入力で同じ出力が返らない。
| 影響 | 対処 |
|---|---|
| テストが書きにくい | 評価データセットで統計的に測る |
| デバッグが難しい | 入出力をすべて記録する |
| 回帰に気づけない | 定期的に評価を回す |
単体テストではなく評価 (eval) が中心になる。
失敗を前提にする#
| 失敗 | 対処 |
|---|---|
| 幻覚 | RAG、出力の検証 |
| 形式の逸脱 | スキーマ検証してリトライ |
| 応答が遅い | ストリーミング表示 |
| API 障害 | フォールバック、キャッシュ |
コストとレイテンシ#
トークン単位で課金され、 生成は逐次的に遅い。
- プロンプトキャッシュで入力側のコストを下げる
- 簡単なタスクは小さいモデルに振り分ける
- ストリーミングで体感速度を上げる
- 不要な文脈を入れない(コストと精度の両方に効く)
セキュリティ#
- プロンプトインジェクション — 外部データに含まれる指示
- 出力をそのまま実行しない(コード、SQL、シェル)
- 権限を最小化する
- 秘密情報をプロンプトに入れない
外部から取り込んだ内容はデータであって命令ではない、 という境界をシステム側で維持する必要がある。 モデルの判断に頼るのは危うい。
UX#
確率的なシステムを人が使うための設計。
- 何を根拠にしたかを示す(引用、出典)
- 訂正・やり直しを容易にする
- 副作用のある操作は確認を挟む
- 不確かさを隠さない
参考文献#
- Anthropic. Building Effective Agents. 2024. https://www.anthropic.com/engineering/building-effective-agents
- OWASP Top 10 for Large Language Model Applications. https://owasp.org/www-project-top-10-for-large-language-model-applications/
- Kai Greshake et al. Not what you've signed up for. AISec, 2023. https://doi.org/10.1145/3605764.3623985