Outlines 工作原理?
语言模型逐个 token 生成文本,使用先前的 token 序列作为输入,采样 logits 作为输出。本文档解释了结构化生成过程,其中仅根据预定义的自动机(例如,由正则表达式定义的有限状态机 (FSM) 或 Lark 语法)考虑下一个合法 token。`
示例
我们来看一个表示整数和小数的模式的示例
^\d*(\.\d+)?$
.
创建自动机
该模式首先被转换为一个自动机。下面简要解释自动机转换及其表示。
自动机图示
graph LR
node0("1-9") --> node1("1-9")
node1 --> node1
node1 --> nodeEND{{END}}
node1 --> nodePeriod(".")
nodePeriod --> node2("1-9")
node2 --> node2
node2 --> nodeEND{{END}}
生成一个 Token
假设我们正处于生成过程中,目前已生成“748”。下图是自动机,当前状态以绿色突出显示,合法的下一个字符可以是另一个数字 (0-9),一个点 (.),或序列结束。
graph LR
node0("1-9") --> node1("1-9")
node1 --> node1
node1 --> nodeEND{{END}}
node1 --> nodePeriod(".")
nodePeriod --> node2("1-9")
node2 --> node2
node2 --> nodeEND{{END}}
style node1 fill:#090
生成一个 token 需要以下步骤
- 将先前的输入序列(“748”)馈送给语言模型。
- 语言模型运行前向传播并产生 token logits。
- Outlines logits 处理器将非法 token 的概率设置为 0%。
- 从合法 token 集合中采样一个 token。