Outlines 使用教程:3 行代码让大模型只输出合法 JSON,告别解析报错

Outlines 使用教程:3 行代码让大模型只输出合法 JSON,告别解析报错 Outlines 使用教程3 行代码让大模型只输出合法 JSON告别解析报错【免费下载链接】outlinesStructured Outputs项目地址: https://gitcode.com/GitHub_Trending/ou/outlines你让大模型返回 JSON十次里总有几次在末尾多出一段解释、把数字写成字符串或者整段被包裹json.loads当场崩掉。事后拿正则去抢救输出是很多 LLM 应用的常态也是最脆的一环。Outlines 是 .txt 团队做的一个 Python 库思路正好反过来它不修结果而是在模型逐字生成的过程中就把不合法的 token 挡掉你拿到手的就是能直接反序列化的结构。别再事后抢救输出从生成那一刻就锁死格式先讲清楚 Outlines 和常见做法差在哪这决定了你要不要为它花几分钟。主流做法是提示词求它给 JSON 生成完再解析 出错就重试。Outlines 的做法是把你要的结构交给它生成过程里非法路径根本走不通。对比维度事后解析多数项目现状Outlines结构何时保证生成完再检查生成过程中就保证出错的代价json.loads抛异常得整条重试不会产生非法结构你要写多少胶水代码正则、清洗、重试逻辑只传一个 Python/Pydantic 类型换模型解析逻辑可能也要跟着改同一份代码跨 OpenAI、Ollama、vLLM一句话Outlines 让你把输出长什么样这件事从提示词里挪到一个类型定义里而且这个类型还能被后续代码直接当 Python 对象用。三步完成安装和第一次结构化调用这节带你从装包到拿到第一个结果全程不到十分钟。装包时带上后端对应的 extra这里用最常见的 Transformers 本地推理为例。pip install outlines[transformers]装好之后接上模型直接调用。Outlines 的用法很克制——model(提示词, 输出类型)第二个参数就是契约。import outlines from transformers import AutoModelForCausalLM, AutoTokenizer from typing import Literal name microsoft/Phi-3-mini-4k-instruct model outlines.from_transformers( AutoModelForCausalLM.from_pretrained(name, device_mapauto), AutoTokenizer.from_pretrained(name), ) print(model(评论完全改变了我的生活!的情绪, Literal[Positive,Negative,Neutral]))运行后你会直接看到Positive——不是带引号的字符串、不是 JSON而是一个符合你给的枚举的值。把第二个参数换成int就能拿到纯数字换成 Pydantic 模型就能拿到嵌套结构。接入方式不止 Transformers 一种Ollama、OpenAI、vLLM、llama.cpp 各有from_入口完整清单在 模型接入文档安装细节看 安装指南。实战一把一份财报直接变成能入库的结构化数据这节用一个真实痛点演示财报这种格式混乱的文本人工写解析规则极痛苦而它恰好能被定义成类型。目标很直白输入一段 markdown 形式的利润表输出能直接进 CSV/数据库的结构化字段而不是靠正则一行行抠。做法分两步先定义我要哪些列、各是什么类型再把文本喂给模型、把类型作为输出契约传进去。仓库里这个 财报解析示例用的就是 NVIDIA 的利润表输入长这样输出的字段可以这样约束表格比代码更直观输出字段类型约束作用itemstr项目名称如 Revenue、Net incomevalueint金额百万为单位直接可数值运算periodLiteral财年末日期锁死成固定取值结果是你不再需要维护一堆re.findall数字天然是数字、枚举天然是枚举缺的列会体现在没生成而不是生成了一坨脏数据。对这种字段稳定、格式多变的抽取任务这是它最能打的地方。实战二给自由文本定输出契约再留一个不知道的出口真实输入经常信息不全硬要模型填满字段它就会瞎编。这节教你用Union给模型留一个体面的退路。目标是信息够就返回结构化对象不够就老老实实说不知道而不是编造。from typing import Union, Literal from pydantic import BaseModel class EventInfo(BaseModel): name: str date: str event_type: Literal[conference,webinar,meetup,other] Result Union[EventInfo, Literal[I dont know]] ticket model(DevCon 2023, 11月15日于旧金山需注册。, Result, max_new_tokens200)Union里放一个 Pydantic 模型加一个Literal兜底模型会在两条路里选合法的一条不会给出半结构化的中间态。信息不足时它返回字符串信息充足时你拿到的就是一个字段齐全的EventInfo实例。提示词可以抽到模板里批量复用outlines.Template支持{{ 变量 }}和循环见 模板工具文档。它到底为什么能做到原理一句话就能讲清不必展开推导。Outlines 会把你给的结构Pydantic 模型、正则或 JSON Schema编译成一张哪些 token 组合仍然合法的状态表。模型每吐一个 token它只放行还能走向合法结局的那些把会导致跑偏的选项概率压到 0。所以不是生成完再体检而是非法分支在第一步就被剪掉——这就是100% 落在你要的结构里的来源仓库的 后端实现能看到几套具体编译器。哪些坑要提前知道✅ 结构保证 ≠ 内容正确。它锁的是格式模型仍可能把 A 事件的日期填进 B 字段、把数字写错只是形状一定对。⚠️ 约束越复杂、max_new_tokens给得越小越容易在写到一半被截断处停下导致结构不完整。要么给足 token要么把 schema 拆简单。纯自由写作小说、营销文案用不上硬套约束反而限制表达。后端能力要分清本地可控的推理Transformers、vLLM、llama.cpp能做 token 级硬掩码接远程 API 的模型约束强度取决于提供方要绝不跑偏优先选本地后端。怎么选看 推理后端选型指南。你下一步该做什么你的目标建议动作只想试一下按上面装包用from_transformers跑一个Literal分类10 分钟见结果要长期集成进业务通读 快速上手 与 后端选型按团队现有推理栈挑from_入口做批量抽取/财报/发票直接参考 财报示例把字段定义成 Pydantic 就能进 CSV想统一管理提示词用 Template 模板引擎 把变量和循环抽出来复用从最简单的Literal分类开始把跑通的第一版当基线再逐步把字段换成 Pydantic 模型就是你接入 Outlines 最稳的路径。【免费下载链接】outlinesStructured Outputs项目地址: https://gitcode.com/GitHub_Trending/ou/outlines创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考