SGLang 中的选择方法#

本文档介绍了 SGLang 支持的选择方法。

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

方法#

令牌长度归一化#

令牌长度归一化是 SGLang 默认的选择方法。它选择所有令牌的平均对数概率最高的选项。

使用示例(或者,只需省略 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,
        )
    )

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

贪婪令牌选择#

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

使用示例:

@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,
        )
    )

如果一个选项基于一个有吸引力的初始令牌将模型误导到错误的路径上,则此方法可能表现不佳。例如,贪婪选择将导致此示例的错误响应:

@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,
        )
    )

无条件似然归一化#

无条件似然归一化选择平均令牌对数概率最高的选项,该选项通过无条件令牌对数概率进行归一化,如 这篇 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,
        )
    )