Tableauのデータに対して生成AIを利用して質問ができる「Tableau Langchain」を試してみた
駆け出しカスタマーサクセスマネージャーの玉井です。
職場の同僚の方に、以下を教えてもらいました。
というわけで、上記を実際に試してみたいと思います(序文が適当すぎる)。
Tableau Langchainとは?
そもそもまずLangchainとはなんやねんっていう話ですが、以下によれば「ChatGPTなどの大規模言語モデルの機能拡張を効率的に実装するためのライブラリ」だそうです。
「じゃあこれはTableauとLLMを組み合わせた何かを作るためのライブラリってこと?」と考えるのが自然な気がしますが、実際のところはTableau Cloud(もしくはTableau Server)にパブリッシュされているデータソースに対してLLMを通して質問(クエリ実行)ができるアプリケーション…という感じでした。
まあ、考えるより、さっさと触ってみたほうが理解が進むので、ちゃっちゃと検証してみましょう。
やってみた
事前準備
こちらのアプリ(?)ですが、色々なLLM関係のサービスを組み合わせて動作するような設計になっており、それらを事前に準備しておく必要があります(結構めんどいです)。というわけで、それらを羅列していきます。
-
OpenAI API
- アカウントを作って、APIを利用できるようにしておく
- そう、Tableau Langchainを動かすには課金が必須である
- 血の涙を流しがら$10課金しました
-
Langsmith
- LangChainを本番環境で運用する際の便利ツールとのこと
- アカウントを作って、APIを利用できるようにしておく
-
Pinecone
- いわゆるベクトルデータベース(文章をベクトル化して保存する)
- アカウントを作って、APIを利用できるようにしておく
-
Tavily
- LLM用に構築された検索エンジン
- アカウントを作って、APIを利用できるようにしておく
上記に加えて、以下も必要です。
- Tableau CloudかTableau Server
- 今回はTableau Cloudでやります。2025.1
- Tableau Langchain用の接続済みアプリの設定をしておく
- Heroku
- 後述する利用方法のうち、Herokuを利用する方法を選ぶ場合は必要
接続済みアプリはこんな感じ。めんどいので権限全振り♪
LLM開発周りに全く明るくないので、もはや個人的な感想レベルですが、上記のサービス達は、RAGを用いたLLMアプリ開発には結構メジャーどころの面子っぽいですね。RAGというのは外部情報の検索をLLMの回答に組み合わせる技術ですが、Tableau Langchainは、まさにLLMの回答にパブリッシュドデータソースを組み合わせて回答させる、まさにRAGでLLMなアプリ(?)ということで、上記のサービスを利用しているのでしょうね(もう一度言いますが、個人の感想です。間違ってる可能性大です)。
利用方法(検証方法)を選ぶ
(この記事の執筆時点での)現在、Tableau Langchainを試すには、以下の3通りあるようです。
- 何らかのNotebook(jupyterとか)で試す
- リポジトリにサンプルのipynbファイルがある
- Herokuにデプロイして試す
- ローカルにデプロイして試す
READMEを読む限り、一番楽そうなのはNotebookの利用で、一番面倒そうなのはローカル環境でした(専用のPython環境の構築が死ぬほど面倒そう)。
一番簡単そうなのをやるのもつまらないので、今回はHerokuにデプロイして試してみようと思います(自分の会社のプロダクトですし)。
Herokuにデプロイする
READMEにご丁寧にも「Deploy to Heroku」ボタンがあるので、それを利用します。ボタンを押すと、Herokuのセットアップ画面に遷移します。
この画面では、定義済の環境変数に値を入れていきます。入力さえすれば、すぐにでもデプロイできるのですが、まあ環境変数の多いこと多いこと…。以下に羅列&説明を記します(順不同)。
-
DEBUG
: エージェントの動作中にどの程度のログを出力するかを指定。1または0を設定。- 通常は0
-
OPENAI_API_KEY
: 文字通りの意味 -
AGENT_MODEL
: エージェントが使用するLLMモデルを指定(例: gpt-4o-mini)。- 詳細はOpenAIのAPIドキュメントを参照
-
RETRIEVER_MODEL
: Retrieverツールが使用する埋め込みモデルを指定(例: text-embedding-3-small)- ぶっちゃけあまりよくわかってません
-
LANGCHAIN_TRACING_V2
: Langsmithでエージェントのトレースを行うかどうかを真偽値(trueまたはfalse)で指定。- ぶっちゃけ(ry
- とりあえずtrueにしました
-
LANGCHAIN_ENDPOINT
: Langsmithのエンドポイント- デフォルト値は https://api.smith.langchain.com です。
-
LANGCHAIN_API_KEY
: 文字通りの意味 -
LANGCHAIN_PROJECT
: Langsmithのプロジェクト名 -
TAVILY_API_KEY
: 文字通りの意味 -
PINECONE_API_KEY
: 文字通りの意味 -
PINECONE_ENVIRONMENT
: Pineconeのがホストされているクラウド環境- 確認方法が調べてもよくわからなかったのですが、アカウント作成直後に遷移する「Welcome to your project」という画面に記載されているサンプルコードにリージョンとクラウド名があったので、それを組み合わせて入れてます(合ってるか不明)
- 私の場合は
us-east-1-aws
-
TABLEAU_DOMAIN
: Tableau CloudかServerの環境のホスト名-
https://xxxxx.tableau.com/
まで
-
-
TABLEAU_SITE
: サイト名- URLで確認できます。
-
TABLEAU_API
: Tableau REST APIのバージョン- 最新の3.25にしました。
-
TABLEAU_JWT_CLIENT_ID
: 接続済みアプリのクライアントID -
TABLEAU_JWT_SECRET_ID
: 接続済みアプリのシークレットID -
TABLEAU_JWT_SECRET
: 接続済みアプリのシークレットの値 -
TABLEAU_USER
: Tableauユーザー名
心を込めて入力してきます
デプロイ後の悪戦苦闘
環境変数を一通り入力し、いざデプロイしたところ、エラーで動きませんでした。(心を込めて入力したのに)
コード微修正の巻
まずそもそも以下の点でコード自体に不足があったので、微修正しました(こっそり人生初のプルリク出してみました[1])。
-
Procfileで指定している
main.py
にパスが間違っている -
requirements.txt
に、動作に必要なライブラリが足りていない- tokenizers
- langchain_tableau
そもそもAPIとして設計されていない?の巻
とりあえず勢いでHerokuのデプロイまでやってきましたが、そもそも(そもそも言い過ぎ)このアプリはどのような形態で利用するのでしょうか?
READMEによれば、「デプロイしたアプリに対して、プロンプトをPOSTで渡すと回答が返ってくる」という感じに読めます。ProcfileにもAPIモードで動作させるようなコマンドが記述されているところから察するに、プロンプトをリクエストとして受け取り、AIによる回答をレスポンスとして返すAPIとして動作することを想定しているようです(中の動きとして、受け取ったプロンプトを基にTableau側にVDSを利用してクエリを実行する)。
しかし、デプロイ後のアプリログを見てみると、実際の設計としては、どうもAPIとして動くことを想定していない感じがしました。
起動直後は以下のようなメッセージがログに出ます。
2025-03-24T06:53:42.496324+00:00 app[web.1]: Welcome to the Tableau Agent Staging Environment!
2025-03-24T06:53:42.496324+00:00 app[web.1]: Enter a prompt or type 'exit' to end
2025-03-24T06:53:42.496334+00:00 app[web.1]: User:
最初は「おー、Welcomeされてるやん」とテンション高めになりますが、よく見てみると、その場でこちらの入力を待ってるかのようなメッセージが出てるのが気になります。
そして、ほどなくしてエラーで落ちます。
2025-03-24T06:53:42.496354+00:00 app[web.1]: An error occurred: EOF when reading a line
2025-03-24T06:53:42.497329+00:00 app[web.1]: Traceback (most recent call last):
2025-03-24T06:53:42.497521+00:00 app[web.1]: File "/app/main.py", line 94, in main
2025-03-24T06:53:42.497526+00:00 app[web.1]: user_input = input("User: \n").strip() # Use .strip() to remove leading/trailing whitespace
2025-03-24T06:53:42.497527+00:00 app[web.1]: ~~~~~^^^^^^^^^^^^
こちらのエラーですが、本来はユーザー側の入力を待つはずが、ユーザー側の入力が無い(受け付けれない?)ということでエラーになっているように思えます。
APIとして動作するのであれば、こんなところで入力を待つのではなく、各種HTTPリクエストを受け付けられる状態で待機しとくようになってそうなものですが(知らんけど)、どう見てもこれはCUIで直接プロンプトを叩き込む設計になっているようにしか思えませんでした。
ダイレクトドライブ(直接実行)の巻
なので、デプロイしたアプリに入ってみたいということで、まずは普通にSSH接続しようとしました。しかし、アプリ自体は(先述の通り)エラーが発生している状態なので、Heroku上はこのアプリはCrash状態扱いとなってしまっており(まあ当たり前ですが…)、SSH接続自体が実行できませんでした。[2]
どうしようかと途方に暮れていた矢先、Herokuのメニューの中に、ある機能を見つけました
Web UI上で直接デプロイしたアプリ(正確にいうとDynoっていうコンテナ)にCUIで入れるっぽい…!が、アプリがCrash状態だったら結局これもできないのでは…?
くよくよ言ってても何も始まらないので、とりあえず実行してみたところ、入れました。
知ってるコマンドはこの程度
というわけで、ついにTableau Langchainを本当の意味で実行する時が来ました。
プロンプトを投げてみる
無事中に入れたら、まずは本体を実行します。
$ python main.py
[nltk_data] Downloading package punkt_tab to
[nltk_data] /app/.heroku/python/lib/python3.13/site-
[nltk_data] packages/llama_index/core/_static/nltk_cache...
[nltk_data] Unzipping tokenizers/punkt_tab.zip.
Agent Graph saved as 'graph_visualization.png' | file size: 8936 bytes
<IPython.core.display.Image object>
Welcome to the Tableau Agent Staging Environment!
Enter a prompt or type 'exit' to end
User:
ついに起動しました!…しかし、先程も書いたように、やはり直接CUIで実行することしか想定されていないようにしか思えないですね…。まあいっか…。
成功例
結論から書きますと、「プロンプトが英語で、データソースがシンプルな日本語もしくは英語の場合は成功した」という検証結果になりました。
というわけで、まずは成功結果のスクショを貼ります。
私が指定したデータソースは例のスーパー玉出のものなのですが、「店舗の一覧を出せ」というプロンプトに対して、実際にTableau Cloud上のスーパー玉出のデータから「店舗名」というディメンションのユニーク値を一覧で返してくれました。
私が投げたプロンプトは以下です。
Please do not translate the dimension names into English, but use them as they are. List all the unique values for the dimension “店舗名”.
最初の一文なんですが、このLLMアプリ、こちらが書いたディメンション名等を英語に翻訳して解釈するところがありまして(余計なお世話)、「それをするなよ(日本語のまま使え)」という命令のために追加しています。
うまくいかなかった例
次にうまくいかなかった例を紹介します。
この玉出データには、「私の前職の移転前の大阪オフィスから(各店舗までの)距離」が入っており、それを用いた質問を投げています。
プロンプト自体は日本語でも大丈夫っぽいのですが(まあLLMなので)、なんと「大阪」が「大分」として解釈されてしまっています…!そして健気にも「大分オフィスからの距離」というメジャーを探しては「そんなデータは無いです〜」というエラーを繰り返しています。私の前職に大分オフィスは無い!!(福岡オフィスはある)
で、「大分じゃなくて大阪だよ」みたいなことを言ってみたのですが、まさかの大分を「Daibun」、大阪を「Daito」という新解釈が来ました。確かに大阪に大東市ってあるけど、逆にハイレベルな回答なのかこれは?
プロンプトの書き方を変えてみたところ、回答はしてくれるようになりましたが、普通に間違っております(しかも店舗名じゃなくて住所だし、大阪オフィスからの距離ではなく、経度をもってきてるし…)
他にも色々試してみましたが、うまくいったのは先述の店舗一覧くらいでした。データソースを全部英語のものにして、英語プロンプトでやれば、もう少しうまくいくかもしれません(が、私の検証エネルギー、ここで力尽きる)。
補足情報と感想
Tableau Conference 2025で紹介される?
今年の4月にTC25がサンディエゴで開催されますが、セッションの1つにTableau Langchainを紹介する(と思われる)ものがありました。
気になった方は今すぐ申し込んで渡米!!
BIとLLMの組み合わせを実現している製品
BIツールにLLMを組み合わせるという発想は誰もがするところだと思いますが、実際に実現している製品をいくつかご紹介します。
Looker
Google Cloudが買収したBIツールのLookerは、既に生成AI連携機能を搭載しています。
私の前職の同僚が上記の記事でガッツリ検証していますが、「データに対して文章で質問ができる」という、BIツールの「夢」を実現しかけている感じがしますね。記事にもありますが、LookMLというコードでセマンティックレイヤーが既にあるため、それが生成AIの回答精度に活かされている感があります。
Omni
AI-powered summarizationという機能があり、データの異常を特定したり、トレンドに関する洞察を特定したりできるようです。Blobby AIというのに色々と対話形式で聞けるようです。
Tabelau Next
我らがTableauですが、今のTableauとは別ラインとして、Salesforce上で動くTableau Nextというものが発表されています。
こちらも、文章で色々とデータに対して質問ができる機能がありますが、LookerがLookMLによるセマンティックレイヤーで回答精度を上げているのに対して、Tableau Nextは、Salesforce Data Cloud[3]と連携することで、セマンティックレイヤーを構築し、それを利用することで正しい回答を得られるようにしています。
感想
何となくですが、まだ発展途上(開発中?)な感じがしており、TC25のセッションの時に、もう少しちゃんとしたものになるのかなあと思いました。
とはいえ、Tableau(のデータ)に対して、分析に関する質問を自然言語で出来るというのは大きいです。というのも、Tableauでそれができる予定なのは、現在のところ上述のTableau Nextだけです(従来のTableauで利用できる「Tableau Agent」は、あくまでVizや計算フィールドの作成をLLMにやらせることができる、というもの)。Tableau NextはSalesforce上で動くプロダクトなので、Salesforceを使ってなかったり、分析基盤がSalesforceとは別に存在していたりする組織・企業の場合、なかなか利用が難しいと思います。そういった方々にとって、このTableau Langchainは、(今後色々と発展していくという可能性を踏まえて)希望が持てるものになるのではないでしょうか。
あと、ちょっとした要望としては、Tableau CloudやTableau Serverのデータ全体に対して質問してみたいですね(今はデータソースを指定する必要があるため)
Discussion