メインコンテンツへスキップ

MLflowでローカルチャットボットのログを可視化する

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

はじめに
#

LLM、MLOpsに関して勉強中です!機能はLMStudioでローカルチャットボットを作ってみました。LLMのMLOpsを体験するためMLFowを使ってみたいと思います。昨日の記事は以下。

以下に今回使ったコードを配置しました。

ゴール
#

MLflowで生成AIアプリのログを可視化できている

環境
#

本記事の動作確認は以下の環境で行いました。

  • MacBook Pro
  • 14インチ 2021
  • チップ:Apple M1 Pro
  • メモリ:32GB
  • macOS:15.5(24F74)

MLflowとは
#

MLflowとは、機械学習のモデルやパイプラインを管理するためのオープンソースのプラットフォームです。

生成AI用の可視化・評価用の使い方と、モデルの訓練(画像認識など向けでしょうか?)用途の使い方があるようです。 今回は前者の生成AI用の方を使ってみます。

以下の記事に沿って作業を進めます。

MLflow for GenAI
#

MLflow for GenAIとは、生成AIのための包括的なプラットフォームで開発・評価・deploymentを行うことができます。

GenAI クイックスタート
#

MLflow for GenAIを使ってみる
#

自身を持って製品環境で使えるGenAIを作る
#

MLflowはGenAIアプリのの開発・評価・デプロイを変革します。フレームワークやモデルに縛られることなくAIシステムの可視性を完全に確保できます。

flowchart TD
    subgraph DAM [デプロイとモニタリング]
        MS[モデルの保持・提供]
        PM[モニタリング]
        CI[継続的な改善]
    end

    subgraph DAD [開発とデバッグ]
        TES[全てのステップを追跡]
        VP[プロンプトバージョン管理]
        TE[実験の追跡]
    end

    subgraph EAI [評価と改善]
        LJM[LLMの判定メトリクス]
        HF[人間によるフィードバック]
        CV[バージョン比較]
    end

    EAI --> DAD
    DAD --> EAI
    DAM -.-> DAD
    EAI --> DAM

なぜMLflow for GenAIを使うのか?
#

MLflow GenAIを使うことでAIアプリケーションの内部で起きていることを全て見ることができます。全てのLLM呼び出しやツール連携、意思決定ポイントを把握し、ブラックボックスなシステムを透明でデバッグ可能にします。

LangChain、LlamaIndex、OpenAIなどの15以上のフレームワークをサポートしています。

人間によるフィードバックも受け取ることができ、ドメインエキスパートによる実際の利用状況をアプリケーションに反映させることができます。

ビルドしてみよう
#

事前条件
#

以下を使えることを確認してください。

  • Python 3.9 or higher
  • MLflow 3+ installed (pip install –upgrade mlflow)
  • An MLflow tracking server (local or remote)

環境構築
#

今回は以下の手順で環境を作成しました。 pipenv の環境構築はchatGPTにきいてください 🙇

  1. mlfowをインストールします

    pipenv --python 3.12
    pipenv install "mlflow>=3.1"
    
  2. MLflowのサーバーを起動します

    pipenv run mlflow server --host localhost --port 5001
    

    :::message MACではポート5000がすでに使われているので、ポート5001を使っています。またデータ管理もファイルベースではなくPostgreSQLやDatabricksなどを使うことができます。 :::

  3. fileベースのMFflow管理情報を作成します 以下の内容で mlflow_setup.py を作成します。

    import mlflow
    
    # Creates local mlruns directory for experiments
    mlflow.set_tracking_uri("http://localhost:5001")
    mlflow.set_experiment("my-genai-experiment")
    

    以下のコマンドを実行します。

    pipenv run python mlflow_setup.py
    
  4. MLflowに接続する 以下の内容で mlflow_verify.py を作成します。

    import mlflow
    
    # Print connection information
    print(f"MLflow Tracking URI: {mlflow.get_tracking_uri()}")
    print(f"Active Experiment: {mlflow.get_experiment_by_name('my-genai-experiment')}")
    
    # Set the active experiment
    mlflow.set_experiment("my-genai-experiment")
    
    # Test logging
    with mlflow.start_run():
        mlflow.log_param("test_param", "test_value")
        print("✓ Successfully connected to MLflow!")
    

    以下のコマンドを実行します。 ✓ Successfully connected to MLflow! が表示されたら成功です。

    pipenv run python mlflow_verify.py
    
  5. MLflow UIにアクセスする mlflowサーバーは起動済みなので、ブラウザで http://localhost:5001 にアクセスします。

    MLflow UIが表示されたら成功です。

アプリの追跡情報を収集する
#

わずか数行のコードで、全てのプロンプト、モデル、ツールの呼び出しの包括的な追跡をする事ができます。以下を実施できます。

  • OpenAI, LangChain, and DSPy などの人気フレームワークの自動インストルメンテーションができます
  • カスタムの追跡情報をキャプチャできます
  • AIワークフローのデバッグができます

:::message 自動インストルメンテーション とは「フレームワークの動作を観察・分析するために情報を埋め込むこと」を指します。 :::

以下の記事でlocal llmの動作確認をしています。この仕組みを使ってlocal llmのインストルメンテーションをします。

pipenv install streamlit langchain-openai

以下の内容で streamlit_app.py を作成します。

import mlflow
import streamlit as st
from langchain_openai import ChatOpenAI

st.title("🦜🔗 Quickstart App")

# Set the active experiment
mlflow.set_experiment("my-genai-experiment")


@mlflow.trace(name="llm_call", attributes={"model": "gemma-3-12b", "source": "local"})
def generate_response(input_text):
    llm = ChatOpenAI(
        base_url="http://localhost:1234/v1",
        api_key="not-needed",
        temperature=0.7,
        model_name="google/gemma-3-12b",
    )
    output = llm.invoke(input_text).content
    st.info(output)
    return output


with st.form("my_form"):
    text = st.text_area(
        "Enter text:",
        "What are the three key pieces of advice for learning how to code?",
    )
    submitted = st.form_submit_button("Submit")
    if submitted:
        generate_response(text)

以下の環境変数を設定します。

export MLFLOW_TRACKING_URI=http://localhost:5001

スクリプトを実行します。

pipenv run streamlit run ./streamlit_app.py

http://localhost:5001my-genai-experiment をクリック、Traces をクリックします。LLM の呼び出しが追跡されていることがわかります。

localのチャットレスポンスが返ると追跡の StatusOK になります。同時に mlartifacts というディレクトリが生成され、ここにログが保存されます。

Inputs/Outputs と @mlflow.traceで指定した name が設定され Attributes も表示されていて、LLMの呼び出しログを可視化することができました!

おわりに
#

MLflowで生成AIアプリのログを可視化することができました。 公式のドキュメントではOpenAIをベースにした説明になっていたので、ローカルで動作確認するために少し手間取りました。 また、MACで試す場合には5000番ポートがすでに使われているので、5001番ポートを使う必要があるのもポイントです。

次は可視化できた情報を評価について学んでいこうとおもいます。

Reply by Email

関連記事

LMStudioとLangChainでlocalチャットボットを作る
· loading · loading
Git bisect:コミット履歴を二分探索で絞り込む
· loading · loading
gRPC - connect - Render でwebサービスを作ってみる:gRPC Docker環境構築
· loading · loading