跳到正文

自定义 FSM 操作

Outlines 速度很快,因为它在推理之前将正则表达式编译成索引。为此,我们利用了正则表达式和有限状态机 (FSM) 之间的等价性,并使用 interegular 库来执行转换。

或者,可以直接传递使用 interegular 构建的 FSM 来构建生成结构。

示例

使用差集操作

在以下示例中,我们构建了一个 FSM,它只识别符合第一个正则表达式但不符合第二个正则表达式的字符串。特别是,它将阻止生成词语“pink”和“elephant”。

import interegular
from outlines import models, generate


list_of_strings_pattern = """\["[^"\s]*"(?:,"[^"\s]*")*\]"""
pink_elephant_pattern = """.*(pink|elephant).*"""

list_of_strings_fsm = interegular.parse_pattern(list_of_strings_pattern).to_fsm()
pink_elephant_fsm = interegular.parse_pattern(pink_elephant_pattern).to_fsm()

difference_fsm = list_of_strings_fsm - pink_elephant_fsm

difference_fsm_fsm.accepts('["a","pink","elephant"]')
# False
difference_fsm_fsm.accepts('["a","blue","donkey"]')
# True


model = models.transformers("microsoft/Phi-3-mini-4k-instruct")
generator = generate.fsm(model, difference_fsm)
response = generator("Don't talk about pink elephants")

要查看可用的其他操作,请查阅 interegular 的文档