8.0
热点
AI SCORE
编程提效2026-10-09 20:30
把 JSON Schema 直接写成 FunctionTool 效果更好
dev.to · AI#AI编程#LLM#工程实践
Editor brief · 编辑速览
与其在 prompt 里描述输出格式约束,不如将期望结构定义为 FunctionTool,LLM 直接调用落库,减少格式混乱。
我接手过的每一个集成项目,代码里都有这么一行:"return valid JSON."
然后解析器会在对象前面抛出各种注释、markdown 围栏,或者因为源文本太乱导致某个字段被丢弃。JSON schema 根本没有被真正执行——只是被"请求"了,用的是一种模型没有任何理由遵守的语言。
我一直在用一个小技巧来避免描述 schema。把 schema 变成工具本身。
$extracted = null;
$saveProfile = new FunctionTool(
name: 'save_profile',
description: 'Saves the extracted profile data into the system.',
parameters: [
'type' => 'object',
'properties' => [
'full_name' => ['type' => 'string'],
'skills' => ['type' => 'array', 'items' => ['type' => 'string']],
'experience_years' => ['type' => 'integer'],
],
'required' => ['full_name', 'skills'],
],
callable: function (array $args) use (&$extracted) {
$extracted = $args;
return "Captured profile for {$args['full_name']}.";
},
);
$agent = new Agent(
llm: $llmConfig,
systemPrompt: 'You extract profile details. Your ONLY task is to call save_profile once. Answer only via tool call.',
tools: [$saveProfile],
);
$agent->chat($unstructuredText);
// $extracted is now a typed array — full_name, skills, experience_years
你不需要事后验证输出,不需要剥离围栏,模型必须产生满足 schema 的参数,因为工具调用的形状就是这样——让每一次工具调用可靠的那套机制,同样让你的"JSON"变得可靠。
这个方案适用于任何支持工具调用的 provider,无论是托管服务还是跑在本地机器上的模型,验证发生在你这一端,用你的语言,你可以对其做出反应。
更完整的模式和更多示例在我的 PHP-AI 系列第 04 篇里。
你处理结构化输出的方式是什么——schema 即工具、提供商的原生模式,还是正则表达式补救?真心在问,因为我把自己说服放弃了其中两种方案。