FastGPT icon indicating copy to clipboard operation
FastGPT copied to clipboard

调用多模态模型应用API ,文字图片的顺序以及消息体结构对问答的影响

Open dimsky opened this issue 1 year ago • 2 comments

例行检查

  • [x] 我已确认目前没有类似 features
  • [x] 我已确认我已升级到最新版本
  • [x] 我已完整查看过项目 README,已确定现有版本无法满足需求
  • [x] 我理解并愿意跟进此 features,协助测试和提供反馈
  • [x] 我理解并认可上述内容,并理解项目维护者精力有限,不遵循规则的 features 可能会被无视或直接关闭

功能描述 目前在使用多模态应用的 API 时,会通过 content 以有序数组格式传输图片与文字信息,这样能保持文字与图片的联系,但是传入 fastgpt 后,会自动将所有图片放在前面,然后将 content 内的多段 text 合并成一段文字。这样会导致图片与文字失去联系,影响到模型的回复效果。

对于多张图片与文字的组合,claude 官方文档有详细的说明。 https://docs.anthropic.com/claude/docs/vision#3-example-multiple-images-with-a-system-prompt

举个实际的🌰: 调用 API 的原 messages :

[
  {
    "role": "user",
    "content": [
      { "text": "小明: 你最近怎么样,去哪玩了 \n", "type": "text" },
      { "text": "小红:我去三亚玩了一周 \n", "type": "text" },
      { "text": "小红发了一张图片\n", "type": "text" },
      {
        "type": "image_url",
        "image_url": {
          "url": "data:image/webp;base64,xxxxx"
        }
      },
      { "text": "小明:真漂亮,我也去大理玩了几天 \n", "type": "text" },
      { "text": "小明发了一张图片\n", "type": "text" },
      {
        "type": "image_url",
        "image_url": {
          "url": "data:image/webp;base64,xxxxx"
        }
      },
     { "text": "总结一下小红发的图片内容", "type":"text"}
    ]
  }
]

fastgpt 内部转化后:

[
  {
    "role": "user",
    "content": [
      {
        "type": "image_url",
        "image_url": {
          "url": "data:image/webp;base64,image1111"
        }
      },
      {
        "type": "image_url",
        "image_url": {
          "url": "data:image/webp;base64,image222"
        }
      },
      { "text": "小明: 你最近怎么样,去哪玩了 \n小红:我去三亚玩了一周 \n小红发了一张图片\n小明:真漂亮,我也大理玩了几天 \n小明发了一张图片\n总结一下小红发的图片内容", "type": "text" },
    ]
  }
]

很明显转化后的信息已经完全丢失了 图片与文字的联系,这种场景会很大程度的 影响到模型的回答效果。

还有发现 在消息体中传输 assistant 角色的消息时,会被 fastgpt 自动过滤掉,这里我不清楚是否有 fastgpt 系统设计时的考虑,我认为这个是不应该过滤的,这本来就是大模型开放的功能,assistant 的消息也应该能被用户自定义,比如需要预定义历史记录或需要实现Few-shot 也需要对 assistant 角色的定义,claude 文档中也有提到:https://docs.anthropic.com/claude/reference/messages-examples#multiple-conversational-turns

The Messages API is stateless, which means that you always send the full conversational history to the API. You can use this pattern to build up a conversation over time. Earlier conversational turns don't necessarily need to actually originate from Claude — you can use synthetic assistant messages.

我觉得在调用外部 API 时,如果是工作流中首次直接调用大模型的场景,应该将原消息体传大模型。 应用场景

相关示例

dimsky avatar Apr 19 '24 10:04 dimsky

@c121914yu

xiaoToby avatar Apr 23 '24 08:04 xiaoToby

应用api,如果能跟gpt保持一致就好了

superlbr avatar May 06 '24 14:05 superlbr