跳至内容
人工智能
SQL

LMQL 入门指南:连接 SQL 与大型语言模型的桥梁

全面了解 LMQL(Language Models Query Language,语言模型查询语言),这是一门专为大型语言模型设计的创新型编程语言。
Kurtis Pykes 's photo
Kurtis Pykes
已更新 · 12分钟 阅读

使用 AI 探索

ChatGPTClaudePerplexity

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。

结构化查询语言,即 SQL(常读作“sequel”),是一种声明式编程语言,用于在数据库管理系统中存储、检索、管理与处理数据。

它由 IBM 研究人员 Raymond Boyce 与 Donald Chamberlain 于 20 世纪 70 年代初开发,但直到 1979 年,Relational Software, Inc.(现已更名为 Oracle)推出其实现版本后,才在商业上可用。

如今,SQL 因其简洁性以及对大型数据集进行高效管理与分析的能力,被广泛视为关系型数据库管理系统(RDBMS)的标准,在日益数据驱动的世界中不可或缺。

但数据驱动的世界在不断演进。

人工智能快速普及,大型语言模型已成为处理多种任务的强大工具。唯一的问题是,与这些语言模型交互有时感觉像是在使用一门“外星语言”。这正是 LMQL 登场的地方。

LMQL 由苏黎世联邦理工学院(ETH Zürich)的 SRI Lab 开发,充当开发者与语言模型之间的“私人翻译”。它将 SQL 的力量带入语言模型领域,使交互更顺畅、更高效,也更有趣。

在本教程的后续部分,我们将讨论:

  • 什么是 LMQL?
  • 为何选择 LMQL?
  • 如何安装与设置 LMQL
  • LMQL 的实际应用
  • LMQL 的局限性
  • 最佳实践

什么是 LMQL?

LMQL(Language Models Query Language,语言模型查询语言)是一门面向大型语言模型(LLMs)的创新编程语言。它将类似 SQL 的声明式元素与命令式脚本语法相融合,提供一种更结构化、更直观的方式,从 LLM 中提取信息或生成回复。

进一步来说,LMQL 是 Python 的超集,这意味着它作为扩展引入新特性,扩展 Python 的能力。这使开发者可以创建包含文本与代码的自然语言提示,从而增强查询的灵活性与表达力。

根据其文档所述,“LMQL 提供了一种将传统编程与在代码中调用 LLM 的能力交织在一起的新方式。它超越了传统模板语言,在程序代码层面原生集成了与 LLM 的交互。”

其作者在题为 Prompting is Programming: A Query Lnague for Large Language Models 的研究论文中提出了这门编程语言,作为实现他们称之为“LMP”(Language Model Prompting,语言模型提示)的方案。

作为背景说明,大型语言模型在诸如问答与代码生成等多种任务上表现出色。其本质是基于统计似然,根据给定输入自动生成合乎逻辑的序列。

利用这种能力,用户可以通过语言指令或示例来提示 LLM 执行各种下游任务。更高级的提示技术甚至能在用户、语言模型与诸如计算器等外部工具之间实现互动。

难点在于,要达到最先进的性能或将 LLM 定制用于特定任务,通常需要实现复杂且针对任务的程序,而这些程序仍可能依赖临场式的交互。

语言模型提示是一门新兴学科,正在崛起以应对这些问题。LMQL 遵循 LMP 的原则,包括为 LLM 提供直观的文本提示与脚本相结合的方式,并允许用户对语言模型的输出施加约束。

为何选择 LMQL?

最新一代的语言模型可以通过示例或指令在概念上轻松提示。然而,要充分发挥其潜力并在新模型发布的同时保持更新,仍需要深入理解其内部机制以及各厂商的专用库与实现。

例如,将解码过程限制在合法词语或短语列表上会很棘手,因为语言模型以 token 为单位工作。无论是本地使用 LLM 还是通过 API 使用,由于其规模庞大,调用成本都不低。

LMQL 可以借助预设行为以及由约束引入的搜索限制,减少语言模型(LM)调用次数。

选择 LMQL 的另一原因是,许多提示技术需要在语言模型与用户之间往返交流(如我们在 ChatGPT 等聊天机器人中所见),或需要高度专业化的界面,例如用于借助外部控制逻辑执行算术计算的界面。

实现这些提示需要大量手工工作,并与模型的解码过程交互,从而限制了实现结果的通用性。最后,由于 LM 一次只能生成一个(子词)token,完成生成往往需要多次调用。

现有的 LM 不提供对输出进行约束的功能,而这在生产环境中至关重要。比如,设想您在构建一个情感分析应用,用于标记负面评价。程序会期望 LLM 返回“positive”“negative”或“neutral”之类的结果。

然而,LLM 往往可能回答诸如“针对所提供的客户评论,其情感为 positive”之类的话,这会让您的 API 难以处理。因此,约束极为有用。

通过 LMQL,您可以用人类易懂的术语来控制输出,而不是用 LMs 所使用的 token。

安装与设置 LMQL

LMQL 可在本地安装,或通过基于 Web 的 Playground IDE 在线使用。注意:如果您希望通过 Transformers 或 llama.cpp 使用自托管模型,必须在本地安装 LMQL。步骤如下:

安装与环境配置

在本地安装 LMQL 相当简单。

您只需在 Python >= 3.10 的环境中运行以下命令:

pip install lmql

如果打算在本地 GPU 上运行模型,则必须在启用 GPU 的 PyTorch >= 1.11 环境中安装 LMQL。

若要通过 pip 安装包含 GPU 依赖的 LMQL,可运行以下命令:

pip install lmql[hf]

注意:在虚拟环境中安装依赖是良好实践。

安装完成后,您有三种方式运行 LMQL 程序:

1. Playground
您可以启动本地的 Playground IDE 实例

lmql playground

该命令会启动基于浏览器的 Playground IDE;如未自动打开,请访问 http://localhost:3000。

注意,此方法需要安装 Node.js。

2. 命令行界面
Playground 的替代方案是命令行工具。它可用于执行本地 .lmql 文件。使用方法很简单,运行以下命令:

lmql run

3. Python 集成
由于 LMQL 是超集,您可以直接在 Python 程序中运行。只需导入 lmql 包。所有查询代码必须通过 lmql.run 运行,或使用 @lmql.query 装饰器。

在 Playground IDE 或命令行工具中使用本地 Transformer 模型时,您必须先执行 lmql serve-model 命令,为相应模型启动一个 LMQL 推理 API 实例。

理解 LMQL 语法

一个 LMQL 程序由五个基本部分构成,每部分都在决定查询行为方面发挥关键作用。这些组件包括:

  • Query(查询)
  • Decoder(解码器)
  • Model(模型)
  • Constraints(约束)
  • Distribution(分配/分布)

下面逐一深入了解。

Query

查询块是语言模型与用户之间的主要沟通方式。

以下是一个基础的 LMQL 查询:

# Source: https://lmql.ai/docs/
"Say 'this is a test':[RESPONSE]" where len(TOKENS(RESPONSE)) < 25

—-- Model Output—--
"""
Say 'this is a test': RESPONSE This is a test
"""

查询块将每个顶层字符串视为对语言模型的直接查询。类似于 Python 的 f-strings,这些查询字符串支持两个特殊的转义子字段。

注意,语言模型将要生成的语句使用 [varname] 表示。这也被称为“孔”(hole)——我们稍后再谈 where 子句。

还可以使用 {varname} 从当前作用域检索变量值。

例如:

# Source: https://lmql.ai/docs/language/overview.html
# review to be analyzed
review = """We had a great stay. Hiking in the mountains was fabulous and the food is really good."""

# use prompt statements to pass information to the model
"Review: {review}"

Decoder

LMQL 支持多种用于从语言模型的 token 分布中生成文本的解码算法。这使得可以在查询开头指定解码算法。

有两种方式指定要使用的解码算法:

1. 作为查询的一部分——即在查询中指定算法及其参数。根据 LMQL 文档,“如果您选择的解码器与正在编写的具体程序相关,这种方式将特别有用。”代码示例如下:

# Source: https://lmql.ai/docs/language/decoding.html
# use beam search with beam width 2 for
# the entire program
beam(n=2)

# uses beam search to generate RESPONSE 
"This is a query with a specified decoder: [RESPONSE]"

2. 外部指定——即在程序外部单独指定解码算法和参数。注意,这只在从 Python 环境使用 LMQL 时可行。

# Source: https://lmql.ai/docs/language/decoding.htmlimport lmql

@lmql.query(model="openai/text-davinci-003", decoder="sample", temperature=1.8)
def tell_a_joke():
    '''lmql
    """A list good dad joke. A indicates the punchline:
    Q:[JOKE]
    A:[PUNCHLINE]""" where STOPS_AT(JOKE, "?") and  STOPS_AT(PUNCHLINE, "\n")
    '''

tell_a_joke() # uses the decoder specified in @lmql.query(...)
tell_a_joke(decoder="beam", n=2) # uses a beam search decoder with n=2

Model

开发者将 LMQL 定义为“一种用于文本生成的高层前端语言”。这意味着它并不绑定于某个特定的文本生成模型。相反,其后端支持多种文本生成模型,例如 OpenAI model、llama.cpp以及HuggingFace Transformers。

加载模型非常直接。您可以使用 lmql.model(...) 函数,它会生成一个 lmql.LMM 对象。

示例如下:

# Source: https://lmql.ai/docs/models/
lmql.model("openai/gpt-3.5-turbo-instruct") # OpenAI API model
lmql.model("random", seed=123) # randomly sampling model
lmql.model("llama.cpp:<YOUR_WEIGHTS>.gguf") # llama.cpp model

lmql.model("local:gpt2") # load a `transformers` model in-process
lmql.model("local:gpt2", cuda=True, load_in_4bit=True) # load a `transformers` model in process with additional arguments
lmql.model("gpt2") # access a `transformers` model hosted via `lmql serve-model`

创建 lmql.LLM 对象后,您可以通过两种方式之一将模型传给查询程序:

1. 在外部指定模型

# Source: https://lmql.ai/docs/models/
import lmql

# uses 'chatgpt' by default
@lmql.query(model="chatgpt")
def tell_a_joke():
    '''lmql
    """A great good dad joke. A indicates the punchline
    Q:[JOKE]
    A:[PUNCHLINE]""" where STOPS_AT(JOKE, "?") and \
                           STOPS_AT(PUNCHLINE, "\n")
    '''

tell_a_joke() # uses chatgpt
tell_a_joke(model=lmql.model("openai/text-davinci-003")) # uses text-davinci-003

2. 在查询中使用 from 子句

# Source: https://lmql.ai/docs/models/
argmax
    "This is a query with a specified 'from'-clause: [RESPONSE]"
from
    "openai/text-ada-001"

Constraints

LMQL 的主要亮点之一是约束组件。LMQL 允许用户对语言模型的输出设定约束。这既能通过脚本化提示保证模型输出在预期位置结束,也能让用户在解码过程中对模型进行控制。

支持的约束包括:

  • 停止短语(Stopping Phrases)
  • 数字类型约束(Number Type Constraints)
  • 集合选择(Choice From Set)
  • 字符长度(Character Length)
  • token 长度(Token Length)
  • 正则约束预览(Regex Constraints Preview)
  • 组合约束(Combining Constraints)
  • 自定义(Custom)

请参阅 LMQL 文档中的“Constraints”页面以了解详情。

Distribution

分配(distribution)指令是 LMQL 的关键组成部分。它通过定义生成结果的分布与呈现方式,来控制输出的格式与结构。

以下是一个实际示例:

# Source: https://lmql.ai/docs/language/overview.html
argmax
    # review to be analyzed
    review = """We had a great stay. Hiking in the mountains was fabulous and the food is really good."""

    # use prompt statements to pass information to the model
    "Review: {review}"
    "Q: What is the underlying sentiment of this review and why?"
    # template variables like [ANALYSIS] are used to generate text
    "A:[ANALYSIS]" where not "\n" in ANALYSIS

    # use constrained variable to produce a classification
    "Based on this, the overall sentiment of the message can be considered to be[CLS]"
distribution
   CLS in [" positive", " neutral", " negative"]

                  ----- Model Output ------
Review: We had a great stay. Hiking in the mountains was fabulous and the food is really good.
Q: What is the underlying sentiment of this review and why?
A: ANALYSIS The underlying sentiment of this review is positive because the reviewer had a great stay, enjoyed the hiking and found the food to be good.
Based on this, the overall sentiment of the message can be considered to be CLS

LMQL 的局限与社区支持

与所有技术一样,LMQL 也存在一些局限。例如:

  • LMQL 库面世时间不长,尚未大规模流行。因此社区规模较小,可在遇到问题时参考的外部资源也较少。
  • 该库的文档不够详尽。
  • 由于OpenAI API 的限制,无法在 ChatGPT 上充分利用 LMQL,因为最流行、性能最佳的模型不可访问。

尽管这些问题可能会影响部分用户采用 LMQL,但需要注意,该库仍然较新且在持续开发中——这些限制或将在后续版本中得到解决。

结语

LMQL 是一种类似 SQL 的编程语言,同时也是 Python 的超集。它将声明式元素与命令式脚本语法相结合,简化了从 LLM 中提取信息或生成回复的过程。开发者可以借助 LMQL 有效控制文本生成,使其成为科技行业各种应用中的一项极具价值的工具。

若想继续学习,建议查看:


Kurtis Pykes 's photo
Author
Kurtis Pykes
LinkedIn
主题
人工智能
SQL

立即开启您的 AI 之旅!

课程

生成式 AI 概念

2 小时
121K
了解如何负责任地开始利用生成式 AI。 了解生成式 AI 模型如何开发,以及它们未来将如何影响社会。
查看详情开始课程

创建您的免费账户

实践并学习路径你的进步。

使用 Google 继续
继续操作即表示您接受我们的《使用条款》和《隐私政策》,并同意您的数据存储在美国。
查看更多