ガードレール
ガードレールは、ユーザー入力やエージェント出力のチェックと検証を可能にします。例えば、非常に賢い(したがって遅く/高価な)モデルを使って顧客対応を行うエージェントがあるとします。悪意のあるユーザーが、そのモデルに自分の数学の宿題を手伝うよう依頼することは避けたいでしょう。そこで、速く/安価なモデルでガードレールを実行できます。ガードレールが悪用を検知した場合、すぐにエラーを発生させて高価なモデルの実行を防げるため、時間とコストを節約できます(ブロッキング ガードレールを使用する場合。並列ガードレールの場合、ガードレールが完了する前に高価なモデルの実行が開始されている可能性があります。詳細は下記「実行モード」を参照してください )。
ガードレールには 2 種類あります。
- 入力ガードレールは最初のユーザー入力に対して実行されます
- 出力ガードレールは最終的なエージェント出力に対して実行されます
入力ガードレール
入力ガードレールは 3 つのステップで実行されます。
- まず、ガードレールはエージェントに渡されるものと同じ入力を受け取ります。
- 次に、ガードレール関数が実行され、
GuardrailFunctionOutputを生成し、それをInputGuardrailResultでラップします - 最後に、
.tripwire_triggeredが true かを確認します。true の場合、InputGuardrailTripwireTriggered例外を送出し、ユーザーへの適切な応答や例外処理ができるようにします。
Note
入力ガードレールはユーザー入力に対して実行されることを想定しているため、エージェントのガードレールはそのエージェントが「最初の」エージェントである場合にのみ実行されます。なぜguardrails プロパティがエージェント側にあり、Runner.run に渡さないのか疑問に思うかもしれません。これは、ガードレールが実際のエージェントに密接に関係する傾向があるためです。エージェントごとに異なるガードレールを実行することになるため、コードを同じ場所に置くことで可読性が向上します。
実行モード
入力ガードレールは 2 つの実行モードをサポートします。
並列実行(デフォルト、
run_in_parallel=True): ガードレールはエージェントの実行と同時に実行されます。両者が同時に開始されるため、最も良いレイテンシーになります。ただし、ガードレールが失敗した場合でも、キャンセルされるまでにエージェントがすでにトークンを消費し、ツールを実行している可能性があります。ブロッキング実行(
run_in_parallel=False): ガードレールはエージェントが開始する「前に」実行され完了します。ガードレールのトリップワイヤーが発動した場合、エージェントは一切実行されず、トークン消費やツール実行を防止できます。コスト最適化や、ツール呼び出しによる副作用を避けたい場合に最適です。
出力ガードレール
出力ガードレールは 3 つのステップで実行されます。
- まず、ガードレールはエージェントが生成した出力を受け取ります。
- 次に、ガードレール関数が実行され、
GuardrailFunctionOutputを生成し、それをOutputGuardrailResultでラップします - 最後に、
.tripwire_triggeredが true かを確認します。true の場合、OutputGuardrailTripwireTriggered例外を送出し、ユーザーへの適切な応答や例外処理ができるようにします。
Note
出力ガードレールは最終的なエージェント出力に対して実行されることを想定しているため、エージェントのガードレールはそのエージェントが「最後の」エージェントである場合にのみ実行されます。入力ガードレールと同様に、ガードレールは実際のエージェントに密接に関係する傾向があるため、コードを同じ場所に置くことで可読性が向上します。
出力ガードレールは常にエージェントの完了後に実行されるため、run_in_parallel パラメーターはサポートしません。
トリップワイヤー
入力または出力がガードレールに不合格となった場合、ガードレールはトリップワイヤーでそれを通知できます。トリップワイヤーが発動したガードレールを検知するとすぐに、{Input,Output}GuardrailTripwireTriggered 例外を送出し、エージェントの実行を停止します。
ガードレールの実装
入力を受け取り、GuardrailFunctionOutput を返す関数を提供する必要があります。次の例では、その内部でエージェントを実行して実現します。
frompydanticimportBaseModelfromagentsimport(Agent,GuardrailFunctionOutput,InputGuardrailTripwireTriggered,RunContextWrapper,Runner,TResponseInputItem,input_guardrail,)classMathHomeworkOutput(BaseModel):is_math_homework:boolreasoning:strguardrail_agent=Agent(# (1)!name="Guardrail check",instructions="Check if the user is asking you to do their math homework.",output_type=MathHomeworkOutput,)@input_guardrailasyncdefmath_guardrail(# (2)!ctx:RunContextWrapper[None],agent:Agent,input:str|list[TResponseInputItem])->GuardrailFunctionOutput:result=awaitRunner.run(guardrail_agent,input,context=ctx.context)returnGuardrailFunctionOutput(output_info=result.final_output,# (3)!tripwire_triggered=result.final_output.is_math_homework,)agent=Agent(# (4)!name="Customer support agent",instructions="You are a customer support agent. You help customers with their questions.",input_guardrails=[math_guardrail],)asyncdefmain():# This should trip the guardrailtry:awaitRunner.run(agent,"Hello, can you help me solve for x: 2x + 3 = 11?")print("Guardrail didn't trip - this is unexpected")exceptInputGuardrailTripwireTriggered:print("Math homework guardrail tripped")- このエージェントをガードレール関数内で使用します。
- これはエージェントの入力/コンテキストを受け取り、結果を返すガードレール関数です。
- ガードレール結果に追加情報を含めることができます。
- これがワークフローを定義する実際のエージェントです。
出力ガードレールも同様です。
frompydanticimportBaseModelfromagentsimport(Agent,GuardrailFunctionOutput,OutputGuardrailTripwireTriggered,RunContextWrapper,Runner,output_guardrail,)classMessageOutput(BaseModel):# (1)!response:strclassMathOutput(BaseModel):# (2)!reasoning:stris_math:boolguardrail_agent=Agent(name="Guardrail check",instructions="Check if the output includes any math.",output_type=MathOutput,)@output_guardrailasyncdefmath_guardrail(# (3)!ctx:RunContextWrapper,agent:Agent,output:MessageOutput)->GuardrailFunctionOutput:result=awaitRunner.run(guardrail_agent,output.response,context=ctx.context)returnGuardrailFunctionOutput(output_info=result.final_output,tripwire_triggered=result.final_output.is_math,)agent=Agent(# (4)!name="Customer support agent",instructions="You are a customer support agent. You help customers with their questions.",output_guardrails=[math_guardrail],output_type=MessageOutput,)asyncdefmain():# This should trip the guardrailtry:awaitRunner.run(agent,"Hello, can you help me solve for x: 2x + 3 = 11?")print("Guardrail didn't trip - this is unexpected")exceptOutputGuardrailTripwireTriggered:print("Math output guardrail tripped")- これは実際のエージェントの出力型です。
- これはガードレールの出力型です。
- これはエージェントの出力を受け取り、結果を返すガードレール関数です。
- これがワークフローを定義する実際のエージェントです。