跳过内容

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%。
  • 从合法标记的集合中抽取一个标记。

Generation and Logits Processing Flow Chart