Prhub

#46119 [Pooling] Validate non-negative rerank top_n

原始 PR 作者 taneem-ibrahim 合并时间 2026-06-22 23:40 文件变更 1 提交数 2 评论 3 代码增减 +1 / -1

执行摘要

为 RerankRequest 的 top_n 添加非负校验

PR body 指出:top_n 表示 rerank 请求的结果数量,负值为无效输入。此前 top_n=-1 被静默接受,行为等同于 0,可能隐藏客户端 bug 并增加请求行为推理难度。PR 要求添加非负校验,同时保留 top_n=0 返回全部结果、大于文档数的值也被接受的现有行为。

PR 简单明确,适合快速合入。改动虽小但提升了接口健壮性。

讨论亮点

Reviewer yewentao256 对测试文件提出建议:认为该小型更新无需专门的单元测试,因此测试提交被移除。此外,reviewer 提议的 ge=0 写法被采纳,同时 reviewer 认为无需添加 description 参数,因为其他属性都没有且易于理解。最终 reviewer 批准了 PR。

实现拆解

vllm/entrypoints/pooling/scoring/protocol.pyRerankRequest 类中,修改 top_n 字段的 Pydantic 定义:

  1. default_factory=lambda: 0 替换为 default=0,简化默认值写法。
  2. 添加 ge=0(greater than or equal to 0)约束,Pydantic 会在请求解析时自动校验,当传入负数时抛出验证错误。
  3. 该变更仅涉及一行代码,测试文件因 reviewer 建议被移除。
文件 模块 状态 重要度
vllm/entrypoints/pooling/scoring/protocol.py 入口协议 modified 4.49

关键符号

RerankRequest

关键源码片段

vllm/entrypoints/pooling/scoring/protocol.py core-logic

修改 RerankRequest 的 top_n 字段,添加非负约束

# vllm/entrypoints/pooling/scoring/protocol.py
# RerankRequest 类中 top_n 字段定义
class RerankRequest(ScoringRequestMixin):
    # --8<-- [start:rerank-request-params]
    query: ScoreInput
    documents: ScoreInput | list[ScoreInput]
    # 修改前:top_n: int = Field(default_factory=lambda: 0)
    # 修改后:添加 ge=0 约束,拒绝负数输入
    top_n: int = Field(default=0, ge=0)
    # --8<-- [end:rerank-request-params]

评论区精华

测试必要性 测试

Reviewer yewentao256 认为该小型更新无需专门的单元测试,并建议移除测试文件。

结论:测试提交被移除,PR 仅保留一行核心修改。 · 已解决

Field 定义建议 设计

Reviewer 建议使用 `Field(default=0, ge=0)` 替代原写法,并去掉不必要的描述字段。

结论:采纳建议,最终采用 `top_n: int = Field(default=0, ge=0)`。 · 已解决

风险与影响

风险极低:仅修改了 Pydantic 字段定义,添加非负约束。该变更不会影响正常请求(top_n>=0),只会使负数输入提前报错,避免静默错误。由于测试被移除,缺少直接的自动测试覆盖,但 Pydantic 的内置校验本身可靠。

影响范围小:仅影响 RerankRequest 的请求解析阶段。用户传入负数 top_n 时将收到 Pydantic 验证错误,而非静默退化为 0。对合法请求(包括 top_n=0 和大于文档数的值)无影响。

无测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论