进阶 lmql.ai 2026-10-11 18:10:44 · 31 阅读

第18章 OpenAI

OpenAI 和 LMQL 还支持通过 OpenAI 的 Completions 或 Chat API 访问的模型,例如 GPT-3.5 的各个版本、ChatGPT 以及 GPT-4。LMQL 同样支持 Azure OpenAI 模型,该部分将在 Azure OpenAI 章节中详细讨论。

以下模型已测试确认与 LMQL 兼容,对应的模型标识符可用作 lmql.model(...) 参数,或用于查询语句的 from 子句中:

Completions API - openai/text-ada-001 - openai/text-curie-001 - openai/text-babbage-001 - openai/text-davinci-00[1-3] - openai/gpt-3.5-turbo-instruct

Chat API - openai/gpt-3.5-turbo,也可使用 chatgpt - openai/gpt-4,也可使用 gpt-4

### Chat API 的局限性 受 API 限制,Chat API 模型无法完全支持 LMQL 约束。原因是当前的 Chat API 形式过于严格。尽管如此,STOPS_AT、STOPS_BEFORE 以及 len(TOKENS(...)) < N 等简单约束仍然可用,此外 LMQL 的其他功能,如中间指令和脚本化提示,也保持支持。有关 Chat API 限制的详细信息,请参阅 OpenAI API 限制章节。

### 配置 OpenAI API 凭证 若需使用 OpenAI 模型,必须配置 API 凭证。你可以通过定义 OPENAI_API_KEY 环境变量来实现: export OPENAI_API_KEY= 或者在当前工作目录下创建一个 api.env 文件,内容如下: openai-org: openai-secret: 如需全局配置,还可以在 $HOME/.lmql/api.env 或 LMQL 发行版的根目录(例如开发副本中的 src/)创建 api.env 文件。 最后,还可以使用 LMQL 专属环境变量 LMQL_OPENAI_SECRET 和 LMQL_OPENAI_ORG,它们的优先级高于 OPENAI_API_KEY。

### 监控 OpenAI API 使用 在使用 OpenAI 模型时,跟踪 API 使用情况至关重要。LMQL 提供了几种方式来查看内部情况以及发出的 API 调用数量。

#### 游乐场 在查询编辑器右下角的游乐场中,你可以查看实时的查询统计数据,包括使用 OpenAI 模型时的请求数、令牌数和预计费用: 这些信息会随着查询的执行自动更新。若想在 Python 中查看相同信息,可使用以下代码片段。

#### Python 中的使用统计 要在 Python 中获取相同信息,可以使用以下代码片段: ```python from lmql.runtime.bopenai import get_stats print(get_stats()) # OpenAI API Stats: 1 requests, 0 errors, 9 tokens, 1.0 average batch size ``` 这里的 tokens 指标指的是模型消耗和生成的令牌数量。

#### API 请求日志 此外,你可能还希望查看后台实际发出的 API 请求。为此,有一个 decoder 选项 verbose=True,它启用详细日志记录并打印所有 OpenAI 请求负载到控制台,例如如下查询: argmax(verbose=True) "Hello[WHO]" from "openai/text-ada-001" where STOPS_AT(WHO, "\n")

model-output:: Completion with {'model': 'text-ada-001', 'prompt': \[550256, 15496], 'max_tokens': 64, 'temperature': 0, 'logprobs': 5, 'user': 'lmql', 'stream': True, 'echo': True}

### 配置推测性 OpenAI API 使用 为了将 OpenAI API 与 LMQL 集成,我们依赖推测性预测(speculative prediction),LMQL 更少急切地应用令牌掩码和停止条件,以节省 API 调用。 为此,输出按块生成,每个块在继续生成前都会经过验证以确保满足约束。可以通过在解码子句中传递 chunksize 参数来配置块大小,如下所示: argmax(chunksize=128) "The quick brown fox jumps over the[COMPLETION]" from "openai/text-ada-001" where STOPS_AT(COMPLETION, ".") 默认块大小为 32。选择此值是基于这样的考虑:非常大的块大小意味着,如果约束在早期被违反,LMQL 可能需要丢弃大量已生成的令牌(成本很高)。然而,如果查询仅有少量或仅包含停止短语约束,较大的块大小可能对整体查询成本有益。通常,如果查询需要生成多个长的、不间断的序列且不施加许多约束,建议采用较大的块大小。

### OpenAI API 限制 不幸的是,OpenAI API 的 Completions 和 Chat API 在令牌掩码和每个预测令牌的令牌分布可用性方面存在严重限制。LMQL 尽可能利用这些 API,但存在一些需要规避的限制,可能会影响用户: OpenAI Completion API 将可能的 logit 偏置数量限制为 300。这意味着,如果你的约束导致令牌掩码大于 300 个令牌,LMQL 会自动将令牌掩码截断为前 300 个令牌。这可能导致意外行为,例如,由于掩码被截断得过于严格,模型性能可能低于预期。当超过 300 个偏置限制时,LMQL 会在控制台打印警告消息,表明 logit 偏置已被截断。 OpenAI Completions API 仅为每个预测令牌提供前 5 个 logprobs。这意味着探索例如前 n 个概率以进行决策(如 beam search)的解码算法,其分支因子被限制为 5。 OpenAI Chat API 不提供获取令牌分布或生成/继续部分响应的方法(适用于 ChatGPT、GPT-4)。简单约束仍可实现,因为 LMQL 运行时会将它们优化以适配 OpenAI API。然而,更复杂的约束可能无法实现。在这种情况下,LMQL 会在控制台打印错误消息。作为变通方法,用户可以调整约束以符合这些 API 限制,或依赖后处理和回溯。尽管如此,脚本化提示、中间指令和简单约束在 Chat API 模型中仍得到支持。

评论 (0)