生成 · 2023 起

格式化生成

用 JSON Schema、类型模型或工具调用约束模型输出,让回答能被程序验证和继续执行。

常用 · 使用现成模型

要解决的问题

自然语言答案难以稳定驱动前端组件、API 和业务流程;字段遗漏、类型错误或夹带解释文字都会让下游解析失败。

相对前一代的变化

提示词只能约定输出长什么样。格式化生成进一步定义机器可读的 Schema,在生成后做类型校验;支持工具调用的模型还会原生返回函数名和参数。

做法

先定义字段、类型和约束,再选择输出解析器、模型原生结构化输出或 Function Calling。应用负责验证结果、处理失败和执行真实工具,并把工具结果返回模型生成最终答复。

局限

结构正确不代表事实正确。Schema 越复杂越容易漏字段,工具参数也必须经过权限、范围和业务规则校验;执行外部动作时仍需由代码掌控。

在链路中的位置

位于生成阶段的出口,也是智能体调用工具的接口层;上游证据进入模型,下游收到经过验证的数据或工具请求。

详解

「详解」根据 Datawhale《All-in-RAG》 的 格式化生成:输出解析、Schema 与 Function Calling 改写,有删节和重组,未包含原教程的代码、图片和练习。原教程与本节详解均按 CC BY-NC-SA 4.0 许可提供:使用时需署名并标明修改,不得用于商业目的,再次改编须以相同许可共享。

下游要的是字段,不只是一段通顺的话

客服推荐要渲染成商品卡片,查航班要变成接口参数,新闻抽取要写入数据库。这些场景都要求模型交出有字段、有类型的数据。自然语言回答即使内容正确,解析器也无法稳定取出价格、日期或人名。

先定义结构,再把结构写进提示

Pydantic 或 JSON Schema 先声明字段、类型和含义。输出解析器把这个定义转成格式说明,塞进提示词。模型返回文本后,解析器先把它读成 JSON,再用数据模型校验类型。校验失败就明确报错,而不是让一个缺字段的对象继续往下走。

LangChain 的 PydanticOutputParser 走这条提示加校验的路。LlamaIndex 的 Pydantic Program 也先定义模型;如果底层模型支持工具调用,它会优先使用原生结构化输出,否则退回把 Schema 写进提示。

不使用框架时,原则相同:明确要求只返回 JSON,给出字段说明,并附一两个输入到输出的例子。本地模型还可以用 GBNF 一类语法约束下一个 token,使输出在语法上不可能偏离 JSON。

工具调用把结构变成一次可执行的决定

Function Calling 不只约定回答的样子,还让模型选择一个工具并给出参数。应用先用 JSON Schema 描述工具名称、用途和参数。模型返回 tool_calls 后,代码解析名称和参数,真正执行 API 或数据库,再把结果以工具消息送回。模型看到结果后,才生成给人读的最终回答。

  • 定义工具:名称、用途和参数都要具体,模型靠这些文字做选择。
  • 第一次调用:问题与工具列表一起送出,模型决定是否调用。
  • 代码执行:参数先校验范围和权限,再执行真实动作。
  • 第二次调用:工具结果回到对话,模型组织最终答复。

格式正确仍然可能事实错误

Schema 能拦住缺字段和错误类型,不能保证价格或日期来自资料。工具参数同样要经过白名单、数量上限和业务规则。模型可以提议调用,真正执行必须留在代码里。