品質問題の検出

15 minutes  

注意: このセクションでは複数のファイルを変更する必要があります。 どこを変更すればよいかわからない場合や、アプリケーションが動作しなくなった場合は、 ~/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 StatementsEnd: Add Import Statements の間に 以下の import 文を追加します

from poison_chat_wrapper import PoisonedChatWrapper

次に、hotel_specialist_node 関数を以下のようにラッパーを使用するように修正します

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 イメージをビルドします

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

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.yaml

Kubernetes でのアプリケーションのテスト

新しいアプリケーション Pod が正常に起動し、古い Pod が存在しないことを確認します

kubectl get pods -n travel-agent
NAME                                        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 と呼んでいるため、 いくつかの品質問題があることがわかります

Trace With Quality Issue Trace With Quality Issue

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