Outlines是如何工作的?
语言模型生成文本是逐个令牌的,使用之前的令牌序列作为输入,并将采样的logits作为输出。本文档解释了结构化生成过程,其中仅根据预定义的自动机(例如,正则表达式定义的 有限状态机 (FSM) 或 Lark 语法)考虑合法的令牌用于下一步。
示例
让我们考虑一个关于整数和小数的例子:
^\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}}
生成令牌
假设我们正在生成过程中,到目前为止已经生成了“748”。这是具有当前状态以绿色突出显示的自动机,合法的下一个字符可以是另一个数字(1-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
生成一个令牌需要以下步骤:
- 将之前的输入序列("748")输入到语言模型中。
- 语言模型进行正向传播并产生标记对数。
- Outlines logits 处理器将非法令牌的概率设置为 0%。
- 从合法标记的集合中抽取一个标记。