SGLang 中的选择方法#

本文档描述了 SGLang 支持的选择方法。

可选的 choices_method 参数决定了如何选择提供给 SGLang choices 原语的选项。只有 RuntimeEndpoint 后端支持 choices_method 参数。其他后端,例如 OpenAI,由于 API 限制,具有定制的选择实现。

方法#

按 Token 长度归一化#

按 Token 长度归一化是 SGLang 默认的选择方法。它选择在其所有 Token 中平均对数概率最高的选项。

用法示例(或者,只需省略 choices_method 参数)

@sgl.function
def example(s):
    s += sgl.user("What is the capital of France?")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["London", "Paris", "Berlin"],
            choices_method=sgl.token_length_normalized,
        )
    )

如果一个选项包含许多 Token,并且其后面的 Token 是根据前面的 Token 以高置信度预测的,则这种方法可能会表现不佳。例如,如果指定的选项是 ["Paris", "Antidisestablishmentarianism"],即使是强大的模型也会在上述示例中失败。

贪婪 Token 选择#

贪婪 Token 选择简单地选择初始 Token 对数概率最高的选项。对于重叠选项,其中一个选项是较长选项的子集,较短选项的对数概率会使用其平均对数概率进行扩展,以便与较长选项进行比较。

用法示例

@sgl.function
def example(s):
    s += sgl.user("What is the capital of France?")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["London", "Paris", "Berlin"],
            choices_method=sgl.greedy_token_selection,
        )
    )

如果一个选项根据一个有吸引力的初始 Token 将模型误导到错误的方向,则这种方法可能会表现不佳。例如,对于此示例,贪婪选择将导致不正确的响应。

@sgl.function
def us_president_example(s):
    s += sgl.user("Name a US president.")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["Donald Duck", "Millard Fillmore"],
            choices_method=sgl.greedy_token_selection,
        )
    )

按无条件似然归一化#

按无条件似然归一化选择在通过无条件 Token 对数概率进行归一化后,具有最高平均 Token 对数概率的选项,如 这篇 EleutherAI 博客文章 所述。此方法会产生额外的 LLM 调用以获取无条件似然。

用法示例

@sgl.function
def example(s):
    s += sgl.user("What is the capital of France?")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["London", "Paris", "Berlin"],
            choices_method=sgl.unconditional_likelihood_normalized,
        )
    )