- 如果要使用结构化必须使用脚本编程或者说将对象写入到某个json文件中读取
无论哪个都需要了解部分编程知识,但是很简单
// 自动生成的声明不需要管
import { Util, NodeJsRequire, ChatJsonSchema } from "c:/Users/chen/AppData/Local/Programs/测试/resources/app/extensions/shenghuabi/code-node";
type NodeReturn = (
outputName: undefined,
) => Promise<{
/** 出口数据 */
value: any;
/** 一般用于标识元数据,表示对话中使用了哪些引用 */
extra?: {
metadata?: { type: string; description: string; tooltip?: string };
};
}>
async function main(
parameters: Record<never, { value: any, extra?: any }>,
util: Util,
require: NodeRequire,
): NodeReturn {
//需要手写的
let z = util.zod
// 表示定义了一个对象,对象里有一个name1字符串
let define = z.object({ name1: z.string(), })
return async (outputName) => {
// schema的通用定义,name定义为一个这个对象相关的名字,schema照抄即可
return { value: { name: 'person', schema: util.zodToJsonSchema(define) }, extra: undefined }
}
}
定义类型
- 虽然是使用zod进行schema定义,但是实际上部分方法是无效,甚至会起反效果,这里会列举一些我测试过可以正常生效的
z.string()字符串,支持max,min方法
regexp 不生效,甚至会破坏格式
email 不生效
猜测校验类型的可能都不生效
time()生肖,返回一个时间类型(不过过于精确)
z.object()对象,支持对象嵌套
// 定义一个对象,对象中有个body字段,body中还包含leg
z.object({ body:z.object({leg:z.string()}) })
z.number()数字
min max不生效
z.enum(['男','女'])枚举值,一定从数组中挑一个返回z.literal('xxx')一定返回xxx
虽然是一定返回,但是还是要由大语言模型计算…用这个有点浪费算力
z.date()日期
9176-03-25T14:48:00Z写作领域感觉用不到,因为它返回的是一个精确的日期,而写作中很少用到
z.boolean()真/假值.array()跟在任意类型后面表示数组类型
如
z.string().array()表示字符串数字
按格式输出
- 只传入Schema的情况下,数据一定按照指定格式输出,每个字段的类型一定按照要求,但是不一定符合要求
比如字符串类型的
name指的是谁的名字?
- Schema只能约束格式,不能约束格式内的内容
类型描述
- 所有类型都有
describe('')方法,用于描述这个字段是什么意思
按格式+描述输出
- 只使用Schema会按照指定格式返回,但是不能确定格式的内容
- 所需说还需要将Schema转换为字符串传入到提示词中
在结构化输出之前其实就用这种方法,但是由于模型的能力不同,有的模型可以处理的很好(成功概率高),有的就胡乱说话

