メインコンテンツへスキップ
メインコンテンツへスキップ

DSPy と ClickHouse MCP Server を使って AI エージェントを構築する方法

このガイドでは、DSPy を使って、 ClickHouse の MCP Server を介して ClickHouse の SQL playground と対話できる AI エージェントを構築する方法を説明します。

前提条件

  • システムに Python がインストールされている必要があります。
  • システムに pip がインストールされている必要があります。
  • Anthropic の API キー、または別の LLM プロバイダーの API キーが必要です。

以下の手順は、Python REPL からでも、スクリプトとしてでも実行できます。

サンプルノートブック

この例は、examples リポジトリ内のノートブックとして参照できます。

ライブラリのインストール

pipを使用して以下のコマンドを実行し、必要なライブラリをインストールします:

pip install -q --upgrade pip
pip install -q dspy
pip install -q mcp

認証情報の設定

次に、Anthropic APIキーを指定する必要があります:

import os
os.environ["ANTHROPIC_API_KEY"] = getpass.getpass("Anthropic APIキーを入力:")
別のLLMプロバイダーを使用する場合

Anthropic APIキーをお持ちでない場合や、別のLLMプロバイダーを使用したい場合は、 DSPyドキュメントで認証情報の設定手順をご確認ください。

次に、ClickHouse SQLプレイグラウンドに接続するための認証情報を定義します:

env = {
    "CLICKHOUSE_HOST": "sql-clickhouse.clickhouse.com",
    "CLICKHOUSE_PORT": "8443",
    "CLICKHOUSE_USER": "demo",
    "CLICKHOUSE_PASSWORD": "",
    "CLICKHOUSE_SECURE": "true"
}

MCPサーバーの初期化

次に、ClickHouse MCP ServerをClickHouse SQLプレイグラウンドに接続するように設定します。

from mcp import ClientSession, StdioServerParameters
from mcp.client.stdio import stdio_client
import dspy

server_params = StdioServerParameters(
    command="uv",
    args=[
        'run',
        '--with', 'mcp-clickhouse',
        '--python', '3.13',
        'mcp-clickhouse'
    ],
    env=env
)

LLMの初期化

次に、以下のコマンドでLLMを初期化します:

dspy.configure(lm=dspy.LM("anthropic/claude-sonnet-4-20250514"))

エージェントを実行する

最後に、エージェントを初期化して実行します。

class DataAnalyst(dspy.Signature):
    """あなたはデータアナリストです。質問を受け取り、利用可能なツールを使用して回答してください。"""

    user_request: str = dspy.InputField()
    process_result: str = dspy.OutputField(
        desc=(
            "クエリへの回答"
        )
    )

from utils import print_dspy_result

async with stdio_client(server_params) as (read, write):
    async with ClientSession(read, write) as session:
        await session.initialize()
        tools = await session.list_tools()

        dspy_tools = []
        for tool in tools.tools:
            dspy_tools.append(dspy.Tool.from_mcp_tool(session, tool))

        react = dspy.ReAct(DataAnalyst, tools=dspy_tools)
        result = await react.acall(user_request="最も人気のあるAmazon製品カテゴリは何ですか")
        print_dspy_result(result)
================================================================================
🤖 DSPy ReAct 結果
================================================================================

📍 ステップ 1
----------------------------------------
🧠 思考: Amazonの製品カテゴリに関する情報を見つけ、最も人気のあるカテゴリを特定する必要があります。まず、Amazon関連のデータがあるかどうかを確認するために、利用可能なデータベースを調査します。

🔧 ツール: list_databases

📊 結果:
   amazon
bluesky
country
covid
default
dns
environmental
food
forex
geo
git
github
hackernews
imdb
logs
metrica
mgbench
mta
noaa
nyc_taxi
nypd
ontime
opensky
otel
otel_v2
pypi
random
reddit
rubygems
sta...

📍 ステップ 2
----------------------------------------
🧠 思考: 素晴らしい!「amazon」データベースが利用可能であることが確認できました。これはAmazonの製品カテゴリに関する情報を見つけるために必要なものです。amazonデータベース内のテーブルを調査して、どのようなデータが利用可能かを確認します。

🔧 ツール: list_tables
   引数: {'database': 'amazon'}

📊 結果:
   {
  "database": "amazon",
  "name": "amazon_reviews",
  "comment": "",
  "columns": [
    {
      "name": "review_date",
      "type": "Date",
      "default_type": "",
      "default_expression": "",...

📍 ステップ 3
----------------------------------------
🧠 思考: 完璧です!product_category列を含むamazon_reviewsテーブルを見つけました。このテーブルには1億5000万行を超えるAmazonレビューデータがあり、製品の人気度を適切に表現できるはずです。最も人気のあるAmazon製品カテゴリを見つけるには、カテゴリごとのレビュー数をカウントし、カウント数の降順で並べ替える必要があります。最も多くのレビューを持つカテゴリが最も人気があると見なされます。

🔧 ツール: run_select_query
   引数: {'query': 'SELECT product_category, COUNT(*) as review_count FROM amazon.amazon_reviews GROUP BY product_category ORDER BY review_count DESC LIMIT 10'}

📊 結果:
   1. Books: 19,530,930件のレビュー
   2. Digital_Ebook_Purchase: 17,622,107件のレビュー
   3. Wireless: 9,001,567件のレビュー
   4. PC: 6,908,245件のレビュー
   5. Home: 6,221,321件のレビュー
   ... その他5件

📍 ステップ 4
----------------------------------------
🧠 思考: 完璧です!ユーザーの質問に対する答えが見つかりました。Amazonレビューデータに基づくと、「Books」が19,530,930件のレビューで最も人気のあるAmazon製品カテゴリであることが明確にわかります。次いで「Digital_Ebook_Purchase」が17,622,107件のレビューとなっています。データは、各カテゴリが受け取ったレビュー数に基づいて、製品カテゴリの人気度の明確なランキングを示しています。ユーザーの質問に答えるために必要なすべての情報が揃いました。

🔧 ツール: finish

📊 結果:
   完了しました。

🎯 推論
----------------------------------------
最も人気のあるAmazon製品カテゴリに関する質問に答えるため、Amazonデータベースにアクセスし、1億5000万件を超えるレビューレコードを含む「amazon_reviews」というテーブルを見つけました。このテーブルには「product_category」列があり、レビュー数に基づいて製品の人気度を分析できます。製品カテゴリごとのレビュー数をカウントし、カウント数の降順で並べ替えるクエリを実行しました。ここでの前提は、より多くのレビューを持つカテゴリがより高い人気を示すということです。これは、より多くのレビューが通常、より多くの購入と顧客エンゲージメントに相関するためです。

✅ 最終結果
----------------------------------------
1億5000万件を超えるレコードを含むAmazonレビューデータに基づくと、最も人気のあるAmazon製品カテゴリは**Books**で、19,530,930件のレビューがあります。

レビュー数による上位10のAmazon製品カテゴリは以下の通りです:

1. **Books** - 19,530,930件のレビュー
2. **Digital_Ebook_Purchase** - 17,622,107件のレビュー  
3. **Wireless** - 9,001,567件のレビュー
4. **PC** - 6,908,245件のレビュー
5. **Home** - 6,221,321件のレビュー
6. **Apparel** - 5,906,085件のレビュー
7. **Health & Personal Care** - 5,331,239件のレビュー
8. **Beauty** - 5,115,462件のレビュー
9. **Video DVD** - 5,069,014件のレビュー
10. **Mobile_Apps** - 5,033,164件のレビュー

興味深いことに、BooksとDigital Ebook Purchase(関連するカテゴリ)を合わせると3700万件を超えるレビューがあり、Amazonプラットフォームにおける読書資料の高い人気を示しています。
================================================================================