第4章 LMQL 入门指南:编写你的第一个查询程序
入门 了解如何开始使用 LMQL 并编写你的第一个程序。
1. 安装 你可以本地安装 LMQL,或使用基于网页的 Playground IDE。如果要使用通过 Transformers 或 llama.cpp 运行的自托管模型,必须本地安装 LMQL。
2. 编写你的第一个查询 一个简单的 Hello World LMQL 查询如下所示: ```lmql "Say 'this is a test':[RESPONSE]" where len(TOKENS(RESPONSE)) < 25 ``` 提示词输入:Say this is a test: 模型输出:This is a test 注意:你可以点击“Open In Playground”来运行并试验这个查询。 这个简单的 LMQL 程序由单个提示词语句和关联的 where 子句组成: 提示词语句 "Say 'this is a test'[RESPONSE]": 提示词通过所谓的提示词语句构建,其外观类似 Python 中的顶级字符串。像 [RESPONSE] 这样的模板变量会自动由模型补全。除了单行文本提示词,LMQL 还支持多部分和脚本化提示词,例如允许控制流和分支行为来控制提示词的构建。了解更多,请参见 Scripted Prompting。 约束子句 where len(RESPONSE) < 10: 在此语句的第二部分中,用户可以指定针对输出的高层逻辑约束。LMQL 使用新颖的求值语义来处理这些约束,将字符级约束(如 len(RESPONSE) < 25)自动转换为(子)词元掩码,从而可以在文本生成期间提前强制执行。了解更多,请参见 Constraints。
3. 进一步探索 基于上述第一个查询,你可能希望添加更复杂的逻辑,例如在提示词中添加第二部分。此外,你可能希望采用不同的解码算法,例如采样程序的多个轨迹或使用不同的模型。 让我们扩展初始查询,以允许进行这些更改: ```lmql sample(temperature=1.2)
"Say 'this is a test'[RESPONSE]" where len(TOKENS(RESPONSE)) < 25
if "test" not in RESPONSE: "You did not say 'test', try again:[RESPONSE]" where \ len(TOKENS(RESPONSE)) < 25 else: "Good job" ``` 除了我们目前所见的内容,这个 LMQL 程序在几个方面扩展了上述内容: 解码器声明 sample(temperature=1.2): 这里,我们指定用于文本生成的解码算法。在此情况下,我们使用采样解码,并将温度略微提高(>1.0)。在上述示例中,我们隐式依赖确定性的 argmax 解码,这是 LMQL 的默认设置。有关 LMQL 支持的不同解码算法(例如 beam 或 best_k)的更多信息,请参见 Decoders。 提示词程序:程序主体仍然是提示词。与之前一样,我们在这里使用提示词语句,但现在也利用了控制流和分支行为。 在每次 LLM 调用中,所有迄今提示词语句的连接构成了用于为当前活动的模板变量(如 RESPONSE)生成值的提示词。这意味着 LLM 在为模板变量生成值时,始终意识到迄今的完整提示词上下文。 执行提示词语句后,包含的模板变量会自动暴露给周围的程序上下文。这允许你对模型输出做出反应,并将结果纳入你的程序逻辑。有关这种交互式提示词形式的更多信息,请参见 Scripted Prompting。
4. 开始享受 这些基本步骤应该能让你开始使用 LMQL。如果在编写自己的查询之前需要更多灵感,你可以探索 Playground IDE 包含的示例,或 LMQL 网站上展示的示例。 如果你有任何问题或文档请求,请随时通过我们的社区 Discord、GitHub Issues 或 Twitter 联系我们。