当前位置: 首页 > news >正文

如何让LLM输出指定字段的数据类型

一、业务场景

很多情况下我们利用LLM处理信息,并希望其返回包含固定字段的数据,如字典(dict)或者JSON文本。但单纯依靠prompt保证LLM输出预期的格式,尤其是模型需要进行复杂推理或生成较长文本时。

二、解决方案

截止到撰文日期,推荐的方案应该是结合Pydantic库(不了解的小伙伴可自行检索了解)使用结构化输出(Structured Output)功能。

目前主流的大模型供应商(如 OpenAI, Anthropic, Google, Azure AI)以及开源框架(如 LangChain, LlamaIndex, Instructor)都提供了原生支持。它们会在底层修改解码策略或进行后处理校验,确保返回的对象直接就是符合你定义的 Pydantic 模型。

下面以OpenAI为例介绍使用方法:

from openai import OpenAI, APIError from pydantic import BaseModel, ValidationError # 定义Pydantic类 class LLM_Response(BaseModel): reportname: str reportid: int reporttime: str client = OpenAI(api_key="your-key", base_url="base-url") try: completion = client.beta.chat.completions.parse( model="gpt-4o-2024-08-06", # 或其他支持该功能的模型 messages=[ {"role": "system", "content": "你是一个专业的人工智能助手。"}, {"role": "user", "content": your_prompt} ], response_format=LLM_Response, # 直接传入自定义Pydantic 类 ) # 直接获取解析好的对象,如果解析失败会抛出异常,不会返回错误的字符串 parsed_response = completion.choices[0].message.parsed print(parsed_response.reportname) # 情况1:模型返回了JSON,但内容不符合Pydantic模型定义 except ValidationError as e: print("数据验证失败(Pydantic ValidationError):") print(e.errors()) # 打印具体错误,方便调试 # 情况2:OpenAI API层面的错误(如速率限制、鉴权失败、服务器错误等) except APIError as e: print(f"API 请求错误:{e.statuis_code} - {e.message}") raise # 情况3:其他未知错误(如网络中断、本地代码错误) except Exception as e: print(f"发生未知错误:{type(e).__name__} - {str(e)}") raise

但即使使用了上述方法,模型还是有可能未按指定格式输出导致Pydantic模型验证失败,因此我们可以进一步结合instructor库使用。

instructor是一个轻量级库,专门用于让任何LLM输出结构化数据。它会自动重试:如果模型输出的JSON有误,它会捕获错误,把错误信息返回给模型让其修正,直到成功为止。

import instructor from openai import OpenAI from pydantic import BaseModel # 将 OpenAI 客户端 patch 为 instructor 模式 client = instructor.from_openai(OpenAI(api_key="your-key", base_url="your-base-url")) # ... (定义你的 Pydantic 模型) ... response = client.chat.completions.create( model="gpt-4o", # 也可以是本地模型地址 response_model=LLM_Respose, # 指定返回模型 messages=[ {"role": "user", "content": "your-prompt")} ], max_retries=3 # 如果格式错误,自动重试3次 ) # response 已经是验证通过的 LLM_Respose 对象

结合结构化输出和instructor库使得模型最后的结构化输出更加稳定,当然由于LLM是概率模型,极端情况下也可能出现重试几次仍然没有输出预期结果的情况,无法100%保证。

http://www.jsqmd.com/news/543808/

相关文章:

  • 端点税结束了:Elastic Security XDR
  • 遥感数据处理实战:手把手教你用MATLAB实现Freeman-Durden极化SAR分解
  • 5分钟看懂Glyph视觉推理:长文本处理从此变简单
  • ComfyUI可视化操作Nunchaku FLUX.1-dev:无需代码,拖拽节点即可生成图片
  • 2026 Web前端进阶学习路线
  • SDMatte在广告设计中的应用:一键生成高精度透明PNG用于动态海报合成
  • OpenClaw文件处理:用nanobot镜像自动归类下载文件夹
  • Oracle EBS 预算控制与保留款配置文档
  • Python金融回测速度提升300%的7个隐藏技巧:NumPy向量化、Numba JIT与Cython实战对比
  • SeqGPT-560M开源镜像详解:含预训练权重、微调脚本、评估工具链
  • JDspyder京东抢购脚本终极指南:如何轻松抢到茅台等热门商品
  • 2026年国内安徽折臂吊品牌,知名的安徽折臂吊优选品牌推荐与解析 - 品牌推荐师
  • 腾讯“小龙虾计划”的技术悖论
  • 告别WebGL输入噩梦:Unity开发者的终极救星来了
  • OpenClaw技能市场:Qwen3.5-4B-Claude专属5个实用技能推荐
  • 保姆级教程:在Ubuntu 22.04上用Docker Compose一键部署GZCTF靶场(附配置文件详解)
  • Wan2.2-I2V-A14B效果对比评测:不同提示词工程下的生成质量分析
  • 当AI安全遇上生成式对抗:AdvGAN如何绕过主流防御?一份给安全工程师的攻防指南
  • winrar去除广告、去除序列号注册
  • 终极Chrome密码找回指南:使用ChromePass快速恢复遗忘的登录凭据
  • 2026中国石油石化企业信息技术交流大会5月在京启航
  • Jenkins在Docker里启动总报错?试试这个一劳永逸的目录权限预设脚本(支持CentOS/Ubuntu)
  • Python金融风控建模黄金公式:特征工程×样本加权×对抗验证=通过央行《模型风险管理指引》认证
  • SDMatte Web服务监控方案:Prometheus+Grafana显存/请求/延迟看板
  • 2026年市面上口碑好的双缸四柱液压机源头厂家推荐榜单,金属拉伸/零件冲压/粉末压制/工件校直/双缸同步/自动化生产线,双缸四柱液压机制造企业如何选 - 品牌推广师
  • 基于Matlab的无线传感器网络部署仿真探索
  • 手把手教你用红石比较器打造Minecraft自动物品分类机(1.20+版本适用)
  • 基于Vue.js的Qwen3-ForcedAligner-0.6B可视化操作界面开发
  • S7-200plc和MCGS组态自动化搬运机械手的组系统设计 我们主要的后发送的产品有,带解释...
  • 从2kg到10kg:不同规模中试冻干机选型指南与厂家推荐 - 品牌推荐大师