メインコンテンツへジャンプ
Company Blog

 

DATA + AI Summit 2023では多くの生成AIに関するソリューションの発表がありました。Lakehouse IQではお客様毎の環境を理解したLLMが利用できるようになり、LakehouseAIでは、Vector SearchなどのDataset サービスから、AutoML for LLMや MLflow Evaluation などのモデル作成評価そして、Lakehouse Monitoring や GPU Model Serving Endpoint など魅力的な生成AIソリューションの発表があり、徐々にですがPrivate Previewとして利用が開始され始めてきております。

 

今回は上記のような新しい機能が正式リリースされる前に、今すぐ出来るソリューションとして生成AIを使ったチャットボット構築をご紹介したいと思います。上記のような最新ソリューションの仕組みを理解する上でも、一度自分で生成AIを使ったサービスを構築し利用する事で、サービスの仕組みや有り難みをより深く理解することが出来るようになります。ソースコードも提供しますので、お手元のDatabricks環境で利用してみてください。

Solution 1 : 自然言語によるデータ問い合わせ

最初のソリューションは、自然言語によるDeltaTable内のデータ問い合わせです。従来はSQLやPythonなどのコードを利用したクエリーを投げることでデータを確認出来ました。こちらの仕組みを利用するとユーザーは自然言語を利用してデータに直接問い合わせ出来るようになります。

例えば、以下のように簡単にDatabricks内に保存されたデータを確認することが出来るようになります。

仕組みは以下の通りです。 Langchainの SQLDatabase Chainを使って OpenAIと連携し、ユーザーからの問い合わせをSQLに変換し、Databricksに問い合わせします。またユーザーインターフェース部分はSlack(Teamsや他のアプリなども可)などと連携することで、より広範囲にサービスを届けることが出来ます。

サンプルノートブックを実行する際に準備する情報は以下になります。上記の情報のうち機密性の高い情報については、Databricks Secret機能を利用して予め保存してください。

  • SQL Warehouse にアクセスするための情報( Databricks Workspace Host, SQL Warehouse ID, Token)
  • OpenAI API Secret Key (Azure OpenAI も可能)
  • Slack連携する場合は、Slack AppとBotのKey情報. (詳細の作成・取得方法はこちらをご覧ください) 
# OpenAI Secret Key
os.environ['OPENAI_API_KEY'] = dbutils.secrets.get("llm-scope", "openai-key") 

# Slack 連携しない場合は、以下は不要
os.environ['SLACK_BOT_TOKEN'] = dbutils.secrets.get("llm-scope", "slack_bot") 
os.environ['SLACK_APP_TOKEN'] = dbutils.secrets.get("llm-scope", "slack_app") 

# Databricks Access 情報
os.environ['DATABRICKS_HOST'] ="<databricks-hostname>"  
os.environ['DATABRICKS_WAREHOUSEID'] ="<wahouseID>"   
os.environ['DATABRICKS_TOKEN'] = dbutils.secrets.get("llm-scope","token-key")

また検索対象のデータベースやテーブルを指定します。他に Chat LLM(Azure OpenAIも可能) を選択するだけで利用することが出来ます。

#######################################################
## 今回検索対象とするカタログとスキーマを選択します。       #######
#######################################################

catalog = "samples"
schema = "nyctaxi" 
tables  = ["trips"] 

# LLM
llm = ChatOpenAI(model_name='gpt-3.5-turbo',temperature=0, verbose=True)

## Langchain SQLDatabaseChain
db = SQLDatabase.from_databricks(catalog=catalog, 
                                 schema=schema, 
                                 include_tables=tables, 
                                 host = os.environ.get("DATABRICKS_HOST") , 
                                 warehouse_id=os.environ.get("DATABRICKS_WAREHOUSEID") , 
                                 api_token=os.environ.get("DATABRICKS_TOKEN") )

db_chain = SQLDatabaseChain.from_llm(llm, db, verbose=True)

ノートブック以外から利用する為に、今回のサンプルノートブックではSlackと連携する方法を記載しております。以下のコードを実行すると、Slack Appと連携するアプリが立ち上がります。

from flask import Flask, request

app = App(token=os.environ.get("SLACK_BOT_TOKEN") ) 

# mentionされた場合メッセージを読み取ります
@app.event("app_mention")
def respond_to_mention(body, say):
    channel_id = body["event"]["channel"]
    user_id = body["event"]["user"]
    question = body["event"]["text"]

    #response = db_chain.run(question)
    response = delta_chain(question)

    # Craft your response message
    message = f"Answer: {response}"

    # Send the response message
    say(message, channel=channel_id)

@app.event("message")
def handle_message_events(body, logger):
    logger.info(body)


flask_app = Flask("dbchain")
handler = SocketModeHandler(app, os.environ.get("SLACK_APP_TOKEN"))

@flask_app.route('/', methods=['POST'])
def slack_events():
  return handler.start(request)

if __name__ == '__main__':
    handler.start()
    flask_app.run(host="0.0.0.0", port="7777")

以上で、冒頭に書いたような自然言語によるデータ問い合わせが、Slackなどのアプリと連携しながら利用できるようになります。是非お試しください。

Solution 2: Q&Aチャットボットシステム

2つ目のソリューションはもう少し複雑な仕組みですが、より柔軟にユーザーからの問い合わせを受け付けられるようになります。例えば製品マニュアルやFAQなどのデータを元にユーザーからの問い合わせに柔軟に回答してくれるようなチャットボットを構築できます。

こちらを利用すると以下のように、ユーザーからの特定の分野の問い合わせにデータを元にした回答をしてくれるようになります。

仕組みとしては以下のとおりです。データをベクトル化することで、類似検索が可能となり関連する情報を元にした回答を生成AIが作成してくれます。

サンプルノートブックでは、最初に util/notebook-config にある初期設定情報を入力した上で、00から順に実行してください。

サンプルノートブックでは、Databricks BlogやFAQを集めたデータセットを元にチャットボットを構築しております。DeltaLakeに保存できればいいので、みなさんのPDFやWord文書からでもデータは収集できます。またこれらをDatabricks WorkflowやDLTを使ってスケジュール実行することで常に最新のデータセットを用意することができます。

今回はFacebook AI Researchが開発したFAISS Vector Storeを利用しました。

# エンべディングベクトルを生成するエンべディングモデルの指定
embeddings = OpenAIEmbeddings(model=config['openai_embedding_model'])

# ベクトルストアオブジェクトのインスタンスの作成
vector_store = FAISS.from_texts(
  embedding=embeddings, 
  texts=text_inputs, 
  metadatas=metadata_inputs
  )

ユーザーからのQAに対してもVector Storeから類似検索を行い、その結果を元に回答するようにします。

上記のモデルを他のノートブックで利用したり、モデルサービング上にデプロイするためMLflowにパッケージ化します。

# mlflowモデルのインスタンスを作成
model = MLflowQABot(llm, retriever, chat_prompt)

# mlflowにモデルを永続化
with mlflow.start_run():
    # Signatureの作成
    input_df = pd.DataFrame({"question" : [""]})
    output_df = pd.DataFrame({'answer':[""], 'source':[""], 'output_metadata':[""]})
    model_signature = infer_signature(input_df, output_df)

    # Model の保存
    logged_model = mlflow.pyfunc.log_model(
      python_model=model,
      extra_pip_requirements=['langchain==0.0.166', 'tiktoken==0.4.0', 'openai==0.27.6', 'faiss-cpu==1.7.4'],
      artifact_path='model',
      registered_model_name =f"{config['catalog_name']}.{config['schema_name']}.{config['registered_model_name']}",
      signature=model_signature
    )

最新のMLflow2.4では、モデルをMLflow Repository以外にもUnityCatalogに保存出来るようになりました。 Unity Catalogに登録すると以下のようにデータエクスプローラーから確認出来るようになり、権限管理やリネージュなども行えるようになります。

次に上記モデルをModel Serving Endpoint にデプロイします。ただしLLMをサポートしたMLflowをデプロイする場合、Model Serving v2(Serverless) 機能が必要となります。残念ながらTokyo Regionではまだ(2023/7月時点) Serverless のModel Servingが利用できないため、サンプルノートブックを動かすには US RegionなどサポートされているRegionをご利用ください。

最後のノートブックでは、Slack連携するためのコードをご紹介しております。Solution1と同じくSlackからユーザー問い合わせを受け付けることができます。

 

始めるには

サンプルノートブックはこちらのレポジトリで公開しております。お手元のDatabricks のReposに登録するとすぐに利用できます。Databricks Runtime (DBR) 13.2ML以降をご利用いただき、初期設定を行った上でノートブックを数字の若い番号から順に実行していきます。実行しながら仕組みを理解されるといいと思います。

またノートブックの使い方なども含め解説しているWebinarがこちらです。今からでも登録してアーカイブをご覧頂けます。

 

 

 

 

 

 

Databricks 無料トライアル

関連記事

Platform blog

LakehouseIQのご紹介: あなたのビジネスを独自に理解するAIエンジン

翻訳:Junichi Maruyama. - Original Blog Link 本日、LakehouseIQを発表いたします。LakehouseIQは、お客様のビジネスとデータのユニークなニュアンスを学習し、様々なユースケースで自然言語によるアクセスを可能にするナレッジエンジンです。LakehouseIQは、組織内のどの従業員でも自然言語でデータを検索、理解、照会することができます。LakehouseIQは、お客様のデータ、使用パターン、組織図に関する情報をもとに、専門用語や独自のデータ環境を理解し、素朴なLarge Language Models (LLM)よりもはるかに優れた回答を提供します。 ラージ・ランゲージ・モデルはもちろん、データに言語インターフェースをもたらすと約束されており、どのデータ会社もAIアシスタントを追加しているが、現実には、これらのソリューションの多くは企業データでは不十分である。どの企業も独自のデータセット、専門用語、ビジネス上の質問に答えるために必要な内部知識を持っており、質問に
Platform blog

Lakehouse AI: Generative AIアプリケーション構築のためのデータ中心アプローチ

翻訳: Masahiko Kitamura オリジナル記事: Lakehouse AI: a data-centric approach to building Generative AI applications ジェネレーティブAIは、あらゆるビジネスに変革をもたらすでしょう。Databricksは10年にわたりAIイノベーションのパイオニアとして、AIソリューションを提供するために何千ものお客様と積極的に協力し、月間1,100万ダウンロードを誇るMLflowのようなプロジェクトでオープンソースコミュニティと協力してきました。Lakehouse AIとそのユニークなデータ中心アプローチにより、私たちはお客様がスピード、信頼性、完全なガバナンスでAIモデルを開発・展開できるよう支援します。本日開催されたData and AI Summitでは、Lakehouse AIがお客様のジェネレーティブAI制作の旅を加速させる最高のプラットフォームとなるよう、いくつかの新機能を発表しました。これらのイノベーションには、V
Databricks ブログ一覧へ