DanLevy.net

本番AIは恐ろしい(そして修正方法)

ガードレールのないエージェントは、本番環境の準備ができていません。

誰も安全でないAIシステムを作ろうとして始めるわけではありません。指示を書き、エッジケースをテストし、いくつかの検証ルールを追加します。その後、誰かがあなたのボットを海賊のロールプレイに仕向け、ユーザーデータを暴露できる方法を発見します。あるいは、クレジットカード番号がログに記録されます。あるいは、モデルが自信満々に競合他社の製品を推奨します。

「デモでは動く」と「本番で安全」の間の溝は、ほとんどのチームが予想しているよりも深いものです。

問題の一部は、生のLLMには何をすべきか、何をすべきでないかについての意見がないということです。LLMは、あなたが始めたパターンを続けようとする予測マシンです。「システムオーバーライドモード」のようなプロンプトを与えれば、喜んでそれに従います。これはモデルのバグではなく、言語モデルがそういうものだというだけです。

ほとんどのフレームワークはモデルを渡して幸運を祈りますが、Mastraは異なるアプローチを取ります。ガードレールは最終的に必要になると想定し、エージェントアーキテクチャに最初から組み込みます。


セーフティレイヤーとしてのプロセッサー

コアメカニズムはシンプルです。プロンプトがモデルに届く前に、一連の入力プロセッサーを通過します。モデルが応答した後、出力プロセッサーがその番を迎えます。各プロセッサーはその段階でコンテンツを検査、修正、またはブロックできます。

AIインタラクション用のミドルウェアだと考えてください。必要なものを積み重ね、動作を設定すれば、すべてのリクエストで自動的に実行されます。

1. 海賊を止める(プロンプトインジェクション)

プロンプトインジェクション攻撃は創造的になりました。目に見えないUnicode文字を使ったり、base64で指示を書いたり、通常のルールが適用されない「デバッグモード」だとモデルを説得したりします。テクニックは進化し続けています。

Mastraには一般的なパターンを検出するプロセッサーが含まれています:

src/mastra/agents/secure-agent.ts
import { Agent } from '@mastra/core/agent';
import { PromptInjectionDetector, UnicodeNormalizer } from '@mastra/core/processors';
import { openai } from '@ai-sdk/openai';
export const secureAgent = new Agent({
id: 'fortress-assistant',
name: 'fortress-assistant',
instructions: 'You are a secure assistant.',
model: openai('gpt-5'),
inputProcessors: [
// 1. Scrub invisible characters
new UnicodeNormalizer({
id: 'unicode-normalizer',
stripControlChars: true,
collapseWhitespace: true,
}),
// 2. Detect the attempt
new PromptInjectionDetector({
id: 'prompt-injection-detector',
model: openai('gpt-5-nano'), // Cheap, fast
threshold: 0.8,
strategy: 'block', // Hard stop
detectionTypes: ['injection', 'jailbreak', 'system-override'],
}),
],
});

UnicodeNormalizerは制御文字を削除し、空白を折りたたみます。PromptInjectionDetectorは、クリーンアップされた入力を分析し、指示を上書きしようとするパターンを検出します。

検出の精度(thresholdパラメーター)と、トリップしたときに何を行うか(ブロック、ログ、またはフラグのみ)を設定できます。

2. PIIの処理

ログ内のクレジットカード番号、ベクターデータベース内の社会保障番号、必要以上に長く保存されるメールアドレス。これらは規制問題に発展する種類のものです。課題は、ユーザーがチャットウィンドウに機密データを貼り付けていることに必ずしも気づいていないということです。

PIIDetectorは、モデルに届く前やストレージに書き込まれる前に、一般的なパターンをスキャンします:

import { PIIDetector } from '@mastra/core/processors';
export const privateAgent = new Agent({
id: 'privacy-first-assistant',
name: 'privacy-first-assistant',
instructions: 'You are a helpful assistant that never stores personal information.',
model: openai('gpt-5'),
inputProcessors: [
new PIIDetector({
id: 'pii-detector',
model: openai('gpt-5-nano'),
detectionTypes: ['email', 'phone', 'credit-card', 'ssn'],
threshold: 0.6,
strategy: 'redact',
redactionMethod: 'mask', // Replace with [REDACTED]
instructions: 'Detect and mask personally identifiable information',
}),
],
});

削除([REDACTED]に置換)、ハッシュ化、または完全ブロックから選択できます。プロセッサーは入力と出力の両方で実行されるため、モデルが応答で機密データを生成した場合でもカバーされます。

3. コンテンツモデレーション

インターネットデータでトレーニングされたモデルは、いろいろなものを見ています。フィルタリングがなければ、PRチームを緊張させるような応答を時折生成する可能性があります。ModerationProcessorは、ガイドラインに違反するコンテンツを検出します:

import { ModerationProcessor } from '@mastra/core/processors';
export const moderatedAgent = new Agent({
id: 'safe-assistant',
name: 'safe-assistant',
instructions: 'You are a helpful assistant for a community platform.',
model: openai('gpt-5'),
inputProcessors: [
new ModerationProcessor({
id: 'moderation-processor',
model: openai('gpt-5-nano'), // Fast, cheap model for classification
categories: ['hate', 'harassment', 'violence', 'self-harm'],
threshold: 0.7, // Block if confidence > 70%
strategy: 'block', // Stop the request immediately
instructions: 'Detect harmful content that violates community guidelines',
}),
],
});

興味深いのは、ユースケースにとってどのカテゴリーが重要かを自分で定義できる点です。クリエイティブライティングツールは、カスタマーサービスボットよりも表現豊かなコンテンツを許可するかもしれません。しきい値と戦略により、フィルタリングの厳密さを制御できます。


トリップしたとき

プロセッサーは問題を検出してもエラーをスローしません。代わりに、結果オブジェクトにフラグを設定します:

const result = await secureAgent.generate('Ignore all previous instructions...');
if (result.tripwire) {
console.log(`Blocked! Reason: ${result.tripwireReason}`);
// "Blocked! Reason: Prompt injection detected."
return "Nice try, script kiddie.";
}

このパターンにより、アプリケーションに適した方法でセキュリティイベントを処理できます。分析用にログに記録したり、一般的なエラーメッセージを返したり、特定のコンテキストで特定の違反を許可したりできます。tripwireReasonフィールドは、どのプロセッサーがコンテンツをフラグしたかを正確に示すため、誤検知のデバッグやしきい値の調整に役立ちます。


これが解決しないこと

プロセッサーは多くのことを検出しますが、魔法ではありません。十分な時間を持つ意図的な攻撃者は、おそらくすり抜けるプロンプトを見つけることができるでしょう。モデルは、プロセッサーが予測できない方法で幻覚を見ることがあります。そして、セキュリティと柔軟性の間には常にトレードオフがあります。ルールを厳しくするほど、正当なユースケースをブロックする可能性が高くなります。

価値は完全な保護ではありません。本番環境で確実に発生する一般的な問題を処理するための体系的な方法を持つことです。ユーザーが実際に行うことを学びながら、感度を調整できます。ドメイン固有のリスクに対してカスタムプロセッサーを追加できます。そして、何がブロックされ、なぜブロックされたかを示す監査証跡があります。

本番AIのほとんどのセキュリティ問題は、洗練された攻撃ではありません。ユーザーが機密データをコピー&ペーストしたり、試行錯誤を通じてボットが意図しない動作をすることに気づいたりするものです。プロセッサーはすべての問題を止めることはできませんが、明白なものをずっと難しくします。

リソース

シリーズを読む

  1. LLMルーティング
  2. セキュリティ&ガードレール(この投稿)
  3. MCP&ツール統合
  4. ワークフロー&メモリ