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