SGLang 使用方式与典型场景
四、使用方式与典型场景
示例一:用 OpenAI 协议调用,并用约束解码拿到稳定 JSON
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:30000/v1", api_key="EMPTY")
# 1) 普通对话
r = client.chat.completions.create(
model="sgl-local",
messages=[{"role": "user", "content": "把下面这段话压缩成一句话:……"}],
temperature=0.2,
max_tokens=128,
)
print(r.choices[0].message.content)
# 2) 若服务端支持 OpenAI 的 JSON 输出能力,可要求返回严格 JSON
r2 = client.chat.completions.create(
model="sgl-local",
messages=[{"role": "user", "content": "抽取工单信息:客户张三投诉物流慢,要求退款 99 元"}],
temperature=0.0,
response_format={"type": "json_object"},
max_tokens=256,
)
print(r2.choices[0].message.content)
约束解码的价值在把「格式错误重试」这条链路砍掉。抽取类任务里,模型输出无法解析是主要失败原因;把格式约束下沉到解码层之后,下游可以直接 json.loads,失败率大幅下降。
示例二:用前端 DSL 描述一个多步流程(先生成再判断再改写)
# 伪代码风格示意,具体 API 名称以官方文档为准
import sglang as sgl
@sgl.function
def review_flow(s, text):
s += "你是内容审核员。\n原文:" + text + "\n"
s += "第一步:判断是否违规,只回答 合规 或 违规。\n"
s += "结论:" + sgl.gen("verdict", max_tokens=8, temperature=0)
# 分支:只有违规才继续,合规直接结束
if s["verdict"].strip().startswith("违"):
s += "第二步:指出问题类型(广告/辱骂/涉政)。\n"
s += "类型:" + sgl.gen("kind", max_tokens=8, temperature=0)
s += "第三步:给出改写建议。\n"
s += sgl.gen("advice", max_tokens=256, temperature=0.6)
return s
# 一次提交多条,运行时自动批处理
outs = review_flow.run_batch(
[{"text": t} for t in texts],
temperature=0.3,
)
for o in outs:
print(o["verdict"], o.get("kind"), o.get("advice"))
这段写法的意义在于:分支决策与生成调用在同一个程序里表达,运行时知道哪些请求要走第二步、哪些可以提前结束,从而把批次里已经完成的请求释放掉、把新请求填进来。手写客户端编排时,这种「提前结束」的机会通常会被浪费。
适合与不适合的场景
适合:多轮对话与固定系统提示占比高的场景(前缀复用收益大);需要严格结构化输出的抽取、函数调用、表单填充场景;树状推理、多次采样投票、agent 多步流程;多模态输入的统一服务。
不适合:团队已经在 vLLM 上有成熟运维体系且没有前缀复用需求(迁移收益不大);Windows 原生环境;非 NVIDIA 硬件的场景支持有限;只需要一次简单请求的极低频场景。

