以前こちらの記事を翻訳したのですが、その際に触れていたLLM比較のインタフェースであるアーティファクトビューを試してみました。思った以上に便利。
MLflowのマニュアルはこちら。
MLflow 2.4.0のmlflow.evaluate()では、テキスト要約、テキスト分類、質疑応答、テキスト生成を含むLLMの様々なタスクに対するビルトインのサポートがあります。
試してみます。なお、Databricks機械学習ランタイム13.2であれば最初からMLflow 2.4.0が入っています。
環境設定、ライブラリのインポート
OpenAI APIを使うので、シークレットに保存してあるAPIキーを環境変数に設定します。
import os
os.environ["OPENAI_API_KEY"] = dbutils.secrets.get("demo-token-takaaki.yayoi", "openai_api_key")
import pandas as pd
import mlflow
import openai
プロンプトとモデルの記録
プロンプトの試行錯誤を想定しているので、モデルの呼び出しと評価のロジックを関数にします。
# OpenAIを用いたプロンプトエンジニアリングによる質疑応答モデルの作成
# MLflowトラッキングにプロンプトとモデルを記録
def evaluate_gpt(system_prompt):
mlflow.log_param("system_prompt", system_prompt)
logged_model = mlflow.openai.log_model(
model="gpt-3.5-turbo",
task=openai.ChatCompletion,
artifact_path="model",
messages=[
{"role": "system", "content": system_prompt},
{"role": "user", "content": "{question}"},
],
)
# 同じサンプル質問でモデルを評価
questions = pd.DataFrame(
{
"question": [
"MLflowでランをどのように作成しますか?",
"MLflowでどのようにモデルを記録しますか?",
"フランスの首都はどこですか?",
]
}
)
mlflow.evaluate(
model=logged_model.model_uri,
model_type="question-answering",
data=questions,
)
プロンプトを微妙に変えながら、モデルの評価を行います。
with mlflow.start_run():
system_prompt = (
"あなたの仕事はMLflowに関する質問に回答することです。MLflowについて質問された際には、"
" それに反応してください。コードサンプルを含めるようにしてください。質問がMLflowに関係がない場合には、"
" 質問が無関係ですと言って、質問を拒否してください。"
)
evaluate_gpt(system_prompt)
with mlflow.start_run():
system_prompt = (
"あなたの仕事はMLflowに関する質問に回答することです。MLflowについて質問された際には、"
" それに反応してください。コードサンプルを含めないでください。質問がMLflowに関係がない場合には、"
" 質問が無関係ですと言って、質問を拒否してください。"
)
evaluate_gpt(system_prompt)
with mlflow.start_run():
system_prompt = (
"あなたの仕事はMLflowに関する質問に回答することです。MLflowについて質問された際には、"
" それに反応してください。コードサンプルを含めないでください。質問がMLflowに関係がない場合でも、"
" 嫌がりながらも質問に回答してください。"
)
evaluate_gpt(system_prompt)
モデルの評価
評価結果のデータにアクセスすることができます。
# 評価結果をロードして調査
results: pd.DataFrame = mlflow.load_table(
"eval_results_table.json", extra_columns=["run_id", "params.system_prompt"]
)
results_grouped_by_question = results.sort_values(by="question")
display(results_grouped_by_question[
["run_id", "params.system_prompt", "question", "outputs"]
])
より詳細に比較するために、MLflowランの右にあるをクリックします。
このように一覧が表示されますが、これで終わりではありません。Evaluationをクリックします。
このようにテーブル形式でモデルごとの質問に対する回答を確認することができます。
定量的な評価が難しいLLMですが、少なくともこの機能を活用することで人間の目でのチェックが楽になるかと思います。