如何定义Manifest

什么是Manifest

Manifest的概念来源于gpt plugin,gpt pluginManifest是一个文件,文件存储对于一个插件的所有描述,包括插件相关的API出入参、插件作用等关键信息,大模型会根据Manifest的信息知晓当前的插件可以完成什么(What),什么时候该调度(When),如何完成要完成的事情(How),从而完成插件的调度、调用,完成大模型和三方API的结合

我们的Manifest也是用于描述插件的What、WhenHow的描述信息,但是这个信息并不是一个由用户定义的一个文件来描述的,而是将用户定义的API插件配置信息组装成Manifest传递给大模型进行调度决策(Planning)。

Manifest的组成部分包括:

  • 插件的描述信息

  • 插件的入参code以及入参的描述

  • 插件的出参结构以及各个属性的描述

image.png

Manifest在决策中扮演的角色

所以定义好插件描述、出入参的code以及描述是十分重要的,关乎于插件是否能够发挥预期的作用。

如何写好插件描述

定义插件描述的几个原则

  • 尽可能用自然语言描述用户的可能问法,要举例。

    可以模仿以下范式:「开启后,支持通过自然语言交互,通过xxx获取/达成xxx实现xxx。示例:“xxxxx”」。

  • 多个插件的描述要将差异性体现出来。

    例如上面的插件A、B,要突出“驾车”和“步行”的差别,否则描述比较相近,模型很容易产生歧义,有很大概率无法做出正确的判断。

正例

开启后,支持通过自然语言交互,通过高德获取两个地点的驾车距离和驾车预估时间。示例:“从阿里巴巴云谷园区到西溪园区要多久”

反例

示例①

用于获取两个地点间的开车耗时的插件。

示例②

插件A:

开启后,支持通过自然语言交互,通过高德获取两个地点的步行距离和步行预估时间。示例:“从阿里巴巴云谷园区到西溪园区要多久”

如何定义插件的入参

正例入参定义image.png反例入参定义

image.png

定义入参的几个原则

  • 入参code尽可能带有含义

    比如入参为城市,入参code尽量定义为city这种有含义的英文单词,可以帮助大模型理解当前需要识别的参数信息是什么。

  • 入参描述/解释要简练且准确

    比如描述date,描述为日期的同时,可以再进一步描述date的形式,比如yyyy-MM-dd,帮助大模型进一步理解取参的方式。

  • 取值来源要设置准确

    “模型识别”是需要大模型从用户问题中识别提取的字段,如果存在必填参数但又不是从用户问题中识别的(例如工号,是程序透传的,不会是用户问题中识别提取的),这种要勾选“业务透传”,否则会出现必填参数无法识别,导致插件调用失败的情况。

  • 参数尽可能精简

    如果接口存在既不需要透传也不需要识别的参数,例如是个定值的参数,建议这种参数直接闭包到接口当中,不要外显出来。因为入参传给大模型的Manifest越复杂,产生模型混淆的可能性越高。

如何定义插件的出参

正例出参定义

image.png反例出参定义image.png

定义出参的几个原则

出参code尽可能带有含义

比如入参为城市,入参code尽量定义为city这种有含义的英文单词,可以帮助大模型理解当前需要识别的参数信息是什么。

出参描述/解释要简练且准确

“模型识别”是需要大模型从用户问题中识别提取的字段,如果存在必填参数但又不是从用户问题中识别的(例如工号,是程序透传的,不会是用户问题中识别提取的),这种要勾选“业务透传”,否则会出现必填参数无法识别,导致插件调用失败的情况。

出参尽可能精简

如果当前API插件在执行后某些字段并用不上,那么在定义出参的时候字段就不需要放到配置当中,做到尽可能精简。

出参结构要精确到使用到的最深层级

由于结构定义不够深,内层的结构会被解析成jsonstring,这种结构对于大模型来说无法进行准确的提取和内容提炼,所以想要达到效果不打折扣,需要将定义做到用到的最深一级。