Prhub

#45839 [Frontend] Support additional sampling parameters for translation API

原始 PR 作者 guan404ming 合并时间 2026-07-21 13:53 文件变更 1 提交数 4 评论 7 代码增减 +69 / -1

执行摘要

为翻译 API 增加额外采样参数

Translation 端点原先缺少常用的采样参数(如 top_p),用户无法精细控制文本生成。该 PR 实现了 TODO 标记的功能,补齐这些参数以提升 API 的实用性与灵活性。

该 PR 改动量小,逻辑清晰,适合快速了解 vLLM Translation 端点的请求模型与参数路由方式。值得注意的设计决定是 vllm_xargs 的类型与其他端点对齐,体现了 API 设计的一致性要求。建议阅读后检查相关端点是否也缺少某些参数,考虑统一维护。

讨论亮点

DarkLight1337 在代码审查中指出 vllm_xargs 的类型应与其他端点保持一致,建议从 dict[str, str | int | float | bool] 改为 dict[str, str | int | float | list[str | int | float]]。作者采纳并更新了代码。该讨论涉及 API 设计一致性,已被解决。

实现拆解

  1. 扩展请求模型:在 TranslationRequest 类中添加新字段,包括 top_p, top_k, min_p, frequency_penalty, repetition_penalty, presence_penaltyvllm_xargs。所有字段设置默认 None(除 frequency_penaltypresence_penalty 默认 0.0 外),保证向后兼容。
  2. 更新默认值字典:修改 _DEFAULT_SAMPLING_PARAMS 类变量,为新增参数提供合理的默认值(如 top_p=1.0, top_k=0, min_p=0.0, repetition_penalty=1.0),确保未显式指定时行为一致。
  3. 修改参数映射方法:在 to_sampling_params 方法中,为每个新参数添加回退解析逻辑:优先使用请求传入值(非 None),否则从 default_sampling_params(来自模型配置)摘取,最后回退至 _DEFAULT_SAMPLING_PARAMS。将解析后的值传入 SamplingParams.from_optional
  4. 根据 Review 调整:将 vllm_xargs 的类型从 dict[str, str | int | float | bool] 改为 dict[str, str | int | float | list[str | int | float]],与 Chat 和 Transcription 端点保持一致,并添加 import json 用于后续可能的 JSON 解析。
文件 模块 状态 重要度
vllm/entrypoints/speech_to_text/translation/protocol.py 前端 modified 6.33

关键符号

to_sampling_params

关键源码片段

vllm/entrypoints/speech_to_text/translation/protocol.py dependency-wiring

唯一变更文件,包含所有新增字段和参数映射逻辑,是 PR 的核心实现。

# SPDX-License-Identifier: Apache-2.0
import time
from typing import Literal
from fastapi import UploadFile
from pydantic import Field
from vllm.sampling_params import SamplingParams
​
​
class TranslationRequest(OpenAIBaseModel):
    # ... existing fields ...
​
    # 新增采样参数,默认 None 表示使用系统默认值
    top_p: float | None = None
    """核采样阈值,累积概率超过 p 时截断。"""
​
    top_k: int | None = None
    """限制每次采样仅考虑概率最高的 k 个 token。"""
​
    min_p: float | None = None
    """过滤掉概率低于 min_p 的 token。"""
​
    frequency_penalty: float | None = 0.0
    """频率惩罚,降低已出现 token 的概率。"""
​
    repetition_penalty: float | None = None
    """重复惩罚,抑制重复生成。"""
​
    presence_penalty: float | None = 0.0
    """存在惩罚,鼓励引入新 token。"""
​
    # vllm_xargs 类型与其他端点保持一致,支持扩展
    vllm_xargs: dict[str, str | int | float | list[str | int | float]] | None = Field(
        default=None,
        description="用于自定义扩展的附加参数字典"
    )
​
    # 默认采样参数字典,设定未显式指定时的基准值
    _DEFAULT_SAMPLING_PARAMS: dict = {
        "repetition_penalty": 1.0,
        "temperature": 0,
        "top_p": 1.0,
        "top_k": 0,
        "min_p": 0.0,
    }
​
    def to_sampling_params(
        self,
        default_sampling_params: dict | None = None,
    ) -> SamplingParams:
        # ... 原有逻辑 ...
        # 新参数的回退解析:优先请求值,其次 default_sampling_params,最后 _DEFAULT
        if (top_p := self.top_p) is None:
            top_p = default_sampling_params.get(
                "top_p", self._DEFAULT_SAMPLING_PARAMS["top_p"]
            )
        if (top_k := self.top_k) is None:
            top_k = default_sampling_params.get(
                "top_k", self._DEFAULT_SAMPLING_PARAMS["top_k"]
            )
        if (min_p := self.min_p) is None:
            min_p = default_sampling_params.get(
                "min_p", self._DEFAULT_SAMPLING_PARAMS["min_p"]
            )
        if (repetition_penalty := self.repetition_penalty) is None:
            repetition_penalty = default_sampling_params.get(
                "repetition_penalty",
                self._DEFAULT_SAMPLING_PARAMS["repetition_penalty"],
            )
        return SamplingParams.from_optional(
            temperature=temperature,
            max_tokens=max_tokens,
            seed=self.seed,
            top_p=top_p,
            top_k=top_k,
            min_p=min_p,
            repetition_penalty=repetition_penalty,
            # ... 其他参数 ...
        )

评论区精华

vllm_xargs 类型一致性 设计

DarkLight1337 建议将 vllm_xargs 的类型从 dict[str, str | int | float | bool] 改为 dict[str, str | int | float | list[str | int | float]],以与其他端点保持一致。

结论:作者采纳建议,更新了类型并添加了 import json。 · 已解决

风险与影响

  • 向后兼容风险:新增字段均有默认 None 或中性值,已有请求不受影响,风险低。
  • 缺失测试:本次变更没有添加单元测试,可能遗漏参数边界情况(如负值、类型错误等),建议后续补充测试。
  • 安全风险vllm_xargs 是一个任意字典,后端需确保对键值对进行适当验证,避免注入或异常回退。
  • 用户侧:Translation API 使用者现在可以直接在请求中指定 top_p 等参数,不再仅依赖 Temperature,提升了控制粒度。
  • 系统侧:新增参数最终传入 SamplingParams,不影响推理核心逻辑。vllm_xargs 提供了扩展点,但需注意类型安全。
  • 团队侧:代码简洁,易于维护,但缺少测试覆盖,后续宜增加。
缺少测试覆盖 vllm_xargs 需验证

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论