【実装ガイド】Dataiku Cloudで作る R&D Value Navigator

前提

1. Dataiku DSS 14 の管理者アカウント(プラグイン、LLM接続、Agent Hub の設定で必要)

2. プロジェクト作成権限と Managed Folders 作成権限

3. LLM API キー(OpenAI 等)を Dataiku に登録済み(Agentが使う場合)

4. Code env(プロジェクト)に以下パッケージをインストールしておく(Designer/Modeler/Reporter 用):

pandas, numpy, scipy, statsmodels, pyDOE2, scikit-learn, lightgbm, shap, python-pptx, matplotlib, dataiku

構成の要点

データフロー(raw_* のデータ群→前処理→feature→ROI/score→agent用ビュー)を Dataiku Flow として再現し、その上に Visual/Code Agent を配置して Agent Hub / Agent Connect で研究者がチャット操作できるようにします。

目次

1. データセット(名称とスキーマ)

2. Flow:レシピ(SQL / Prepare / Group / Join)一覧と実装コード

3. Agent 用ビュー(SQL) — agent_historical_search 等

4. Code Agent 実装(Experiment Designer / Simulation / Modeler / Reporter) — Dataiku 用 process() コード

5. Visual Agent(Historical / Knowledge)設定(Agent Tools / Prompt)

6. Agent Hub & Agent Connect 設定手順(Intent / Conversation profile)

7. テスト手順 & デバッグチェックリスト

8. 付録:よく使う Dataiku 操作のショートカット

1. データセット — 作成しておくもの

  • raw_employees.csv employee_id, role, annual_cost
  • raw_projects.csv project_id, project_title, start_date, end_date, status, project_lead
  • raw_labor_hours.csv labor_id, employee_id, project_id, hours, date
  • raw_expenses.csv expense_id, project_id, expense_type, amount
  • raw_products.csv product_id, project_id, product_name
  • raw_sales.csv sale_id, product_id, year, revenue
  • raw_market.csv market_id, product_id, growth_rate
  • raw_patents.csv patent_id, project_id, patent_score

2. Flow:レシピの順番と具体的SQL / Prepare 設定

各ステップは Flow で新規 Recipe(Prepare / Join / Group / SQL / Python)を作成して下さい。SQL は SQL レシピで実行可能です。

2.1 labor_cost_per_project の作成

操作:Join + Prepare

説明:raw_labor_hours JOIN raw_employees → 労務コスト算出(hours * annual_cost / 2000)

手順

Join Recipe: raw_labor_hours (left) JOIN raw_employees on employee_id Prepare Recipe: 新しいカラム labor_cost を追加(式): labor_cost = hours * annual_cost / 2000

出力 dataset:labor_cost_per_project

2.2 labor_cost_project(プロジェクト別人件費集計)

操作:Group Recipe

Group by: project_id

Aggregation:SUM(labor_cost) -> total_labor_cost

出力 dataset:labor_cost_project

2.3 other_cost_project(外注等の経費集計)

操作:Group Recipe on raw_expenses

Group by: project_id

Aggregation:SUM(amount) -> total_other_cost

出力 dataset:other_cost_project

2.4 project_total_cost(総コスト)

操作:Join labor_cost_project LEFT JOIN other_cost_project on project_id → Prepare: total_cost = total_labor_cost + total_other_cost

出力 dataset:project_total_cost

2.5 project_revenue(製品売上をプロジェクト集約)

操作:Join raw_products JOIN raw_sales on product_id → Group by project_id:SUM(revenue) -> total_revenue AVG(revenue) -> avg_annual_revenue

出力 dataset:project_revenue

2.6 project_roi(ROI算出)

操作:Join project_revenue JOIN project_total_cost on project_id → Prepare:

roi = (total_revenue - total_cost) / total_cost revenue_cost_ratio = total_revenue / total_cost

出力 dataset:project_roi

2.7 raw_roi_summary(Success/Strategic Score算出) — PDFロジックそのまま

操作:Join project_roi JOIN raw_patents on project_id → Prepare(SQL または Prepare)

式(SQL 表現推奨):

-- SQL recipe: create raw_roi_summary SELECT p.project_id, p.total_revenue, c.total_cost, ROUND((p.total_revenue - c.total_cost)/c.total_cost, 4) AS roi, r.patent_score, CASE WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 1.5 AND r.patent_score > 80 THEN 5 WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 1.2 THEN 4 WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 1.0 THEN 3 WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 0.8 THEN 2 ELSE 1 END AS success_score, ROUND( (CASE WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 1.5 AND r.patent_score > 80 THEN 5 WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 1.2 THEN 4 WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 1.0 THEN 3 WHEN ( (p.total_revenue - c.total_cost)/c.total_cost ) > 0.8 THEN 2 ELSE 1 END) * 0.6 + r.patent_score * 0.4, 2) AS strategic_score FROM project_revenue p LEFT JOIN project_total_cost c ON p.project_id = c.project_id LEFT JOIN raw_patents r ON p.project_id = r.project_id

出力 dataset:raw_roi_summary

3. Agent 用ビュー(SQL) — agent_historical_search

目的:過去のプロジェクトを検索・類似抽出するためのビューを作成。Agent が参照します(Historical Agent 用)。

SQL レシピ(そのまま貼れる):

-- agent_historical_search SELECT project_id, project_title, roi, strategic_score, total_revenue, total_cost, patent_score FROM raw_roi_summary WHERE roi IS NOT NULL

出力 dataset:agent_historical_search

この dataset を Knowledge Bank 的に Visual Agent の「Dataset Lookup」ツールで参照します。

4. Code Agent 実装

以下は Dataiku Code Agent にそのまま貼れる process() の骨子です。Dataiku の Code Agent 作成時に process(inputs, outputs) を実装します(ファイル入出力は Dataiku API を使用)。

注意:Dataiku の Code Agent 環境では dataiku モジュールが利用可能です。Managed Folder や Dataset の読み書きは dataiku.Folder / dataiku.Dataset を使ってください。

4.1 Simulation Agent(Code Agent) — PDF準拠の NPV / IRR 計算

# simulation_agent.py (Code Agent: process) import json import numpy as np def process(inputs, outputs): # inputs: expect json with "cashflows" (list), "discount_rate" payload = inputs.get("payload") if isinstance(payload, str): payload = json.loads(payload) cashflows = payload.get("cashflows", []) # e.g., [-1000, 300, 400, 500] discount = payload.get("discount_rate", 0.08) if not cashflows: raise ValueError("cashflows missing") # NPV npv = sum(cf / ((1+discount)**i) for i, cf in enumerate(cashflows)) # IRR (numpy.irr may be deprecated; use numpy_financial if available; fallback: np.irr) try: irr = np.irr(cashflows) except Exception: try: import numpy_financial as nf irr = nf.irr(cashflows) except Exception: irr = None outputs["simulation_json"] = json.dumps({"npv": float(npv), "irr": float(irr) if irr is not None else None})

4.2 Experiment Designer Agent — サンプルサイズ算出(Code Agent)

# experiment_designer_agent.py import json import math from statsmodels.stats.power import TTestIndPower import dataiku def process(inputs, outputs): planner = inputs.get("planner_json") if isinstance(planner, str): planner = json.loads(planner) # extract params or defaults baseline = planner.get("baseline", 0.2) min_effect = planner.get("min_effect", 0.05) alpha = planner.get("alpha", 0.05) power = planner.get("power", 0.8) # For proportions you'd use proportion_effectsize, but we default to Cohen's d approximation effect_size = planner.get("effect_size", min_effect) analysis = TTestIndPower() n_per_group = math.ceil(analysis.solve_power(effect_size=effect_size, alpha=alpha, power=power, alternative='two-sided')) protocol = { "design_type": "two_group_ttest", "n_per_group": n_per_group, "total_n": n_per_group * 2, "alpha": alpha, "power": power, "variables": planner.get("required_data", []), "hypothesis": planner.get("hypothesis", "") } outputs["protocol_json"] = json.dumps(protocol)

4.3 Modeler Agent — LightGBM + SHAP(Dataiku 用。Managed Folder へ保存)

# modeler_agent.py import json, os import pandas as pd import numpy as np import dataiku from lightgbm import LGBMRegressor from sklearn.model_selection import train_test_split import shap import matplotlib.pyplot as plt def process(inputs, outputs): # inputs: "experiment_csv_path" or Dataiku dataset name csv_path = inputs.get("experiment_csv_path") dataset_name = inputs.get("dataset_name") project_id = inputs.get("project_id", "proj_unknown") # load data if dataset_name: ds = dataiku.Dataset(dataset_name) df = ds.get_dataframe() else: df = pd.read_csv(csv_path) # target must be "measurement" per schema if "measurement" not in df.columns: raise ValueError("measurement column required") y = df["measurement"] X = df.drop(columns=["measurement"]) X = X.fillna(X.median()) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LGBMRegressor(n_estimators=200) model.fit(X_train, y_train) preds = model.predict(X_test) rmse = float(np.sqrt(((preds - y_test)**2).mean())) r2 = float(model.score(X_test, y_test)) # SHAP explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test) out_folder = dataiku.Folder("reports_folder_id") # create in Dataiku and replace ID # save shap figure plt.figure() shap.summary_plot(shap_values, X_test, show=False) shap_path = f"/tmp/{project_id}_shap.png" plt.savefig(shap_path, bbox_inches="tight", dpi=150) # write shap to managed folder with out_folder.get_writer(f"{project_id}_shap.png") as w: with open(shap_path, "rb") as r: w.write(r.read()) importance = dict(zip(X.columns.tolist(), model.feature_importances_.tolist())) analysis = {"metrics": {"rmse": rmse, "r2": r2}, "importance": importance, "plots": {"shap": f"{project_id}_shap.png"}} outputs["analysis_json"] = json.dumps(analysis)

重要:reports_folder_id は Dataiku 内で作成した Managed Folder の ID に置換してください(Folder の設定 → Advanced → ID で確認できます)。

4.4 Reporter Agent — pptx 生成(Dataiku Managed Folder へ保存)

# reporter_agent.py import json from pptx import Presentation from pptx.util import Inches import dataiku def process(inputs, outputs): analysis_json = inputs.get("analysis_json") project_id = inputs.get("project_id", "proj_unknown") if isinstance(analysis_json, str): analysis = json.loads(analysis_json) else: analysis = analysis_json prs = Presentation() # Title slide slide = prs.slides.add_slide(prs.slide_layouts[0]) slide.shapes.title.text = f"R&D Navigator Report - {project_id}" # Metrics slide slide = prs.slides.add_slide(prs.slide_layouts[1]) slide.shapes.title.text = "Key Metrics" tf = slide.shapes.placeholders[1].text_frame tf.clear() tf.add_paragraph(f"RMSE: {analysis['metrics']['rmse']}") tf.add_paragraph(f"R2: {analysis['metrics']['r2']}") # Importance slide slide = prs.slides.add_slide(prs.slide_layouts[1]) slide.shapes.title.text = "Feature Importance" tf = slide.shapes.placeholders[1].text_frame tf.clear() for k, v in analysis['importance'].items(): tf.add_paragraph(f"{k}: {v}") # insert SHAP image from managed folder reports_folder = dataiku.Folder("reports_folder_id") shap_fname = analysis['plots']['shap'] # Download shap into temp file and insert local_shap = f"/tmp/{shap_fname}" with reports_folder.get_download_stream(shap_fname) as stream: with open(local_shap, "wb") as f: f.write(stream.read()) slide = prs.slides.add_slide(prs.slide_layouts[5]) slide.shapes.add_picture(local_shap, Inches(1), Inches(1), width=Inches(8)) # Save PPTX to managed folder fname = f"report_{project_id}.pptx" with reports_folder.get_writer(fname) as w: prs.save(w) outputs["report_path"] = f"{reports_folder.get_path()}/{fname}"

5. Visual Agent の設定(Historical / Knowledge) — 手順とプロンプト

5.1 Historical Agent(Visual Agent)作成手順

1. Project → + → Generative AI → Visual Agent を選択

2. 名前: Historical_Agent(説明に用途)

3. LLM 接続: 管理者が用意した OpenAI / Claude の connection を選択

4. Agent Tools に Dataset Lookup を追加 → dataset に agent_historical_search を指定(上で作成)

5. Retrieval 設定: top_k = 5、スコア閾値を適宜設定

6. Prompt / Instructions(例):

You are Historical Agent for R&D Navigator. Given a query about a project or a new idea, search the agent_historical_search dataset and return: - top 3 similar projects (project_id, roi, strategic_score) - short summary (1-3 sentences) of why they are similar - any lessons learned (from project metadata) Output as JSON: { similar_projects: [...], summary: "...", lessons: [...] }

この Visual Agent は PDF の Historical Agent の役割(過去事例検索)に直接対応します。

5.2 Knowledge / RAG Agent(もし使う場合)

  • Knowledge Bank に PDF や社内の報告書をアップロードし、Embedding Search ツールを設定する。
  • Visual Agent の Tool に Knowledge Bank Search を追加し、ユーザーの問い合わせに対して参照文献を返すように設定。

6. Agent Hub(Orchestrator)設計・設定

6.1 Agent の登録

Agent Hub で次を登録:

Historical_Agent(Visual) Experiment_Designer(Code) Simulation_Agent(Code) Modeler_Agent(Code) Reporter_Agent(Code)

6.2 Orchestrator のルール(Intent → Agent)

例ルール(Agent Hub の routing 設定で作成):

  • Intent contains “過去” or “similar” → Historical_Agent
  • Intent contains “サンプルサイズ” or “power” or “実験設計” → Experiment_Designer
  • Intent contains “シミュレーション” or “NPV” or “IRR” → Simulation_Agent
  • Intent contains “解析” or “モデル” or “学習” → Modeler_Agent
  • Intent contains “レポート” or “報告” → Reporter_Agent

6.3 シーケンス(Pipeline)例

Orchestrator が Planner の出力を受け、次に Designer、次に Modeler、最後に Reporter を順に呼ぶようパイプライン定義を行う(Agent Hub の Pipeline 機能で可視化)。

7. Agent Connect / Dataiku Answers 設定(研究者向けチャットUI)

7.1 Agent Connect インストール(管理者)

Plugin ストアから Agent Connect をインストール(管理者のみ)

7.2 Conversation Profile(例)

名前: R&D_Navigator_Profile

説明: “研究目的を入力すると Planner→Designer→Modeler→Reporter を順に実行します”

Profile 設定項目

  • Default Orchestrator: Agent Hub の Orchestrator(上で作成)
  • Available Agents: Historical_Agent, Experiment_Designer, Simulation_Agent, Modeler_Agent, Reporter_Agent
  • File upload enabled: yes (uploads go to inputs Managed Folder)
  • Conversation store: ON (保存先と保持ポリシーを設定)

7.3 UI カスタマイズ(推奨)

ファイルアップロードボタン(inputs folder) 「実行」ボタン(Orchestrator に run コマンド) 「状況確認」ボタン(projects dataset の status を表示)

8. テスト手順 & デバッグチェックリスト

単体テスト(Agentごと)

  • Historical Agent: 入力例「似たプロジェクトを教えて」→ agent_historical_search から3件返るか確認
  • Experiment Designer: 固定 planner_json を投げ、n_per_group が妥当か(期待値)
  • Modeler: サンプル CSV(小規模)で学習→analysis_json が返るか、plots が managed folder に保存されるか

E2E テスト

1. Agent Connect で converse: 「新触媒Xで歩留まりを10%改善したい。予算50万円。」

2. Orchestrator が Planner → Designer → (ユーザー同意)→ Modeler(dummy)→ Reporter を順に実行。

3. projects dataset の status が reported になり、reports/ Managed Folder に PPTX が生成されることを確認。

デバッグのポイント

  • Code Agent 実行時のエラーログは Agent Hub の実行ログで取得(Stacktrace を確認)
  • Managed Folder ID の不一致 → ファイル入出力で「Folder not found」エラーが出る(ID確認)
  • LLM のレスポンスが想定外 → Visual Agent の Prompt を修正(Instruction を具体化)

9. セキュリティ & ガバナンス(必須)

  • Managed Folder 書き込み権限は研究者/開発者のみ付与
  • LLM に送る入力は PIIや企業機密を除去するフィルタを作る(Code Agent で sanitize)
  • Conversation の保存・アクセスログを有効にし、保持期間とアクセス権を制定

10. 付録:よく使う Dataiku 操作ショートカット(UI手順)

  • Managed Folder ID 確認:Folder → Settings → Advanced → ID
  • Code Env パッケージ追加:Project → Settings → Code env → Edit → Add packages
  • Code Agent 作成:Flow → + → Generative AI → Code Agent → Create → paste process()
  • Visual Agent 作成:Flow → + → Generative AI → Visual Agent → configure Tools & Prompt
  • Agent Hub 設定:Administration → Generative AI → Agent Hub → Create Team / Pipeline

11. まとめ(実装の流れ・優先度)

1. Raw datasets を Flow に追加(names/columns を PDF 準拠で)

2. 前処理(Join / Group / Prepare)を順に作る → raw_roi_summary まで構築(SQLレシピを活用)

3. agent_historical_search の dataset を作る(Agent 用ビュー)

4. Managed Folders(inputs, plans, protocols, reports)を作る

5. Code Agent(Simulation, Designer, Modeler, Reporter)を作成して process() を実装

6. Visual Agent(Historical)を作って dataset lookup を設定

7. Agent Hub にエージェントを登録・Orchestrator ルールを作る

8. Agent Connect(Answers)でチャット UI を公開し E2E テスト

Posted in

コメントを残す