Squadbase

Text-to-Pythonでオンデマンドなデータ分析ダッシュボードを実現する

Text-to-Python技術を活用してオンデマンドなデータ分析を実現する方法を学習する

前章では、Text-to-SQL を用いたデータベースクエリの自動生成について学びました。これにより、ユーザーは自然言語での質問を通じて、データベースから必要な情報を迅速に取得できるようになりました。

本章では、Text-to-Python によって、自然言語での質問に対してリアルタイムで Python コードを生成し、動的なデータ分析を行うダッシュボードの構築方法を学びます。これにより、ユーザーはその場で生まれる具体的な疑問に対して即座にフィードバックを受けることが可能になります。

Text-to-Python の価値と可能性

従来の分析手法の限界

従来のデータ分析には大きく 2 つのアプローチがありました

  • ノーコード・ローコードツール

    専門知識がなくても直感的に操作できるが、既定のテンプレートや機能に制限され、柔軟な分析や独自の可視化が困難

  • プログラミングベースのアプローチ(Python、R など)

    高い柔軟性や自由度を持つが、習得に時間がかかり、日常業務で活用するハードルが高い

この結果、多くのビジネスパーソンが「もう少し詳しく分析したい」「この角度で数字を見たい」と思っても、その場で自分自身が必要な分析を実行することが困難でした。

Text-to-Python がもたらす変革

Text-to-Python は、この課題を根本的に解決します。「売上が前年同月比で最も増加している商品カテゴリを教えて」といった自然言語の質問を入力すると、AI が Python コードを生成し、データベースから必要な情報を抽出・分析して結果を表示します。

静的な Dashboard と Text-to-Python の使い分け

Text-to-Python の特徴は、デプロイが必要なく、その場で分析のフィードバックループを回せることです。Streamlit で BI ダッシュボードを作る場合、以下のように使い分けるといいでしょう。

  • 探索的な分析: Text-to-Python

    • 「なぜ売上が下がったのか?」といった原因究明
    • 会議中に生まれた疑問への即座の回答
    • 仮説 → 検証 → 新たな仮説のサイクルを高速で回す
  • 定期監視: 静的ダッシュボード

    • 日次売上、KPI などの定型的な指標監視
    • ステークホルダーとの定期的な情報共有
    • 異常値の監視と早期発見

この使い分けにより、探索的分析で得たインサイトを静的ダッシュボードに反映し、発見から継続監視への流れを構築できます。

Text-to-Python の構成要素

Text-to-Python システムは、コード生成とコード実行の 2 つのステップから構成されます:

1. コードの生成: LLM が自然言語から Python コードを生成

ユーザーが自然言語で入力した分析要求を、LLM が解釈し、対応する Python コードを自動生成します。

この段階では、LLM はデータの構造、利用可能なライブラリ、分析の目的を考慮して、最適なコードを生成します。プロンプトエンジニアリングにより、より精度の高いコード生成が可能になります。

2. コードの実行: 生成されたコードを安全な環境で実行

生成された Python コードを、セキュリティが保証された隔離環境(サンドボックス)で実行し、結果をユーザーに返します。

Python コードの生成

効果的なプロンプト設計

第五章では、AI Coding Tool を利用するための効果的なプロンプトについて紹介しました。

Text-to-Python でも同様に、 AI に対する指示(プロンプト)が重要です。意図したコードを生成するためには、「コードを書いて」と曖昧に依頼するのではなく、AI が理解しやすい構造化された指示を提供しましょう。

AI がコードを生成するために必要な背景情報として、以下の要素を含めましょう。

  • データベーススキーマの提供: テーブル名、カラム名、データ型、データの性質などを明示
  • 利用可能なライブラリの指定: (例: 「pandas, plotly が利用してください。」)
  • データの特性: サイズ、形式、特殊な制約の説明
  • 分析の目的: 何を達成したいのかを具体的に記述
  • 出力形式の指定: 結果をどのように出力、保存するか(例: 「plotly でグラフを生成して、png で保存してください」)

サンドボックス環境の必要性

Python には、exec()eval()といったコード動的に評価、実行する組み込み関数が用意されています。しかし、これらの関数は信頼できないコードの実行に向けて作られたものではなく、LLM 生成のコードを実行する場合には以下のような危険性があります

  • ファイルシステムへの不正アクセス
  • システムコマンドの実行
  • 機密情報の漏洩
  • システムリソースの過度な消費

これらのリスクを回避するため、生成されたコードは隔離された安全な環境(サンドボックス)で実行するべきです。サンドボックス環境では、コードの実行範囲を制限し、システムへの影響を最小限に抑えることができます。

主要なサンドボックスサービス比較

現在、以下のようなマネージドサンドボックスサービスが利用できます。

  • E2B: AI アプリケーション向けに特化したクラウドランタイム
  • Daytona: 開発環境管理に特化したプラットフォーム
  • Modal: 汎用的なクラウドコンピューティング基盤

本章では、特に AI アプリケーションでの実績が豊富で、高速起動を実現する E2B を使用します。

E2B を使用した Streamlit アプリケーションの構築

ここまでで、Text-to-Python を実現するための基本的な概念について学びました。

実際に、Streamlit と E2B, OpenAI API を組み合わせて、csv ファイルを分析する簡単な Text-to-Python アプリケーションを構築してみましょう。

事前準備: E2B のセットアップとデータセットの準備

E2B API Keyを参考に、API キーを発行し、その値を環境変数 E2B_API_KEY に設定してください。また、Open AI の API キーも必要です。

E2B_API_KEY=e2b_xxx
OPENAI_API_KEY="sk-xxx"

アプリケーションの実行

以下のコードをapp.pyというファイル名で保存し、streamlit run app.pyで実行します。

from dotenv import load_dotenv
from e2b_code_interpreter import Sandbox, Execution
import streamlit as st
import openai
from pydantic import BaseModel
import base64

load_dotenv()

# Create sandbox
sbx = Sandbox()

# Upload the dataset to the sandbox
dataset_path_in_sandbox = ""
with open("dataset.csv", "rb") as f:
    dataset_path_in_sandbox = sbx.files.write("dataset.csv", f)


def run_code_in_sandbox(python_code: str) -> Execution:
    execution = sbx.run_code(python_code)
    return execution


class PythonGeneratedResult(BaseModel):
    code: str
    description: str


def generate_code(user_input: str) -> PythonGeneratedResult | None:
    prompt = f"""
Generate Python code and description for it.

I have a CSV file about movies. It has about 10k rows. It's saved in the sandbox at {dataset_path_in_sandbox}.
These are the columns:
- 'id': number, id of the movie
- 'original_language': string like "eng", "es", "ko", etc
- 'original_title': string that's name of the movie in the original language
- 'overview': string about the movie
- 'popularity': float, from 0 to 9137.939. It's not normalized at all and there are outliers
- 'release_date': date in the format yyyy-mm-dd
- 'title': string that's the name of the movie in english
- 'vote_average': float number between 0 and 10 that's representing viewers voting average
- 'vote_count': int for how many viewers voted

Write Python code that analyzes the dataset based on my request and produces right chart accordingly

- Output should be png image.
- Write code comments and description in English.

user input: {user_input}
"""

    response = openai.responses.parse(
        model="o4-mini",
        input=[{"role": "user", "content": prompt}],
        text_format=PythonGeneratedResult,
    )

    return response.output_parsed


st.title("Simple Text-to-Python")

with st.form("analyse_csv"):
    user_input = st.text_area(label="Input", height=200)

    submitted = st.form_submit_button("Submit")
    if submitted:
        generated = generate_code(user_input)

        if generated is None:
            st.write("Failed to generate python code")
            st.stop()

        st.write("Python Code Generated")
        st.code(generated.code, height=600)
        st.write(generated.description)

        execution = run_code_in_sandbox(generated.code)

        if execution.error:
            st.error(execution.error.value)

        if len(execution.results) == 0:
            st.write("Empty Output")

        for result in execution.results:
            if result.png:
                st.image(base64.b64decode(result.png))

データセットについて質問すると、AI が Python コードを生成し、E2B のサンドボックス環境で実行されます。結果は Streamlit アプリケーション上に表示されます。

アプリのスクリーンショット

発展的な Text-to-Python

基本的な Text-to-Python システムをさらに発展させることで、より実用的で柔軟なデータ分析環境を構築できます。

チャットインターフェースによる対話的分析 単発の質問ではなく、会話形式で連続した分析を実行できます。「先ほどの結果を詳しく見たい」「今度は別の角度で分析して」といった対話的な分析が可能になります。また、Text-to-Python 以外にも、Text-to-SQL や検索、外部 API など、他のツールを組み合わせて、より複雑な分析を行うことができます。

動的なデータソース選択 CSV ファイルのアップロードだけでなく、データベース接続や外部 API からのデータ取得にも対応します。ユーザーが分析したいデータソースを柔軟に選択できます。

パッケージの動的インストール 分析に必要な Python ライブラリにコード生成時に判断し、コードの実行前に動的にインストールします。特殊な分析手法や可視化に必要なパッケージも即座に利用可能になります。

コードの自動修正 エラーが発生した場合にコードを自動で修正して再実行します。

これらの発展機能を統合したサンプルアプリケーションを公開しています:

TODO: リンク GitHub Live demo hosted on Squadbase

サンプルアプリでは、実際のビジネス環境で使用できるレベルの Text-to-Python システムを体験できます。

まとめ

本章では、自然言語から Python コードを生成し、動的なデータ分析を実現する Text-to-Python システムについて学びました。

Text-to-Python は、従来のノーコード・ローコードツールの制約とプログラミングベースアプローチの習得困難さという課題を解決します。自然言語での質問に対してリアルタイムでコードを生成・実行することで、「もう少し詳しく分析したい」という場面で即座に対応できるようになります。

実装においては、LLM によるコード生成と E2B などのサンドボックス環境での安全な実行という 2 つのステップが重要です。十分な情報を LLM に与えることにより精度の高いコード生成を実現し、サンドボックス環境によりセキュリティリスクを回避できます。