什么是Manifest
Manifest的概念来源于gpt plugin,gpt plugin中Manifest是一个文件,文件存储对于一个插件的所有描述,包括插件相关的API出入参、插件作用等关键信息,大模型会根据Manifest的信息知晓当前的插件可以完成什么(What),什么时候该调度(When),如何完成要完成的事情(How),从而完成插件的调度、调用,完成大模型和三方API的结合。
我们的Manifest也是用于描述插件的What、When和How的描述信息,但是这个信息并不是一个由用户定义的一个文件来描述的,而是将用户定义的API插件配置信息组装成Manifest传递给大模型进行调度决策(Planning)。
Manifest的组成部分包括:
插件的描述信息
插件的入参code以及入参的描述
插件的出参结构以及各个属性的描述
Manifest在决策中扮演的角色
所以定义好插件描述、出入参的code以及描述是十分重要的,关乎于插件是否能够发挥预期的作用。
如何写好插件描述
定义插件描述的几个原则
尽可能用自然语言描述用户的可能问法,要举例。
可以模仿以下范式:「开启后,支持通过自然语言交互,通过xxx获取/达成xxx实现xxx。示例:“xxxxx”」。
多个插件的描述要将差异性体现出来。
例如上面的插件A、B,要突出“驾车”和“步行”的差别,否则描述比较相近,模型很容易产生歧义,有很大概率无法做出正确的判断。
正例
开启后,支持通过自然语言交互,通过高德获取两个地点的驾车距离和驾车预估时间。示例:“从阿里巴巴云谷园区到西溪园区要多久”
反例
示例①
用于获取两个地点间的开车耗时的插件。
示例②
插件A:
开启后,支持通过自然语言交互,通过高德获取两个地点的步行距离和步行预估时间。示例:“从阿里巴巴云谷园区到西溪园区要多久”
如何定义插件的入参
正例入参定义反例入参定义
定义入参的几个原则
入参code尽可能带有含义
比如入参为城市,入参code尽量定义为city这种有含义的英文单词,可以帮助大模型理解当前需要识别的参数信息是什么。
入参描述/解释要简练且准确
比如描述date,描述为日期的同时,可以再进一步描述date的形式,比如yyyy-MM-dd,帮助大模型进一步理解取参的方式。
取值来源要设置准确
“模型识别”是需要大模型从用户问题中识别提取的字段,如果存在必填参数但又不是从用户问题中识别的(例如工号,是程序透传的,不会是用户问题中识别提取的),这种要勾选“业务透传”,否则会出现必填参数无法识别,导致插件调用失败的情况。
参数尽可能精简
如果接口存在既不需要透传也不需要识别的参数,例如是个定值的参数,建议这种参数直接闭包到接口当中,不要外显出来。因为入参传给大模型的Manifest越复杂,产生模型混淆的可能性越高。
如何定义插件的出参
正例出参定义
反例出参定义
定义出参的几个原则
出参code尽可能带有含义
比如入参为城市,入参code尽量定义为city这种有含义的英文单词,可以帮助大模型理解当前需要识别的参数信息是什么。
出参描述/解释要简练且准确
“模型识别”是需要大模型从用户问题中识别提取的字段,如果存在必填参数但又不是从用户问题中识别的(例如工号,是程序透传的,不会是用户问题中识别提取的),这种要勾选“业务透传”,否则会出现必填参数无法识别,导致插件调用失败的情况。
出参尽可能精简
如果当前API插件在执行后某些字段并用不上,那么在定义出参的时候字段就不需要放到配置当中,做到尽可能精简。
出参结构要精确到使用到的最深层级
由于结构定义不够深,内层的结构会被解析成jsonstring,这种结构对于大模型来说无法进行准确的提取和内容提炼,所以想要达到效果不打折扣,需要将定义做到用到的最深一级。