こちらの一番シンプルなチェーンのサンプルを構築し、Agent Frameworkを用いてそのチェーンを記録・デプロイします。
"Hello World" アプリケーションノートブック
チェーンのノートブック
このノートブックは、Mosaic AI Agent Frameworkを使用してシンプルな"Hello World"チェーンを作成します。
パッケージのインストール
%pip install -U -qqqq databricks-agents mlflow langchain==0.2.1 langchain_core==0.2.5 langchain_community==0.2.4
dbutils.library.restartPython()
インポート
import mlflow
from operator import itemgetter
from langchain_core.output_parsers import StrOutputParser
from langchain.schema.runnable import RunnableLambda
from langchain_community.chat_models import ChatDatabricks
from langchain_core.prompts import PromptTemplate
MLflowトレースの有効化
MLflowトレースを有効にすると、次のことができます:
- このノートブックでトレースの可視化を表示する
- インファレンステーブルを介して本番環境でトレースをキャプチャする
- アプリケーションを評価する
mlflow.langchain.autolog()
ヘルパー関数
お使いのチェーンでは、messages
パラメーターとしてOpenAIのフォーマットに従ったメッセージの配列を受け付ける必要があります。
# これらのヘルパー関数は `messages` の配列をパースします
# ユーザーからの最も直近のメッセージの文字列のコンテンツを返却
def extract_user_query_string(chat_messages_array):
return chat_messages_array[-1]["content"]
# 最後の質問の前の全てとなるチャット履歴を返却
def extract_chat_history(chat_messages_array):
return chat_messages_array[:-1]
チェーンの作成
############
# 生成のためのプロンプトテンプレート
############
prompt = PromptTemplate(
template="あなたはhello world botです。ユーザーの質問に対してユーザーにとって面白い回答を日本語でレスポンスします。ユーザーの質問: {question}",
input_variables=["question"],
)
############
# 生成のための基盤モデル
# ChatDatabricks は、いかなる /llm/v1/chat モデルサービングエンドポイントを受け付ます
############
model = ChatDatabricks(
endpoint="databricks-dbrx-instruct",
extra_params={"temperature": 0.01, "max_tokens": 500},
)
############
# シンプルなチェーン
############
# このフレームワークは、チェーンに文字列を返却することを要求します
chain = (
{
"question": itemgetter("messages")
| RunnableLambda(extract_user_query_string),
"chat_history": itemgetter("messages") | RunnableLambda(extract_chat_history),
}
| prompt
| model
| StrOutputParser()
)
ローカルでチェーンをテスト
# これは、チェーンのREST APIが受け入れるのと同じ入力です。
question = {
"messages": [
{
"role": "user",
"content": "ragって何?",
},
]
}
chain.invoke(question)
'「rag」は、英語で「ラグ」や「はみ出し」を意味する言葉です。しかし、日本語では「rag」という言葉はあまり使われません。もし、あなたが「rag」と聞いたのであれば、その場面によって意味が異なるでしょう。もし、具体的な文脈を教えていただければ、もっと正確な回答を差し上げます。'
トレースが表示されます。
MLflowログにチェーンの場所を指定する
mlflow.models.set_model(model=...)
関数は、評価とデプロイメントに使用するLangChainチェーンを指定します。これは、mlflow.langchain.log_model(...)
でこのチェーンをMLflowにログするために必要です。
mlflow.models.set_model(model=chain)
本当にシンプルなチェーンを動かしましたというサンプルですね。次のドライバーノートブックからアクセスすることになります。
"Hello World" ドライバーノートブック
ドライバーノートブック
このノートブックは、Mosaic AI Agent Frameworkを使用してシンプルな"Hello World"アプリケーションをログ、テスト、デプロイする方法を示しています。以下のステップをカバーしています:
- Mosaic AI Agent Frameworkのインストール
- 必要なモジュールのインポート
- ノートブックのパスを定義
- MLflowにチェーンをログし、ローカルでテストする
- Unity Catalogにモデルとしてチェーンを登録する
- チェーンをデプロイする
- Agent Framework UIでデプロイされたチェーンを表示する
パッケージのインストール
%pip install -U -qqqq databricks-agents mlflow langchain==0.2.1 langchain_core==0.2.5 langchain_community==0.2.4
dbutils.library.restartPython()
インポート
import os
import mlflow
from databricks import agents
# Unity Catalog モデルレジストリを使用する
mlflow.set_registry_uri('databricks-uc')
Unity Catalogの場所を選択して、チェーンをログに記録します
# ウィジェットの作成
dbutils.widgets.text("uc_catalog", "", "catalog")
dbutils.widgets.text("uc_schema", "", "schema")
dbutils.widgets.text("model_name", "hello_world", "Model name")
# ウィジェットから値を取得
uc_catalog = dbutils.widgets.get("uc_catalog")
uc_schema = dbutils.widgets.get("uc_schema")
model_name = dbutils.widgets.get("model_name")
MLflowへのチェーンのログ記録
チェーンとその結果のモデルをノートブックのMLflowエクスペリメントに記録します。
MLflowログの入力パラメーター
# MLflowモデルのシグネチャに設定される入力スキーマの例を提供します
input_example = {
"messages": [
{
"role": "user",
"content": "Retrieval-augmented Generationとは何ですか?",
}
]
}
# チェーンノートブックへの完全なパスを指定します
chain_notebook_file = "hello-world-chain"
chain_notebook_path = os.path.join(os.getcwd(), chain_notebook_file)
print(f"チェーンノートブックのパス: {chain_notebook_path}")
チェーンノートブックのパス: /Workspace/Users/takaaki.yayoi@databricks.com/20240930_ai_agents/hello-world-chain
チェーンを記録する
with mlflow.start_run():
logged_chain_info = mlflow.langchain.log_model(
lc_model=chain_notebook_path,
artifact_path="chain",
input_example=input_example,
)
チェーンが記録されます。
チェーンの評価
通常、この時点でチェーンを評価します。ただし、このノートブックにはそのステップは含まれていません。
チェーンのデプロイ
モデルをデプロイするには、まずMLflowランからチェーンをUnity Catalogモデルとして登録します。
# Unity Catalogのロケーション
uc_model_name = f"{uc_catalog}.{uc_schema}.{model_name}"
# Unity Catalogにモデルを登録
uc_registered_model_info = mlflow.register_model(model_uri=logged_chain_info.model_uri, name=uc_model_name )
Unity Catalog配下にモデルが登録されます。
agents.deploy
を使用してチェーンをデプロイすると、以下の場所にデプロイされます:
- クエリのためのREST APIエンドポイント
- レビューアプリには、ウェブUIを使用してチェーンとチャットし、フィードバックを提供することができます。
deployment_info = agents.deploy(uc_model_name, uc_registered_model_info.version)
上を実行すると、クエリのためのエンドポイントとレビューのためのエンドポイントが作成されます。
# アプリケーションをクエリするためにこのURLを使用してください。
deployment_info.query_endpoint
'https://xxxxxxx.cloud.databricks.com/serving-endpoints/agents_users-takaaki_yayoi-hello_world/served-models/users-takaaki_yayoi-hello_world_1/invocations'
上のURLでREST APIを呼び出すことでエンドポイントにクエリーすることができます。REST APIの呼び出しにはパーソナルアクセストークンが必要なので、ここでは直接エンドポイントの画面からクエリーします。
# アプリケーションと対話するために、このURLをブラウザにコピーしてください。
deployment_info.review_app_url
'https://xxxxxxx.cloud.databricks.com/ml/review/users.takaaki_yayoi.hello_world/1?o=2556758628403379'
こちらにアクセスすると、チェーンの精度を評価するためのUIが表示されます。
デプロイメントの表示
もし上記で取得したデプロイメント情報を失ってしまった場合は、list_deployments()
を使用してそれを見つけることができます。
deployments = agents.list_deployments()
deployments