Open wssywh opened 6 months ago
我最近再用这个库做qwen-vl的推理,想要做few-shot,之前不用库的时候是直接str拼接few shot example的,然后用了这个库,我发现我怎么样也没法直接在prompt上直接拼多模态的例子,然后也实验了一下使用多轮对话代替,输出结果也是异常输出 多轮的结果,还有对应的期待答案
Response(text=' \n 19\n ',
generate_token_len=8,
input_token_len=3645,
session_id=0,
finish_reason='stop',
token_ids=[688, 198, 260, 220, 16, 24, 198, 260],
logprobs=None)
{"p": "[0|5349]",
"input_ids_length": 3645,
"question": "What is the ‘actual’ value per 1000, during the year 1975?",
"response": " \n 19\n ",
"answers": ["0.28"]}
zero-shot(也就是单轮的结果)
Response(text='8.22',
generate_token_len=5,
input_token_len=543,
session_id=0,
finish_reason='stop',
token_ids=[23, 13, 17, 17],
logprobs=None)
{"p": "[0|5349]",
"input_ids_length": 543,
"question": "What is the ‘actual’ value per 1000, during the year 1975?",
"response": "8.22",
"answers": ["0.28"]}
@wssywh 我跑llava的cli对比了一下,拼的prompt有点差别。https://github.com/InternLM/lmdeploy/pull/1620 这个PR修了一下。
你指的输出结果异常是不是说回答跟问题不是很匹配,有一些多余的东西?
跑了10次你给的例子(使用你给的第一轮问答作为历史)。结果如下,llava这边结果整体确实跟简洁一些。
# run with llava.cli
图片中有一辆红色的踏板车。
图片中有一辆踏板车,它的颜色是红色的。
图片中有一辆红色踏板车。
图片中有一辆红色的踏板车,也就是我们通常所说的“电瓶车”或“电动自行车”。
图片中有一辆踏板车,它的颜色是红色。
图片中有一辆红色的踏板车,它是一种小型、轻便的交通工具,通常用于短途出行或城市内行驶。
图片中有一辆红色的小型踏板车。
图片中有一辆红色的踏板车。
图片中有一辆红色的踏板车,也就是一种小型电动摩托车。
图片中有一辆红色的踏板车。
# run with lmdeploy
图片中有一辆红色的踏板车,它是一种小型摩托车,通常用于短距离的通勤或娱乐
图片中有一辆红色的踏板车,也就是通常所说的“小电驴”或“电瓶车”
图片中有一辆红色的小型摩托车,通常称为踏板车或电动踏板车。
图片中有一辆红色的踏板车,它的颜色为红色。
图片中有一辆红色的小型车辆,看起来像是一辆踏板车或小型摩托车。
图片中有一辆红色的踏板车,这是一种小型、轻便的交通工具,通常用于短距离的出行。
图片中有一辆红色的踏板车。
图片中有一辆红色踏板车。
图片中有一辆踏板车,它的颜色是红色。
图片中有一辆红色的踏板车,它是一种小型两轮车辆,通常用于短距离的交通工具。
@GuiQuQu
你是说用lmdeploy拼不出来你想要的prompt么?可以给一些例子说明一下,我目前不是很明白你的问题。
就比如说我想要的prompt是这样
<im_start>system
SYSTEM_MESSAGE
<im_end>
<im_start>user
"关于问题的相关说明....
<img>表示图像1</img>
问题:aaa
答案:bbb
关于问题的相关说明....
<img>表示图像2</img>
问题:aaa
答案:bbb
关于问题的相关说明....
<img>表示图像3</img>
问题:aaa
答案:bbb
关于问题的相关说明....
<img>表示图像4</img>
问题:aaa
答案:"
<im_end>
<im_start>assistant:
我前三个是few-shot的例子,最后是是我对应的问题,但是因为图像必须额外传递参数,不能和文本prompt混在一起传递,所以我想要的文字和图像前后顺序怎么都无法拼成这个样子。我看了你们qwen-vl-chat的templateWarpper的源码,如果我单独传递图像参数的话,图像的prompt会变成类似于"Picture 0:
然后我觉得这样搞不成了之后,我发现你们支持gpt4v的那种prompt格式,然后我就试了下面这种prompt传递的参数
[
{
'role': 'user',
'content': [{'type':'text','text':text1},{'type':'image_url','image_url':{'url':image_path1}}]
},
{
'role': 'assistant',
'content': answer1
},
{
'role': 'user',
'content': [{'type':'text','text':text2},{'type':'image_url','image_url':{'url':image_path2}}]
},
{
'role': 'assistant',
'content': answer2
},
{
'role': 'user',
'content': [{'type':'text','text':text3},{'type':'image_url','image_url':{'url':image_path3}}]
},
{
'role': 'assistant',
'content': answer3
},
{
'role': 'user',
'content': [{'type':'text','text':text4},{'type':'image_url','image_url':{'url':image_path4}}]
}
]
构造出来的prompt相当于我的每一个问题都被
@irexyc 结果不对是指输出了额外的json格式数据:
[{'type': 'text', 'text': '图片中有一辆红色的踏板车,它的车身和车座都有明显的磨损和污垢,车座上甚至有一些灰尘。踏板车的后部有一个黑色的篮子,里面可能装了一些东西。'}]
正确的输出应该是纯文本:
图片中有一辆红色的踏板车,它的车身和车座都有明显的磨损和污垢,车座上甚至有一些灰尘。踏板车的后部有一个黑色的篮子,里面可能装了一些东西。
这些都是多余的输出:[{'type': 'text', 'text':
@irexyc 多轮对话输出文本格式异常示例
@wssywh
明白你的意思了。
之前的逻辑对于assistant/system这种角色,支持的格式应该是下面这种。
{
'role': 'assistant',
'content': 'some str' # not list
}
而你的第一轮回答给的是下面这种,所以拼接的时候会把content直接拼过去(list not text),造成第二轮之后的回话格式有问题。这个PR也对针对这种输入进行了修复。可以再试一下。
{
'role': 'assistant',
'content':
[
{
'type': 'text',
'text': """ answer ... """
}
],
},
@GuiQuQu
明白你的意思了。这个问题我之前有想过,有些模型的prompt并不是固定的,<image> token
可以出现在user prompt 中的任何地方。
我加一下这部分的逻辑。
@GuiQuQu
可以看下 https://github.com/InternLM/lmdeploy/pull/1627 这个能不能解决你的问题。
我看了你提交的pr,我目前还有两个问题
@GuiQuQu
PR需要review,需要一段时间才能合入。现在用的话,需要改安装目录的代码。
image list 是按照顺序插入到 user prompt 当中。
以你之前的例子来说 (如果不改 system, user , assistant的话),那么输入大概长这样?
"关于问题的相关说明.... <IMAGE_TOKEN>问题:aaa\n答案:bbb
关于问题的相关说明.... <IMAGE_TOKEN>问题:aaa\n答案:bbb
关于问题的相关说明.... <IMAGE_TOKEN>问题:aaa\n答案:bbb
关于问题的相关说明.... <IMAGE_TOKEN>问题:aaa\n答案:"
你创建server或者pipeline的时候,可以把log_level设置成INFO,这样应该会打印拼好的prompt,可以对比一下看看拼的对不对。
Checklist
Describe the bug
使用llava-v1.6-34b模型部署OPENAI 服务后,多轮对话过程中模型有一定的概率会返回错误的结果
Reproduction
服务运行命令:
template.json文件内容:
程序运行代码:
Environment
Error traceback
No response