说明:
根据有关要求,本文将【Visual ChatGPT】模型简称为【Visual-GPT】。
本文为删节版,进行了大量删改,有些内容比较晦涩,读者可以略过,当然也可以仔细研读…完整版参见文末链接。
更新说明:文末链接已删除。
1. 【Visual- ChatGPT】火热来袭
3月9日,微软亚洲研究院发布了图文版 ChatGPT——Visual ChatGPT,并在 Github 开源了基础代码,短短一周已经获得了 19.7k 颗星。
2022年11月,OpenAI 推出的 ChatGPT,几个月来已经火爆全球,不仅需要候补注册,还要科学上网。ChatGPT 具有强大的会话能力的语言界面进行人机对话,能陪你聊天、编写代码、修改 bug、解答问题…,但是目前还不能处理或生成视觉图像。
Visual ChatGPT 把一系列 Visual Foundation 视觉模型接入 ChatGPT,使用户能够与 ChatGPT 以文本和图像的形式交互,还能提供复杂的视觉指令,让多个模型协同工作。Visual ChatGPT 可以理解和响应基于文本的输入和基于视觉的输入,减少进入文本到图像模型的障碍,增加各种 AI 工具的互操作性。
Visual Transformer 将 ChatGPT 作为逻辑处理中心,集成 Visual Foundation 视觉基础模型,从而实现:
提供视觉聊天系统,可以接收和发送文本和图像;
提供复杂的视觉问答和视觉编辑指令,可以解决复杂视觉任务;
可以提供反馈,总结答案,还可以主动对模糊的指令进行询问。
Visual-GPT 可以用自然语言简单地从模型中键入想要的内容,如题图所示的过程中进行了几轮对话:
用户要求生成一张猫的图像。Visual-GPT 生成了一幅正在看书的猫的图像。
用户要求将图像中的猫换成狗,并把书删除。Visual-GPT 将该图像中的猫换成了狗,并删除了图像中的书。
用户要求对图像进行 Canny 边缘检测。Visual-GPT 理解并执行了 Canny 边缘检测操作,生成了边缘图像。
用户要求基于指定的网络图像,生成一幅黄狗图像,Visual-GPT 也很好地完成了这个任务。
2. 【Visual-GPT】操作实例
2.1 处理流程
Visual-GPT 的基本处理流程如图所示。
如图所示,用户上传了一张黄色花朵的图像,并输入一条复杂的语言指令「请根据该图像生成的深度图在生成一朵红色花朵,然后逐步将其制作成卡通图片」。
Visual-GPT 中的 Prompt Manager 控制与 VFM 相关的处理流程。ChatGPT 利用这些 VFMs,并以迭代的方式接收其反馈,直到满足用户的要求或达到结束条件。
首先是深度估计模型,用来检测图像深度信息;
然后是深度图像模型,用来生成具有深度信息的红色花朵图像;
最后利用基于 Stable Diffusion 的风格迁移模型,将图像风格转换为卡通图像。
在上述 pipeline 中,Prompt Manager 作为 ChatGPT 的管理调度中心,提供可视化格式的类型并记录信息转换的过程,最后输出最终结果图像并显示。
2.2 操作实例
第一轮对话:
Q1:用户文本询问,问题与图像无关。
A1:模型文本回答,回答与图像无关。
Q2:用户要求画一个苹果。
A2:模型图文回答,绘制了一幅苹果图片。
第二轮对话:
Q3:用户输入图像,是一个苹果和杯子的草图。
A3:模型文本回答,询问用户的意图,并主动提示草图的文件名。
Q4:用户文本输入,要求按草图绘制苹果和杯子。
A5:模型图文回答,按照用户要求绘制了一幅苹果和杯子的图片。
第三轮对话: Q5:用户输入文本,要求把上图修改为水彩画风格。 A5:模型图文回答,按照用户要求把上图修改为一幅水彩画风格的图片。 Q6:用户文本输入,询问图片的背景颜色。 A6:模型文本回答,回答图片的背景颜色。
第四轮对话: Q7:用户文本输入,要求去除图片中的苹果。 A7:模型图文回答,按照用户要求从图片中去除苹果——但是没有去除苹果在桌面上的影子。 Q8:用户输入文本,指出上图中的影子还在桌面上,并要求把换一张黑色的桌子。 A8:模型图文回答,按照用户要求把图片中的桌子换成黑色桌子。
3. 【Visual-GPT】技术原理分析
3.1 技术原理
由于 ChatGPT 是用单一语言模态训练而成,处理视觉信息的能力非常有限。而视觉基础模型(VFM,Visual Foundation Models)在计算机视觉方面潜力巨大,因而能够理解和生成复杂的图像。例如,BLIP 模型是理解和提供图像描述的专家,Stable Diffusion 可以基于文本提示合成图像。然而由于 VFM 模型对输入输出格式的苛求和固定限制,但在人机交互上却不如对话语言模型灵活。
Visual ChatGPT 是在大量文本和图像数据集上训练的。该模型使用不同的视觉基础模型(如 VGG、ResNet和DenseNet)从图像中提取特征,然后将这些特征与基于文本的输入相结合以生成响应。使用有监督和无监督学习技术的组合进行训练,使其能够学习并适应新的场景。
当用户用图像输入问题或陈述时,它分析图像并提取相关特征。然后,它将这些特性与基于文本的输入相结合,以生成与用户查询相关的响应。例如,如果用户上传一辆汽车的图像并询问“这辆汽车的品牌和型号是什么?”,Visual-GPT 将分析图像并根据从图像中提取的视觉特征生成响应。
传统的聊天机器人只依赖基于文本的输入,这限制了它们的能力。Visual-GPT 通过结合计算机视觉扩展了聊天机器人的功能,使其能够基于视觉上下文理解并生成响应。Visual-GPT 的另一个特性是它能够生成创造性的响应。由于它是在GPT-3之上构建的,它可以访问大量文本数据集,这使它能够生成富有创意和多样性的响应。这使得与 Visual-GPT 的交互更具吸引力和人性化。
3.2 系统架构
Visual-GPT 的系统架构如下图所示,由用户查询模块(User Query)、交互管理模块(Prompt Manger)、视觉基础模型(Visual Foundation Models,VFM)、调用 ChatGpt API 系统和迭代交互模块(Iterative Reasoning)、用户输出模块(Outputs)构成。
上图左图是多轮对话的过程,中图是 Visual-GPT 如何迭代调用 VFMs 并提供答案的流程图,右图是模型针对第2个 Q/A 的详细运行过程。
分析系统架构图,该系统利用 ChatGPT 和 一个Prompt Manager(M) 来做意图识别和语言理解,然后决定后续的操作和产出。
在这个对话的例子中:
第一轮对话:首先用户输入一张图片 User Query(Q1),模型回答收到 (A1)。
第二轮对话:(1)用户提出”把沙发改为桌子“和”把风格改为水彩画“两个要求(Q2),模型判断需要使用VFM模型;(2)模型判断第一个要求是替换东西,因此调用 repalce object 模块,生成符合第一个要求的图片;(3)模型判断第二个要求是通过语言修改图片,因此调用 pix2pix 模块,生成符合第二个要求的图片;(4)模型判断完成用户提出的需求,输出第二幅图片(A2)。
第三轮对话:用户提出问题(Q3),模型判断不需要 VFM,调用 VQA 模块,回答问题得到答案(A3)。
将这个过程抽象出来, 就是一系列系统规则组成的M§和功能模块组成的M(F) :
对于由多个“问题-答案对”所构成的集合 S = ( Q 1 , A 1 ) , ( Q 2 , A 2 ) , . . . , ( Q n , A n ) S={(Q_1,A_1), (Q_2,A_2),…,(Q_n,A_n)}S=(Q
1
,A
1
),(Q
2
,A
2
),…,(Q
n
,A
n
),要从第 i ii 轮对话中得到答案 A i A_iA
i
,需要一系列的 VFM 和中间输出。
将第i ii轮对话中第j jj次的工具调用中间答案记为 A i j A_i^{j}A
i
j
,就可以定义 Visual ChatGPT 的模型为:
A i j + 1 = C h a t G P T ( M ( P ) , M ( F ) , M ( H < i ) , M ( Q i ) , M ( R i < j ) , M ( F ( A i j ) ) ) A_i^{j+1} = ChatGPT(M(P), M(F), M(H_{<i}), M(Q_i), M(R_i^{<j}), M(F(A_i^j)))
A
i
j+1
=ChatGPT(M(P),M(F),M(H
<i
),M(Q
i
),M(R
i
<j
),M(F(A
i
j
)))
其中:P 是全局原则,F 是各个视觉基础模型,M ( H < i ) M(H_{<i})M(H
<i
) 是历史会话记忆,$ M(Q_i)$ 是第 i 轮的用户输入, M ( R i < j ) M(R_i^{<j})M(R
i
<j
) 是第 i 轮的推理历史,A j A^jA
j
是中间答案。
ChatGPT生成最终答案要经历一个不断迭代的过程,它会不断自我询问,自动调用更多VFM。而当用户指令不够清晰时,Visual ChatGPT会询问其能否提供更多细节,避免机器自行揣测甚至篡改人类意图。
3.3 模块说明
M§:
Visual-GPT 为了能让不同的VFM理解视觉信息并生成相应答案,需要设计一系列系统原则,并将其转化为 ChatGPT能够理解的提示。
通过生成这样的提示,Prompt Manager 能够帮助 Visual-GPT 完成生成文本、图像的任务,能够访问一系列VFM并自由选择使用哪个基础模型,提高对文件名的敏感度,进行链式思考和严格推理。
M(F):
Prompt Manager 需要帮助 Visual-GPT 区分不同的VFM,以便准确地完成图像任务。
为此,Prompt Manager对各个基础模型的名称、应用场景、输入和输出提示以及实例给出了具体定义。
M(Q):
Prompt Manager会对用户新上传的图像生成唯一文件名,并生成假的对话历史,其中提到该名称的图片已经收到,这样可以在涉及引用现有图像的查询时忽略文件名的检查。
Prompt Manager会在查询问题之后加上一个后缀提示,来确保成功触发VFM,强制 Visual-GPT 进行思考,给出言之有物的输出。
M(F(A)):
VFM给出的中间输出,Prompt Manager会为其生成链式文件名,作为下一轮内部对话的输入。
3.4 Prompt Manager 功能与规则
Visual-GPT 的核心是 Prompt Manager,具体功能如下:
首先明确告诉 ChatGPT 每个 VFM 的功能,并指定输入输出格式。
然后转换不同的视觉信息(如 png 图像、深度图像和 mask 矩阵)转换为语言格式。
最后处理不同 VFM 的历史、优先级和冲突。
通过 Prompt Manager 的帮助,ChatGPT 可以利用这些 VFM,并以迭代方式接收反馈,直到满足用户的需求或达到结束条件。
Visual-GPT 集成了不同 VFM 来理解视觉信息并生成相应答案的系统。因此,Visual-GPT 需要制定一些基本规则,并将其转化为 ChatGPT 可以理解的命令。
这些基本规则包括:
Visual-GPT 的任务需求:协助完成一系列与文本和视觉相关的任务,例如 VQA、图像生成和编辑。
VFM 的可访问性:Visual ChatGPT 可以访问 VFM 列表来解决各种 VL( vision-language ) 任务,使用哪种基础模型由 ChatGPT 模型本身决定。
文件名敏感度:在对话中可能包含多个图像及不同的更新版本,使用精确的文件名以避免歧义至关重要,滥用文件名会导致混淆图片。Visual-GPT 被设计为严格使用文件名,确保检索和操作图像文件的正确性。
Chain-of-Thought:一些看似简单的命令可能需要多个 VFM,例如生成卡通图片的过程涉及深度估计、深度到图像和风格转换的 VFM。Visual-GPT 引入了 CoT 以帮助决定、利用和调度多个 VFM,将用户的问题分解为多个子问题来解决更具挑战性需求。
推理格式的严谨性:Visual-GPT 必须遵循严格的推理格式。该研究使用精细的正则表达式匹配算法解析中间推理结果,为 ChatGPT 模型构建合理的输入格式,以帮助其确定下一次执行,例如触发新的 VFM 或返回最终响应。
可靠性:Visual-GPT 作为一种语言模型,可能会伪造假图像文件名或事实,这会使系统不可靠。为了处理此类问题,需要设计 prompt 使忠于视觉基础模型的输出,而不能伪造图像内容或文件名。此外,prompt 还将引导 ChatGPT 优先利用 VFM,而不是根据对话历史生成结果。
3.5 视觉基础模型(Visual Foundatin Model)
Visual-GPT 支持 22 种视觉基础模型(Visual Foundatin Model):
从图像中删除对象(Remove Objects from Image):image path, textual what to remove -> image path
替换图像中的对象(Replace Objects from Image):image path, textual what to replace, textual what to add -> image path
按文本要求修改图像(Change Image by the Text):image path, textual how to modify -> image path
图像问题解答(Image Question Answering):image path, question -> answer
从图像生成描述文本(Image-to-Text):image path -> natural language description
从描述文本生成图像(Text-to-Image):textual description -> image path
对图像进行边缘检测(Image-to-Edge):image path -> edge image path
从边缘检测图和文本描述生成新图像(Edge-to-Image):edge image path, textual description -> image path
对图像进行直线检测(Image-to-Line):image path -> line image path
从直接检测图和文本生成新图像(Line-to-Image):line image path, textual description -> image path
对图像进行 HED 边缘检测(Image-to-Hed):image path -> hed image path
从HED边缘检测和文本生成新图像(Hed-to-Image):hed image path, textual description -> image path
生成分割图像(Image-to-Seg):image path -> segment image path
从分割图像和文本生成新图像(Seg-to-Image):segment image path, textual description ->image path
从图像生成深度图(Image-to-Depth):image path -> depth image path
从深度图和文本生成新图像(Depth-to-Image):depth image path, textual description -> image path
从图像生成法线图(Image-to-NormalMap):image path -> norm image path
从法线图和文本生成新图像(NormalMap-to-Image):norm image path, textual description -> image path
从图像生成草图(Image-to-Sketch):image path -> sketch image path
从草图和文本生成新图像(Sketch-to-Image):sketch image path, textual description -> image path
对图像进行姿态检测(Image-to-Pose):image path -> pos image path
从姿态检测和文本生成新图像(Pose-to-Image):pos image path, textual description -> image path
4. 【Visual-GPT】使用与运行
【本文为删节版,相关内容已删除。】
4.1 clone the repo
4.2 prepare the basic environments
4.3 start local runing
5. 【Visual-GPT】论文简介
5.1 论文获取
Title:Visual ChatGPT: Talking, Drawing and Editing with Visual Foundation Models
标题:Visual ChatGPT:使用 Visual Foundation 模型进行对话、绘图和编辑
作者:Chenfei Wu, Shengming Yin, Weizhen Qi, Xiaodong Wang, Zecheng Tang, Nan Duan
机构:Microsoft Researc Asia(微软亚洲研究院)
论文链接: https://arxiv.org/abs/2303.04671
开源代码: https://github.com/microsoft/visual-chatgpt
我已经将本文上传到 CSDN,读者也可以从 arxiv 自行下载。
第一作者:吴晨飞,高级研究员,2020 年加入微软亚洲研究院自然语言计算组,研究领域为多模型的预训练、理解和生成。
通讯作者: 段楠,微软亚洲研究院首席研究员及自然语言计算组研究经理,中国科学技术大学兼职博导,天津大学兼职教授,研究领域为自然语言处理、代码智能、多模态智能和机器推理等。
5.2 主要贡献
(1)提出 Visual ChatGPT,打开了 ChatGPT 和 VFM 连接的大门,使 ChatGPT 能够处理复杂的视觉任务。
(2)设计了一个 Prompt Manager,其中涉及 22 个不同的 VFM,并定义了它们之间的内在关联,以便更好地交互和组合。
(3)进行了大量的零样本实验,并展示了大量的案例来验证 Visual ChatGPT 的理解和生成能力。
5.3 本文的启发
本文开启了 ChatGPT 处理视觉任务的大门。
NLP —> Natural Language PhotoShop,自然语言文本描述下的图片创作编辑和问答。
可以通过系统设计和工具包设计的 Prompt 实现无监督的工具调用,类似于 zero-shot 的 toolformer。
ChatGPT 本身对仿真场景的能力很强,也能接受图片路径和函数关系,可以很好地使用基础视觉模型。
Visual ChatGPT 本身是一个语言模型,所谓的两方多轮对话只是一个 Human AI 的多轮特殊形式。
5.4 模型复现
Visual-GPT 的运行步骤如下。
(1)创建 Python3.8 环境并激活新的环境:
# create a new environment
conda create -n visgpt python=3.8
# activate the new environment
conda activate visgpt
1
2
3
4
5
(2)安装所需的依赖(详见4.2):
# prepare the basic environments
pip install -r requirement.txt
1
2
(3)clone the repo:
【删除】
clone the repo 所建立的文件夹结构如下:
├── assets
│ ├── demo.gif
│ ├── demo_short.gif
│ └── figure.jpg
├── download.sh
├── LICENSE.md
├── README.md
├── requirement.txt
└── visual_chatgpt.py
(4)设置工作目录:
将工作目录设置为创建的 github repo 的 copy:
# clone the repo
%cd visual-chatgpt
1
2
(5)下载基本视觉模型 VFM:
# download the visual foundation models
bash download.sh
1
2
(6)输入 OpenAI_API_key:
要开始使用OpenAI API,请访问 platform.OpenAI.com 并使用 Google 或 Microsoft 邮箱注册帐户,获取 API 密钥,该密钥将允许您访问API。——科学上网,势不可挡!
%env OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
# prepare your private OpenAI key (for Linux)
export OPENAI_API_KEY={Your_Private_Openai_Key}
# prepare your private OpenAI key (for Windows)
set OPENAI_API_KEY={Your_Private_Openai_Key}
1
2
3
4
5
(7)创建图像保存目录
!mkdir ./image
1
(8)运行 Visual GPT
!python3.8 ./visual_chatgpt.py
1
注意问题:
(1)可以通过 “–load” 指定 GPU/CPU 分配,该参数设置使用的 VFM 模型及加载位置。可用的 Visual Foundation 模型参见 3.6 节内容。
例如,将 ImageCaptiing 加载到 cpu,将 Text2Image 加载到 cuda:0,则设置为:
python visual_chatgpt.py –load ImageCaptioning_cpu, Text2Image_cuda:0
(2)VFM 模型所需的内存资源很大,推荐的设置选项为:
CPU 用户:只加载 ImageCaptioning_cpu, Text2Image_cpu
1 Tesla T4 15GB 用户:只加载 ImageCaptioning_cuda:0, Text2Image_cuda:0,可以加载 ImageEditing_cuda:0
4 Tesla V100 32GB 用户:加载如下
–load ImageCaptioning_cuda:0,ImageEditing_cuda:0,
Text2Image_cuda:1,Image2Canny_cpu,CannyText2Image_cuda:1,
Image2Depth_cpu,DepthText2Image_cuda:1,VisualQuestionAnswering_cuda:2,
InstructPix2Pix_cuda:2,Image2Scribble_cpu,ScribbleText2Image_cuda:2,
Image2Seg_cpu,SegText2Image_cuda:2,Image2Pose_cpu,PoseText2Image_cuda:2,
Image2Hed_cpu,HedText2Image_cuda:3,Image2Normal_cpu,
NormalText2Image_cuda:3,Image2Line_cpu,LineText2Image_cuda:3
1
2
3
4
5
6
7
(3)不同 VFM 模型所需内存的参考值。
Foundation Model Memory Usage (MB)
ImageEditing 6.5
ImageCaption 1.7
T2I 6.5
canny2image 5.4
line2image 6.5
hed2image 6.5
scribble2image 6.5
pose2image 6.5
BLIPVQA 2.6
seg2image 5.4
depth2image 6.5
normal2image 3.9
InstructPix2Pix 2.7
5.5 常见错误
RuntimeError: CUDA error: invalid device ordinal
问题原因:GPU 的数量不够。
解决方案:将 visual_chatgpt.py 文件中的所有 cuda:\d 替换为 cuda:0。
OutOfMemoryError: CUDA out of memory
问题原因:没有足够的 GPU 内存来运行 VFM模型。
解决方案:忽略 download.sh 和 visual_chatgpt.py 文件中不需要的一些模型,只加载必要的模型。
5.6 代码解读
**说明:**本节内容来自外网,博主也在解读和测试。在此贴出相关内容,仅供参考,更多解读详见 【Visua ChatGPT: Paper and Code Review】。
with gr.Column(scale=0.15, min_width=0):
btn = gr.UploadButton(“Upload”, file_types=[“image”])
btn.upload(bot.run_image, [btn, state, txt], [chatbot, state, txt])
def run_image(self, image, state, txt):
image_filename = os.path.join(‘image’, str(uuid.uuid4())[0:8] + “.png”)
print(“======>Auto Resize Image…”)
img = Image.open(image.name)
width, height = img.size
ratio = min(512 / width, 512 / height)
width_new, height_new = (round(width * ratio), round(height * ratio))
img = img.resize((width_new, height_new))
img = img.convert(‘RGB’)
img.save(image_filename, “PNG”)
print(f”Resize image form {width}x{height} to {width_new}x{height_new}”)
description = self.i2t.inference(image_filename)
Human_prompt = “nHuman: provide a figure named {}. The description is: {}. This information helps you to understand this image, but you should use tools to finish following tasks, ”
“rather than directly imagine from my description. If you understand, say “Received”. n”.format(image_filename, description)
AI_prompt = “Received. ”
self.agent.memory.buffer = self.agent.memory.buffer + Human_prompt + ‘AI: ‘ + AI_prompt
print(“======>Current memory:n %s” % self.agent.memory)
state = state + [(f”![](/file={image_filename})*{image_filename}*”, AI_prompt)]
print(“Outputs:”, state)
return state, state, txt + ‘ ‘ + image_filename + ‘ ‘
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
如上所述,上传图像后,调用run_image函数。此函数通过uuid创建新的图像名称,对图像进行预处理,然后创建添加到缓存的人工旋转。
还可以看出,图像描述与文件名一起被包括作为初始输入。该描述由Blip图像字幕模型生成。
class ImageCaptioning:
def __init__(self, device):
print(“Initializing ImageCaptioning to %s” % device)
self.device = device
self.processor = BlipProcessor.from_pretrained(“Salesforce/blip-image-captioning-base”)
self.model = BlipForConditionalGeneration.from_pretrained(“Salesforce/blip-image-captioning-base”).to(self.device)
self.i2t = ImageCaptioning(device=”cuda:4″)
1
2
3
4
5
6
7
从上面声明的Human_prompt变量中可以看出,短语“但在根据我的描述直接想象之前,您应该使用工具完成以下任务。设置ChatGPT使用VFM而不是任意提供响应的音调。
Human_prompt = “nHuman: provide a figure named {}. The description is: {}. This information helps you to understand this image, but you should use tools to finish following tasks, ”
“rather than directly imagine from my description. If you understand, say “Received”. n”.format(image_filename, description)
1
2
除了调用提交图像之外,每个调用还具有前缀和后缀,以进一步确保模型不会以特殊方式运行。前缀中列出的一些关键准则如下:
作为一种语言模型,VisualChatGPT不能直接读取图像,但它有一系列工具来完成各种视觉任务。每个图像都将创建一个文件名为“image/xxx.png”,VisualChatGPT可以调用各种工具来间接理解图像。
VisualChatGPT 对图像的文件名非常严格,不支持不存在的文件。
Visual ChatGPT可以按顺序使用这些工具,并且忠于工具观察结果的输出,而不是伪造图像内容和图像文件名。如果创建了新图像,它将记住上次观察工具时的文件名。
Visual ChatGPT可以访问以下工具:
这些声明使Visual ChatGPT能够使用可用的可视化工具,以及如何处理文件名以及如何与用户就VFM模型之一生成的图像进行通信。
代理有一个可以使用的所有工具的列表,在本例中是VFM。每个工具都有详细描述其功能,例如:
Tool(name=”Generate Image From User Input Text”, func=self.t2i.inference,
description=”useful when you want to generate an image from a user input text and save
it to a file. like: generate an image of an object or something, or
generate an image that includes some objects. ”
“The input to this tool should be a string, representing the text
used to generate image. “),
1
2
3
4
5
6
所使用的工具之一是VFM,它可以将文本转换为图像,如图所示,为代理提供了有关工具名称的信息,该信息概括了模型的功能、要调用的函数以及详细描述工具和输入。以及仪器输出。
然后,代理使用工具的描述和过去的对话历史来决定下一步使用哪个工具。使用ReAct框架做出决策。
self.agent = initialize_agent(
self.tools,
self.llm,
agent=”conversational-react-description”,
verbose=True,
memory=self.memory,
return_intermediate_steps=True,
agent_kwargs={‘prefix’: VISUAL_CHATGPT_PREFIX,
‘format_instructions’: VISUAL_CHATGPT_FORMAT_INSTRUCTIONS,
‘suffix’: VISUAL_CHATGPT_SUFFIX},
1
2
3
4
5
6
7
8
9
10
ReAct可以被认为是推理链(CoT)推理范式的扩展。而CoT允许LM生成一系列推理来解决任务,从而减少产生幻觉的可能性。
为了确保ChatGPT以这种格式响应,ChatGPT提示符包含以下内容:
VISUAL_CHATGPT_FORMAT_INSTRUCTIONS = “””To use a tool, please use the following
format:
“””
Thought: Do I need to use a tool? Yes
Action: the action to take, should be one of [{tool_names}]
Action Input: the input to the action
Observation: the result of the action
When you have a response to say to the Human, or if you do not need to
use a tool, you MUST use the format:
Thought: Do I need to use a tool? No
“””
{ai_prefix}: [your response here]”””
1
2
3
4
5
6
7
8
9
10
11
12
需要注意的是,想法、行动和观察步骤的输出不会显示给最终用户。所有这些信息都是隐藏的,以确保最终用户不会被没有直接解决用户问题的所有中间答案淹没。
相反,当LM认为它已经得到了最终答案或想向用户提问时,只向用户 [此处为您的回答] 字段显示生成的文本的一部分。
ReAct范式的另一个好效果是,我们现在可以结合使用多种工具,因为在看到观察结果后,ChatGPT默认会考虑是否需要使用工具。本质上我必须使用工具吗?是添加到ChatGPT服务生成的每个查询和代理响应的后缀。
从ChatGPT响应格式上方的提示可以看出,对于ChatGPT从可用列表中选择一个工具,可以从前面看到的工具描述中获得工具的输入格式,最后可以从视图中解析VFM输出。
可以通过下面的LangChain库查看行动分析和行动条目:
def _extract_tool_and_input(self, llm_output: str) -> Optional[Tuple[str, str]]:
if f”{self.ai_prefix}:” in llm_output:
return self.ai_prefix, llm_output.split(f”{self.ai_prefix}:”)[-1].strip()
regex = r”Action: (.*?)[n]*Action Input: (.*)”
match = re.search(regex, llm_output)
if not match:
raise ValueError(f”Could not parse LLM output: `{llm_output}`”)
action = match.group(1)
action_input = match.group(2)
return action.strip(), action_input.strip(” “).strip(‘”‘)
1
2
3
4
5
6
7
8
9
10
在提取要使用的工具和要提供的输入时,进行调用以执行该工具。
每个模型的输出以以下格式保存为文件名:
{Name}_{Operation}_{Previous Name}_{Organization Name}.
title 是唯一的 uuid,操作对应于工具的名称,原名对应于用于创建新图像的输入图像的 uuid,组织的名称对应于用户提供的原始输入图像。按照这种命名约定,ChatGPT可以很容易地导出有关新生成的图像的信息。
def get_new_image_name(org_img_name, func_name=”update”):
head_tail = os.path.split(org_img_name)
head = head_tail[0]
tail = head_tail[1]
name_split = tail.split(‘.’)[0].split(‘_’)
this_new_uuid = str(uuid.uuid4())[0:4]
if len(name_split) == 1:
most_org_file_name = name_split[0]
recent_prev_file_name = name_split[0]
new_file_name = ‘{}_{}_{}_{}.png’.format(this_new_uuid, func_name, recent_prev_file_name, most_org_file_name)
else:
assert len(name_split) == 4
most_org_file_name = name_split[3]
recent_prev_file_name = name_split[0]
new_file_name = ‘{}_{}_{}_{}.png’.format(this_new_uuid, func_name, recent_prev_file_name, most_org_file_name)
return os.path.join(head, new_file_name)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
最后,将所有移动部件组合起来,与Visual ChatGPT进行对话,后者可以使用视觉信息。
这项工作是快速工程重要性的完美例证。提示允许代理使用文件名处理视觉信息,并创建思维链->动作链->观察反应链,帮助确定要使用哪些VFM并处理VFM模型的输出。
为了抽象解决方案的复杂性质,中介响应(包括思想、行动和观察话语)对用户是隐藏的,只有当ChatGPT相信时LM生成的最终响应才会显示给用户。不再需要使用VFM。
6. GPT4 来了
刚刚写完本文,就看到 GPT4 发布的资讯。而且,GPT-4 开始接受图像作为输入介质,也可以开始处理图像了。
下面是 OpenAI 提供的一个示例,GPT-4 针对图像输入回答的问题。
由于目前图像输入的权限尚未公开,还不清楚 GPT-4 图像处理的技术原理和能力。所以关于 GPT-4,我们后文再讨论吧。
但是,可以预期的是:世界潮流,浩浩荡荡。