[{"data":1,"prerenderedAt":222},["ShallowReactive",2],{"site-settings":3,"$fL8GWHIEqTrH_jRWwgiK8xrAADd8ROdskMR1np67J9nQ":26,"related-posts":49,"$f52APWDtZdBIHJH-wrKeZNLslXXAqEhIlSiMUFXo9nt8":221},{"id":4,"site_name":5,"site_subtitle":6,"site_description":7,"author":8,"email":9,"github":10,"icp":10,"page_size":11,"enable_comment":12,"enable_rss":12,"updated_at":13,"site_icon":14,"site_og_image":15,"site_keywords":16,"site_og_image_width":24,"site_og_image_height":25},1,"LiteSite（轻站）","把你想做的网站说出来","LiteSite（轻站）探索自然语言驱动的零代码建站体验，展示响应式网站与前端原型的设计方向。","Admin","support@litesite.com",null,10,true,"2026-10-05T03:56:44.502+00:00","https:\u002F\u002Fnklbhnvyoggxghtaoizu.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-images\u002F2026-10-05-1765bce7-01f1-4206-8d5d-6a717d17f206.png","https:\u002F\u002Fnklbhnvyoggxghtaoizu.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Fblog-images\u002F2026-10-05-157c3c1d-2722-474c-860b-d3f38d6a674d.png",[17,18,19,20,21,22,23],"LiteSite","轻站","零代码建站","AI建站","响应式网站","前端原型","网站设计",1200,630,{"id":27,"slug":28,"title":29,"summary":30,"content":31,"status":32,"tags":33,"seo_keywords":38,"published_at":44,"updated_at":45,"category":46},20,"llm-structured-output-reliability","结构化输出怎么保证模型按格式返回？","模型返回 JSON 不等于系统拿到可用数据。本文区分提示词、JSON 模式与 Schema 约束，说明如何用服务端校验、有限重试和业务规则构建可靠的结构化输出链路。","结构化输出怎么保证模型按格式返回？先把“保证”拆开：一是响应能被解析，二是字段、类型和枚举符合约定，三是字段值在业务上正确。这三层不能只靠一句“请严格返回 JSON”同时解决。工程上要把模型生成、格式约束、服务端校验和失败处理连成一条链路。\n\n## 为什么提示词写了格式，还是会出错？\n\n让模型把客服工单归类为“故障、账单、其他”，并返回优先级和摘要。即使提示词给了示例，模型仍可能加上解释文字、漏字段、把优先级写成“紧急”、输出不完整 JSON，或者给出格式正确但分类错误的结果。提示词描述的是期望行为，不是应用程序的类型系统；采样、上下文变化、拒答和输出截断都可能影响结果。\n\n先定义一个最小契约：\n\n```json\n{\n  \"category\": \"bug\",\n  \"priority\": \"high\",\n  \"summary\": \"登录后页面持续报错\",\n  \"needsHuman\": true\n}\n```\n\n字段名、类型、允许值、必填项和额外字段的处理方式都要明确。生产场景还需要版本号或清晰的接口版本管理，避免修改字段后下游仍按旧结构解析。\n\n## 三种控制手段，强度不同\n\n| 手段 | 能解决什么 | 仍需注意什么 |\n| --- | --- | --- |\n| 提示词加示例 | 让模型理解任务和期望结构 | 不能保证合法 JSON 或固定字段 |\n| JSON 模式 | 通常约束输出为可解析 JSON | 合法 JSON 仍可能缺字段、类型错误或语义错误 |\n| Schema 约束输出 \u002F 工具参数 | 在支持的模型与接口中约束字段和类型 | 支持的 Schema 子集、拒答、截断和语义正确性仍需处理 |\n\n“结构化输出”在不同服务商的 API 中含义并不完全相同。有的通过受约束解码限制生成的 token，有的把结果放在工具调用参数里。具体是否支持严格模式、哪些 JSON Schema 关键字有效，要以所用模型和接口文档为准。即使用了严格模式，也只应把**完整且成功的响应**送去解析；拒答、超时、达到输出上限或工具调用未完成，都不是一条可用业务记录。\n\n## 先设计 Schema，再写提示词\n\n以工单分类为例，可以定义对象必填字段、枚举和禁止多余属性：\n\n```json\n{\n  \"type\": \"object\",\n  \"properties\": {\n    \"category\": { \"type\": \"string\", \"enum\": [\"bug\", \"billing\", \"other\"] },\n    \"priority\": { \"type\": \"string\", \"enum\": [\"low\", \"medium\", \"high\"] },\n    \"summary\": { \"type\": \"string\" },\n    \"needsHuman\": { \"type\": \"boolean\" }\n  },\n  \"required\": [\"category\", \"priority\", \"summary\", \"needsHuman\"],\n  \"additionalProperties\": false\n}\n```\n\nSchema 应尽量小：只要下游真会用到的字段。可选字段要统一缺失值的表示，别让一部分调用省略字段、另一部分返回空字符串或 null。枚举比自由文本更适合程序分支。摘要长度、日期格式等约束若供应商不支持，就放在服务端验证。\n\n提示词负责说清判断标准，而不是重复一大段 JSON。例如写明：何时归入 billing，什么情况必须标记 needsHuman，以及证据不足时如何选择 other。输入的工单正文是待分析数据，不能让其中“忽略以上规则”之类的话覆盖系统规则。\n\n## 服务端必须再验一次\n\n模型返回后，按“响应完成 → JSON 解析 → Schema 校验 → 业务校验”的顺序处理。下面的 TypeScript 示例使用 Zod 演示应用侧校验；它独立于具体模型 SDK：\n\n```ts\nimport { z } from 'zod'\n\nconst Ticket = z.object({\n  category: z.enum(['bug', 'billing', 'other']),\n  priority: z.enum(['low', 'medium', 'high']),\n  summary: z.string().min(1).max(120),\n  needsHuman: z.boolean(),\n}).strict()\n\ntype Ticket = z.infer\u003Ctypeof Ticket>\n\nfunction parseTicket(raw: string): Ticket {\n  const json: unknown = JSON.parse(raw)\n  return Ticket.parse(json)\n}\n```\n\nJSON.parse 可能抛语法错误，Ticket.parse 可能抛校验错误；调用方应捕获并记录错误类别，不能把失败当成空对象继续写库。这里的 Zod 规则也说明了一件事：模型接口接受的 Schema 与应用侧校验器可以各司其职，前者减少无效生成，后者守住自己的数据边界。\n\n通过类型校验仍不代表内容为真。比如“无法登录”被分到 billing，或模型凭空写出未发生的退款承诺，都属于业务错误。对高影响字段增加规则检查、原文证据定位或人工复核；金额、权限和实际执行动作尤其不能只凭模型自由生成的值决定。\n\n## 失败时怎么处理？\n\n不要无限重试。一个实用策略是：对可恢复的格式错误或临时故障重试一到两次，向模型提供简短的校验错误；对拒答、持续失败或超出预算的请求，进入人工处理或明确的失败状态。重试要有超时、次数上限和成本上限，写库或触发动作前要考虑幂等性。不能悄悄把“解析失败”改成默认的 high 或 other，因为这会把系统故障混进正常业务数据。\n\n流式输出时，传输中的片段可能不是完整 JSON。应等到响应完成并确认结束原因后再解析和校验；若需要逐步展示，可把预览和正式结果分开。日志记录请求 ID、模型版本、Schema 版本、校验错误与重试次数，避免把客户原文或敏感数据无必要地写进日志。\n\n最后用一批真实样本做回归测试：统计解析成功率、Schema 通过率、业务准确率、人工接管率和平均重试成本。前两个指标只能说明“长得像正确数据”，第三个才更接近“做对了事”。结构化输出的可靠性来自多层约束和可观测的失败处理，而不是相信模型每次都会听话。","published",[34,36],{"name":35,"slug":35},"工程",{"name":37,"slug":37},"大模型",[39,40,41,42,43],"大模型结构化输出","JSON Schema","模型按格式返回","LLM输出校验","约束解码","2026-10-05T04:10:02.025+00:00","2026-10-05T04:10:05.53197+00:00",{"id":47,"name":48,"slug":48},3,"技术笔记",{"items":50,"total":219,"page":4,"pageSize":220},[51,67,83,89,109,127,143,159,174,187,202],{"id":52,"slug":53,"title":54,"summary":55,"status":32,"tags":56,"seo_keywords":59,"published_at":65,"category":66},22,"llm-output-instability-hallucination","模型返回不稳定 \u002F 幻觉怎么办？","区分随机波动与事实幻觉，沿着样本评测、证据检索、结构校验、业务规则和人工回退建立可验证的大模型输出链路。",[57,58],{"name":35,"slug":35},{"name":37,"slug":37},[60,61,62,63,64],"模型幻觉怎么办","大模型输出不稳定","LLM幻觉","RAG事实校验","模型评测","2026-10-05T04:17:13.315+00:00",{"id":47,"name":48,"slug":48},{"id":68,"slug":69,"title":70,"summary":71,"status":32,"tags":72,"seo_keywords":75,"published_at":81,"category":82},21,"llm-cost-budget-guardrails","大模型调用怎么控制成本？把预算控制放进请求链路","从请求准入、原子预留、真实用量结算到超支降级，设计一套能在并发与重试下运行的大模型调用预算控制链路。",[73,74],{"name":35,"slug":35},{"name":37,"slug":37},[76,77,78,79,80],"大模型调用成本控制","LLM预算管理","Token费用","模型调用限额","API成本监控","2026-10-05T04:14:07.621+00:00",{"id":47,"name":48,"slug":48},{"id":27,"slug":28,"title":29,"summary":30,"status":32,"tags":84,"seo_keywords":87,"published_at":44,"category":88},[85,86],{"name":35,"slug":35},{"name":37,"slug":37},[39,40,41,42,43],{"id":47,"name":48,"slug":48},{"id":90,"slug":91,"title":92,"summary":93,"status":32,"tags":94,"seo_keywords":101,"published_at":107,"category":108},19,"geo-vs-seo-explained","理解 GEO 是什么？和 SEO 有什么区别？","GEO 是什么，和 SEO 有什么区别？从用户提问、内容呈现、优化动作与衡量指标四个角度讲清两者的关系，并给出一套适合建站团队的入门做法。",[95,98],{"name":96,"slug":97},"建站","jianzhan",{"name":99,"slug":100},"GEO","geo",[102,103,104,105,106],"GEO是什么","GEO和SEO的区别","生成式引擎优化","SEO","AI搜索优化","2026-10-05T04:07:05.673+00:00",{"id":47,"name":48,"slug":48},{"id":110,"slug":111,"title":112,"summary":113,"status":32,"tags":114,"seo_keywords":119,"published_at":125,"category":126},18,"how-nuxt-ssr-works","Nuxt 的 SSR 是怎么做的？从请求、数据获取到 Hydration","沿着一次文章页请求，看 Nuxt 如何用 Nitro 接收请求、在服务端执行 useFetch 并生成 HTML，再由浏览器复用 payload 完成 Hydration。",[115,116],{"name":35,"slug":35},{"name":117,"slug":118},"Nuxt","nuxt",[120,121,122,123,124],"Nuxt SSR","Nuxt服务端渲染","Nuxt useFetch","Hydration","Nitro渲染流程","2026-10-05T03:55:36.035+00:00",{"id":47,"name":48,"slug":48},{"id":128,"slug":129,"title":130,"summary":131,"status":32,"tags":132,"seo_keywords":135,"published_at":141,"category":142},17,"llm-api-cost-control","大模型调用怎么控制成本？一笔账算清缓存、输出与重试","先按输入、输出和额外调用算清单次成本，再用缓存、模型路由、上下文裁剪和预算限额降本，并用可用答案质量守住效果。",[133,134],{"name":35,"slug":35},{"name":37,"slug":37},[136,137,138,139,140],"大模型调用成本","LLM API成本控制","Token费用计算","提示词缓存","模型路由","2026-10-05T03:49:26.666+00:00",{"id":47,"name":48,"slug":48},{"id":144,"slug":145,"title":146,"summary":147,"status":32,"tags":148,"seo_keywords":151,"published_at":157,"category":158},16,"geo-technical-pipeline-design","GEO 的技术链路你会怎么设计？","从问题池、证据库、可读页面到答案采样与质量回写，设计一条可维护的 GEO 技术链路，并明确外部 AI 系统的边界。",[149,150],{"name":35,"slug":35},{"name":99,"slug":100},[152,153,154,155,156],"GEO技术链路","GEO技术方案","生成式引擎优化架构","AI搜索内容工程","GEO监测","2026-10-05T03:44:34.947+00:00",{"id":47,"name":48,"slug":48},{"id":160,"slug":161,"title":162,"summary":163,"status":32,"tags":164,"seo_keywords":166,"published_at":172,"category":173},15,"geo-core-metrics-calculation","GEO 的核心指标你怎么理解？怎么算？","用同一组问题和明确的分母，算清 GEO 的品牌提及率、引用率、有效引用率、竞争提及份额与有效线索率。",[165],{"name":99,"slug":100},[167,168,169,170,171],"GEO核心指标","GEO指标怎么算","品牌提及率","AI引用率","生成式引擎优化效果","2026-10-05T03:40:09.175+00:00",{"id":47,"name":48,"slug":48},{"id":175,"slug":176,"title":177,"summary":178,"status":32,"tags":179,"seo_keywords":182,"published_at":185,"category":186},14,"geo-business-understanding","GEO 从业务理解开始：把真实问题写成可引用的内容","做 GEO 之前，先弄清业务服务谁、用户在什么场景下提问、哪些证据能支持回答，再用真实问题和业务结果验证内容。",[180,181],{"name":96,"slug":97},{"name":99,"slug":100},[99,104,183,184,106],"业务理解","GEO内容策略","2026-10-05T03:33:52.358+00:00",{"id":47,"name":48,"slug":48},{"id":188,"slug":189,"title":190,"summary":191,"status":32,"tags":192,"seo_keywords":194,"published_at":200,"category":201},13,"website-launch-checklist","网站上线前后检查清单：从可访问到可维护","一份实用的网站上线清单，逐项检查域名、HTTPS、手机体验、页面速度、SEO、表单、备份与上线后的监测。",[193],{"name":35,"slug":35},[195,196,197,198,199],"网站上线检查清单","网站上线","网站性能优化","网站SEO","网站维护","2026-10-05T03:24:44.969+00:00",{"id":47,"name":48,"slug":48},{"id":203,"slug":204,"title":205,"summary":206,"status":32,"tags":207,"seo_keywords":209,"published_at":215,"category":216},12,"website-planning-checklist","建站之前：用一张页面清单理清目标、结构与内容","从网站目标、访问者任务到页面清单和内容准备，用一套可执行的方法完成建站规划，避免边做边改。",[208],{"name":35,"slug":35},[210,211,212,213,214],"建站规划","网站信息架构","网站内容规划","页面清单","个人网站建设","2026-10-05T03:23:27.683+00:00",{"id":217,"name":218,"slug":218},7,"项目实践",11,100,[],1791174017235]