# JEV

> [!WARNING]
> 決定モデル、`decision` パイプライン、および `DecisionConfig` は実験的な機能です。これらの API は、非推奨化なしにいつでも変更される可能性があります。

JEVは、プロンプトの最後のトークンにおいて線形層で単一トークンのラベルをスコアリングする決定ヘッドです。言語モデルヘッドのlogitsと同様にソフトキャップが適用されています。[JEV](https://huggingface.co/autotrust/JEV-9B)によって導入され、[GEV](https://huggingface.co/autotrust/GEV-26B-Decide)でも使用されています。

[JevForDecision](/docs/transformers/main/ja/model_doc/jev#transformers.JevForDecision) は、チェックポイントのモデルとそのヘッドです。`ForCausalLM` がモデルとその `lm_head` であるのと同じです。これは、チェックポイントが重みの隣にヘッドを同梱するファイルを読み取ります（vLLM 決定モデルの場合は `readout.safetensors` と `decision_config.json`、JEV の場合は `head.safetensors` と `judge_config.json`）。

```python
from transformers import pipeline

decide = pipeline("decision", model="autotrust/GEV-26B-Decide")
decide(
    {
        "state": "I was charged twice for my order and want a refund.",
        "questions": {"refund": {"type": "noul", "instructions": "Is a refund requested?"}},
    }
)
```

画像アセットについては、[decision pipeline](../main_classes/pipelines#transformers.DecisionPipeline)を参照してください。

パイプラインなしの場合、決定モデルは`generate`のように使用されます。決定設定がチャットテンプレートを使用して各質問ごとにプロンプト（またはすべてに共通のプロンプト）をレンダリングし、`decide`が各質問の選択肢をスコアリングし、`Question.answer`がスコアを回答に変換します。

> [!IMPORTANT]
> `from_pretrained` は、サブフォルダーに LoRA を保持するチェックポイント（`decision_config.adapter`、例えば JEV の `adapter/` など）の LoRA を読み込みません。パイプラインが代わりに読み込みますが、パイプラインを使わない場合は、以下のように自分で `load_adapter` を呼び出してください。そうしないと、モデルはベースの重みで応答します。

```python
import torch
from transformers import AutoTokenizer, JevForDecision

repo = "autotrust/JEV-9B"
model = JevForDecision.from_pretrained(repo, dtype=torch.bfloat16, device_map="auto")
tokenizer, config = AutoTokenizer.from_pretrained(repo), model.decision_config  # read from the checkpoint's files
if config.adapter:  # JEV keeps its LoRA in a subfolder: `from_pretrained` doesn't load it, the pipeline does
    model.load_adapter(repo, adapter_kwargs={"subfolder": config.adapter})

request = {
    "state": "I was charged twice for my order and I want my money back today.",
    "questions": {
        "refund": {"type": "noul", "instructions": "Does the customer ask for a refund?"},
        "urgency": {"type": "score", "criteria": ["Can wait", "This week", "Today", "Now"]},
    },
}
answers = {}
for inputs, questions in config.prepare_inputs(request, tokenizer):
    scores = model.decide(**inputs, decision_questions=questions)
    answers |= {q.name: q.answer(s.softmax(-1).tolist()) for q, s in zip(questions, scores)}
```

同じヘッドが、[pplx-decider](https://huggingface.co/perplexity-ai/pplx-decider-v1.1-27b)と[d3](https://huggingface.co/vllm-sr/d3)の255個の回答コードを読み取ります。これらはQwen3.5のバックボーンを備えており、プロンプト全体にアテンションを適用します（`JevForDecision`の`text_config`で`is_causal=False`）。これらのヘッド（`readout.safetensors`）と設定（`decision_config.json`）は、重みと同様にそのまま読み込まれます。

```python
pipeline("decision", model="vllm-sr/d3")(request)  # or perplexity-ai/pplx-decider-v1.1-27b
```

## JevConfig[[transformers.JevConfig]]

#### transformers.JevConfig[[transformers.JevConfig]]

```python
transformers.JevConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, hidden_size: int = 4096, num_verbalizers: int = 24, offsets: dict[str, int] | None = None, softcap: float | None = None, text_config: dict | transformers.configuration_utils.PreTrainedConfig | None = None, initializer_range: float = 0.02)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/jev/configuration_jev.py#L101)

**パラメータ:**

hidden_size (`int`、*任意*、デフォルトは`4096`) : 隠れ表現の次元数。

num_verbalizers (`int`、*optional*、デフォルトは 24) : 全クエスチョンタイプにおいて、ヘッドによってスコアリングされる単一トークンラベルの数。

offsets (`dict[str, int]`、*optional*、デフォルトは`{"noul" : 0, "score": 2, "choice": 8}`): 各質問タイプの最初のラベルの行: 質問の選択肢は、`offsets[question.type]`以降の行が順にスコアリングされます。

softcap (`float`, *optional*) : スコアのソフトキャップ、`softcap * tanh(scores / softcap)`。言語モデルヘッドのロジットと同様です。

text_config (`dict` または `PreTrainedConfig`、*任意*) : ヘッドが読み取るモデルの設定、つまりそのリポジトリの `config.json` です。

initializer_range (`float`、*任意*、デフォルトは`0.02`) : すべての重み行列を初期化するためのtruncated_normal_initializerの標準偏差です。

これは JevModel の設定を保存するための設定クラスです。指定された引数に基づいて Jev モデルをインスタンス化し、モデルのアーキテクチャを定義するために使用されます。デフォルト値で設定をインスタンス化すると、[autotrust/JEV-9B](https://huggingface.co/autotrust/JEV-9B) と同様の設定が得られます。

設定オブジェクトは [PreTrainedConfig](/docs/transformers/main/ja/main_classes/configuration#transformers.PreTrainedConfig) を継承し、モデルの出力を制御するために使用できます。詳細については、[PreTrainedConfig](/docs/transformers/main/ja/main_classes/configuration#transformers.PreTrainedConfig) のドキュメントを参照してください。

例:
```python
>>> from transformers import JevConfig, JevForDecision

>>> model = JevForDecision(JevConfig(hidden_size=4096))
```

#### decision_config[[transformers.JevConfig.decision_config]]

```python
decision_config(head_configs: dict, text_config: dict)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/jev/configuration_jev.py#L134)

decision設定は、重みとJEVヘッドを一緒に提供するチェックポイントの、その設定ファイルから取得されます。

## JevForDecision[[transformers.JevForDecision]]

#### transformers.JevForDecision[[transformers.JevForDecision]]

```python
transformers.JevForDecision(config: JevConfig)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/jev/modeling_jev.py#L38)

**パラメータ:**

config ([JevConfig](/docs/transformers/main/ja/model_doc/jev#transformers.JevConfig)) : モデルのパラメータをすべて含むモデル設定クラスです。設定ファイルで初期化しても、モデルに関連する重みは読み込まれず、設定のみが読み込まれます。モデルの重みをロードするには、[from_pretrained()](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel.from_pretrained) メソッドを確認してください。

JEV (autotrust/JEV-9B): リポジトリのモデルと決定ヘッド。各質問の`<|mark|>`の直前のトークンにおける、単一トークンラベルの線形スコア。言語モデルヘッドのlogitsと同様にソフトキャップが適用されています。

このモデルは [PreTrainedModel](/docs/transformers/main/ja/main_classes/model#transformers.PreTrainedModel) を継承しています。ライブラリがすべてのモデルに対して実装している汎用的なメソッド（ダウンロードや保存、入力埋め込みのリサイズ、ヘッドのプルーニングなど）については、スーパークラスのドキュメントを参照してください。

このモデルは、PyTorchの[torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module)のサブクラスでもあります。通常のPyTorch Moduleとして使用し、一般的な使用方法や動作に関する詳細については、PyTorchのドキュメントを参照してください。

#### forward[[transformers.JevForDecision.forward]]

```python
forward(input_ids: LongTensor, marks: LongTensor, num_options: LongTensor, question_type_ids: LongTensor, **kwargs)
```

[ソース](https://github.com/huggingface/transformers/blob/main/src/transformers/models/jev/modeling_jev.py#L45)

**パラメータ:**

input_ids (`torch.LongTensor`、shape `(batch_size, sequence_length)`) : 語彙における入力シーケンスのトークンインデックスです。デフォルトでは、パディングは無視されます。インデックスは [AutoTokenizer](/docs/transformers/main/ja/model_doc/auto#transformers.AutoTokenizer) を使用して取得できます。詳細は [PreTrainedTokenizer.encode()](/docs/transformers/main/ja/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.encode) および [PreTrainedTokenizer.__call__()](/docs/transformers/main/ja/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.__call__) を参照してください。 [入力IDとは何ですか？](../glossary#input-ids)

marks (`torch.LongTensor`、形状 `(num_marks,)`) : 決定テンプレートの `<|mark|>` によって記録された位置: それぞれの `<|mark|>` の前のプロンプトのトークン数。

num_options (`torch.LongTensor`、形状 `(num_questions,)`) : プロンプトの各質問の選択肢の数。

question_type_ids (`torch.LongTensor`、形状 `(num_questions,)`) : プロンプトの各質問のタイプを、`Question.questions_types` におけるインデックスとして表したものです。

**戻り値:**

`torch.Tensor`

[JevForDecision](/docs/transformers/main/ja/model_doc/jev#transformers.JevForDecision)のforwardメソッドは、`__call__`特殊メソッドをオーバーライドします。

この関数内でフォワードパスの手順を定義する必要がありますが、その後、この関数ではなく`Module`インスタンスを呼び出すべきです。前者は前処理と後処理の実行を適切に処理するのに対し、後者はそれらを無視してしまいます。

