# Outlines: 结构化文本生成
## 何时使用此技能
当您需要执行以下操作时,请使用 Outlines:
- **保证生成内容的有效 JSON/XML/代码**结构
- **使用 Pydantic 模型**以获得类型安全的输出
- **支持本地模型** (Transformers, llama.cpp, vLLM)
- **最大化推理速度**,实现零开销的结构化生成
- **针对 JSON 模式**自动进行生成
- **在语法层面控制** Token 采样
**GitHub Stars**: 8,000+ | **来源**: dottxt.ai (原 .txt)
## 安装
bash
# 基础安装
pip install outlines
# 配合特定后端
pip install outlines transformers # Hugging Face 模型
pip install outlines llama-cpp-python # llama.cpp
pip install outlines vllm # 用于高吞吐量的 vLLM
## 快速开始
### 基础示例:分类
python
import outlines
from typing import Literal
# 加载模型
model = outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")
# 使用类型约束进行生成
prompt = "Sentiment of 'This product is amazing!': "
generator = outlines.generate.choice(model, ["positive", "negative", "neutral"])
sentiment = generator(prompt)
print(sentiment) # "positive" (保证是列表中的一项)
### 使用 Pydantic 模型
python
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")
# 生成结构化输出
prompt = "Extract user: John Doe, 30 years old,
[email protected]"
generator = outlines.generate.json(model, User)
user = generator(prompt)
print(user.name) # "John Doe"
print(user.age) # 30
print(user.email) # "
[email protected]"
## 核心概念
### 1. 约束 Token 采样
Outlines 使用有限状态机 (FSM) 在 Logit 层面约束 Token 生成。
**工作原理:**
1. 将模式 (JSON/Pydantic/正则表达式) 转换为上下文无关文法 (CFG)
2. 将 CFG 转换为有限状态机 (FSM)
3. 在生成过程的每一步过滤无效 Token
4. 当仅存在一个有效 Token 时进行快进
**优势:**
- **零开销**:过滤发生在 Token 级别
- **速度提升**:通过确定性路径快进
- **保证有效性**:不可能产生无效输出
python
import outlines
# Pydantic 模型 -> JSON 模式 -> CFG -> FSM
class Person(BaseModel):
name: str
age: int
model = outlines.models.transformers("microsoft/Phi-3-mini-4k-instruct")
# Behind the