[工作流]结构化输出

  • 如果要使用结构化必须使用脚本编程或者说将对象写入到某个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转换为字符串传入到提示词中

在结构化输出之前其实就用这种方法,但是由于模型的能力不同,有的模型可以处理的很好(成功概率高),有的就胡乱说话