はじめに
昨日、Thinking Machines Lab (TML)初のオープンウェイトモデルInklingがリリースされ、Databricksがday zeroローンチパートナーとして即日Unity AI Gateway経由での提供を開始しました。
早速、自分のワークスペースでも使えるようになっていたので、Unity AI Gateway経由でInklingを呼び出す基本パターンをノートブックで一通り試してみました。
Inklingとは
InklingはOpenAIの元CTOであるMira Murati氏が設立したThinking Machines Labによる、同社初のオープンウェイトモデルです。
概要は以下の通りです。
- 総パラメータ975B / アクティブ41BのMixture-of-Experts (MoE)モデル。66層のdecoder-onlyで、各トークンが256エキスパート中6つにルーティングされる構成
- 最大1Mトークンのコンテキストウィンドウ
- テキスト・画像・音声・動画にまたがる45兆トークンで事前学習され、テキスト・画像・音声入力にネイティブ対応
- thinking effortを0.2〜0.99の範囲で調整可能
- Apache 2.0ライセンス
TML自身が「Inklingは現時点で最強のモデルではない。ただ、マルチモーダル能力、効率的なthinking、Tinkerでのファインチューニング対応という組み合わせにより、カスタマイズのベースとなる良いオープンウェイトモデルである」と、最初からカスタマイズ前提のポジショニングを明確にしているのが興味深いところです。オープンウェイトモデルを顧客の企業データでカスタマイズするというDatabricksのメッセージとも整合しています。
Unity AI Gatewayでの提供
ワークスペースのAIゲートウェイ > モデルを見ると、inklingが追加されています。モデル詳細画面にはcURL/Pythonのサンプル、Playgroundへのリンク、そしてガバナンス設定 (使用状況の追跡、推論テーブル、レート制限、ポリシー)がまとまっています。
モデル名はsystem.ai.inkling、エンドポイントはUnity AI Gatewayの/ai-gateway/mlflow/v1/chat/completionsです。OpenAI互換なので、openaiパッケージがそのまま使えます。
セットアップ
OpenAI SDKをインストールします。
%pip install -U openai
dbutils.library.restartPython()
クライアントの初期化
ノートブックのコンテキストからワークスペースのURLとトークンを取得し、Unity AI Gatewayのエンドポイントをbase_urlに指定します。
from openai import OpenAI
ctx = dbutils.notebook.entry_point.getDbutils().notebook().getContext()
API_TOKEN = ctx.apiToken().get()
HOST = ctx.apiUrl().get()
client = OpenAI(
api_key=API_TOKEN,
base_url=f"{HOST}/ai-gateway/mlflow/v1",
)
MODEL = "system.ai.inkling"
基本的なチャット
まずはシンプルな呼び出しから。
response = client.chat.completions.create(
model=MODEL,
max_tokens=1024,
messages=[
{"role": "user", "content": "Databricksとは何ですか?日本語で簡潔に説明してください。"},
],
)
print(response.choices[0].message.content)
Databricks(データブリックス)は、**Apache Sparkの創始者たちが作ったクラウド型のデータ分析・AIプラットフォーム**です。
主な特徴:
- **レイクハウス**:データレイク(大規模生データ保存)とデータウェアハウス(分析用構造化データ)を統合
- **統合環境**:データ処理(ETL)、分析、機械学習を一つの基盤で実行
- **クラウド対応**:AWS・Azure・GCP上で動作
要するに、大量データの取り込みからAIモデルの開発・運用までを効率化する統合プラットフォームです。
日本語も問題なさそうです。
マルチターンの会話
会話履歴をmessagesに積むことでマルチターンの対話ができます。モデル詳細画面の「始めましょう」に表示されているcURLサンプルと同じ構造です。
response = client.chat.completions.create(
model=MODEL,
max_tokens=1024,
messages=[
{"role": "user", "content": "Hello!"},
{"role": "assistant", "content": "Hello! How can I assist you today?"},
{"role": "user", "content": "What is Databricks?"},
],
)
print(response.choices[0].message.content)
Delta Lake、MLflow、Unity Catalogといった主要技術まで含めた詳細な回答が返ってきました (長いので出力は割愛)。
ストリーミング
stream=Trueでトークンを逐次受け取れます。エージェントやチャットアプリに組み込む際に便利です。
stream = client.chat.completions.create(
model=MODEL,
max_tokens=1024,
stream=True,
messages=[
{"role": "user", "content": "Mixture-of-Expertsアーキテクチャの利点を3つ挙げてください。"},
],
)
for chunk in stream:
if chunk.choices and chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="")
Mixture-of-Experts(MoE)アーキテクチャの主な利点は以下の3つです。
1. **計算効率の向上(スパース活性化)**
入力ごとに全パラメータではなく、一部の「エキスパート」のみを選択的に活性化するため、**総パラメータ数を大きく増やしても推論・学習時の計算コストを抑えられます**。
(以下略)
Inkling自身がMoEモデルなので、自己紹介をしてもらった形になります。
コーディングタスク
Inklingはコーディングとエージェント的な推論に最適化されています。PySparkのコード生成を試してみます。
ここで1つ注意点です。Inklingはreasoningモデルであり、thinkingトークンもmax_tokensにカウントされます。最初max_tokens=2048で試したところ出力が途中で切れてしまいました。コード生成のような長い出力ではmax_tokensを大きめに設定してください。小さすぎるとfinish_reasonがlengthになり、出力が途中で切れます。
response = client.chat.completions.create(
model=MODEL,
max_tokens=10000,
messages=[
{
"role": "user",
"content": "PySparkで、売上テーブル (columns: date, store_id, amount) から店舗ごとの月次売上と前月比を計算するコードを書いてください。",
},
],
)
print(response.choices[0].message.content)
返ってきたコードがこちらです。
from pyspark.sql import SparkSession
from pyspark.sql.functions import (
col, sum, lag, when, round, date_format
)
from pyspark.sql.window import Window
# --- 1. 年月(yyyy-MM)を抽出 ---
df_ym = df.withColumn("year_month", date_format(col("date"), "yyyy-MM"))
# --- 2. 店舗×月の売上を集計 ---
monthly_sales = (
df_ym
.groupBy("store_id", "year_month")
.agg(sum("amount").alias("monthly_amount"))
)
# --- 3. 店舗ごとに月順でWindowを定義 ---
window_spec = Window.partitionBy("store_id").orderBy("year_month")
# --- 4. 前月売上を取得し、前月比を計算 ---
result = (
monthly_sales
.withColumn("prev_amount", lag("monthly_amount", 1).over(window_spec))
.withColumn(
"mom_ratio", # 前月比(倍率): (当月 - 前月) / 前月
when(
col("prev_amount").isNotNull() & (col("prev_amount") != 0),
round((col("monthly_amount") - col("prev_amount")) / col("prev_amount"), 4)
).otherwise(None)
)
)
result.orderBy("store_id", "year_month").show(truncate=False)
lagを使ったWindow関数、ゼロ除算防止のwhenまで含めて一発で妥当なコードが出てきました。ステップごとの解説テーブルと出力イメージまで付いてきており、コーディングに最適化されているという触れ込みは伊達ではなさそうです。
画像入力 (マルチモーダル)
Inklingは画像入力にネイティブ対応しています。ここで1つハマりどころがありました。最初は外部URL (Wikimedia)から画像を取得してbase64エンコードする形にしていたのですが、Invalid base64 string for imageという400エラーに遭遇。調べてみると、Wikimedia側がリクエストをブロックしてHTMLエラーページを返しており、画像ではなくHTMLをbase64エンコードして送っていたのが原因でした。
外部URLからの画像取得はUser-Agent要件やネットワーク設定で失敗しやすいため、ノートブック内でPillowを使って画像を生成する方式が確実です。
import io
import base64
from PIL import Image, ImageDraw
# テスト用の画像をノートブック内で生成
img = Image.new("RGB", (400, 200), "white")
draw = ImageDraw.Draw(img)
draw.rectangle([50, 50, 150, 150], fill="red")
draw.ellipse([250, 50, 350, 150], fill="blue")
buf = io.BytesIO()
img.save(buf, format="JPEG")
image_data = base64.standard_b64encode(buf.getvalue()).decode("utf-8")
response = client.chat.completions.create(
model=MODEL,
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_data}"},
},
{"type": "text", "text": "この画像には何が写っていますか?図形の種類と色を教えてください。"},
],
},
],
)
print(response.choices[0].message.content)
この画像には2つの図形が写っています。
- **左側**:赤い**四角形**(正方形)
- **右側**:青い**円**(丸)
背景は白(または薄い灰色)です。
正しく画像を認識できています。元画像はこちらです。
REST APIで直接呼び出す
SDKを使わず、requestsでエンドポイントを直接叩くこともできます。モデル詳細画面に表示されているcURLサンプルと同等の呼び出しです。
import requests
resp = requests.post(
f"{HOST}/ai-gateway/mlflow/v1/chat/completions",
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {API_TOKEN}",
},
json={
"model": MODEL,
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "レイクハウスアーキテクチャとは何ですか?一言で説明してください。"},
],
},
)
resp.raise_for_status()
print(resp.json()["choices"][0]["message"]["content"])
データレイクの低コスト・柔軟性とデータウェアハウスの管理機能・ACID対応を統合した、次世代データ基盤アーキテクチャです(Databricks提唱)。
まとめ
Unity AI Gateway経由でInklingを呼び出す基本パターンを一通り確認しました。OpenAI互換APIなので既存のコード資産がほぼそのまま使え、日本語・コーディング・画像入力のいずれも問題なく動作しました。
実際に触ってみてのポイントをまとめます。
- エンドポイントはOpenAI互換 (
/ai-gateway/mlflow/v1)。openaiパッケージでbase_urlを差し替えるだけ - reasoningモデルのため、thinkingトークンも
max_tokensにカウントされる。コード生成では10000程度に設定するのが安全 - 画像入力はbase64のdata URI形式でOK。外部URLからの画像取得はHTMLエラーページを掴まされるリスクがあるので検証を挟むこと
- Unity AI Gateway側で使用状況の追跡 (
system.ai_gateway.usageシステムテーブル)、推論テーブル、レート制限、ポリシーといったガバナンス機能を利用可能
なお、Inklingはthinking effort (0.2〜0.99)による推論の深さの調整にも対応しています。エンドポイント経由で指定するパラメータ名はFoundation Model APIドキュメントを確認してください。SQLからのai_query対応も近日提供予定とのことなので、来たらまた試します。
参考リンク:

