# JEV

> [!WARNING]
> 决策模型、`decision` 流水线以及 `DecisionConfig` 均为实验性功能：其 API 可能会随时变更，且不会经过弃用流程。

JEV 是一个决策头，它在提示的最后一个 token 处使用线性层对单 token 标签进行评分，其输出像语言模型头的 logits 一样经过软截断。它由 [JEV](https://huggingface.co/autotrust/JEV-9B) 提出，也被 [GEV](https://huggingface.co/autotrust/GEV-26B-Decide) 使用。

[JevForDecision](/docs/transformers/v5.23.0/zh/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?"}},
    }
)
```

请参阅图像资产的[决策流水线](../main_classes/pipelines#transformers.DecisionPipeline)。

如果没有 pipeline，决策模型的使用方式类似于 `generate`：决策配置通过聊天模板为每个问题（或所有问题）渲染一个提示词，`decide` 对每个问题的选项进行评分，而 `Question.answer` 则将评分转换为答案：

> [!IMPORTANT]
> `from_pretrained` 不会加载将 LoRA 保存在子文件夹中的检查点（`decision_config.adapter`，例如 JEV 的 `adapter/`）。流水线会为您加载它；如果不使用流水线，请像下面这样自行调用 `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)}
```

同一个 head 读取 [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`）。它们的 head（`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/v5.23.0/src/transformers/models/jev/configuration_jev.py#L101)

**参数：**

hidden_size (`int`，*可选*，默认为 `4096`)：隐藏表示的维度。

num_verbalizers (`int`, *可选*，默认为 24)：针对所有问题类型，由该头部进行打分的单 token 标签数量。

offsets (`dict[str, int]`，*可选*，默认为 `{"noul" : 0, "score": 2, "choice": 8}`)：每种问题类型的首个标签所在的行：问题的选项按顺序从 `offsets[question.type]` 开始的行进行评分。

softcap (`float`, *可选*) : 分数的软上限，`softcap * tanh(scores / softcap)`，类似于语言模型头的 logits。

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/v5.23.0/zh/main_classes/configuration#transformers.PreTrainedConfig)，可用于控制模型输出。有关更多信息，请参阅 [PreTrainedConfig](/docs/transformers/v5.23.0/zh/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/v5.23.0/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/v5.23.0/src/transformers/models/jev/modeling_jev.py#L38)

**参数：**

config ([JevConfig](/docs/transformers/v5.23.0/zh/model_doc/jev#transformers.JevConfig))：模型配置类，包含模型的所有参数。使用配置文件进行初始化时，不会加载与模型关联的权重，仅加载配置。请查看 [from_pretrained()](/docs/transformers/v5.23.0/zh/main_classes/model#transformers.PreTrainedModel.from_pretrained) 方法以加载模型权重。

JEV (autotrust/JEV-9B)：该仓库中的模型以及一个决策头，对每个问题中`<|mark|>`标记前一个 token 处的单 token 标签进行线性打分，其输出像语言模型头的 logits 一样经过软截断。

该模型继承自 [PreTrainedModel](/docs/transformers/v5.23.0/zh/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/v5.23.0/src/transformers/models/jev/modeling_jev.py#L45)

**参数：**

input_ids (`torch.LongTensor`，形状为 `(batch_size, sequence_length)`)：输入序列词元在词汇表中的索引。默认情况下，填充部分将被忽略。可以使用 [AutoTokenizer](/docs/transformers/v5.23.0/zh/model_doc/auto#transformers.AutoTokenizer) 获取索引。有关详细信息，请参阅 [PreTrainedTokenizer.encode()](/docs/transformers/v5.23.0/zh/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.encode) 和 [PreTrainedTokenizer.__call__()](/docs/transformers/v5.23.0/zh/internal/tokenization_utils#transformers.PreTrainedTokenizerBase.__call__)。[什么是输入 ID？](../glossary#input-ids)

marks (`torch.LongTensor`，形状为 `(num_marks,)`)：决策模板中 `<|mark|>` 所记录的位置：每个标记之前提示词中的 token 数量。

num_options (`torch.LongTensor`，形状为 `(num_questions,)`)：提示中每个问题的选项数量。

question_type_ids (`torch.LongTensor`，形状为 `(num_questions,)`)：提示中每个问题的类型，即其在 `Question.questions_types` 中的索引。

**返回值：**

`torch.Tensor`

[JevForDecision](/docs/transformers/v5.23.0/zh/model_doc/jev#transformers.JevForDecision) 的 forward 方法重写了 `__call__` 特殊方法。

尽管前向传播的实现需要在此函数中定义，但之后应调用 `Module` 实例，而不是直接调用此函数，因为前者会负责执行预处理和后处理步骤，而后者会静默地忽略这些步骤。

