labring / labring/FastGPT

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

Open
#1,251 2 comments 0 reactions 1 assignee Claimed by @c121914yu View on GitHub
feature
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.