SGLang 中的选项方法#
本文档描述了 SGLang 支持的选项(choices)方法。
可选参数 choices_method 决定了如何从 SGLang 的 choices 原语提供的选项中进行选择。目前仅 RuntimeEndpoint 后端支持 choices_method 参数。其他后端(如 OpenAI)由于 API 限制,采用了定制的选择实现。
方法#
按 Token 长度归一化#
按 Token 长度归一化是 SGLang 默认的选项方法。它会选择所有 Token 平均对数概率(logprob)最高的选项。
用法示例(或者,只需省略 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,
)
)