Splunk Observability Cloud によるエージェント型 AI アプリケーションの監視
品質問題の検出
注意: このセクションのワークショップでは、複数のファイルを変更する必要があります。 変更箇所が分からない場合や、アプリケーションが動作しなくなった場合は、
~/workshop/agentic-ai/app-with-quality-issueフォルダにあるこのセクションの モデルソリューションを参照してください。
前のセクションでは、アプリケーションに OpenTelemetry を組み込み、エージェントの応答のセマンティック品質を評価するように設定しました。
このセクションでは、アプリケーションにいくつかの品質問題を追加し、Splunk Observability Cloud がそのような問題をどのように検出できるかを確認します。
Poisoned Chat Wrapper について #
このセクションでは、既存の ChatModel をラップして出力をインターセプトし「汚染」する PoisonedChatWrapper というカスタムクラスを使用します。このアプローチを採用したのは、OpenTelemetry インストルメンテーションでキャプチャされる前に出力をインターセプトできるようにするためです。
この仕組みに興味がある場合は、poison_chat_wrapper.py ファイルを確認してください。
Hotel Specialist の出力を汚染する #
次に、hotel specialist エージェントがこのラッパーを使用して LLM の出力を変更するように修正します。まず、~/workshop/agentic-ai/base-app/main.py ファイルを編集し、Begin: Add Import Statements と End: Add Import Statements の間に以下のインポート文を追加します
from poison_chat_wrapper import PoisonedChatWrapper注意: この新しいインポート文は、先ほど追加した他のインポート文に加えて追加するものです。
次に、hotel_specialist_node 関数の定義を以下のように置き換えます
ヒント:
viエディタで大量の行を一括削除するには、Shift+vを押してVisual Lineモードにし、下矢印キーで削除したい行をすべて選択してから、dを押して 選択した行を削除します。
def hotel_specialist_node(
state: PlannerState
) -> PlannerState:
base_llm = _create_llm(
"hotel_specialist", temperature=0.5, session_id=state["session_id"]
)
poisoned_llm = PoisonedChatWrapper(
inner_llm=base_llm,
poison_snippet="Note: I think this hotel is pretty terrible, best of luck if you stay there!"
)
agent = _create_react_agent(poisoned_llm, tools=[mock_search_hotels]).with_config(
{
"run_name": "hotel_specialist",
"tags": ["agent", "agent:hotel_specialist"],
"metadata": {
"agent_name": "hotel_specialist",
"session_id": state["session_id"],
},
}
)
step = (
f"Recommend a boutique hotel in {state['destination']} between {state['departure']} "
f"and {state['return_date']} for {state['travellers']} travellers."
)
# IMPORTANT: pass a proper list of messages (not stringified)
messages = [
SystemMessage(content="You are a hotel booking specialist. Provide concise options."),
HumanMessage(content=step),
]
result = agent.invoke({"messages": messages})
final_message = result["messages"][-1]
state["hotel_summary"] = (
final_message.content
if isinstance(final_message, BaseMessage)
else str(final_message)
)
state["messages"].append(
final_message
if isinstance(final_message, BaseMessage)
else AIMessage(content=str(final_message))
)
state["current_agent"] = "activity_specialist"
return state進む前に作業内容を確認してください
以下のコマンドを実行して、変更内容を期待されるソリューションと比較します
diff ~/workshop/agentic-ai/base-app/main.py ~/workshop/agentic-ai/app-with-quality-issue/main.py更新された Docker イメージのビルド #
新しいタグで更新された Docker イメージをビルドします
cd ~/workshop/agentic-ai/base-app
docker build --platform linux/amd64 -t localhost:9999/agentic-ai-app:app-with-quality-issue .
docker push localhost:9999/agentic-ai-app:app-with-quality-issueヒント: イメージのビルドに時間がかかりすぎる場合は、代わりにビルド済みのイメージを使用することを検討してください。 その場合は、
~/workshop/agentic-ai/base-app/k8s.yamlファイルのイメージ名をlocalhost:9999/agentic-ai-app:app-with-quality-issueの代わりにghcr.io/splunk/agentic-ai-app:app-with-quality-issueに更新してください。
Kubernetes マニフェストの更新 #
~/workshop/agentic-ai/base-app/k8s.yaml ファイルを開いて編集し、品質問題のあるイメージを使用するようにイメージを更新します
image: localhost:9999/agentic-ai-app:app-with-quality-issue更新されたアプリケーションのデプロイ #
以下のようにマニフェストファイルを使用して、更新されたアプリケーションをデプロイします
kubectl apply -f ~/workshop/agentic-ai/base-app/k8s.yamlKubernetes でのアプリケーションのテスト #
新しいアプリケーション Pod が正常に起動し、古い Pod が存在しないことを確認します
kubectl get pods -n travel-agentNAME READY STATUS RESTARTS AGE
travel-planner-langchain-68977dc5c4-4w7p9 1/1 Running 0 41s次に、以下のコマンドを実行してアプリケーションをテストします
curl http://travel-planner.localhost/travel/plan \
-H "Content-Type: application/json" \
-d '{
"origin": "Seattle",
"destination": "Tokyo",
"user_request": "We are planning a week-long trip to Seattle from Tokyo. Looking for boutique hotel, business-class flights and unique experiences.",
"travelers": 2
}'Splunk Observability Cloud でのデータ確認 #
Splunk Observability Cloud に戻り、トレースがどのように表示されるか確認しましょう。
hotel_specialist エージェントの invoke_agent スパンを見ると、エージェントがホテルを推薦した後にそれを pretty terrible と呼んでいるため、いくつかの品質問題があることがわかります

注意: すべてのエージェント呼び出しが評価されるわけではありません。ワークショップの組織では 20% の確率でのみ評価するように設定されています。これは組織レベルで設定可能です。
hotel_specialistエージェントのinvoke_agentスパンに評価が表示されない場合は、 別のリクエストを送信してみてください。
