SGLang中的选择方法#

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

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

方法#

令牌长度归一化#

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

如果一个选项包含许多标记,其中后面的标记基于前面的标记被高度自信地预测,这可能会导致性能不佳。例如,即使强大的模型也会在上述示例中失败,如果指定的选项是["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,
        )
    )