# 非構造化カスタムモデルの構築

> 非構造化カスタムモデルの構築 - 非構造化モデルは、入出力に任意のデータを使用でき、ターゲットのタイプに関係なくモデルをデプロイおよび監視することができます。

This Markdown file sits beside the HTML page at the same path (with a `.md` suffix). It summarizes the topic and lists links for tools and LLM context.

Companion generated at `2026-07-15T05:55:44.600362+00:00` (UTC).

## Primary page

- [非構造化カスタムモデルの構築](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md): Full documentation for this topic (Markdown sidecar).

## Sections on this page

- [非構造化カスタムモデルフック](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#unstructured-custom-model-hooks): In-page section heading.
- [init()](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#init): In-page section heading.
- [init()入力](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#init-input): In-page section heading.
- [init()例](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#init-example): In-page section heading.
- [init()出力](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#init-output): In-page section heading.
- [load_model()](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#load-model): In-page section heading.
- [load_model()入力](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#load-model-input): In-page section heading.
- [load_model()例](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#load-model-example): In-page section heading.
- [load_model()出力](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#load-model-output): In-page section heading.
- [score_unstructured()](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#score-unstructured): In-page section heading.
- [score_unstructured()入力](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#score-input): In-page section heading.
- [score_unstructured()例](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#score-unstructured-examples): In-page section heading.
- [score_unstructured()出力](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#score-unstructured-output): In-page section heading.
- [非構造化モデルに関する注意事項](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#unstructured-model-considerations): In-page section heading.
- [入力データ型解像度](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#incoming-data-type-resolution): In-page section heading.
- [送信データおよびkwargsパラメーター](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#outgoing-data-and-kwargs-parameters): In-page section heading.
- [サーバーモード](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#server-mode): In-page section heading.
- [バッチモード](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#batch-mode): In-page section heading.
- [補助](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#auxiliaries): In-page section heading.

## Documentation content

カスタムモデルがDataRobotでサポートされているターゲットタイプを使用していない場合、非構造化モデルを作成することができます。 非構造化モデルは、入出力に任意の（ つまり、構造化されていない ）データを使用でき、ターゲットのタイプに関係なくモデルをデプロイおよび監視することができます。 非構造化モデルのこの特性により、予測リクエストと応答からデータを読み取る方法をより細かく制御できます。ただし、正しく構築するには的確なコーディングが必要です。 [非構造化入力データを処理するカスタムフック](https://docs.datarobot.com/ja/docs/api/code-first-tools/drum/unstructured-custom-models.html.md#unstructured-custom-model-hooks) を実装して、有効な応答を生成する必要があります。

以下の2つのタイプのカスタムモデルの特性と機能を比較します。

| モデルタイプ | 特性 | 機能 |
| --- | --- | --- |
| 構造化 | DataRobotが認識できるターゲットタイプ（連続値、二値分類、多クラス、多ラベル、異常検知など）を使用します。リクエスト/レスポンススキーマに準拠する必要があります。構造化入力および出力データを受け入れます。 | 完全なデプロイ機能デプロイ後に、トレーニングデータを受け入れます。 |
| 非構造化 | DataRobotに知られていないカスタムターゲットタイプを使用します。リクエスト/レスポンススキーマに準拠する必要はありません。非構造化入出力データを受け入れます。 | デプロイ機能には制約があります。 データドリフトや精度統計、チャレンジャーモデル、信頼性ルールはサポートしません。デプロイ後はトレーニングデータを受け付けません。 |

推論モデルは、非構造化モードをサポートします。このモデルでは、入力と出力が検証されず、ほぼすべてのモードが可能です。 正確さを確認するのはユーザーの責任です。 非構造化カスタム推論モデルに固有の構築手順については、DRUMのドキュメントに記載されている [Python](https://github.com/datarobot/datarobot-user-models/tree/master/model_templates/python3_unstructured) および [R](https://github.com/datarobot/datarobot-user-models/tree/master/model_templates/r_unstructured) のモデルテンプレートを参照してください。

> [!NOTE] データ形式
> 非構造化モデルで作業する場合、DataRobotはデータをテキストまたはバイナリファイルとしてサポートします。

## 非構造化カスタムモデルフック

Pythonモデルの場合は `custom.py` 、Rモデルの場合は `custom.R` というファイルに、モデルフォルダー内のモデルアーティファクトと一緒に必要なフックを含めます。

> [!WARNING] 必要なすべてのカスタムモデルコードをフックに含める
> カスタムモデルフックは、カスタムモデルに渡されるコールバックです。 カスタムモデルに必要なすべてのコードは、カスタムモデルフック内に存在する必要があります。カスタムモデルは、定義されたカスタムモデルフックの外部で提供されるコードにはアクセスできません。 また、これらのフックの入力引数は事前定義されているため、変更することはできません。

**フック署名でのタイプ注釈**

次のフック署名は、Python 3タイプ注釈で記述されます。 Pythonタイプは以下のRタイプに一致します。

| Pythonタイプ | Rタイプ | 説明 |
| --- | --- | --- |
| None | NULL | なし |
| str | character | 文字列 |
| bytes | raw | 元のバイト数 |
| dict | list | キーと値のペアのリスト。 |
| tuple | list | データのリスト。 |
| Any | Rオブジェクト | 非シリアル化モデル。 |
| *args, **kwargs | ... | これらはタイプではなくキーワード引数であり、追加パラメーター用のプレースホルダーとして機能します。 |

### init()

`init` フックは実行の開始時に1回だけ実行され、モデルが他のフックで使用するライブラリと追加のファイルをロードできるようにします。

```
init(**kwargs) -> None 
```

#### init() 入力

| 入力パラメーター | 説明 |
| --- | --- |
| **kwargs | 追加のキーワード引数。 code_dirは、--code_dirパラメーターを介してモデルコードが保存されるフォルダーへのリンクを提供します。 |

#### init() 例

**Python:**
```
def init(code_dir):
    global g_code_dir
    g_code_dir = code_dir 
```

**R:**
```
init <- function(...) {
    library(brnn)
    library(glmnet)
} 
```


#### init() 出力

`init()` フックは何も返しません。

### load_model()

`load_model()` フックは、複数のアーティファクトから1つ以上のトレーニング済みオブジェクトをロードするために、実行の開始時に1回だけ実行されます。 トレーニング済みのオブジェクトがサポートされていない形式を使用するアーティファクトに保存されている場合、または複数のアーティファクトが使用される場合にのみ必要です。 サポートされている形式の1つの形式のアーティファクトが1つだけある場合、 `load_model()` フックは必要ありません。

- Python： .pkl 、 .pth 、 .h5 、 .joblib
- Java: .mojo
- R： .rds

```
load_model(code_dir: str) -> Any 
```

#### load_model() 入力

| 入力パラメーター | 説明 |
| --- | --- |
| code_dir | モデルアーティファクトと追加のコードが提供されるディレクトリに、--code_dirパラメーターを介して渡されるリンク。 |

#### load_model() 例

**Python:**
```
def load_model(code_dir):
    model_path = "model.pkl"
    model = joblib.load(os.path.join(code_dir, model_path))
    return model 
```

**R:**
```
load_model <- function(input_dir) {
    readRDS(file.path(input_dir, "model_name.rds"))
} 
```


#### load_model() 出力

`load_model()` フックは、トレーニング済みのオブジェクト（あらゆる型）を返します。

### score_unstructured()

`score_unstructured()` フックは、カスタム推定器の出力を定義し、出力データに予測を返します。 変換モデルにこのフックは使用しないでください。

```
score_unstructured(model: Any, data: str/bytes, **kwargs: Dict[str, Any]) -> str/bytes [, Dict[str, str]] 
```

#### score_unstructured()入力

| 入力パラメーター | 説明 |
| --- | --- |
| data | データは、提供されたmimetypeに応じて、strまたはbytesとして表示されます。 |
| model | DataRobotによってアーティファクトからロードされるか、またはload_modelフックを介してロードされるトレーニング済みオブジェクト。 |
| **kwargs | 追加のキーワード引数。 For a binary classification model, it contains the positive and negative class labels as the following keys:mimetype: str: Indicates the nature and format of the data, taken from request Content-Type header or --content-type CLI argument in batch mode.charset: str: Indicates the encoding for text data, taken from request Content-Type header or --content-type CLI argument in batch mode.query: dict: Parameters passed as query parameters in a HTTP request or the --query CLI argument in batch mode.headers: dict: Request headers passed in the HTTP request. |

#### score_unstructured()例

**Python:**
The following example processes text input, decodes bytes if necessary, and returns a prediction as a string:

```
def score_unstructured(model, data, query, **kwargs):
    text_data = data.decode("utf8") if isinstance(data, bytes) else data
    text_data = text_data.strip()
    words_count = model.predict(text_data)
    return str(words_count) 
```

```
curl -X POST "$DATAROBOT_ENDPOINT/api/v2/deployments/<deploymentId>/predictionsUnstructured/" \
  -H "Authorization: Bearer $DATAROBOT_API_TOKEN" \
  -H "Content-Type: text/plain" \
  -d "This is sample text input"

# Expected response:
5 
```

The following example demonstrates parsing JSON input and returning JSON output with the appropriate `Content-Type` header:

```
import json

def load_model(code_dir):
    """Required when no model artifact (.pkl, .h5, etc.) is present."""
    return True

def score_unstructured(model, data, query, **kwargs):
    """Parse JSON input and return JSON output with Content-Type header."""
    # Parse JSON input
    input_data = json.loads(data) if data else {}

    # Your inference logic here
    result = {
        "input": input_data,
        "prediction": "your_prediction_here"
    }

    # Return JSON response with Content-Type header
    return json.dumps(result), {"mimetype": "application/json"} 
```

```
curl -X POST "$DATAROBOT_ENDPOINT/api/v2/deployments/<deploymentId>/predictionsUnstructured/" \
  -H "Authorization: Bearer $DATAROBOT_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"key": "value", "test": 123}'

# Expected response:
{"input": {"key": "value", "test": 123}, "prediction": "your_prediction_here"} 
```

**R:**
```
score_unstructured <- function(model, data, query, ...) {
    kwargs <- list(...)

    if (is.raw(data)) {
        data_text <- stri_conv(data, "utf8")
    } else {
        data_text <- data
    }
    count <- str_count(data_text, " ") + 1
    ret = toString(count)
    ret
} 
```


#### score_unstructured()出力

`score_unstructured()` フックは次の値を返します。

- 単一の値 return data: str/bytes 。
- タプル return data: str/bytes, kwargs: dict[str, str] 。ここで kwargs には、個々のコンポーネントから Content-Type レスポンスヘッダーを構築するための {"mimetype": "users/mimetype", "charset": "users/charset"} を含めることができます。

## 非構造化モデルに関する注意事項

### 入力データ型解像度

`score_unstructured` フックは、 `str` または `bytes` タイプの `data` パラメーターを受け取ります。

タイプチェック方法を使用して、タイプを確認できます。

- Python：isinstance(data, str)またはisinstance(data, bytes)
- R：is.character(data)またはis.raw(data)

DataRobotは、 `Content-Type` ヘッダーを使用して `data` のキャスト先のタイプを決定します。 `Content-Type` ヘッダーは、リクエストまたは `--content-type` CLI引数で提供できます。 `Content-Type` ヘッダー形式は `type/subtype;parameter` です（たとえば、 `text/plain;charset=utf8` ）。 以下のルールが適用されます。

- charsetが定義されていない場合、デフォルトのutf8文字セットが使用されます。定義されている場合、提供された文字セットがデータのデコードに使用されます。
- Content-Typeが定義されていない場合、kwargs={"mimetype": "text/plain", "charset":"utf8"}が入力されるため、データはテキストとして扱われ、utf8文字セットでデコードされてstrとして渡されます。
- mimetypeがtext/またはapplication/jsonで始まる場合、データはテキストとして扱われ、提供された文字セットでデコードされてstrとして渡されます。
- 他のすべてのmimetype値については、データは二値として扱われ、bytesとして渡されます。

### 送信データおよびkwargsパラメーター

上記のように、 `score_unstructured` は以下を返すことができます。

- 単一のデータ値：return data。
- タプル（データおよび追加パラメーター：return data, {"mimetype": "some/type", "charset": "some_charset"}）。

#### サーバーモード

サーバーモードでは、次のルールが適用されます。

- return data: str：データはテキストとして扱われます。デフォルトのContent-Type="text/plain;charset=utf8"ヘッダーがレスポンスに設定され、データはutf8charsetでエンコードされて送信されます。
- return data: bytes：データは二値として扱われます。デフォルトのContent-Type="application/octet-stream;charset=utf8"ヘッダーがレスポンスに設定されて、データはそのまま送信されます。
- return data, kwargs：kwargsでmimetype値が欠損している場合、デフォルトのmimetypeはデータ型str/bytes->text/plain/application/octet-streamに従って設定されます。charset値が欠損している場合、デフォルトのutf8文字セットが設定されます。データの型がstrの場合、解決済みのcharsetを使用してエンコードされ、送信されます。

#### バッチモード

バッチモードでデバッグする最良の方法は、 `--output` ファイルを提供することです。 返されたデータは、返されたデータのタイプに従ってファイルに書き込まれます。

- strデータはデフォルトのutf8を使用してテキストファイルに書き込まれるか、kwargscharsetで返されます。
- bytesデータはバイナリファイルに書き込まれます。 返されたkwargsはバッチモードでは表示されませんが、デバッグ中には出力できます。

### 補助

コード内の `datarobot_drum.RuntimeParameters` （たとえば、 `custom.py` ）を使用して、実行されたカスタムモデルに配信されるランタイムパラメーターを読み取ることができます。 ランタイムパラメーターは、DataRobot UIで定義する必要があります。 以下は、資格情報ランタイムパラメーターの文字列を読み取る方法の簡単な例です。

```
from datarobot_drum import RuntimeParameters

def load_model(code_dir):
    target_url = RuntimeParameters.get("TARGET_URL")
    s3_creds = RuntimeParameters.get("AWS_CREDENTIAL")
    ... 
```
