项目详情

Outlines

LLM 结构化输出,生成时保证合规而非生成后修复

GitHub 地址 Apache-2.0 PythonPydantic

更新于 2026-07-23

← 返回汇总
项目速览

一句话定位

LLM 结构化输出,生成时保证合规而非生成后修复

LLM 结构化生成库。通过约束解码(constrained decoding),在 token 生成时屏蔽违反目标结构的 token——模型从数学上无法生成不合规的 JSON/regex/CFG 输出。用法镜像 Python 类型系统:model(prompt, output_type),output_type 可为 Literal/int/Pydantic/JsonSchema/Regex/CFG。LogitsProcessor 三剑客(JSON/Regex/CFG)驱动。白盒模型 100% 合规,黑盒 API 转交服务端。NVIDIA/Cohere/HuggingFace/vLLM 生产使用,15.2k Stars。

项目速览

核心数据

15.2k
GitHub Stars
3 年
项目年龄
100%
JSON 合规率
115
开放 Issue

Python · Apache-2.0 · dottxt.co 团队维护 · 被主流推理引擎(vLLM/llama.cpp/Ollama)采纳 · arXiv 学术论文背书(结构化生成基准)

为什么存在

LLM 输出的"信任危机"

输出不可预测

同一 prompt,模型时而输出合规 JSON,时而输出带 markdown 包裹、多余解释、字段缺失的"近似 JSON"。生产环境无法稳定依赖。

事后修复脆弱

主流方案是生成后用 json.loads + try/except + regex 清洗 + 重试。代码脆弱、增加延迟、消耗 token,且无法保证 100% 成功。

工具调用依赖格式

Function calling、Agent 工具调度都依赖结构化参数。格式一错整个流程崩溃——这是 AI 应用的工程化瓶颈。

供应商锁定

各家的 structured output 实现各异(OpenAI response_format、Anthropic 无原生支持)。换模型要改代码,迁移成本高。

核心理念

生成时约束,而非生成后解析

与其让模型自由生成再用代码修补,不如在每一步 token 采样时直接屏蔽非法选项——从源头杜绝错误结构。

目标结构 编译为 FSM/索引 每步屏蔽非法 token 只采样合法 token 100% 合规输出

这是"治本"方案:模型被数学上阻止犯错,而非事后纠错。代价是编译开销与轻微推理延迟——但换来生产级可靠性。

核心机制

LogitsProcessor 三剑客

语言模型逐 token 生成,每步输出 logits 概率分布。Outlines 注入 LogitsProcessor,在采样前把违反约束的 token 概率置零。

Processor 1
JsonSchemaLogitsProcessor
把 JSON Schema 编译成状态机,保证生成的每个字符都构成合法 JSON。保证 100% 合规。
Processor 2
RegexLogitsProcessor
约束输出匹配任意正则。电话号码、邮箱、日期格式、自定义模式皆可。
Processor 3
CFGLogitsProcessor
上下文无关文法约束。比 regex 更强,支持嵌套结构,如代码、SQL、XML。

另有 LogitTrackingProcessor 可追踪每步 token 概率与 logits,用于调试与可解释性。

设计哲学

镜像 Python 类型系统

Outlines 把"输出结构"提升为一等公民——像写 Python 类型注解一样声明期望输出。无需学新 DSL。

模型集成

白盒 vs 黑盒

维度白盒模型(可访问 logits)黑盒 API 模型
代表transformers、vLLM、Ollama、llama.cppOpenAI、Gemini 等
约束执行本地 LogitsProcessor 实时屏蔽转为 API 参数服务端执行(如 response_format
支持类型全部(JSON/regex/CFG/choice)因供应商而异,多数仅 JSON,Anthropic 无原生支持
合规保证100%(数学约束)依赖供应商实现质量

同一套代码跨模型运行——这是 Outlines 的 provider independence 卖点。切换模型不改业务代码。

快速上手

三行结构化输出

pip install outlines
import outlines
from typing import Literal
from pydantic import BaseModel
# 接入模型(transformers/vLLM/Ollama/OpenAI 等皆可)
model = outlines.from_transformers(model, tokenizer)
# 简单分类——保证输出只能是 Positive/Negative/Neutral
sentiment = model("Analyze: 'Great product!'", Literal["Positive","Negative","Neutral"])
# → "Positive"
# 复杂结构——Pydantic model 直接约束
class ProductReview(BaseModel):
    rating: int
    pros: list[str]
    cons: list[str]
    summary: str
review = model("Review: XPS 13 ...", ProductReview, max_new_tokens=200)
review = ProductReview.model_validate_json(review)

无需 prompt 工程,无需 try/except 解析,无需重试逻辑。结构在类型声明里,保证在生成时。

实战场景

真实用例

客服工单分类

自由文本邮件 → 结构化工单(优先级/类别/是否升级/摘要/动作项)。驱动自动路由。

电商商品归类

商品描述 → 预定义分类枚举。Literal 约束保证类目合法,不产生幻觉类目。

事件信息抽取

非结构化文本 → 带可选字段的事件对象。Pydantic 处理缺失/不完整数据。

Function Calling

用户请求 → 函数参数。直接传函数对象,签名即约束,参数自动对齐。

性能权衡

合规的代价

arXiv 基准论文(2501.10868)显示:Outlines 的 grammar compile time(GCT)与首 token 延迟(TTFT)高于 Guidance/Llamacpp——约束编译有开销。

权衡点说明
编译开销schema → FSM 编译耗时。复杂 schema 在大模型上 GCT 可达数秒,首次请求明显
推理延迟每步 logits 屏蔽增加 TPOT。tool-heavy 场景感知明显
合规率100% JSON 合规——这是事后解析方案永远达不到的
缓存优化编译结果可缓存复用,同 schema 多次调用摊薄开销

适用判断:需要 100% 可靠性的生产场景,编译开销值得;追求极致低延迟的流式场景需评估。

适用场景

谁该用 Outlines

风险提示

需要权衡

潜力评估

未来空间

LLM 结构化生成赛道的奠基项目。约束解码已从"小众技巧"成为行业标准——vLLM、llama.cpp、Ollama 纷纷内置,OpenAI/Google 也推出原生 structured output。Outlines 的价值正从"工具库"升华为"方法论标准":它的真正影响力在于定义了"生成时约束"这一范式。dottxt.co 团队转向商业 API 与 schema 审计服务,说明赛道有商业化空间。挑战在于:当所有推理引擎都内置约束,独立库如何保持不可替代?答案或在跨引擎统一接口与高级约束(CFG/复杂 schema)的深耕。无论如何,它是 AI 工程化绕不开的基础设施。


上一个
Openship
下一个
Dioxus
1 / 14