调用多模态模型应用API ,文字图片的顺序以及消息体结构对问答的影响
- Dominant language
- TypeScript
- Stars
- 29.6k
- Forks
- 7.3k
- Avg merge
- 1d 7h
- Merged PRs (30d)
- 152
Description
**例行检查**
[//]: # '方框内填 x 表示打钩'
- [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 :
```json
[
{
"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 内部转化后:
```json
[
{
"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 时,如果是工作流中首次直接调用大模型的场景,应该将原消息体传大模型。
**应用场景**
**相关示例**
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.