8月24日、Machine Learning MasteryのAI・機械学習分野のライターであるIván Palomares Carrascosaが「Integrating Agentic AI with Existing Machine Learning Pipelines」と題した記事を公開した。この記事では、既存のscikit-learnベースの機械学習パイプラインにAIエージェントを組み込み、顧客離脱予測から自律的なリテンション施策実行までを一本のPythonアプリケーションとして完成させる手順について詳しく紹介されている。
なぜ今「Agentic AI × 機械学習パイプライン」なのか
近年、LLMの実用化が進むにつれて「AIエージェント」や「Agentic AI」という概念への注目が急速に高まっている。LangChainやAutoGenといったフレームワークがその代表例であり、LLMに「ツールを呼び出して行動する」能力を与えることで、単なる文章生成を超えた自律的なタスク実行を可能にするアーキテクチャとして広く議論されるようになった。
しかし、こうした議論の多くはチャットボットや情報検索のユースケースを中心に展開されており、「既存の機械学習パイプラインと組み合わせる」という観点からの実装例は比較的少ない。この記事が取り上げるのは、まさにその空白地帯だ。予測モデルが出した数値をLLMが解釈し、ビジネスアクションまで自律実行する構成を、シンプルなscikit-learnのコードから段階的に組み上げていく。
「予測して終わり」から「予測して動く」へ
従来の機械学習パイプラインは、パターン認識においては優秀だが本質的に受動的だ。モデルが「この顧客は離脱しそうだ」と予測しても、そこから先は人間が判断して施策を実行する必要がある。
この記事が示すのは、その「予測から行動」のギャップをAIエージェントで埋めるアーキテクチャだ。具体的には:
- scikit-learnのランダムフォレストで顧客の離脱確率を予測する
- その予測結果をGroq上のLlama 3.3 70Bが解釈し、「割引コードを送る」か「サポート通話をスケジュールする」かを自律的に判断して実行する
実行環境はGoogle ColabまたはローカルのJupyter Notebook。無料で動かせる構成になっている。
機械学習パイプライン部分:500件の合成データでRFを学習
まず500件の合成顧客データを生成する。特徴量は「月間支出額」と「サポートチケット発行数」の2つ。チャーンリスクは「チケットが多いほど高く、支出額が高いほど低い」というルールにガウスノイズを加えて生成する。
np.random.seed(42)
n_samples = 500
spend = np.random.uniform(10, 150, n_samples)
tickets = np.random.poisson(lam=1.5, size=n_samples)
base_churn_risk = (tickets * 0.15) + np.where(spend < 30, 0.3, 0) - np.where(spend > 100, 0.2, 0)
base_churn_risk += np.random.normal(0, 0.1, n_samples)
base_churn_risk = np.clip(base_churn_risk, 0, 1)
y = (base_churn_risk > 0.5).astype(int)
X = np.column_stack((spend, tickets))
このデータでRandomForestClassifier(木の数50、最大深度5)を学習させると、テストセットで91%の精度が出る。これをベースに次のステップへ進む。
なお、この91%という数値は、あらかじめ定義されたルールに基づいて生成した合成データを、特徴量わずか2つで学習・評価したものだ。実務データへの直接的な参照値としては捉えず、あくまでパイプライン構成の検証用スコアとして読むのが適切だ。
ml_model = RandomForestClassifier(n_estimators=50, max_depth=5, random_state=42)
ml_model.fit(X_train, y_train)
# Model Accuracy on Test Set: 91.0%
エージェント部分:LLMが文脈を読んでツールを選ぶ
ここが記事の核心だ。エージェントは「手」(ツール)と「脳」(推論コア)の2層で構成される。
ツール(Agentic "Hands")は2つのモック関数として定義される:
def send_discount(customer_id):
return f"[Action Executed] Sent a 20% discount code to Customer {customer_id}."
def schedule_support_call(customer_id):
return f"[Action Executed] Escalated Customer {customer_id} to a human agent for a check-in."
推論コアはGroq APIを介してLlama 3.3 70Bを呼び出す。システムプロンプトで「callかdiscountのどちらか1単語だけ出力せよ」と制約をかけ、temperature=0.0で決定論的な出力を得る設計になっている。
chat_completion = self.client.chat.completions.create(
messages=[
{"role": "system", "content": "You are an autonomous customer retention agent. You must output exactly one word: either 'call' or 'discount'."},
{"role": "user", "content": prompt}
],
model="llama-3.3-70b-versatile",
temperature=0.0,
)
エージェントの判断ロジックはこうだ:
- 離脱確率が50%未満 → 何もしない(ガードレール)
- 50%以上かつサポートチケット2件超 →
schedule_support_call(不満を抱えている顧客は人間のフォローが必要) - 50%以上かつチケット2件以下 →
send_discount(価格感度が高いだけなので割引で対処)
このビジネスルールをプロンプトとして自然言語で記述し、LLMに解釈させる点が肝だ。ルールを変えたければプロンプトを書き換えるだけでよく、コードの条件分岐を触る必要がない。LangChainやAutogenのようなフレームワークを使えばツール定義やルーティングをより体系的に管理できるが、この記事はあえてフレームワークに依存せず、Agentic AIの仕組みを素のPythonで透明性高く示すことを優先している。
パイプライン全体の流れ
MLモデルの予測→エージェントの判断→ツール実行、という一連の流れは以下の4ステップで整理されている:
- Step A:
predict_probaで離脱確率を取得 - Step B: 確率が0.5未満なら即座にスキップ(不要なAPI呼び出しを避ける)
- Step C: 顧客の特徴量とビジネスルールをプロンプトに埋め込んでLLMに推論させる
- Step D: LLMの出力(
call/discount)に応じて対応するツール関数を呼び出す
必要なライブラリはnumpy、scikit-learn、groqのみ。groqはColabの場合!pip install groqで追加し、Groqの公式サイトでAPIキーを取得して環境変数に設定すれば動く。
設計上のポイント
この記事のアーキテクチャで着目すべきは、MLモデルとLLMの役割分担が明確な点だ。確率計算はランダムフォレストが担い、その数値をビジネスコンテキストと組み合わせて解釈し行動を決定するのはLLMが担う。両者を無理に一体化させず、それぞれの得意領域に徹させている。
また、エージェントの出力を1単語に制限する設計は、ツール呼び出しの信頼性を高める実用的なテクニックだ。LLMの出力が不定形だとルーティングが壊れるため、こうした制約は本番運用を見据えた場合に重要になる。OpenAIのFunction CallingやAnthropicのtool_useといった公式機能も同様の問題意識から生まれており、出力の構造化はAgentic AI設計における共通の課題だ。
詳細はIntegrating Agentic AI with Existing Machine Learning Pipelinesを参照していただきたい。