SGLang 中的选择方法#

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

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

方法#

令牌长度归一化#

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

使用示例(或者,直接省略 choices_method 参数):

@sgl.function
def example(s):
    s += sgl.user("法国的首都是什么?")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["伦敦", "巴黎", "柏林"],
            choices_method=sgl.token_length_normalized,
        )
    )

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

贪婪令牌选择#

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

使用示例:

@sgl.function
def example(s):
    s += sgl.user("法国的首都是什么?")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["伦敦", "巴黎", "柏林"],
            choices_method=sgl.greedy_token_selection,
        )
    )

如果一个选项因其吸引人的初始令牌而将模型引入错误的路径,那么此方法的性能可能会很差。例如,贪婪选择会导致此示例的响应错误:

@sgl.function
def us_president_example(s):
    s += sgl.user("说出一位美国总统。")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["唐老鸭", "米勒德·菲尔莫尔"],
            choices_method=sgl.greedy_token_selection,
        )
    )

无条件似然归一化#

无条件似然归一化选择在通过无条件令牌对数概率归一化后平均令牌对数概率最高的选项,如 这篇 EleutherAI 博客文章 所述。此方法需要额外的 LLM 调用以获得无条件似然。

使用示例:

@sgl.function
def example(s):
    s += sgl.user("法国的首都是什么?")
    s += sgl.assistant(
        sgl.gen(
            "answer",
            choices=["伦敦", "巴黎", "柏林"],
            choices_method=sgl.unconditional_likelihood_normalized,
        )
    )