跳到内容

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。

Generation and Logits Processing Flow Chart