SGLang结构化生成框架Skill sglang

SGLang是一个高性能的大语言模型服务框架,专注于结构化生成和快速推理,通过RadixAttention技术实现自动前缀缓存,显著提升代理工作流、多轮对话等场景的效率。适用于AI智能体开发、JSON输出生成等应用。关键词:SGLang,结构化生成,RadixAttention,前缀缓存,LLM服务,AI智能体,高性能推理。

AI智能体 0 次安装 0 次浏览 更新于 3/21/2026

name: sglang description: 快速结构化生成和为LLM提供服务的框架,带有RadixAttention前缀缓存。用于JSON/正则表达式输出、约束解码、带有工具调用的代理工作流,或当您需要比vLLM快5倍的推理速度并带有前缀共享时。在xAI、AMD、NVIDIA和LinkedIn上支持300,000+ GPUs。 version: 1.0.0 author: Orchestra Research license: MIT tags: [推理服务, SGLang, 结构化生成, RadixAttention, 前缀缓存, 约束解码, 代理, JSON输出, 快速推理, 生产规模] dependencies: [sglang, torch, transformers]

SGLang

高性能的LLM和VLM服务框架,带有RadixAttention用于自动前缀缓存。

何时使用SGLang

使用SGLang时:

  • 需要结构化输出(JSON、正则表达式、语法)
  • 构建带有重复前缀的代理(系统提示、工具)
  • 带有函数调用的代理工作流
  • 带有共享上下文的多轮对话
  • 需要更快的JSON解码(3倍于标准)

改用vLLM时:

  • 简单的无结构文本生成
  • 不需要前缀缓存
  • 想要成熟、广泛测试的生产系统

改用TensorRT-LLM时:

  • 最大单请求延迟(不需要批处理)
  • 仅NVIDIA部署
  • 需要在H100上使用FP8/INT4量化

快速开始

安装

# pip安装(推荐)
pip install "sglang[all]"

# 带有FlashInfer(更快,CUDA 11.8/12.1)
pip install sglang[all] flashinfer -i https://flashinfer.ai/whl/cu121/torch2.4/

# 从源代码
git clone https://github.com/sgl-project/sglang.git
cd sglang
pip install -e "python[all]"

启动服务器

# 基本服务器(Llama 3-8B)
python -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3-8B-Instruct \
    --port 30000

# 带有RadixAttention(自动前缀缓存)
python -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3-8B-Instruct \
    --port 30000 \
    --enable-radix-cache  # 默认:启用

# 多GPU(张量并行)
python -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3-70B-Instruct \
    --tp 4 \
    --port 30000

基本推理

import sglang as sgl

# 设置后端
sgl.set_default_backend(sgl.OpenAI("http://localhost:30000/v1"))

# 简单生成
@sgl.function
def simple_gen(s, question):
    s += "Q: " + question + "
"
    s += "A:" + sgl.gen("answer", max_tokens=100)

# 运行
state = simple_gen.run(question="法国的首都是什么?")
print(state["answer"])
# 输出:"法国的首都是巴黎。"

结构化JSON输出

import sglang as sgl

@sgl.function
def extract_person(s, text):
    s += f"从文本中提取人物信息:{text}
"
    s += "输出JSON:
"

    # 约束JSON生成
    s += sgl.gen(
        "json_output",
        max_tokens=200,
        regex=r'\{"name": "[^"]+", "age": \d+, "occupation": "[^"]+"\}'
    )

# 运行
state = extract_person.run(
    text="John Smith是一名35岁的软件工程师。"
)
print(state["json_output"])
# 输出:{"name": "John Smith", "age": 35, "occupation": "software engineer"}

RadixAttention(关键创新)

它做什么:自动缓存和跨请求重用公共前缀。

性能

  • 5倍更快用于带有共享系统提示的代理工作负载
  • 10倍更快用于带有重复示例的少样本提示
  • 零配置 - 自动工作

工作原理

  1. 构建所有处理令牌的基数树
  2. 自动检测共享前缀
  3. 重用匹配前缀的KV缓存
  4. 仅计算新令牌

示例(带有系统提示的代理):

请求1:[SYSTEM_PROMPT] + "天气怎么样?"
→ 计算完整提示(1000令牌)

请求2:[相同系统提示] + "预订航班"
→ 重用系统提示KV缓存(998令牌)
→ 仅计算2个新令牌
→ 5倍更快!

结构化生成模式

带有模式的JSON

@sgl.function
def structured_extraction(s, article):
    s += f"文章:{article}

"
    s += "以JSON格式提取关键信息:
"

    # JSON模式约束
    schema = {
        "type": "object",
        "properties": {
            "title": {"type": "string"},
            "author": {"type": "string"},
            "summary": {"type": "string"},
            "sentiment": {"type": "string", "enum": ["positive", "negative", "neutral"]}
        },
        "required": ["title", "author", "summary", "sentiment"]
    }

    s += sgl.gen("info", max_tokens=300, json_schema=schema)

state = structured_extraction.run(article="...")
print(state["info"])
# 输出:符合模式的有效JSON

正则表达式约束生成

@sgl.function
def extract_email(s, text):
    s += f"从文本中提取电子邮件:{text}
"
    s += "电子邮件:"

    # 电子邮件正则表达式模式
    s += sgl.gen(
        "email",
        max_tokens=50,
        regex=r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}'
    )

state = extract_email.run(text="联系john.doe@example.com获取详情")
print(state["email"])
# 输出:"john.doe@example.com"

基于语法的生成

@sgl.function
def generate_code(s, description):
    s += f"为以下描述生成Python代码:{description}
"
    s += "```python
"

    # Python的EBNF语法
    python_grammar = """
    ?start: function_def
    function_def: "def" NAME "(" [parameters] "):" suite
    parameters: parameter ("," parameter)*
    parameter: NAME
    suite: simple_stmt | NEWLINE INDENT stmt+ DEDENT
    """

    s += sgl.gen("code", max_tokens=200, grammar=python_grammar)
    s += "
```"

带有函数调用的代理工作流

import sglang as sgl

# 定义工具
tools = [
    {
        "name": "get_weather",
        "description": "获取某个位置的天气",
        "parameters": {
            "type": "object",
            "properties": {
                "location": {"type": "string"}
            }
        }
    },
    {
        "name": "book_flight",
        "description": "预订航班",
        "parameters": {
            "type": "object",
            "properties": {
                "from": {"type": "string"},
                "to": {"type": "string"},
                "date": {"type": "string"}
            }
        }
    }
]

@sgl.function
def agent_workflow(s, user_query, tools):
    # 系统提示(通过RadixAttention缓存)
    s += "您是一个有帮助的助手,可以访问工具。
"
    s += f"可用工具:{tools}

"

    # 用户查询
    s += f"用户:{user_query}
"
    s += "助手:"

    # 使用函数调用生成
    s += sgl.gen(
        "response",
        max_tokens=200,
        tools=tools,  # SGLang处理工具调用格式
        stop=["用户:", "

"]
    )

# 多个查询重用系统提示
state1 = agent_workflow.run(
    user_query="纽约的天气怎么样?",
    tools=tools
)
# 第一次调用:计算完整系统提示

state2 = agent_workflow.run(
    user_query="预订到洛杉矶的航班",
    tools=tools
)
# 第二次调用:重用系统提示(5倍更快)

性能基准

RadixAttention加速

少样本提示(提示中有10个示例):

  • vLLM: 2.5 秒/请求
  • SGLang: 0.25 秒/请求(10倍更快)
  • 吞吐量:4倍更高

代理工作流(1000令牌系统提示):

  • vLLM: 1.8 秒/请求
  • SGLang: 0.35 秒/请求(5倍更快)

JSON解码

  • 标准:45 令牌/秒
  • SGLang: 135 令牌/秒(3倍更快)

吞吐量(Llama 3-8B, A100)

工作负载 vLLM SGLang 加速比
简单生成 2500 令牌/秒 2800 令牌/秒 1.12×
少样本(10示例) 500 令牌/秒 5000 令牌/秒 10×
代理(工具调用) 800 令牌/秒 4000 令牌/秒
JSON输出 600 令牌/秒 2400 令牌/秒

多轮对话

@sgl.function
def multi_turn_chat(s, history, new_message):
    # 系统提示(始终缓存)
    s += "您是一个有帮助的AI助手。

"

    # 对话历史(随着增长缓存)
    for msg in history:
        s += f"{msg['role']}: {msg['content']}
"

    # 新用户消息(仅新部分)
    s += f"用户:{new_message}
"
    s += "助手:"
    s += sgl.gen("response", max_tokens=200)

# 第一轮
history = []
state = multi_turn_chat.run(history=history, new_message="你好!")
history.append({"role": "用户", "content": "你好!"})
history.append({"role": "助手", "content": state["response"]})

# 第二轮(重用第一轮KV缓存)
state = multi_turn_chat.run(history=history, new_message="2+2等于多少?")
# 仅计算新消息(快得多!)

# 第三轮(重用第一轮 + 第二轮KV缓存)
state = multi_turn_chat.run(history=history, new_message="讲个笑话")
# 随着历史增长,逐渐更快

高级功能

推测解码

# 使用草稿模型启动(2-3倍更快)
python -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3-70B-Instruct \
    --speculative-model meta-llama/Meta-Llama-3-8B-Instruct \
    --speculative-num-steps 5

多模态(视觉模型)

@sgl.function
def describe_image(s, image_path):
    s += sgl.image(image_path)
    s += "详细描述这张图片:"
    s += sgl.gen("description", max_tokens=200)

state = describe_image.run(image_path="photo.jpg")
print(state["description"])

批处理和并行请求

# 自动批处理(连续批处理)
states = sgl.run_batch(
    [
        simple_gen.bind(question="什么是AI?"),
        simple_gen.bind(question="什么是ML?"),
        simple_gen.bind(question="什么是DL?"),
    ]
)

# 所有3个在单个批次中处理(高效)

OpenAI兼容API

# 使用OpenAI API启动服务器
python -m sglang.launch_server \
    --model-path meta-llama/Meta-Llama-3-8B-Instruct \
    --port 30000

# 使用OpenAI客户端
curl http://localhost:30000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "default",
    "messages": [
      {"role": "system", "content": "您有帮助"},
      {"role": "user", "content": "你好"}
    ],
    "temperature": 0.7,
    "max_tokens": 100
  }'

# 使用OpenAI Python SDK
from openai import OpenAI
client = OpenAI(base_url="http://localhost:30000/v1", api_key="EMPTY")

response = client.chat.completions.create(
    model="default",
    messages=[{"role": "user", "content": "你好"}]
)

支持的模型

文本模型

  • Llama 2, Llama 3, Llama 3.1, Llama 3.2
  • Mistral, Mixtral
  • Qwen, Qwen2, QwQ
  • DeepSeek-V2, DeepSeek-V3
  • Gemma, Phi-3

视觉模型

  • LLaVA, LLaVA-OneVision
  • Phi-3-Vision
  • Qwen2-VL

来自HuggingFace的100+模型

硬件支持

NVIDIA: A100, H100, L4, T4 (CUDA 11.8+) AMD: MI300, MI250 (ROCm 6.0+) Intel: 带有GPU的Xeon(即将推出) Apple: M1/M2/M3 通过MPS(实验性)

参考文献

资源