KDnuggets

Structured Language Model Generation with Outlines

8.5内容质量

TL;DR · AI 摘要

Outlines库通过确定性机制提升LLM结构化输出可靠性,解决JSON等格式生成中的幻觉问题。

核心要点

  • 使用generate.choice()可强制模型在预定义选项中选择
  • 安装命令需包含pip install outlines[transformers]
  • 通过屏蔽非法标记实现100%结构合规输出

结构提纲

按章节快速跳转。

  1. 介绍Outlines库解决LLM结构化输出的可靠性问题

  2. 通过屏蔽非法标记实现输出格式的确定性控制

  3. 使用generate.choice()实现多选分类的情感分析

  4. 需同时安装outlines和transformers库

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • 结构化语言模型生成
    • 核心机制
      • 非法标记屏蔽
      • 确定性输出
    • 应用用例
      • 多选分类
      • JSON生成
    • 技术依赖
      • transformers库
      • Hugging Face

金句 / Highlights

值得收藏与分享的关键句。

#Outlines#LLM#结构化输出#Python
打开原文

使用 Outlines 实现结构化语言模型生成 - KDnuggets

publ: 2026年7月13日

  • 博客热门文章
  • 主题 AI 职业建议 计算机视觉 数据工程 数据科学 语言模型 机器学习 MLOps NLP 编程 Python SQL
  • 数据集
  • 活动
  • 资源 快速参考指南 推荐 技术简报
  • 广告

订阅电子报

#header end

/ad_wrapper

使用 Outlines 实现结构化语言模型生成

Outlines 是一个开源库,它为大型语言模型(LLM)的输出生成过程引入了确定性,从而实现更可靠、更结构化的输出生成。

作者:

Iván Palomares Carrascosa

,KDnuggets 技术内容专家,2026年7月13日发布于

语言模型

<div class="addthis_native_toolbox"></div>

# 引言

通常,当我们要求大型语言模型(LLM)生成结构化输出(如 JSON 对象)时,需要精心设计提示并辅以一些运气。否则,要让模型生成完全符合预期的结构化输出可能颇具挑战。直到最近一个新型开源库的出现,这种情况才有所改变:outlines。

该库旨在解决 LLM 在特定输出导向型使用场景中常见的问题,例如幻觉。更具体地说,它在输出生成过程中引入了确定性。

通过本文,我们将揭示 outlines 能够实现的功能,并通过一些 Python 实例展示其实际应用!

# 应用场景 1:情感分析的多选分类

在深入探讨第一个应用场景之前,你可能想知道:outlines 是如何运作的?它又是如何确保结构化模型输出的正确性?在推理层面,它会在生成过程中屏蔽“语法非法”的标记,而不是在生成后试图修正文本。这使得模型几乎不可能违反特定输出格式所依赖的规则。

让我们来看一个实际示例:我们正在构建一个客户支持工单的分析流水线,需要从有限的批准选项列表中精确选择一个选项。这类似于分类问题,而 generate.choice() 函数可以帮助我们模拟这一过程,通过强制模型从预定义的字面量或类别中选择一个。

但在开始之前,我们需要安装 outlines 库以及 transformers 库来加载预训练的 LLM:

code
pip install outlines[transformers]

以下代码使用 outlines.from_transformers() 加载一个预训练模型,并借助 Hugging Face 的 auto 类来加载模型及其相关分词器。关键之处在于:这两个组件都被封装在一个 outlines 对象中,该对象将在后续帮助模型明确生成目标。在推理阶段,我们不仅传递用户提示(用于分类评论),还传递一个 Literal 对象,其中包含模型应限制输出的约束条件:

code
import outlines
from transformers import AutoTokenizer, AutoModelForCausalLM
from typing import Literal

# 1. 使用标准基于Transformer的模型加载后端
model_name = "microsoft/Phi-3-mini-4k-instruct"

# 我们使用 outlines 的 from_transformers() 函数加载模型
model = outlines.from_transformers(
    AutoModelForCausalLM.from_pretrained(model_name),
    AutoTokenizer.from_pretrained(model_name)
)

# 2. 直接调用模型,将批准的字符串作为类型约束传递
sentiment = model(
    "对这条客户评论进行情感分类:'我等了两周的送货,但包裹还是没到。'",
    Literal["Positive", "Negative", "Neutral"]
)

print(sentiment)

输出:

code
Negative

需要特别注意的是:虽然我们定义的字面量属于Python内置的typing模块而非 outlines,但我们的开箱即用库仍然在此处假设模型控制权:模型和分词器被封装到一个对象中,该对象强制执行标准Python类型,内部构建了一个有限状态机,仅将输出限制为提供的选项。

# 用例2:JSON对象生成

此示例首先定义了一个Pydantic对象,用于描述一个虚构角色的JSON对象结构,该角色具有名称、描述和年龄。然后使用之前封装的 outlines 模型,将角色对象作为参数传递,确保生成的输出严格遵循所请求的JSON对象结构:

code
from pydantic import BaseModel

# 1. 为期望的JSON结构定义一个Pydantic模型
class Character(BaseModel):
    name: str
    description: str
    age: int

# 2. 使用封装的 outlines 模型生成符合Pydantic模型的JSON输出
json_output = model(
    "生成一个描述虚构角色'Anya'的JSON对象。",
    Character,
    max_new_tokens=200
)

print(json_output)
code
{ "name": "Anya", "description": "Anya 是一个年轻、充满冒险精神的女性,热爱探索新地方和结识新朋友。她有一头长长的卷发和明亮的绿眼睛,充满好奇心。Anya 总是渴望学习,并喜欢与他人分享自己的知识。她心地善良,总是乐于助人。Anya 的爱好包括徒步旅行、阅读和弹吉他。她是一个重视自由和独立的自由灵魂。" ,"age": 25 }

# 用例3:用于REST API的纯JSON生成

这个第三个示例同样与JSON相关,与前一个示例类似但应用场景略有不同。想象一下,你正在构建一个需要明确定义的JSON有效负载来更新数据库的API。如果请求标准LLM生成此类输出,通常会产生令人烦恼的多余字符(如逗号),这些字符可能会导致JSON解析器崩溃。

使用 outlines,我们再次通过基于Pydantic的自定义类对象定义JSON有效负载模式。

code
from pydantic import BaseModel
from typing import Literal
import json

class ServerHealth(BaseModel):
    service_name: str
    uptime_seconds: int
    status: Literal["OK", "DEGRADED", "DOWN"]

# 1. Outlines 应生成一个保证为有效 JSON 的原始字符串
raw_json_string = model(
    "报告主认证数据库的当前状态。",
    ServerHealth,
    max_new_tokens=50
)

print(type(raw_json_string))  # 这将输出:
# 2. 美化打印
parsed_json = json.loads(raw_json_string)
print(json.dumps(parsed_json, indent=2))
code
{
  "service_name": "auth_db_status",
  "uptime_seconds": 1623456789,
  "status": "OK"
}

# 结束语

由于大型语言模型(LLMs)经过训练,擅长进行对话并可能打破语法或产生幻觉以在与我们的对话中"听起来像人类",因此让它们生成可靠、结构化的输出(如干净的 JSON 对象)可能会让人感到有些棘手。Outlines 是一个新推出的开源库,为 LLMs 的输出生成过程引入了确定性,从而实现更可靠、更结构化的输出生成。本文展示了三个简单但实用的使用场景,适合刚开始使用这个有趣工具的新手。

Iván Palomares Carrascosa 是人工智能、机器学习、深度学习和大型语言模型(LLMs)领域的领导者、作家、演讲者和顾问。他培训和指导他人如何在现实世界中利用人工智能。

更多相关内容

  • 检索增强生成:信息检索与...
  • 将非结构化数据转换为结构化洞察的5种方法
  • 检索增强生成如何使LLMs更智能
  • 最佳的3个视频生成模型
  • Google的Nano-Banana开启了图像生成的新时代
  • 最佳的5个开源视频生成模型

<hr class="grey-line"><br> <div><h3>我们推荐的5个免费课程</h3><br> </div>

Mailchimp for WordPress v4.13.1 - https://wordpress.org/plugins/mailchimp-for-wp/

/ Mailchimp for WordPress 插件

您可以从这里开始编辑。

如果评论已关闭。

<= 上一篇

#content end

<script type="text/javascript">kda_sid_write(kda_sid_n);</script>

最新文章

  • 使用 Outlines 进行结构化语言模型生成 5 个真实世界 SQL 项目构建您的数据作品集 为新手解释微调(如何让预训练模型学习新技能) 使用 SmolVLM2-2.2B 处理帧的本地视频摘要管道 使用 Ollama 运行 OpenClaw 用 Python 自动化描述性统计的 7 个步骤

热门文章

  • 使用 Ollama 运行 OpenClaw
  • 机器学习中 10 个概率概念的简单解释
  • 使用 Python 清理杂乱的 CSV 文件:初学者指南
  • 2026 年你应该了解的 10 个智能体 AI 框架
  • 为新手解释微调(如何让预训练模型学习新技能)
  • 数据科学家正在成为 AI 管理员,而非模型构建者
  • 使用 Python 开始使用 Claude API
  • KDnuggets 新闻,2026 年 1 月 25 日:ChatGPT 作为 Python 编程助手 • 使用 Python 和机器学习预测足球比赛胜者
  • 2026 年可在本地运行的 7 个顶级编码模型
  • SQL vs Pandas vs AI Agents:哪个最适合解决分析问题?

#content_wrapper end

© 2026

Guiding Tech Media

|

关于

联系

广告

隐私

服务条款

2026 年 7 月 13 日由 Iván Palomares Carrascosa 发布

blank

不,谢谢!

/.main_wrapper

<script defer type="text/javascript" src="https://s7.addthis.com/js/300/addthis_widget.js#pubid=gpsaddthis"></script>

noptimize

code

部署与扩展

  • 使用 Docker 容器化应用,确保环境一致性。
  • 通过 Kubernetes 实现自动扩展和负载均衡。
  • 配置 CI/CD 管道以实现持续集成和持续交付。
  • 监控系统性能并设置自动告警机制。
code