😺

RAG用ドキュメントとしてのデータカタログ

2024/03/14に公開

データカタログの悩み

dataplexやdbt docs、その他無数のSaaS製品に代表されるデータカタログは、データリネージを自動的に生成できるなど便利な機能を数多くそろえている一方で、物足りない点もまだ多く、特にマネージャー陣など非データ分析職や他チームからの問い合わせを削減することは過去の経験から考えてもまだ難しいと感じている。

自チームがデータ分析を行う際には、とりあえずデータカタログで調べてみるという形を実現できたことはあるのだが、

マネージャー「AのディメンションごとにBのメトリクスを自分で集計したいが、どのテーブルを使えばいいか」

別チームのメンバー「プロダクトXに関する指標Yが数日前から変動しているが、Xのチームで何らかの変更を行ったのか」

といった相談や問い合わせは依然としてそれなりの工数を占めていた。

組織全体でのデータ活用や複数ドメインでのデータ連携ができているということなので、それ自体は歓迎すべきなのだが、質問に回答できるテーブルやダッシュボードの情報提供・状況確認や権限付与などを複数件行っていると1時間くらい溶けることも往々にしてある。

こうした問い合わせに回答するのはルーチン性が高い一方でスケールさせないといずれ運用が破綻する領域なので、なるべく質問者側が自己解決できる環境づくりや自動化を行いたい。

そもそもなぜ既存のデータカタログが組織外からの問い合わせ削減に寄与しないかというと、現状のデータカタログはあくまでデータエンジニアやデータアナリストが管理しているデータパイプラインをより効率的に理解・運用するためのプロダクトという側面が大きく、ドメイン知識を網羅的に蓄えたい人向けに作られている。

そのため、チーム外からのデータ分析に関するアドホックな疑問や要求に対しては、数百件超のテーブルと簡単な説明やスキーマが記載されているデータカタログを渡すだけでは、ドメイン知識がない質問者が自力で回答に辿り着くのは極めて難しい。

つまるところ求められているのは、普段からデータ管理者が行っているように、問い合わせに対して回答となるSQLや疑問に答えられるようなダッシュボードを渡せるようになることである。ほぼ自動化された形で実現するためにはどうしたらいいのか、という議論自体は既に各所で行われており、解決策の1つとして、RAGを組み込んだ生成AIを使うという方法がある。

RAGとは

RAGとはRetrieval Augmented Generationの略で、生成AIが学習段階では知らない社内のデータパイプラインや業務マニュアルなど、固有のドキュメントを探索してプロンプトとして生成AIに渡すことで、より具体的かつ正確な回答を得ることができるというものである。

一例として、dbtのSlackコミュニティで紹介されていたragstarというライブラリを使うと、dbtのレポジトリをドキュメントとして探索し、マッチした情報をプロンプトとして生成AIに渡すことができる。dbtなどデータカタログを持つプロダクトでは、既にある程度構造化されたメタデータを保有しているので検索性は高く、そのまま生成AIに渡してしまえば良いという発想である。

検証

実際にどのような挙動をするのか検証するために、BigQueryの公開データにある、theLook eCommerceという架空のECサイトのデータセットを対象にしてみる。

一般的なECサイトとして商品の在庫情報から顧客情報まで様々なデータがあるが、今回はシンプルな問題設定として、ユーザー数を集計することにする。

まずは何もしない状態で、Web上でGPT3.5に聞いてみる。

input

How can I retrieve the number of users on the look ecommerce?

output

Retrieving the number of users on a specific e-commerce platform typically requires access to backend analytics or administrative tools provided by the platform itself. Here are some common ways you might retrieve this information:

Built-in Analytics: Many e-commerce platforms come with built-in analytics dashboards that provide information about user activity, including the number of active users. Check if your e-commerce platform offers such analytics tools.

Google Analytics Integration: If your e-commerce platform integrates with Google Analytics, you can use Google Analytics to track user activity on your site, including the number of users.

Custom Analytics Integration: Some e-commerce platforms allow you to integrate with custom analytics solutions or provide APIs that allow you to extract user data programmatically. You can use these to retrieve user-related metrics.

Database Query: If you have direct access to the database where user information is stored, you can run a query to count the number of unique users who have visited your site within a specific time frame.

Third-Party Tools: There are third-party analytics tools and plugins available that can be integrated with your e-commerce platform to track user activity and provide insights into the number of users.

If you're not sure where to start, consulting the documentation or support resources provided by your e-commerce platform would be a good first step.

どうやらこのデータセットに関する情報は学習データには入っていないようで、一般的な情報を返してきた。

次にライブラリを介して同じ質問を投げる。

インプットとして必要なものはOpenAIのAPIキーとdbt projectのデータなので、OpenAIのサイトでAPIキーを発行した上で、dbt側でモデリングを行う。

stg_bigquery_public_data__thelook_ecommerce__users.sql

{{ config(
    materialized='ephemral',
    ) }}

SELECT
    id,
    first_name,
    last_name,
    email,
    age,
    gender,
    state,
    street_address,
    postal_code,
    city,
    country,
    latitude,
    longitude,
    traffic_source,
    created_at
FROM
    {{ source("thelook_ecommerce", "users") }}

sources.yml

version: 2

sources:

  - name: thelook_ecommerce
    description: "Synthetic eCommerce and Digital Marketing data"
    database: bigquery-public-data
    schema: thelook_ecommerce
    tables:
      - name: users
        description: "list of users"
        columns:
          - name: id
            description: "user id"

models.yml

version: 2

models: 
  - name: stg_bigquery_public_data__thelook_ecommerce__users
    description: "list of users"
    columns:
      - name: id
        description: "user id"
        tests:
          - unique
          - not_null

これで最低限のモデルとyamlを用意できたので、サンプルコードをベースに同じ質問を投げてみる。


from ragstar import Chatbot
from google.cloud import secretmanager

PROJECT = "your-gcp-project"
SECRET_NAME = "your-secret-name"
DBT_PATH = "your-dbt-path"

def get_secret():
    client = secretmanager.SecretManagerServiceClient()
    name = f"projects/{PROJECT}/secrets/{SECRET_NAME}/versions/latest"

    response = client.access_secret_version(request={"name": name})

    return response.payload.data.decode("UTF-8")

def main(question):

    openai_api_key = get_secret()

    # Instantiate a chatbot object
    chatbot = Chatbot(
        dbt_project_root=DBT_PATH,
        openai_api_key=openai_api_key,
        chatbot_model="gpt-3.5-turbo-0125"
    )

    # Step 1. Load models information from your dbt ymls into a local vector store
    chatbot.load_models()

    # Step 2. Ask the chatbot a question
    response = chatbot.ask_question(question)
    print(response)

    # Step 3. Clear your local database (Optional).
    # You only need to do this if you would like to load a different project into your db
    # or restart from scratch for whatever reason.

    # If you make any changes to your existing models and load them again, they get upserted into the database.
    chatbot.reset_model_db()

if __name__ == "__main__":
    question = "How can I retrieve the number of users on the look ecommerce?"
    main(question)

output

Asking question:  How can I retrieve the number of users on the look ecommerce?

Looking for closest models to the query...
Closest models found: stg_bigquery_public_data__thelook_ecommerce__users, my_second_dbt_model, my_first_dbt_model

Preparing prompt...

Calculating response...

Response received:

To retrieve the number of users in the stg_bigquery_public_data__thelook_ecommerce__users table, you can use the following SQL query:

"""sql
SELECT COUNT(id) AS number_of_users
FROM stg_bigquery_public_data__thelook_ecommerce__users;
"""

This query will count the number of rows in the table and provide you with the total number of users in the look ecommerce platform.

出力結果を見ると最初に関連するモデルを探索し、プロンプトに加えていることが分かる。その後生成AIから返却されたレスポンスには、どのテーブルを使えば良いかだけではなくSQLも含まれている。(多少修正の必要はあるが)

今回はGPT3.5を使用しているが、GPT4などより高性能なモデルを使えば、さらに複雑な質問でも正答できるかもしれない。

Tech企業のイベントでも発表されているように、生成AIによるダッシュボードの生成も着々と進んでいるので、問い合わせも含めた反復的なデータ分析プロセスは自動化されていき、そう遠くない未来には生成AIと関連プロダクトを作るチームと、生成AIに渡すデータを整備するチームが残るだけになるかもしれない。

Reference

Discussion