ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Outlines 快速上手:三步生成 100% 合法的 JSON,告别脆弱的解析代码

Outlines 快速上手:三步生成 100% 合法的 JSON,告别脆弱的解析代码 Outlines 快速上手三步生成 100% 合法的 JSON告别脆弱的解析代码【免费下载链接】outlinesStructured Outputs项目地址: https://gitcode.com/GitHub_Trending/ou/outlines你多半也写过这样的代码让 LLM「只返回 JSON」然后用json.loads接住再配上 try-except 和正则补丁——结果每次模型心情不好管道就崩。Outlines 换了一个思路不靠生成后解析而是在生成过程中就锁定输出结构保证模型吐出的每一段内容都严格符合你声明的类型。3 分钟跑通 Outlines 安装与第一次结构化输出最短路径就三步装包、接模型、传一个 Python 类型。pip install outlines[transformers]这段命令安装 Outlines 本体和 transformers 后端依赖换 Ollama、OpenAI 等后端就把方括号里的 extras 换掉可选列表在 pyproject.toml 里。import outlines from typing import Literal from transformers import AutoTokenizer, AutoModelForCausalLM MODEL microsoft/Phi-3-mini-4k-instruct model outlines.from_transformers( AutoModelForCausalLM.from_pretrained(MODEL, device_mapauto), AutoTokenizer.from_pretrained(MODEL), ) sentiment model(Analyze: This product changed my life!, Literal[Positive, Negative, Neutral]) print(sentiment) # Positive这段代码加载一个本地模型并做情感分类。注意第二个参数是Literal——它是 Python 类型不是字符串提示。模型只能从这三个词里选输出天然是合法的枚举值省掉了正则和 try-catch。用 Pydantic 模型约束复杂字段财报数字提取复杂对象把 Pydantic 模型直接传进去即可from pydantic import BaseModel class Revenue(BaseModel): period: str revenue: int gross_profit: int net_income: int result model(prompt, Revenue, max_new_tokens200)这段代码把 Pydantic 类当作输出类型。它会被自动翻译成 JSON Schema 并约束生成过程字段名、数字类型一个都跑不掉。以这张 NVIDIA 利润表为例把「提取最近一年的收入、毛利、净利润」写进 prompt拿到的就是符合Revenue结构的 JSONRevenue.model_validate_json(result)之后即可直接入库中间没有解析环节。批量分类用 Template 复用提示词处理一批文本时提示词逻辑最好从循环里抽出来template outlines.Template.from_string( Classify this document as one of: report, contract, manual.\n Document:\n{{ document }}\nAnswer: ) results model([template(documentt) for t in docs], Literal[report, contract, manual], max_new_tokens10)这段代码用 Jinja 语法定义了可复用的模板一次传入多个提示做批量生成。Template还支持from_file从文件加载模板可以单独维护、单独测试不用和调用代码混在一起。模型与约束选型一张表看明白接入方式模型约束能力适用场景from_transformers本地 Transformers可转向全部类型 后端切换本地开发、完全控制from_llamacppGGUF 模型可转向低配机器本地推理from_mlxlmApple Silicon可转向Mac 本地推理from_ollamaOllama 服务黑盒JSON 结构本机 Ollama 部署from_openaiOpenAI 等 API黑盒JSON 结构云端 API 调用from_vllm/from_sglang推理服务黑盒JSON 结构高吞吐生产部署本地可转向模型transformers、llama.cpp、MLX靠 logits 级动态掩码做约束正则、JSON、上下文无关语法全都支持API 类模型由服务端原生能力负责格式。约束后端默认用 outlines-core 处理 JSON Schema 与正则、llguidance 处理上下文无关语法也可在创建生成器时显式指定 xgrammar详见 docs/features/advanced/backends.md。踩坑与调优现象同一份代码本地跑得好好的切到 OpenAI 直接抛异常。原因黑盒模型不支持 logits processor正则和上下文无关语法这类约束只能在可转向模型上生效。解法换用 JSON 结构这类 API 原生支持如response_format的输出类型必须用严格语法时回到本地模型。现象输出类型不知道选什么写了一堆字符串提示。原因Outlines 里「类型即约束」——类型注解本身就是提示词。解法固定枚举用Literal数字用int复杂对象用 Pydantic 模型模型字段保持精简别塞无用的默认值。现象想对 Ollama 模型批量推理batch报NotImplementedError。原因ollama 库本身不支持批量接口见 src/outlines/models/ollama.py。解法逐条循环生成或者换 transformers、vLLM 等支持批量的后端。现象提示词里约束写了三遍每加一条就全量重测。原因提示逻辑散落在调用代码里复测成本高。解法提示词交给Template约束交给类型两边解耦后各自迭代。从能用到可靠接下来往哪走Outlines 把「输出结构」从生成后校验变成了生成时保证你的 Pydantic 模型不再是文档而是硬约束。再往进阶走可以看上下文无关语法与自定义 DSLdocs/features/advanced/logits_processors.md或者参考 examples/ 里的 FastAPI vLLM 部署示例把结构化生成做成团队能调用的服务。【免费下载链接】outlinesStructured Outputs项目地址: https://gitcode.com/GitHub_Trending/ou/outlines创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表