マルチエージェントシステムでのGenieの使用

こちらのノートブックをウォークスルーします。

https://docs.databricks.com/aws/ja/generative-ai/agent-framework/multi-agent-genie

GenieのAPIが公開されたことで、Genieをエージェントとしたマルチエージェントシステムなどを構築できるようになりました。

https://www.databricks.com/blog/genie-conversation-apis-public-preview

:::note info
**注意**
ウォークスルーするノートブックでは、後半でMosaic AI Agent Frameworkを使っています。[お使いのリージョンで利用できるかどうか](https://docs.databricks.com/aws/ja/resources/feature-region-support#ai%E3%81%8A%E3%82%88%E3%81%B3%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E6%A9%9F%E8%83%BD%E3%81%AE%E5%8F%AF%E7%94%A8%E6%80%A7)をご確認ください。執筆時点では日本リージョンではMosaic AI Agent Frameworkはサポートされていませんが、**エージェントをデプロイする**以外の部分は動作します。
:::

# 準備

このノートブックでは以下の準備が必要となります。

- ワークスペースのパーソナルアクセストークン
- GPT-4oなどをサービングするモデルサービングエンドポイント
- Genieスペース

## パーソナルアクセストークン

ワークスペースで[パーソナルアクセストークン](https://docs.databricks.com/aws/ja/dev-tools/auth/pat)を取得して[シークレット](https://docs.databricks.com/aws/ja/security/secrets/)に保存します。

以下はローカルのシェルから実行しています。

```sh
databricks auth login --host https://<ワークスペースのホスト名>
```
```sh
databricks secrets put-secret demo-token-takaaki.yayoi pat -p e2-demo-tokyo
```

## Genieスペース

COVID-19感染者数の分析を行うGenieスペースを使います。`GENIE_SPACE_ID`が必要となるので、URLからコピーしておきます。

```
https://xxxx.databricks.com/genie/rooms/01ef54b0f9cb142f9e63ccc57395c808?v=conversations&o=xxxx
```

この例では`01ef54b0f9cb142f9e63ccc57395c808`がスペースIDとなります。

![Screenshot 2025-03-12 at 9.07.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/e22fc601-c235-42e8-b526-54e99f5ee9ed.png)

## モデルサービングエンドポイント

`gpt-4-o-mini`を使ってます。

![Screenshot 2025-03-12 at 7.25.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/cd5bfc3f-6748-424b-9c8a-22580d58f980.png)

# Mosaic AIエージェントフレームワーク: Genieを使用してマルチエージェントシステムを作成およびデプロイ

このノートブックでは、Mosaic AIエージェントフレームワークと[LangGraph](https://blog.langchain.dev/langgraph-multi-agent-workflows/)を使用してマルチエージェントシステムを構築する方法を示します。ここで[Genie](https://www.databricks.com/jp/product/business-intelligence/ai-bi-genie)はエージェントの1つです。
このノートブックでは、以下を行います:
1. LangGraphを使用してマルチエージェントシステムを作成します。
1. LangGraphエージェントをMLflowの`ChatAgent`でラップし、Databricksの機能との互換性を確保します。
1. マルチエージェントシステムの出力を手動でテストします。
1. マルチエージェントシステムをログおよびデプロイします。

この例は[LangGraphドキュメント - マルチエージェントスーパーバイザーの例](https://github.com/langchain-ai/langgraph/blob/main/docs/docs/tutorials/multi_agent/agent_supervisor.ipynb)に基づいています。

## なぜGenieエージェントを使用するのか？

マルチエージェントシステムは、各エージェントが専門的な能力を持ち、協力して動作する複数のAIエージェントで構成されています。そのエージェントの1つとして、Genieはユーザーが自然言語を使用して構造化データと対話することを可能にします。

事前定義されたクエリのみを実行できるSQL関数とは異なり、Genieはユーザーの質問に答えるために新しいクエリを作成する柔軟性を持っています。

## 前提条件

- このノートブックのすべての`TODO`を解決します。
- Genieスペースを作成します。Databricksのドキュメントを参照してください ([AWS](https://docs.databricks.com/aws/ja/genie/set-up) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/genie/set-up))。

```py
%pip install -U -qqq mlflow langgraph==0.3.4 databricks-langchain databricks-agents uv
dbutils.library.restartPython()
```

## マルチエージェントシステムの定義

LangGraphでスーパーバイザーエージェントノードが以下のエージェントノードを指示するマルチエージェントシステムを作成します:
- **GenieAgent**: 構造化データをクエリし、推論するGenieエージェント。
- **ツール呼び出しエージェント**: Unity Catalog関数ツールを呼び出すエージェント。

この例では、ツール呼び出しエージェントは組み込みのUnity Catalog関数`system.ai.python_exec`を使用してPythonコードを実行します。
エージェントに追加できる他のツールの例については、Databricksのドキュメントを参照してください ([AWS](https://docs.databricks.com/aws/ja/generative-ai/agent-framework/agent-tool) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/generative-ai/agent-framework/agent-tool))。


#### `ChatAgent`インターフェースを使用してLangGraphエージェントをラップする

Databricksは、Databricks AI機能との互換性を確保し、オープンソース標準を使用してマルチターン会話エージェントを簡単に作成するために`ChatAgent`を使用することを推奨しています。

`LangGraphChatAgent`クラスは、LangGraphエージェントをラップするために`ChatAgent`インターフェースを実装しています。

MLflowの[ChatAgentドキュメント](https://mlflow.org/docs/latest/python_api/mlflow.pyfunc.html#mlflow.pyfunc.ChatAgent)を参照してください。

#### エージェントコードをファイルに書き込む

エージェントコードを以下の単一セルで定義します。これにより、`%%writefile`マジックコマンドを使用してエージェントコードをローカルPythonファイルに書き込み、その後のログ記録とデプロイメントに使用できます。

これがエージェントの実装になります。以下のセルでGenieスペースのIDを指定します。

```py
%%writefile agent.py
import functools
import os
from typing import Any, Generator, Literal, Optional

import mlflow
from databricks.sdk import WorkspaceClient
from databricks_langchain import (
    ChatDatabricks,
    DatabricksFunctionClient,
    UCFunctionToolkit,
    set_uc_function_client,
)
from databricks_langchain.genie import GenieAgent
from langchain_core.runnables import RunnableLambda
from langgraph.graph import END, StateGraph
from langgraph.graph.state import CompiledStateGraph
from langgraph.prebuilt import create_react_agent
from mlflow.langchain.chat_agent_langgraph import ChatAgentState
from mlflow.pyfunc import ChatAgent
from mlflow.types.agent import (
    ChatAgentChunk,
    ChatAgentMessage,
    ChatAgentResponse,
    ChatContext,
)
from pydantic import BaseModel

mlflow.langchain.autolog()

###################################################
## Genie SpaceにアクセスできるGenieAgentを作成する
###################################################

# TODO GENIE_SPACE_IDとこのスペースの説明を追加する
GENIE_SPACE_ID = "01ef54b0f9cb142f9e63ccc57395c808"
genie_agent_description = "このエージェントは質問に答えることができます..."

genie_agent = GenieAgent(
    genie_space_id=GENIE_SPACE_ID,
    genie_agent_name="Genie",
    description=genie_agent_description,
    # DB_MODEL_SERVING_HOST_URLはエージェントエンドポイントで設定されますが、ノートブックには存在しません
    client=WorkspaceClient(
        host=os.getenv("DATABRICKS_HOST") or os.getenv("DB_MODEL_SERVING_HOST_URL"),
        token=os.getenv("DATABRICKS_GENIE_PAT"),
    ),
)


############################################
# LLMエンドポイントとシステムプロンプトを定義する
############################################

# TODO: モデルサービングエンドポイントに置き換える。マルチエージェントGenieはGPT 4oおよびGPT o1モデルで最適に動作します。
LLM_ENDPOINT_NAME = "taka-gpt-4o-mini"
assert LLM_ENDPOINT_NAME is not None
llm = ChatDatabricks(endpoint=LLM_ENDPOINT_NAME)


############################################################
# コードエージェントを作成する
# 追加のツールにアクセスできるエージェントも作成できます
############################################################
client = DatabricksFunctionClient()
set_uc_function_client(client)

tools = []

# TODO 必要に応じて、追加のツールを追加し、このエージェントの説明を更新する
uc_tool_names = ["system.ai.*"]
uc_toolkit = UCFunctionToolkit(function_names=uc_tool_names)
tools.extend(uc_toolkit.tools)
code_agent_description = (
    "Coderエージェントは、プログラミングの課題を解決し、コードスニペットを生成し、問題をデバッグし、複雑なコーディングの概念を説明することに特化しています。",
)
code_agent = create_react_agent(llm, tools=tools)

#############################
# スーパーバイザーエージェントを定義する
#############################

worker_descriptions = {
    "Genie": genie_agent_description,
    "Coder": code_agent_description,
}

formatted_descriptions = "\n".join(
    f"- {name}: {desc}" for name, desc in worker_descriptions.items()
)

system_prompt = f"次のワーカーの間でルーティングを決定するか、回答が提供された場合は会話を終了します。 \n{formatted_descriptions}"
options = ["FINISH"] + list(worker_descriptions.keys())


def supervisor_agent(state):
    class nextNode(BaseModel):
        next_node: Literal[tuple(options)]

    preprocessor = RunnableLambda(
        lambda state: [{"role": "system", "content": system_prompt}] + state["messages"]
    )
    supervisor_chain = preprocessor | llm.with_structured_output(nextNode)
    return supervisor_chain.invoke(state)


#######################################
# マルチエージェントのグラフ構造を定義する
#######################################


def agent_node(state, agent, name):
    result = agent.invoke(state)
    return {
        "messages": [
            {
                "role": "assistant",
                "content": result["messages"][-1].content,
                "name": name,
            }
        ]
    }


def final_answer(state):
    system_prompt = "メッセージの内容のみを使用して、他のエージェントが提供した回答を使用してユーザーの質問に答えてください。"
    preprocessor = RunnableLambda(
        lambda state: [{"role": "system", "content": system_prompt}] + state["messages"]
    )
    final_answer_chain = preprocessor | llm
    return {"messages": [final_answer_chain.invoke(state)]}


class AgentState(ChatAgentState):
    next_node: str


code_node = functools.partial(agent_node, agent=code_agent, name="Coder")
genie_node = functools.partial(agent_node, agent=genie_agent, name="Genie")

workflow = StateGraph(AgentState)
workflow.add_node("Genie", genie_node)
workflow.add_node("Coder", code_node)
workflow.add_node("supervisor", supervisor_agent)
workflow.add_node("final_answer", final_answer)

workflow.set_entry_point("supervisor")
# ワーカーが終了したときに必ずスーパーバイザーに「報告」するようにします
for worker in worker_descriptions.keys():
    workflow.add_edge(worker, "supervisor")

# スーパーバイザーが次のノードを決定するようにします
workflow.add_conditional_edges(
    "supervisor",
    lambda x: x["next_node"],
    {**{k: k for k in worker_descriptions.keys()}, "FINISH": "final_answer"},
)
workflow.add_edge("final_answer", END)
multi_agent = workflow.compile()

###################################
# マルチエージェントをChatAgentにラップする
###################################


class LangGraphChatAgent(ChatAgent):
    def __init__(self, agent: CompiledStateGraph):
        self.agent = agent

    def predict(
        self,
        messages: list[ChatAgentMessage],
        context: Optional[ChatContext] = None,
        custom_inputs: Optional[dict[str, Any]] = None,
    ) -> ChatAgentResponse:
        request = {
            "messages": [m.model_dump_compat(exclude_none=True) for m in messages]
        }

        messages = []
        for event in self.agent.stream(request, stream_mode="updates"):
            for node_data in event.values():
                messages.extend(
                    ChatAgentMessage(**msg) for msg in node_data.get("messages", [])
                )
        return ChatAgentResponse(messages=messages)

    def predict_stream(
        self,
        messages: list[ChatAgentMessage],
        context: Optional[ChatContext] = None,
        custom_inputs: Optional[dict[str, Any]] = None,
    ) -> Generator[ChatAgentChunk, None, None]:
        request = {
            "messages": [m.model_dump_compat(exclude_none=True) for m in messages]
        }
        for event in self.agent.stream(request, stream_mode="updates"):
            for node_data in event.values():
                yield from (
                    ChatAgentChunk(**{"delta": msg})
                    for msg in node_data.get("messages", [])
                )


# エージェントオブジェクトを作成し、mlflow.models.set_model()を介して推論のためにエージェントオブジェクトをロードする際に使用するエージェントオブジェクトとして指定します
AGENT = LangGraphChatAgent(multi_agent)
mlflow.models.set_model(AGENT)
```

## Databricksシークレットとしてパーソナルアクセストークン（PAT）を作成する

Genieスペースおよびその基盤となるリソースにアクセスするために、PATを作成する必要があります。
- これはあなた自身のPATまたはシステムプリンシパルのPAT（[AWS](https://docs.databricks.com/aws/ja/dev-tools/auth/oauth-m2m) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/dev-tools/auth/oauth-m2m)）のいずれかです。トークンの有効期限が切れた場合は、自分でローテーションさせる必要があります。
- モデルサービングエンドポイントにシークレットベースの環境変数を追加します（[AWS](https://docs.databricks.com/aws/ja/machine-learning/model-serving/store-env-variable-model-serving#add-secrets-based-environment-variables) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/model-serving/store-env-variable-model-serving#add-secrets-based-environment-variables)）。
- 各リソースの適切な権限レベルについては、デプロイドキュメントの表を参照してください（[AWS](https://docs.databricks.com/aws/ja/generative-ai/agent-framework/deploy-agent#automatic-authentication-passthrough) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/generative-ai/agent-framework/deploy-agent#automatic-authentication-passthrough)）。
  - Genieスペースに対する`CAN RUN`権限
  - Genieスペースで使うSQLウェアハウスに対する`CAN USE`権限
  - 背後にあるUnity Catalogテーブルに対して`SELECT`権限
  - 背後にあるUnity Catalog関数に対して`EXECUTE`権限

準備したシークレットスコープとシークレットキーを指定します。

```py
import os

# TODO: シークレットスコープ名とシークレットキー名を設定して、PATにアクセスします
secret_scope_name = "demo-token-takaaki.yayoi"
secret_key_name = "pat"
os.environ["DATABRICKS_GENIE_PAT"] = dbutils.secrets.get(
    scope=secret_scope_name, key=secret_key_name
)
assert os.environ["DATABRICKS_GENIE_PAT"] is not None, (
    "The DATABRICKS_GENIE_PAT was not properly set to the PAT secret"
)
```

## エージェントのテスト

エージェントと対話してその出力をテストします。このノートブックでは `mlflow.langchain.autolog()` を呼び出しているため、エージェントが実行する各ステップのトレースを確認できます。

**TODO**: このプレースホルダー `input_example` をエージェント用のドメイン固有のプロンプトに置き換えてください。

```py
dbutils.library.restartPython()
```

上で保存した`agent.py`をインポートしてエージェントを初期化し、動作確認します。

```py
# agent.pyからAGENTをimport
from agent import AGENT

input_example = {
    "messages": [
        {
            "role": "user",
            "content": "東京の感染者数の傾向",
        }
    ]
}
AGENT.predict(input_example)
```
```
ChatAgentResponse(messages=[ChatAgentMessage(role='assistant', content='|     | Prefecture   |   Cases | date_timestamp   |\n|----:|:-------------|--------:|:-----------------|\n|   0 | Tokyo        |      78 | 2022-01-01       |\n|   1 | Tokyo        |      82 | 2022-01-02       |\n|   2 | Tokyo        |     103 | 2022-01-03       |\n|   3 | Tokyo        |     151 | 2022-01-04       |\n|   4 | Tokyo        |     388 | 2022-01-05       |\n|   5 | Tokyo        |     640 | 2022-01-06       |\n|   6 | Tokyo        |     920 | 2022-01-07       |\n|   7 | Tokyo        |    1223 | 2022-01-08       |\n|   8 | Tokyo        |    1223 | 2022-01-09       |\n|   9 | Tokyo        |     871 | 2022-01-10       |\n|  10 | Tokyo        |     959 | 2022-01-11       |\n|  11 | Tokyo        |    2196 | 2022-01-12       |\n|  12 | Tokyo        |    3121 | 2022-01-13       |\n|  13 | Tokyo        |    4055 | 2022-01-14       |\n|  14 | Tokyo        |    4559 | 2022-01-15       |\n|  15 | Tokyo        |    4166 | 2022-01-16       |\n|  16 | Tokyo        |    3713 | 2022-01-17       |\n|  17 | Tokyo        |    5181 | 2022-01-18       |\n|  18 | Tokyo        |    7366 | 2022-01-19       |\n|  19 | Tokyo        |    8634 | 2022-01-20       |\n|  20 | Tokyo        |    9695 | 2022-01-21       |\n|  21 | Tokyo        |   11217 | 2022-01-22       |\n|  22 | Tokyo        |    9460 | 2022-01-23       |\n|  23 | Tokyo        |    8493 | 2022-01-24       |\n|  24 | Tokyo        |   12797 | 2022-01-25       |\n|  25 | Tokyo        |   14077 | 2022-01-26       |\n|  26 | Tokyo        |   16525 | 2022-01-27       |\n|  27 | Tokyo        |   17610 | 2022-01-28       |\n|  28 | Tokyo        |   17424 | 2022-01-29       |\n|  29 | Tokyo        |   15893 | 2022-01-30       |\n|  30 | Tokyo        |   11743 | 2022-01-31       |\n|  31 | Tokyo        |   14432 | 2022-02-01       |\n|  32 | Tokyo        |   21562 | 2022-02-02       |\n|  33 | Tokyo        |   20663 | 2022-02-03       |\n|  34 | Tokyo        |   19788 | 2022-02-04       |\n|  35 | Tokyo        |   21110 | 2022-02-05       |\n|  36 | Tokyo        |   17519 | 2022-02-06       |\n|  37 | Tokyo        |   12194 | 2022-02-07       |\n|  38 | Tokyo        |   17100 | 2022-02-08       |\n|  39 | Tokyo        |   18275 | 2022-02-09       |\n|  40 | Tokyo        |   18888 | 2022-02-10       |\n|  41 | Tokyo        |   18648 | 2022-02-11       |\n|  42 | Tokyo        |   11755 | 2022-02-12       |\n|  43 | Tokyo        |   13061 | 2022-02-13       |\n|  44 | Tokyo        |   10330 | 2022-02-14       |\n|  45 | Tokyo        |   15515 | 2022-02-15       |\n|  46 | Tokyo        |   17325 | 2022-02-16       |\n|  47 | Tokyo        |   17856 | 2022-02-17       |\n|  48 | Tokyo        |   16122 | 2022-02-18       |\n|  49 | Tokyo        |   13509 | 2022-02-19       |\n|  50 | Tokyo        |   12933 | 2022-02-20       |\n|  51 | Tokyo        |    8801 | 2022-02-21       |\n|  52 | Tokyo        |   11439 | 2022-02-22       |\n|  53 | Tokyo        |   14559 | 2022-02-23       |\n|  54 | Tokyo        |   10163 | 2022-02-24       |\n|  55 | Tokyo        |   11123 | 2022-02-25       |\n|  56 | Tokyo        |   11558 | 2022-02-26       |\n|  57 | Tokyo        |   10314 | 2022-02-27       |\n|  58 | Tokyo        |    9629 | 2022-02-28       |\n|  59 | Tokyo        |   11802 | 2022-03-01       |\n|  60 | Tokyo        |   12690 | 2022-03-02       |\n|  61 | Tokyo        |   12246 | 2022-03-03       |\n|  62 | Tokyo        |   10515 | 2022-03-04       |\n|  63 | Tokyo        |   10804 | 2022-03-05       |\n|  64 | Tokyo        |    9282 | 2022-03-06       |\n|  65 | Tokyo        |    5370 | 2022-03-07       |\n|  66 | Tokyo        |    8919 | 2022-03-08       |\n|  67 | Tokyo        |   10812 | 2022-03-09       |\n|  68 | Tokyo        |   10077 | 2022-03-10       |\n|  69 | Tokyo        |    8456 | 2022-03-11       |\n|  70 | Tokyo        |    9164 | 2022-03-12       |\n|  71 | Tokyo        |    8127 | 2022-03-13       |\n|  72 | Tokyo        |    4831 | 2022-03-14       |\n|  73 | Tokyo        |    7831 | 2022-03-15       |\n|  74 | Tokyo        |   10220 | 2022-03-16       |\n|  75 | Tokyo        |    8456 | 2022-03-17       |\n|  76 | Tokyo        |    7825 | 2022-03-18       |\n|  77 | Tokyo        |    7441 | 2022-03-19       |\n|  78 | Tokyo        |    6497 | 2022-03-20       |\n|  79 | Tokyo        |    3853 | 2022-03-21       |\n|  80 | Tokyo        |    3532 | 2022-03-22       |\n|  81 | Tokyo        |    6426 | 2022-03-23       |\n|  82 | Tokyo        |    8869 | 2022-03-24       |\n|  83 | Tokyo        |    7284 | 2022-03-25       |\n|  84 | Tokyo        |    7440 | 2022-03-26       |\n|  85 | Tokyo        |    7843 | 2022-03-27       |\n|  86 | Tokyo        |    4542 | 2022-03-28       |\n|  87 | Tokyo        |    7846 | 2022-03-29       |\n|  88 | Tokyo        |    9518 | 2022-03-30       |\n|  89 | Tokyo        |    8220 | 2022-03-31       |\n|  90 | Tokyo        |    7978 | 2022-04-01       |\n|  91 | Tokyo        |    7390 | 2022-04-02       |\n|  92 | Tokyo        |    7896 | 2022-04-03       |\n|  93 | Tokyo        |    4382 | 2022-04-04       |\n|  94 | Tokyo        |    6967 | 2022-04-05       |\n|  95 | Tokyo        |    8650 | 2022-04-06       |\n|  96 | Tokyo        |    8750 | 2022-04-07       |\n|  97 | Tokyo        |    8110 | 2022-04-08       |\n|  98 | Tokyo        |    8098 | 2022-04-09       |\n|  99 | Tokyo        |    8024 | 2022-04-10       |\n| 100 | Tokyo        |    4557 | 2022-04-11       |\n| 101 | Tokyo        |    6920 | 2022-04-12       |\n| 102 | Tokyo        |    8248 | 2022-04-13       |\n| 103 | Tokyo        |    8535 | 2022-04-14       |\n| 104 | Tokyo        |    6761 | 2022-04-15       |\n| 105 | Tokyo        |    6794 | 2022-04-16       |\n| 106 | Tokyo        |    5219 | 2022-04-17       |\n| 107 | Tokyo        |    3477 | 2022-04-18       |\n| 108 | Tokyo        |    5581 | 2022-04-19       |\n| 109 | Tokyo        |    6771 | 2022-04-20       |\n| 110 | Tokyo        |    6710 | 2022-04-21       |\n| 111 | Tokyo        |    5393 | 2022-04-22       |\n| 112 | Tokyo        |    5386 | 2022-04-23       |\n| 113 | Tokyo        |    4935 | 2022-04-24       |\n| 114 | Tokyo        |    3136 | 2022-04-25       |\n| 115 | Tokyo        |    5042 | 2022-04-26       |\n| 116 | Tokyo        |    6049 | 2022-04-27       |\n| 117 | Tokyo        |    5392 | 2022-04-28       |\n| 118 | Tokyo        |    3892 | 2022-04-29       |\n| 119 | Tokyo        |    2978 | 2022-04-30       |\n| 120 | Tokyo        |    3157 | 2022-05-01       |\n| 121 | Tokyo        |    2397 | 2022-05-02       |\n| 122 | Tokyo        |    3349 | 2022-05-03       |\n| 123 | Tokyo        |    2997 | 2022-05-04       |\n| 124 | Tokyo        |    2317 | 2022-05-05       |\n| 125 | Tokyo        |    2678 | 2022-05-06       |\n| 126 | Tokyo        |    3802 | 2022-05-07       |\n| 127 | Tokyo        |    4709 | 2022-05-08       |\n| 128 | Tokyo        |    3011 | 2022-05-09       |\n| 129 | Tokyo        |    4447 | 2022-05-10       |\n| 130 | Tokyo        |    4761 | 2022-05-11       |\n| 131 | Tokyo        |    4214 | 2022-05-12       |\n| 132 | Tokyo        |    4103 | 2022-05-13       |\n| 133 | Tokyo        |    3798 | 2022-05-14       |\n| 134 | Tokyo        |    3348 | 2022-05-15       |\n| 135 | Tokyo        |    2374 | 2022-05-16       |\n| 136 | Tokyo        |    3662 | 2022-05-17       |\n| 137 | Tokyo        |    4353 | 2022-05-18       |\n| 138 | Tokyo        |    4170 | 2022-05-19       |\n| 139 | Tokyo        |    3571 | 2022-05-20       |\n| 140 | Tokyo        |    3462 | 2022-05-21       |\n| 141 | Tokyo        |    3313 | 2022-05-22       |\n| 142 | Tokyo        |    2023 | 2022-05-23       |\n| 143 | Tokyo        |    3268 | 2022-05-24       |\n| 144 | Tokyo        |    3924 | 2022-05-25       |\n| 145 | Tokyo        |    3388 | 2022-05-26       |\n| 146 | Tokyo        |    2629 | 2022-05-27       |\n| 147 | Tokyo        |    2549 | 2022-05-28       |\n| 148 | Tokyo        |    2192 | 2022-05-29       |\n| 149 | Tokyo        |    1342 | 2022-05-30       |\n| 150 | Tokyo        |    2356 | 2022-05-31       |\n| 151 | Tokyo        |    2412 | 2022-06-01       |\n| 152 | Tokyo        |    2333 | 2022-06-02       |\n| 153 | Tokyo        |    2109 | 2022-06-03       |\n| 154 | Tokyo        |    2071 | 2022-06-04       |\n| 155 | Tokyo        |    1583 | 2022-06-05       |\n| 156 | Tokyo        |    1012 | 2022-06-06       |\n| 157 | Tokyo        |    1797 | 2022-06-07       |\n| 158 | Tokyo        |    1934 | 2022-06-08       |\n| 159 | Tokyo        |    1874 | 2022-06-09       |\n| 160 | Tokyo        |    1597 | 2022-06-10       |\n| 161 | Tokyo        |    1524 | 2022-06-11       |\n| 162 | Tokyo        |    1544 | 2022-06-12       |\n| 163 | Tokyo        |     958 | 2022-06-13       |\n| 164 | Tokyo        |    1527 | 2022-06-14       |\n| 165 | Tokyo        |    2014 | 2022-06-15       |\n| 166 | Tokyo        |    1815 | 2022-06-16       |\n| 167 | Tokyo        |    1591 | 2022-06-17       |\n| 168 | Tokyo        |    1681 | 2022-06-18       |\n| 169 | Tokyo        |    1621 | 2022-06-19       |\n| 170 | Tokyo        |    1076 | 2022-06-20       |\n| 171 | Tokyo        |    1959 | 2022-06-21       |\n| 172 | Tokyo        |    2325 | 2022-06-22       |\n| 173 | Tokyo        |    2409 | 2022-06-23       |\n| 174 | Tokyo        |    2181 | 2022-06-24       |\n| 175 | Tokyo        |    2159 | 2022-06-25       |\n| 176 | Tokyo        |    2004 | 2022-06-26       |\n| 177 | Tokyo        |    1514 | 2022-06-27       |\n| 178 | Tokyo        |    2509 | 2022-06-28       |\n| 179 | Tokyo        |    3802 | 2022-06-29       |\n| 180 | Tokyo        |    3621 | 2022-06-30       |\n| 181 | Tokyo        |    3545 | 2022-07-01       |\n| 182 | Tokyo        |    3615 | 2022-07-02       |\n| 183 | Tokyo        |    3788 | 2022-07-03       |\n| 184 | Tokyo        |    2772 | 2022-07-04       |\n| 185 | Tokyo        |    5301 | 2022-07-05       |\n| 186 | Tokyo        |    8338 | 2022-07-06       |\n| 187 | Tokyo        |    8523 | 2022-07-07       |\n| 188 | Tokyo        |    8775 | 2022-07-08       |\n| 189 | Tokyo        |    9714 | 2022-07-09       |\n| 190 | Tokyo        |    9481 | 2022-07-10       |\n| 191 | Tokyo        |    6228 | 2022-07-11       |\n| 192 | Tokyo        |   11508 | 2022-07-12       |\n| 193 | Tokyo        |   16875 | 2022-07-13       |\n| 194 | Tokyo        |   16657 | 2022-07-14       |\n| 195 | Tokyo        |   19055 | 2022-07-15       |\n| 196 | Tokyo        |   18912 | 2022-07-16       |\n| 197 | Tokyo        |   17786 | 2022-07-17       |\n| 198 | Tokyo        |   12691 | 2022-07-18       |\n| 199 | Tokyo        |   11009 | 2022-07-19       |\n| 200 | Tokyo        |   20385 | 2022-07-20       |\n| 201 | Tokyo        |   31855 | 2022-07-21       |\n| 202 | Tokyo        |   34968 | 2022-07-22       |\n| 203 | Tokyo        |   32683 | 2022-07-23       |\n| 204 | Tokyo        |   28096 | 2022-07-24       |\n| 205 | Tokyo        |   22377 | 2022-07-25       |\n| 206 | Tokyo        |   31580 | 2022-07-26       |\n| 207 | Tokyo        |   29030 | 2022-07-27       |\n| 208 | Tokyo        |   40395 | 2022-07-28       |\n| 209 | Tokyo        |   36804 | 2022-07-29       |\n| 210 | Tokyo        |   33450 | 2022-07-30       |\n| 211 | Tokyo        |   31532 | 2022-07-31       |\n| 212 | Tokyo        |   21947 | 2022-08-01       |\n| 213 | Tokyo        |   30827 | 2022-08-02       |\n| 214 | Tokyo        |   38923 | 2022-08-03       |\n| 215 | Tokyo        |   35329 | 2022-08-04       |\n| 216 | Tokyo        |   37752 | 2022-08-05       |\n| 217 | Tokyo        |   30956 | 2022-08-06       |\n| 218 | Tokyo        |   26299 | 2022-08-07       |\n| 219 | Tokyo        |   17872 | 2022-08-08       |\n| 220 | Tokyo        |   29103 | 2022-08-09       |\n| 221 | Tokyo        |   34234 | 2022-08-10       |\n| 222 | Tokyo        |   31242 | 2022-08-11       |\n| 223 | Tokyo        |   20396 | 2022-08-12       |\n| 224 | Tokyo        |   23762 | 2022-08-13       |\n| 225 | Tokyo        |   22721 | 2022-08-14       |\n| 226 | Tokyo        |   23094 | 2022-08-15       |\n| 227 | Tokyo        |   23427 | 2022-08-16       |\n| 228 | Tokyo        |   29274 | 2022-08-17       |\n| 229 | Tokyo        |   27301 | 2022-08-18       |\n| 230 | Tokyo        |   27515 | 2022-08-19       |\n| 231 | Tokyo        |   25140 | 2022-08-20       |\n| 232 | Tokyo        |   24515 | 2022-08-21       |\n| 233 | Tokyo        |   14802 | 2022-08-22       |\n| 234 | Tokyo        |   21767 | 2022-08-23       |\n| 235 | Tokyo        |   25435 | 2022-08-24       |\n| 236 | Tokyo        |   23125 | 2022-08-25       |\n| 237 | Tokyo        |   18409 | 2022-08-26       |\n| 238 | Tokyo        |   17119 | 2022-08-27       |\n| 239 | Tokyo        |   15825 | 2022-08-28       |\n| 240 | Tokyo        |    9876 | 2022-08-29       |\n| 241 | Tokyo        |   14211 | 2022-08-30       |\n| 242 | Tokyo        |   15423 | 2022-08-31       |\n| 243 | Tokyo        |   14449 | 2022-09-01       |\n| 244 | Tokyo        |   12400 | 2022-09-02       |\n| 245 | Tokyo        |   12554 | 2022-09-03       |\n| 246 | Tokyo        |    9633 | 2022-09-04       |\n| 247 | Tokyo        |    7291 | 2022-09-05       |\n| 248 | Tokyo        |    9483 | 2022-09-06       |\n| 249 | Tokyo        |   13554 | 2022-09-07       |\n| 250 | Tokyo        |   10638 | 2022-09-08       |\n| 251 | Tokyo        |    9234 | 2022-09-09       |\n| 252 | Tokyo        |    9988 | 2022-09-10       |\n| 253 | Tokyo        |    7744 | 2022-09-11       |\n| 254 | Tokyo        |    5648 | 2022-09-12       |\n| 255 | Tokyo        |    8846 | 2022-09-13       |\n| 256 | Tokyo        |   10592 | 2022-09-14       |\n| 257 | Tokyo        |    8821 | 2022-09-15       |\n| 258 | Tokyo        |    8632 | 2022-09-16       |\n| 259 | Tokyo        |    8016 | 2022-09-17       |\n| 260 | Tokyo        |    8077 | 2022-09-18       |\n| 261 | Tokyo        |    4066 | 2022-09-19       |\n| 262 | Tokyo        |    3801 | 2022-09-20       |\n| 263 | Tokyo        |    7066 | 2022-09-21       |\n| 264 | Tokyo        |    8860 | 2022-09-22       |\n| 265 | Tokyo        |    7561 | 2022-09-23       |\n| 266 | Tokyo        |    4885 | 2022-09-24       |\n| 267 | Tokyo        |    5706 | 2022-09-25       |\n| 268 | Tokyo        |    6314 | 2022-09-26       |\n| 269 | Tokyo        |    5247 | 2022-09-27       |\n| 270 | Tokyo        |    5327 | 2022-09-28       |\n| 271 | Tokyo        |    5032 | 2022-09-29       |\n| 272 | Tokyo        |    4558 | 2022-09-30       |\n| 273 | Tokyo        |    3834 | 2022-10-01       |\n| 274 | Tokyo        |    2922 | 2022-10-02       |\n| 275 | Tokyo        |    1673 | 2022-10-03       |\n| 276 | Tokyo        |    4310 | 2022-10-04       |\n| 277 | Tokyo        |    4067 | 2022-10-05       |\n| 278 | Tokyo        |    3580 | 2022-10-06       |\n| 279 | Tokyo        |    3016 | 2022-10-07       |\n| 280 | Tokyo        |    2605 | 2022-10-08       |\n| 281 | Tokyo        |    2242 | 2022-10-09       |\n| 282 | Tokyo        |    1372 | 2022-10-10       |\n| 283 | Tokyo        |    1504 | 2022-10-11       |\n| 284 | Tokyo        |    4790 | 2022-10-12       |\n| 285 | Tokyo        |    4338 | 2022-10-13       |\n| 286 | Tokyo        |    3495 | 2022-10-14       |\n| 287 | Tokyo        |    3239 | 2022-10-15       |\n| 288 | Tokyo        |    2714 | 2022-10-16       |\n| 289 | Tokyo        |    1588 | 2022-10-17       |\n| 290 | Tokyo        |    4213 | 2022-10-18       |\n| 291 | Tokyo        |    4204 | 2022-10-19       |\n| 292 | Tokyo        |    3489 | 2022-10-20       |\n| 293 | Tokyo        |    2840 | 2022-10-21       |\n| 294 | Tokyo        |    3231 | 2022-10-22       |\n| 295 | Tokyo        |    2805 | 2022-10-23       |\n| 296 | Tokyo        |    1735 | 2022-10-24       |\n| 297 | Tokyo        |    4702 | 2022-10-25       |\n| 298 | Tokyo        |    4347 | 2022-10-26       |\n| 299 | Tokyo        |    3941 | 2022-10-27       |\n| 300 | Tokyo        |    3520 | 2022-10-28       |\n| 301 | Tokyo        |    4121 | 2022-10-29       |\n| 302 | Tokyo        |    3687 | 2022-10-30       |\n| 303 | Tokyo        |    2019 | 2022-10-31       |\n| 304 | Tokyo        |    6520 | 2022-11-01       |\n| 305 | Tokyo        |    6346 | 2022-11-02       |\n| 306 | Tokyo        |    6686 | 2022-11-03       |\n| 307 | Tokyo        |    3090 | 2022-11-04       |\n| 308 | Tokyo        |    7967 | 2022-11-05       |\n| 309 | Tokyo        |    6264 | 2022-11-06       |\n| 310 | Tokyo        |    3489 | 2022-11-07       |\n| 311 | Tokyo        |    8665 | 2022-11-08       |\n| 312 | Tokyo        |    9012 | 2022-11-09       |\n| 313 | Tokyo        |    7969 | 2022-11-10       |\n| 314 | Tokyo        |    7899 | 2022-11-11       |\n| 315 | Tokyo        |    8021 | 2022-11-12       |\n| 316 | Tokyo        |    6922 | 2022-11-13       |\n| 317 | Tokyo        |    4025 | 2022-11-14       |\n| 318 | Tokyo        |   11196 | 2022-11-15       |\n| 319 | Tokyo        |   10114 | 2022-11-16       |\n| 320 | Tokyo        |    9755 | 2022-11-17       |\n| 321 | Tokyo        |    8292 | 2022-11-18       |\n| 322 | Tokyo        |    9457 | 2022-11-19       |\n| 323 | Tokyo        |    7777 | 2022-11-20       |\n| 324 | Tokyo        |    4619 | 2022-11-21       |\n| 325 | Tokyo        |   12758 | 2022-11-22       |\n| 326 | Tokyo        |   12850 | 2022-11-23       |\n| 327 | Tokyo        |    5639 | 2022-11-24       |\n| 328 | Tokyo        |   12938 | 2022-11-25       |\n| 329 | Tokyo        |   13569 | 2022-11-26       |\n| 330 | Tokyo        |   10346 | 2022-11-27       |\n| 331 | Tokyo        |    5767 | 2022-11-28       |\n| 332 | Tokyo        |   14680 | 2022-11-29       |\n| 333 | Tokyo        |   14399 | 2022-11-30       |\n| 334 | Tokyo        |   12332 | 2022-12-01       |\n| 335 | Tokyo        |   11244 | 2022-12-02       |\n| 336 | Tokyo        |   13321 | 2022-12-03       |\n| 337 | Tokyo        |   10454 | 2022-12-04       |\n| 338 | Tokyo        |    5388 | 2022-12-05       |\n| 339 | Tokyo        |   15501 | 2022-12-06       |\n| 340 | Tokyo        |   14946 | 2022-12-07       |\n| 341 | Tokyo        |   14104 | 2022-12-08       |\n| 342 | Tokyo        |   13556 | 2022-12-09       |\n| 343 | Tokyo        |   14558 | 2022-12-10       |\n| 344 | Tokyo        |   12163 | 2022-12-11       |\n| 345 | Tokyo        |    7044 | 2022-12-12       |\n| 346 | Tokyo        |   19800 | 2022-12-13       |\n| 347 | Tokyo        |   18812 | 2022-12-14       |\n| 348 | Tokyo        |   17687 | 2022-12-15       |\n| 349 | Tokyo        |   16273 | 2022-12-16       |\n| 350 | Tokyo        |   17020 | 2022-12-17       |\n| 351 | Tokyo        |   13646 | 2022-12-18       |\n| 352 | Tokyo        |    7949 | 2022-12-19       |\n| 353 | Tokyo        |   20513 | 2022-12-20       |\n| 354 | Tokyo        |   21186 | 2022-12-21       |\n| 355 | Tokyo        |   18820 | 2022-12-22       |\n| 356 | Tokyo        |   17332 | 2022-12-23       |\n| 357 | Tokyo        |   18731 | 2022-12-24       |\n| 358 | Tokyo        |   15403 | 2022-12-25       |\n| 359 | Tokyo        |    8428 | 2022-12-26       |\n| 360 | Tokyo        |   22063 | 2022-12-27       |\n| 361 | Tokyo        |   20243 | 2022-12-28       |\n| 362 | Tokyo        |   18372 | 2022-12-29       |\n| 363 | Tokyo        |   14525 | 2022-12-30       |\n| 364 | Tokyo        |   11189 | 2022-12-31       |\n| 365 | Tokyo        |    9186 | 2023-01-01       |\n| 366 | Tokyo        |    7537 | 2023-01-02       |\n| 367 | Tokyo        |    9628 | 2023-01-03       |\n| 368 | Tokyo        |   10554 | 2023-01-04       |\n| 369 | Tokyo        |   20735 | 2023-01-05       |\n| 370 | Tokyo        |   20720 | 2023-01-06       |\n| 371 | Tokyo        |   19630 | 2023-01-07       |\n| 372 | Tokyo        |   15124 | 2023-01-08       |\n| 373 | Tokyo        |    8199 | 2023-01-09       |\n| 374 | Tokyo        |    7462 | 2023-01-10       |\n| 375 | Tokyo        |   16772 | 2023-01-11       |\n| 376 | Tokyo        |   13427 | 2023-01-12       |\n| 377 | Tokyo        |   11241 | 2023-01-13       |\n| 378 | Tokyo        |   10727 | 2023-01-14       |\n| 379 | Tokyo        |    8269 | 2023-01-15       |\n| 380 | Tokyo        |    4433 | 2023-01-16       |\n| 381 | Tokyo        |   11120 | 2023-01-17       |\n| 382 | Tokyo        |    9187 | 2023-01-18       |\n| 383 | Tokyo        |    7719 | 2023-01-19       |\n| 384 | Tokyo        |    6603 | 2023-01-20       |\n| 385 | Tokyo        |    6607 | 2023-01-21       |\n| 386 | Tokyo        |    5110 | 2023-01-22       |\n| 387 | Tokyo        |    2677 | 2023-01-23       |\n| 388 | Tokyo        |    7306 | 2023-01-24       |\n| 389 | Tokyo        |    5934 | 2023-01-25       |\n| 390 | Tokyo        |    5061 | 2023-01-26       |\n| 391 | Tokyo        |    4297 | 2023-01-27       |\n| 392 | Tokyo        |    4515 | 2023-01-28       |\n| 393 | Tokyo        |    3427 | 2023-01-29       |\n| 394 | Tokyo        |    1818 | 2023-01-30       |\n| 395 | Tokyo        |    4862 | 2023-01-31       |\n| 396 | Tokyo        |    4012 | 2023-02-01       |\n| 397 | Tokyo        |    3502 | 2023-02-02       |\n| 398 | Tokyo        |    2941 | 2023-02-03       |\n| 399 | Tokyo        |    2992 | 2023-02-04       |\n| 400 | Tokyo        |    2287 | 2023-02-05       |\n| 401 | Tokyo        |    1105 | 2023-02-06       |\n| 402 | Tokyo        |    3131 | 2023-02-07       |\n| 403 | Tokyo        |    2612 | 2023-02-08       |\n| 404 | Tokyo        |    2173 | 2023-02-09       |\n| 405 | Tokyo        |    1922 | 2023-02-10       |\n| 406 | Tokyo        |    1752 | 2023-02-11       |\n| 407 | Tokyo        |     799 | 2023-02-12       |\n| 408 | Tokyo        |     810 | 2023-02-13       |\n| 409 | Tokyo        |    2232 | 2023-02-14       |\n| 410 | Tokyo        |    1858 | 2023-02-15       |\n| 411 | Tokyo        |    1454 | 2023-02-16       |\n| 412 | Tokyo        |    1272 | 2023-02-17       |\n| 413 | Tokyo        |    1146 | 2023-02-18       |\n| 414 | Tokyo        |     992 | 2023-02-19       |\n| 415 | Tokyo        |     510 | 2023-02-20       |\n| 416 | Tokyo        |    1451 | 2023-02-21       |\n| 417 | Tokyo        |    1195 | 2023-02-22       |\n| 418 | Tokyo        |    1072 | 2023-02-23       |\n| 419 | Tokyo        |     427 | 2023-02-24       |\n| 420 | Tokyo        |    1182 | 2023-02-25       |\n| 421 | Tokyo        |     810 | 2023-02-26       |\n| 422 | Tokyo        |     370 | 2023-02-27       |\n| 423 | Tokyo        |    1181 | 2023-02-28       |\n| 424 | Tokyo        |    1028 | 2023-03-01       |\n| 425 | Tokyo        |     952 | 2023-03-02       |\n| 426 | Tokyo        |     736 | 2023-03-03       |\n| 427 | Tokyo        |     795 | 2023-03-04       |\n| 428 | Tokyo        |     705 | 2023-03-05       |\n| 429 | Tokyo        |     335 | 2023-03-06       |\n| 430 | Tokyo        |     989 | 2023-03-07       |\n| 431 | Tokyo        |     926 | 2023-03-08       |\n| 432 | Tokyo        |     794 | 2023-03-09       |\n| 433 | Tokyo        |     778 | 2023-03-10       |\n| 434 | Tokyo        |     805 | 2023-03-11       |\n| 435 | Tokyo        |     606 | 2023-03-12       |\n| 436 | Tokyo        |     313 | 2023-03-13       |\n| 437 | Tokyo        |     988 | 2023-03-14       |\n| 438 | Tokyo        |     816 | 2023-03-15       |\n| 439 | Tokyo        |     680 | 2023-03-16       |\n| 440 | Tokyo        |     631 | 2023-03-17       |\n| 441 | Tokyo        |     627 | 2023-03-18       |\n| 442 | Tokyo        |     549 | 2023-03-19       |\n| 443 | Tokyo        |     270 | 2023-03-20       |\n| 444 | Tokyo        |     877 | 2023-03-21       |\n| 445 | Tokyo        |     373 | 2023-03-22       |\n| 446 | Tokyo        |     908 | 2023-03-23       |\n| 447 | Tokyo        |     893 | 2023-03-24       |\n| 448 | Tokyo        |     863 | 2023-03-25       |\n| 449 | Tokyo        |     667 | 2023-03-26       |\n| 450 | Tokyo        |     355 | 2023-03-27       |\n| 451 | Tokyo        |    1001 | 2023-03-28       |\n| 452 | Tokyo        |    1002 | 2023-03-29       |\n| 453 | Tokyo        |     956 | 2023-03-30       |\n| 454 | Tokyo        |     854 | 2023-03-31       |\n| 455 | Tokyo        |     991 | 2023-04-01       |\n| 456 | Tokyo        |     789 | 2023-04-02       |\n| 457 | Tokyo        |     420 | 2023-04-03       |\n| 458 | Tokyo        |    1357 | 2023-04-04       |\n| 459 | Tokyo        |    1204 | 2023-04-05       |\n| 460 | Tokyo        |    1109 | 2023-04-06       |\n| 461 | Tokyo        |    1133 | 2023-04-07       |\n| 462 | Tokyo        |    1261 | 2023-04-08       |\n| 463 | Tokyo        |     956 | 2023-04-09       |\n| 464 | Tokyo        |     458 | 2023-04-10       |\n| 465 | Tokyo        |    1490 | 2023-04-11       |\n| 466 | Tokyo        |    1334 | 2023-04-12       |\n| 467 | Tokyo        |    1181 | 2023-04-13       |\n| 468 | Tokyo        |    1215 | 2023-04-14       |\n| 469 | Tokyo        |    1197 | 2023-04-15       |\n| 470 | Tokyo        |     891 | 2023-04-16       |\n| 471 | Tokyo        |     474 | 2023-04-17       |\n| 472 | Tokyo        |    1696 | 2023-04-18       |\n| 473 | Tokyo        |    1514 | 2023-04-19       |\n| 474 | Tokyo        |    1449 | 2023-04-20       |\n| 475 | Tokyo        |    1441 | 2023-04-21       |\n| 476 | Tokyo        |    1477 | 2023-04-22       |\n| 477 | Tokyo        |    1138 | 2023-04-23       |\n| 478 | Tokyo        |     571 | 2023-04-24       |\n| 479 | Tokyo        |    1909 | 2023-04-25       |\n| 480 | Tokyo        |    1745 | 2023-04-26       |\n| 481 | Tokyo        |    1663 | 2023-04-27       |\n| 482 | Tokyo        |    1613 | 2023-04-28       |\n| 483 | Tokyo        |    1915 | 2023-04-29       |\n| 484 | Tokyo        |     976 | 2023-04-30       |\n| 485 | Tokyo        |     837 | 2023-05-01       |\n| 486 | Tokyo        |    2604 | 2023-05-02       |\n| 487 | Tokyo        |    2187 | 2023-05-03       |\n| 488 | Tokyo        |     994 | 2023-05-04       |\n| 489 | Tokyo        |     906 | 2023-05-05       |\n| 490 | Tokyo        |    1062 | 2023-05-06       |\n| 491 | Tokyo        |    2345 | 2023-05-07       |\n| 492 | Tokyo        |    1331 | 2023-05-08       |', name='Genie', id='db1541ea-d841-43b8-97dc-6dfd1d9a343f', tool_calls=None, tool_call_id=None, attachments=None), ChatAgentMessage(role='assistant', content='東京の感染者数は、2022年の初めから急激に増加し、特に1月中旬から下旬にかけてピークを迎えました。その後、感染者数は減少し、春先には比較的低い水準に落ち着きました。しかし、夏に入ると再び感染者数が増加し、特に7月には高い数値を記録しました。秋にかけては再度減少傾向を見せましたが、冬に入ると再び感染者数が増加し、特に2023年1月には高い数値が続きました。\n\n全体として、東京の感染者数は季節ごとに変動があり、特に冬季に感染者数が増加する傾向が見られます。', name=None, id='run-6df6f195-1ed7-4f37-8210-503448e5964f-0', tool_calls=None, tool_call_id=None, attachments=None)], finish_reason=None, custom_outputs=None, usage=None)
```

MLflow Tracingでエージェントの挙動を確認できます。

![Screenshot 2025-03-12 at 9.15.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/2a275088-3e18-43df-a265-a77cf695ea5b.png)

中ではLangGraphを使っているので、グラフを可視化します。

```py
from IPython.display import Image, display
from langchain_core.runnables.graph import CurveStyle, MermaidDrawMethod, NodeStyles

display(
    Image(
        AGENT.agent.get_graph().draw_mermaid_png(
            draw_method=MermaidDrawMethod.API,
        )
    )
)
```
![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/d64c76d2-9974-4392-a780-70426fbbe182.png)

ストリーミングも試します。

```py
for event in AGENT.predict_stream(input_example):
  print(event, "-----------\n")
```
```
delta=ChatAgentMessage(role='assistant', content='|     | date_timestamp   |   total_cases |\n|----:|:-----------------|--------------:|\n|   0 | 2022-01-01       |            78 |\n|   1 | 2022-01-02       |            82 |\n|   2 | 2022-01-03       |           103 |\n|   3 | 2022-01-04       |           151 |\n|   4 | 2022-01-05       |           388 |\n|   5 | 2022-01-06       |           640 |\n|   6 | 2022-01-07       |           920 |\n|   7 | 2022-01-08       |          1223 |\n|   8 | 2022-01-09       |          1223 |\n|   9 | 2022-01-10       |           871 |\n|  10 | 2022-01-11       |           959 |\n|  11 | 2022-01-12       |          2196 |\n|  12 | 2022-01-13       |          3121 |\n|  13 | 2022-01-14       |          4055 |\n|  14 | 2022-01-15       |          4559 |\n|  15 | 2022-01-16       |          4166 |\n|  16 | 2022-01-17       |          3713 |\n|  17 | 2022-01-18       |          5181 |\n|  18 | 2022-01-19       |          7366 |\n|  19 | 2022-01-20       |          8634 |\n|  20 | 2022-01-21       |          9695 |\n|  21 | 2022-01-22       |         11217 |\n|  22 | 2022-01-23       |          9460 |\n|  23 | 2022-01-24       |          8493 |\n|  24 | 2022-01-25       |         12797 |\n|  25 | 2022-01-26       |         14077 |\n|  26 | 2022-01-27       |         16525 |\n|  27 | 2022-01-28       |         17610 |\n|  28 | 2022-01-29       |         17424 |\n|  29 | 2022-01-30       |         15893 |\n|  30 | 2022-01-31       |         11743 |\n|  31 | 2022-02-01       |         14432 |\n|  32 | 2022-02-02       |         21562 |\n|  33 | 2022-02-03       |         20663 |\n|  34 | 2022-02-04       |         19788 |\n|  35 | 2022-02-05       |         21110 |\n|  36 | 2022-02-06       |         17519 |\n|  37 | 2022-02-07       |         12194 |\n|  38 | 2022-02-08       |         17100 |\n|  39 | 2022-02-09       |         18275 |\n|  40 | 2022-02-10       |         18888 |\n|  41 | 2022-02-11       |         18648 |\n|  42 | 2022-02-12       |         11755 |\n|  43 | 2022-02-13       |         13061 |\n|  44 | 2022-02-14       |         10330 |\n|  45 | 2022-02-15       |         15515 |\n|  46 | 2022-02-16       |         17325 |\n|  47 | 2022-02-17       |         17856 |\n|  48 | 2022-02-18       |         16122 |\n|  49 | 2022-02-19       |         13509 |\n|  50 | 2022-02-20       |         12933 |\n|  51 | 2022-02-21       |          8801 |\n|  52 | 2022-02-22       |         11439 |\n|  53 | 2022-02-23       |         14559 |\n|  54 | 2022-02-24       |         10163 |\n|  55 | 2022-02-25       |         11123 |\n|  56 | 2022-02-26       |         11558 |\n|  57 | 2022-02-27       |         10314 |\n|  58 | 2022-02-28       |          9629 |\n|  59 | 2022-03-01       |         11802 |\n|  60 | 2022-03-02       |         12690 |\n|  61 | 2022-03-03       |         12246 |\n|  62 | 2022-03-04       |         10515 |\n|  63 | 2022-03-05       |         10804 |\n|  64 | 2022-03-06       |          9282 |\n|  65 | 2022-03-07       |          5370 |\n|  66 | 2022-03-08       |          8919 |\n|  67 | 2022-03-09       |         10812 |\n|  68 | 2022-03-10       |         10077 |\n|  69 | 2022-03-11       |          8456 |\n|  70 | 2022-03-12       |          9164 |\n|  71 | 2022-03-13       |          8127 |\n|  72 | 2022-03-14       |          4831 |\n|  73 | 2022-03-15       |          7831 |\n|  74 | 2022-03-16       |         10220 |\n|  75 | 2022-03-17       |          8456 |\n|  76 | 2022-03-18       |          7825 |\n|  77 | 2022-03-19       |          7441 |\n|  78 | 2022-03-20       |          6497 |\n|  79 | 2022-03-21       |          3853 |\n|  80 | 2022-03-22       |          3532 |\n|  81 | 2022-03-23       |          6426 |\n|  82 | 2022-03-24       |          8869 |\n|  83 | 2022-03-25       |          7284 |\n|  84 | 2022-03-26       |          7440 |\n|  85 | 2022-03-27       |          7843 |\n|  86 | 2022-03-28       |          4542 |\n|  87 | 2022-03-29       |          7846 |\n|  88 | 2022-03-30       |          9518 |\n|  89 | 2022-03-31       |          8220 |\n|  90 | 2022-04-01       |          7978 |\n|  91 | 2022-04-02       |          7390 |\n|  92 | 2022-04-03       |          7896 |\n|  93 | 2022-04-04       |          4382 |\n|  94 | 2022-04-05       |          6967 |\n|  95 | 2022-04-06       |          8650 |\n|  96 | 2022-04-07       |          8750 |\n|  97 | 2022-04-08       |          8110 |\n|  98 | 2022-04-09       |          8098 |\n|  99 | 2022-04-10       |          8024 |\n| 100 | 2022-04-11       |          4557 |\n| 101 | 2022-04-12       |          6920 |\n| 102 | 2022-04-13       |          8248 |\n| 103 | 2022-04-14       |          8535 |\n| 104 | 2022-04-15       |          6761 |\n| 105 | 2022-04-16       |          6794 |\n| 106 | 2022-04-17       |          5219 |\n| 107 | 2022-04-18       |          3477 |\n| 108 | 2022-04-19       |          5581 |\n| 109 | 2022-04-20       |          6771 |\n| 110 | 2022-04-21       |          6710 |\n| 111 | 2022-04-22       |          5393 |\n| 112 | 2022-04-23       |          5386 |\n| 113 | 2022-04-24       |          4935 |\n| 114 | 2022-04-25       |          3136 |\n| 115 | 2022-04-26       |          5042 |\n| 116 | 2022-04-27       |          6049 |\n| 117 | 2022-04-28       |          5392 |\n| 118 | 2022-04-29       |          3892 |\n| 119 | 2022-04-30       |          2978 |\n| 120 | 2022-05-01       |          3157 |\n| 121 | 2022-05-02       |          2397 |\n| 122 | 2022-05-03       |          3349 |\n| 123 | 2022-05-04       |          2997 |\n| 124 | 2022-05-05       |          2317 |\n| 125 | 2022-05-06       |          2678 |\n| 126 | 2022-05-07       |          3802 |\n| 127 | 2022-05-08       |          4709 |\n| 128 | 2022-05-09       |          3011 |\n| 129 | 2022-05-10       |          4447 |\n| 130 | 2022-05-11       |          4761 |\n| 131 | 2022-05-12       |          4214 |\n| 132 | 2022-05-13       |          4103 |\n| 133 | 2022-05-14       |          3798 |\n| 134 | 2022-05-15       |          3348 |\n| 135 | 2022-05-16       |          2374 |\n| 136 | 2022-05-17       |          3662 |\n| 137 | 2022-05-18       |          4353 |\n| 138 | 2022-05-19       |          4170 |\n| 139 | 2022-05-20       |          3571 |\n| 140 | 2022-05-21       |          3462 |\n| 141 | 2022-05-22       |          3313 |\n| 142 | 2022-05-23       |          2023 |\n| 143 | 2022-05-24       |          3268 |\n| 144 | 2022-05-25       |          3924 |\n| 145 | 2022-05-26       |          3388 |\n| 146 | 2022-05-27       |          2629 |\n| 147 | 2022-05-28       |          2549 |\n| 148 | 2022-05-29       |          2192 |\n| 149 | 2022-05-30       |          1342 |\n| 150 | 2022-05-31       |          2356 |\n| 151 | 2022-06-01       |          2412 |\n| 152 | 2022-06-02       |          2333 |\n| 153 | 2022-06-03       |          2109 |\n| 154 | 2022-06-04       |          2071 |\n| 155 | 2022-06-05       |          1583 |\n| 156 | 2022-06-06       |          1012 |\n| 157 | 2022-06-07       |          1797 |\n| 158 | 2022-06-08       |          1934 |\n| 159 | 2022-06-09       |          1874 |\n| 160 | 2022-06-10       |          1597 |\n| 161 | 2022-06-11       |          1524 |\n| 162 | 2022-06-12       |          1544 |\n| 163 | 2022-06-13       |           958 |\n| 164 | 2022-06-14       |          1527 |\n| 165 | 2022-06-15       |          2014 |\n| 166 | 2022-06-16       |          1815 |\n| 167 | 2022-06-17       |          1591 |\n| 168 | 2022-06-18       |          1681 |\n| 169 | 2022-06-19       |          1621 |\n| 170 | 2022-06-20       |          1076 |\n| 171 | 2022-06-21       |          1959 |\n| 172 | 2022-06-22       |          2325 |\n| 173 | 2022-06-23       |          2409 |\n| 174 | 2022-06-24       |          2181 |\n| 175 | 2022-06-25       |          2159 |\n| 176 | 2022-06-26       |          2004 |\n| 177 | 2022-06-27       |          1514 |\n| 178 | 2022-06-28       |          2509 |\n| 179 | 2022-06-29       |          3802 |\n| 180 | 2022-06-30       |          3621 |\n| 181 | 2022-07-01       |          3545 |\n| 182 | 2022-07-02       |          3615 |\n| 183 | 2022-07-03       |          3788 |\n| 184 | 2022-07-04       |          2772 |\n| 185 | 2022-07-05       |          5301 |\n| 186 | 2022-07-06       |          8338 |\n| 187 | 2022-07-07       |          8523 |\n| 188 | 2022-07-08       |          8775 |\n| 189 | 2022-07-09       |          9714 |\n| 190 | 2022-07-10       |          9481 |\n| 191 | 2022-07-11       |          6228 |\n| 192 | 2022-07-12       |         11508 |\n| 193 | 2022-07-13       |         16875 |\n| 194 | 2022-07-14       |         16657 |\n| 195 | 2022-07-15       |         19055 |\n| 196 | 2022-07-16       |         18912 |\n| 197 | 2022-07-17       |         17786 |\n| 198 | 2022-07-18       |         12691 |\n| 199 | 2022-07-19       |         11009 |\n| 200 | 2022-07-20       |         20385 |\n| 201 | 2022-07-21       |         31855 |\n| 202 | 2022-07-22       |         34968 |\n| 203 | 2022-07-23       |         32683 |\n| 204 | 2022-07-24       |         28096 |\n| 205 | 2022-07-25       |         22377 |\n| 206 | 2022-07-26       |         31580 |\n| 207 | 2022-07-27       |         29030 |\n| 208 | 2022-07-28       |         40395 |\n| 209 | 2022-07-29       |         36804 |\n| 210 | 2022-07-30       |         33450 |\n| 211 | 2022-07-31       |         31532 |\n| 212 | 2022-08-01       |         21947 |\n| 213 | 2022-08-02       |         30827 |\n| 214 | 2022-08-03       |         38923 |\n| 215 | 2022-08-04       |         35329 |\n| 216 | 2022-08-05       |         37752 |\n| 217 | 2022-08-06       |         30956 |\n| 218 | 2022-08-07       |         26299 |\n| 219 | 2022-08-08       |         17872 |\n| 220 | 2022-08-09       |         29103 |\n| 221 | 2022-08-10       |         34234 |\n| 222 | 2022-08-11       |         31242 |\n| 223 | 2022-08-12       |         20396 |\n| 224 | 2022-08-13       |         23762 |\n| 225 | 2022-08-14       |         22721 |\n| 226 | 2022-08-15       |         23094 |\n| 227 | 2022-08-16       |         23427 |\n| 228 | 2022-08-17       |         29274 |\n| 229 | 2022-08-18       |         27301 |\n| 230 | 2022-08-19       |         27515 |\n| 231 | 2022-08-20       |         25140 |\n| 232 | 2022-08-21       |         24515 |\n| 233 | 2022-08-22       |         14802 |\n| 234 | 2022-08-23       |         21767 |\n| 235 | 2022-08-24       |         25435 |\n| 236 | 2022-08-25       |         23125 |\n| 237 | 2022-08-26       |         18409 |\n| 238 | 2022-08-27       |         17119 |\n| 239 | 2022-08-28       |         15825 |\n| 240 | 2022-08-29       |          9876 |\n| 241 | 2022-08-30       |         14211 |\n| 242 | 2022-08-31       |         15423 |\n| 243 | 2022-09-01       |         14449 |\n| 244 | 2022-09-02       |         12400 |\n| 245 | 2022-09-03       |         12554 |\n| 246 | 2022-09-04       |          9633 |\n| 247 | 2022-09-05       |          7291 |\n| 248 | 2022-09-06       |          9483 |\n| 249 | 2022-09-07       |         13554 |\n| 250 | 2022-09-08       |         10638 |\n| 251 | 2022-09-09       |          9234 |\n| 252 | 2022-09-10       |          9988 |\n| 253 | 2022-09-11       |          7744 |\n| 254 | 2022-09-12       |          5648 |\n| 255 | 2022-09-13       |          8846 |\n| 256 | 2022-09-14       |         10592 |\n| 257 | 2022-09-15       |          8821 |\n| 258 | 2022-09-16       |          8632 |\n| 259 | 2022-09-17       |          8016 |\n| 260 | 2022-09-18       |          8077 |\n| 261 | 2022-09-19       |          4066 |\n| 262 | 2022-09-20       |          3801 |\n| 263 | 2022-09-21       |          7066 |\n| 264 | 2022-09-22       |          8860 |\n| 265 | 2022-09-23       |          7561 |\n| 266 | 2022-09-24       |          4885 |\n| 267 | 2022-09-25       |          5706 |\n| 268 | 2022-09-26       |          6314 |\n| 269 | 2022-09-27       |          5247 |\n| 270 | 2022-09-28       |          5327 |\n| 271 | 2022-09-29       |          5032 |\n| 272 | 2022-09-30       |          4558 |\n| 273 | 2022-10-01       |          3834 |\n| 274 | 2022-10-02       |          2922 |\n| 275 | 2022-10-03       |          1673 |\n| 276 | 2022-10-04       |          4310 |\n| 277 | 2022-10-05       |          4067 |\n| 278 | 2022-10-06       |          3580 |\n| 279 | 2022-10-07       |          3016 |\n| 280 | 2022-10-08       |          2605 |\n| 281 | 2022-10-09       |          2242 |\n| 282 | 2022-10-10       |          1372 |\n| 283 | 2022-10-11       |          1504 |\n| 284 | 2022-10-12       |          4790 |\n| 285 | 2022-10-13       |          4338 |\n| 286 | 2022-10-14       |          3495 |\n| 287 | 2022-10-15       |          3239 |\n| 288 | 2022-10-16       |          2714 |\n| 289 | 2022-10-17       |          1588 |\n| 290 | 2022-10-18       |          4213 |\n| 291 | 2022-10-19       |          4204 |\n| 292 | 2022-10-20       |          3489 |\n| 293 | 2022-10-21       |          2840 |\n| 294 | 2022-10-22       |          3231 |\n| 295 | 2022-10-23       |          2805 |\n| 296 | 2022-10-24       |          1735 |\n| 297 | 2022-10-25       |          4702 |\n| 298 | 2022-10-26       |          4347 |\n| 299 | 2022-10-27       |          3941 |\n| 300 | 2022-10-28       |          3520 |\n| 301 | 2022-10-29       |          4121 |\n| 302 | 2022-10-30       |          3687 |\n| 303 | 2022-10-31       |          2019 |\n| 304 | 2022-11-01       |          6520 |\n| 305 | 2022-11-02       |          6346 |\n| 306 | 2022-11-03       |          6686 |\n| 307 | 2022-11-04       |          3090 |\n| 308 | 2022-11-05       |          7967 |\n| 309 | 2022-11-06       |          6264 |\n| 310 | 2022-11-07       |          3489 |\n| 311 | 2022-11-08       |          8665 |\n| 312 | 2022-11-09       |          9012 |\n| 313 | 2022-11-10       |          7969 |\n| 314 | 2022-11-11       |          7899 |\n| 315 | 2022-11-12       |          8021 |\n| 316 | 2022-11-13       |          6922 |\n| 317 | 2022-11-14       |          4025 |\n| 318 | 2022-11-15       |         11196 |\n| 319 | 2022-11-16       |         10114 |\n| 320 | 2022-11-17       |          9755 |\n| 321 | 2022-11-18       |          8292 |\n| 322 | 2022-11-19       |          9457 |\n| 323 | 2022-11-20       |          7777 |\n| 324 | 2022-11-21       |          4619 |\n| 325 | 2022-11-22       |         12758 |\n| 326 | 2022-11-23       |         12850 |\n| 327 | 2022-11-24       |          5639 |\n| 328 | 2022-11-25       |         12938 |\n| 329 | 2022-11-26       |         13569 |\n| 330 | 2022-11-27       |         10346 |\n| 331 | 2022-11-28       |          5767 |\n| 332 | 2022-11-29       |         14680 |\n| 333 | 2022-11-30       |         14399 |\n| 334 | 2022-12-01       |         12332 |\n| 335 | 2022-12-02       |         11244 |\n| 336 | 2022-12-03       |         13321 |\n| 337 | 2022-12-04       |         10454 |\n| 338 | 2022-12-05       |          5388 |\n| 339 | 2022-12-06       |         15501 |\n| 340 | 2022-12-07       |         14946 |\n| 341 | 2022-12-08       |         14104 |\n| 342 | 2022-12-09       |         13556 |\n| 343 | 2022-12-10       |         14558 |\n| 344 | 2022-12-11       |         12163 |\n| 345 | 2022-12-12       |          7044 |\n| 346 | 2022-12-13       |         19800 |\n| 347 | 2022-12-14       |         18812 |\n| 348 | 2022-12-15       |         17687 |\n| 349 | 2022-12-16       |         16273 |\n| 350 | 2022-12-17       |         17020 |\n| 351 | 2022-12-18       |         13646 |\n| 352 | 2022-12-19       |          7949 |\n| 353 | 2022-12-20       |         20513 |\n| 354 | 2022-12-21       |         21186 |\n| 355 | 2022-12-22       |         18820 |\n| 356 | 2022-12-23       |         17332 |\n| 357 | 2022-12-24       |         18731 |\n| 358 | 2022-12-25       |         15403 |\n| 359 | 2022-12-26       |          8428 |\n| 360 | 2022-12-27       |         22063 |\n| 361 | 2022-12-28       |         20243 |\n| 362 | 2022-12-29       |         18372 |\n| 363 | 2022-12-30       |         14525 |\n| 364 | 2022-12-31       |         11189 |\n| 365 | 2023-01-01       |          9186 |\n| 366 | 2023-01-02       |          7537 |\n| 367 | 2023-01-03       |          9628 |\n| 368 | 2023-01-04       |         10554 |\n| 369 | 2023-01-05       |         20735 |\n| 370 | 2023-01-06       |         20720 |\n| 371 | 2023-01-07       |         19630 |\n| 372 | 2023-01-08       |         15124 |\n| 373 | 2023-01-09       |          8199 |\n| 374 | 2023-01-10       |          7462 |\n| 375 | 2023-01-11       |         16772 |\n| 376 | 2023-01-12       |         13427 |\n| 377 | 2023-01-13       |         11241 |\n| 378 | 2023-01-14       |         10727 |\n| 379 | 2023-01-15       |          8269 |\n| 380 | 2023-01-16       |          4433 |\n| 381 | 2023-01-17       |         11120 |\n| 382 | 2023-01-18       |          9187 |\n| 383 | 2023-01-19       |          7719 |\n| 384 | 2023-01-20       |          6603 |\n| 385 | 2023-01-21       |          6607 |\n| 386 | 2023-01-22       |          5110 |\n| 387 | 2023-01-23       |          2677 |\n| 388 | 2023-01-24       |          7306 |\n| 389 | 2023-01-25       |          5934 |\n| 390 | 2023-01-26       |          5061 |\n| 391 | 2023-01-27       |          4297 |\n| 392 | 2023-01-28       |          4515 |\n| 393 | 2023-01-29       |          3427 |\n| 394 | 2023-01-30       |          1818 |\n| 395 | 2023-01-31       |          4862 |\n| 396 | 2023-02-01       |          4012 |\n| 397 | 2023-02-02       |          3502 |\n| 398 | 2023-02-03       |          2941 |\n| 399 | 2023-02-04       |          2992 |\n| 400 | 2023-02-05       |          2287 |\n| 401 | 2023-02-06       |          1105 |\n| 402 | 2023-02-07       |          3131 |\n| 403 | 2023-02-08       |          2612 |\n| 404 | 2023-02-09       |          2173 |\n| 405 | 2023-02-10       |          1922 |\n| 406 | 2023-02-11       |          1752 |\n| 407 | 2023-02-12       |           799 |\n| 408 | 2023-02-13       |           810 |\n| 409 | 2023-02-14       |          2232 |\n| 410 | 2023-02-15       |          1858 |\n| 411 | 2023-02-16       |          1454 |\n| 412 | 2023-02-17       |          1272 |\n| 413 | 2023-02-18       |          1146 |\n| 414 | 2023-02-19       |           992 |\n| 415 | 2023-02-20       |           510 |\n| 416 | 2023-02-21       |          1451 |\n| 417 | 2023-02-22       |          1195 |\n| 418 | 2023-02-23       |          1072 |\n| 419 | 2023-02-24       |           427 |\n| 420 | 2023-02-25       |          1182 |\n| 421 | 2023-02-26       |           810 |\n| 422 | 2023-02-27       |           370 |\n| 423 | 2023-02-28       |          1181 |\n| 424 | 2023-03-01       |          1028 |\n| 425 | 2023-03-02       |           952 |\n| 426 | 2023-03-03       |           736 |\n| 427 | 2023-03-04       |           795 |\n| 428 | 2023-03-05       |           705 |\n| 429 | 2023-03-06       |           335 |\n| 430 | 2023-03-07       |           989 |\n| 431 | 2023-03-08       |           926 |\n| 432 | 2023-03-09       |           794 |\n| 433 | 2023-03-10       |           778 |\n| 434 | 2023-03-11       |           805 |\n| 435 | 2023-03-12       |           606 |\n| 436 | 2023-03-13       |           313 |\n| 437 | 2023-03-14       |           988 |\n| 438 | 2023-03-15       |           816 |\n| 439 | 2023-03-16       |           680 |\n| 440 | 2023-03-17       |           631 |\n| 441 | 2023-03-18       |           627 |\n| 442 | 2023-03-19       |           549 |\n| 443 | 2023-03-20       |           270 |\n| 444 | 2023-03-21       |           877 |\n| 445 | 2023-03-22       |           373 |\n| 446 | 2023-03-23       |           908 |\n| 447 | 2023-03-24       |           893 |\n| 448 | 2023-03-25       |           863 |\n| 449 | 2023-03-26       |           667 |\n| 450 | 2023-03-27       |           355 |\n| 451 | 2023-03-28       |          1001 |\n| 452 | 2023-03-29       |          1002 |\n| 453 | 2023-03-30       |           956 |\n| 454 | 2023-03-31       |           854 |\n| 455 | 2023-04-01       |           991 |\n| 456 | 2023-04-02       |           789 |\n| 457 | 2023-04-03       |           420 |\n| 458 | 2023-04-04       |          1357 |\n| 459 | 2023-04-05       |          1204 |\n| 460 | 2023-04-06       |          1109 |\n| 461 | 2023-04-07       |          1133 |\n| 462 | 2023-04-08       |          1261 |\n| 463 | 2023-04-09       |           956 |\n| 464 | 2023-04-10       |           458 |\n| 465 | 2023-04-11       |          1490 |\n| 466 | 2023-04-12       |          1334 |\n| 467 | 2023-04-13       |          1181 |\n| 468 | 2023-04-14       |          1215 |\n| 469 | 2023-04-15       |          1197 |\n| 470 | 2023-04-16       |           891 |\n| 471 | 2023-04-17       |           474 |\n| 472 | 2023-04-18       |          1696 |\n| 473 | 2023-04-19       |          1514 |\n| 474 | 2023-04-20       |          1449 |\n| 475 | 2023-04-21       |          1441 |\n| 476 | 2023-04-22       |          1477 |\n| 477 | 2023-04-23       |          1138 |\n| 478 | 2023-04-24       |           571 |\n| 479 | 2023-04-25       |          1909 |\n| 480 | 2023-04-26       |          1745 |\n| 481 | 2023-04-27       |          1663 |\n| 482 | 2023-04-28       |          1613 |\n| 483 | 2023-04-29       |          1915 |\n| 484 | 2023-04-30       |           976 |\n| 485 | 2023-05-01       |           837 |\n| 486 | 2023-05-02       |          2604 |\n| 487 | 2023-05-03       |          2187 |\n| 488 | 2023-05-04       |           994 |\n| 489 | 2023-05-05       |           906 |\n| 490 | 2023-05-06       |          1062 |\n| 491 | 2023-05-07       |          2345 |\n| 492 | 2023-05-08       |          1331 |', name='Genie', id='4a271f0b-5a6e-4d01-8c71-41b4ba15ef13', tool_calls=None, tool_call_id=None, attachments=None) finish_reason=None custom_outputs=None usage=None -----------

delta=ChatAgentMessage(role='assistant', content='東京の感染者数の傾向は、2022年初頭から2023年にかけて大きな変動が見られます。特に2022年1月には感染者数が急増し、1月中旬には1日あたりの感染者数が1万人を超える日もありました。その後、感染者数は一時的に減少しましたが、夏にかけて再び増加し、特に7月には3万人を超える日もありました。\n\n2022年の秋から冬にかけては、感染者数が再び増加し、2023年1月には高い水準を維持していました。その後、感染者数は徐々に減少し、2023年4月には比較的低い水準に落ち着いています。\n\n全体として、東京の感染者数は季節や新たな変異株の影響を受けながら、波のように変動していることがわかります。', name=None, id='run-7a3db63b-fd27-4cd3-bb29-1999c4b8142c-0', tool_calls=None, tool_call_id=None, attachments=None) finish_reason=None custom_outputs=None usage=None -----------
```

## エージェントをMLflowモデルとしてログに記録する

`agent.py`ファイルからコードとしてエージェントをログに記録します。詳細は[MLflow - Models from Code](https://mlflow.org/docs/latest/models.html#models-from-code)を参照してください。

### Databricksリソースの自動認証を有効にする
最も一般的なDatabricksリソースタイプに対して、Databricksはエージェントのログ記録時にリソース依存関係を事前に宣言することをサポートおよび推奨しています。これにより、エージェントをデプロイする際に自動認証パススルーが有効になります。自動認証パススルーを使用すると、Databricksはこれらのリソース依存関係に安全にアクセスするための短命の資格情報を自動的にプロビジョニング、回転、および管理します。

自動認証を有効にするには、`mlflow.pyfunc.log_model()`を呼び出す際に依存するDatabricksリソースを指定します。
  - **TODO**: Unity Catalogツールが[ベクター検索インデックス](docs link)をクエリする場合や[外部関数](docs link)を利用する場合は、それぞれ依存するベクター検索インデックスおよびUC接続オブジェクトをリソースとして含める必要があります。詳細はドキュメントを参照してください（[AWS](https://docs.databricks.com/aws/ja/generative-ai/agent-framework/log-agent#specify-resources-for-automatic-authentication-passthrough) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/generative-ai/agent-framework/log-agent#resources)）。

[Models from Code](https://mlflow.org/docs/latest/model/models-from-code/)でロギングします。

```py
# デプロイ時に自動認証パススルーを指定するためのDatabricksリソースを決定
import mlflow
from agent import GENIE_SPACE_ID, LLM_ENDPOINT_NAME, tools
from databricks_langchain import UnityCatalogTool, VectorSearchRetrieverTool
from mlflow.models.resources import (
    DatabricksFunction,
    DatabricksGenieSpace,
    DatabricksServingEndpoint,
)

# TODO: 必要に応じて基礎となるリソースを手動で含める。詳細は上記のマークダウンのTODOを参照。
resources = [
    DatabricksServingEndpoint(endpoint_name=LLM_ENDPOINT_NAME),
    DatabricksGenieSpace(genie_space_id=GENIE_SPACE_ID),
]
for tool in tools:
    if isinstance(tool, VectorSearchRetrieverTool):
        resources.extend(tool.resources)
    elif isinstance(tool, UnityCatalogTool):
        resources.append(DatabricksFunction(function_name=tool.uc_function_name))

with mlflow.start_run():
    logged_agent_info = mlflow.pyfunc.log_model(
        artifact_path="agent",
        python_model="agent.py",
        input_example=input_example,
        pip_requirements=[
            "mlflow",
            "langgraph==0.3.4",
            "databricks-langchain",
            "pydantic",
        ],
        resources=resources,
    )
```

モデルが記録されます。

![Screenshot 2025-03-12 at 9.18.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9691f0c1-480b-4616-9597-82fd7243211e.png)

## デプロイ前のエージェント検証

エージェントを登録およびデプロイする前に、[mlflow.models.predict()](https://mlflow.org/docs/latest/python_api/mlflow.models.html#mlflow.models.predict) APIを使用してデプロイ前のチェックを実行します。Databricksのドキュメントを参照してください（[AWS](https://docs.databricks.com/ja/machine-learning/model-serving/model-serving-debug.html#validate-inputs) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/machine-learning/model-serving/model-serving-debug#before-model-deployment-validation-checks)）。

```py
mlflow.models.predict(
    model_uri=f"runs:/{logged_agent_info.run_id}/agent",
    input_data=input_example,
    env_manager="uv",
)
```

## モデルをUnity Catalogに登録する

以下の`catalog`、`schema`、および`model_name`を更新して、MLflowモデルをUnity Catalogに登録します。

```py
mlflow.set_registry_uri("databricks-uc")

# TODO: UCモデルのカタログ、スキーマ、およびモデル名を定義する
catalog = "users"
schema = "takaaki_yayoi"
model_name = "genie"
UC_MODEL_NAME = f"{catalog}.{schema}.{model_name}"

# モデルをUCに登録
uc_registered_model_info = mlflow.register_model(
    model_uri=logged_agent_info.model_uri, name=UC_MODEL_NAME
)
```

UCにモデルが登録されました。

![Screenshot 2025-03-12 at 9.20.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/5b9e81d5-1d44-4f56-a0f1-f8c27a2eba25.png)

## エージェントをデプロイする

上で`dbutils.library.restartPython()`しているので、変数を再定義しています。

```py
secret_scope_name = "demo-token-takaaki.yayoi"
secret_key_name = "pat"
```

```py
from databricks import agents

agents.deploy(
    UC_MODEL_NAME,
    uc_registered_model_info.version,
    tags={"endpointSource": "docs"},
    environment_vars={
        "DATABRICKS_GENIE_PAT": f"{{{{secrets/{secret_scope_name}/{secret_key_name}}}}}"
    },
)
```

サービングエンドポイントにデプロイされました。

![Screenshot 2025-03-12 at 9.22.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/1a84d01e-fdf5-444c-9eb4-64226699e36a.png)

レビューアプリでも動作確認できます。

![Screenshot 2025-03-12 at 9.24.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/67b93b63-ca8b-4ef1-a76c-a5c8ac12b778.png)

AI Playgroundでも動きます。

![Screenshot 2025-03-12 at 9.25.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/dfc2ab77-9842-41e9-b617-a5e343a5247e.png)
![Screenshot 2025-03-12 at 9.26.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/79b162ce-cd8a-4121-9c3a-6b99870aa6ab.png)

## 次のステップ

エージェントがデプロイされた後、AIプレイグラウンドでエージェントとチャットして追加のチェックを行ったり、組織内のSMEと共有してフィードバックを得たり、プロダクションアプリケーションに埋め込んだりすることができます。Databricksのドキュメントを参照してください（[AWS](https://docs.databricks.com/ja/generative-ai/deploy-agent.html) | [Azure](https://learn.microsoft.com/ja-jp/azure/databricks/generative-ai/deploy-agent)）。


### はじめてのDatabricks

[はじめてのDatabricks](https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d)

### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)