用途
Outlines 用于在文本生成过程中强制保证输出结构合法。当你需要模型稳定产出符合 JSON、XML、代码或正则表达式格式的内容,或希望用 Pydantic 模型获得类型安全的输出时,可以使用该库。它特别适合本地模型部署场景,能在不牺牲推理速度的前提下消除无效输出。
主要能力
- 约束式 token 采样:通过有限状态机(FSM)在 logit 层面过滤无效 token。流程为:将 schema(JSON/Pydantic/正则)转换为上下文无关文法(CFG),再转为 FSM,生成时逐步过滤非法 token,并在仅剩一个合法 token 时快速前进。
- 结构化生成器:提供 choice(多选一)、json(匹配 Pydantic 模型或 JSON Schema)、regex(匹配正则)、integer、float 等专用生成器。
- Pydantic 集成:原生支持 Pydantic 模型,自动完成 schema 转换,支持嵌套模型、Enum、Literal、字段约束(如 gt、min_length、pattern)和可选字段。
- 多后端支持:支持 Hugging Face Transformers、llama.cpp(GGUF)、vLLM(高吞吐、多 GPU、量化),以及有限的 OpenAI API 支持。
使用方式
安装:
pip install outlines
pip install outlines transformers # Hugging Face 模型
pip install outlines llama-cpp-python # llama.cpp
pip install outlines vllm # vLLM 高吞吐
基本示例(分类):
import outlines
model = outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")
generator = outlines.generate.choice(model, ["positive", "negative", "neutral"])
sentiment = generator("Sentiment of 'This product is amazing!': ")
Pydantic 结构化输出:
from pydantic import BaseModel
import outlines
class User(BaseModel):
name: str
age: int
email: str
model = outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")
generator = outlines.generate.json(model, User)
user = generator("Extract user: John Doe, 30 years old, john@example.com")
正则约束:
generator = outlines.generate.regex(model, r"[0-9]{3}-[0-9]{3}-[0-9]{4}")
phone = generator("Generate phone number:")
后端配置示例:
# llama.cpp
model = outlines.models.llamacpp("./models/llama-3.1-8b-instruct.Q4_K_M.gguf", n_gpu_layers=35)
# vLLM 多 GPU
model = outlines.models.vllm("meta-llama/Llama-3.1-70B-Instruct", tensor_parallel_size=4)
适用场景
- 数据抽取:从非结构化文本中提取公司信息、用户资料等结构化字段。
- 分类任务:二分类、多分类,或带置信度的分类输出。
- 结构化表单:生成包含多个字段和列表的用户档案。
- 多实体识别:抽取文档中的人物、组织、地点等实体列表。
- 代码生成:生成包含函数名、参数、文档字符串和函数体的结构化代码描述。
- 批量处理:对多条文本循环执行结构化抽取。
限制
- OpenAI API 支持有限,部分功能在 API 模型上不可用。
- 不提供自动重试机制(与 Instructor 不同)。
- 不提供 token healing 或复杂工作流(与 Guidance 不同)。
- 不采用声明式查询语法(与 LMQL 不同)。
- 官方资料未提供具体收费、价格或平台信息。
性能特征
- 速度:零开销,结构化生成与无约束生成速度相当;快速前进优化跳过确定性 token;比生成后校验方案快 1.2–2 倍。
- 内存:FSM 按 schema 编译一次并缓存,运行时开销极小。
- 准确率:输出 100% 合法,无需重试循环。
资源
- 文档:https://outlines-dev.github.io/outlines
- GitHub:https://github.com/outlines-dev/outlines
- Discord:https://discord.gg/R9DSu34mGd
- 博客:https://blog.dottxt.co