亚马逊SageMaker JumpStart是一个强大的工具,它结合了对话引导和视觉语言处理的能力通过使用这个工具,您可以创建出色的视觉语言处理模型,以提高您的产品和服务的用户体验 对话引导是一种强大的方法,可以帮助您更好地理解用户的需求和意图通过使用对话引导,您可以与用户进行交互,并获取他们的输入和反馈这种交互可以帮助您更好地了解用户的需要,从而设计出更符合他们期望的产品和服务
or '打造卓越用户体验:了解亚马逊SageMaker JumpStart的对话引导和视觉语言处理工具视觉语言处理(VLP)处于生成式人工智能的前沿,推动了语言智能、视觉理解和处理等多模态学习的进展。结合大型语言模型(LLM)和大量多模态数据训练的对比性语言-图像预训练(CLIP),视觉语言模型(VLM)在图像标题生成、目标检测和分割以及视觉问答等任务中表现出特别的能力。它们的使用案例涵盖了从媒体娱乐到医学诊断和制造业质量保证的各个领域。
VLP的关键优势包括有效利用预训练的VLM和LLM,实现零样本或少样本预测,无需进行任务特定的修改,并通过非正式的多轮对话对广泛范围的图像进行分类。通过Grounded Segment Anything的增强,VLP在视觉识别方面展现出了强大的能力,尤其是在目标检测和分割方面。将来还有可能利用领域特定数据进一步优化VLM和LLM,以提高精度并减少虚假信息。然而,像其他新兴技术一样,管理模型的复杂性、协调多样的模态以及制定统一的评估指标仍然存在障碍。
本文由NOMIC为OBELICS、HuggingFace M4为IDEFICS、Charles Bensimon为Gradio以及Amazon Polly为TTS提供帮助。
在本篇文章中,我们将使用Amazon SageMaker JumpStart和现代生成式人工智能模型一起探索VLP原型技术的技术细微差别。通过多轮对话,我们突出了面向指令的零样本和少样本视觉语言处理的能力,强调了其多样性,并旨在吸引更广泛的多模态社区的兴趣。演示实现代码可在以下GitHub存储库中找到。
解决方案概述
所提出的VLP解决方案将一套先进的生成式人工智能模块整合到一起,以产生准确的多模态输出。体系结构的核心是精调的VLM和LLM,两者在解码视觉和文本数据流方面都起着重要作用。TGI框架是模型推理层的基础,提供RESTful API,用于稳健地集成和轻松访问。为了补充我们的听觉数据处理,Whisper ASR也配备了RESTful API,可以实现流畅的语音转文字转换。在解决像图像到文本分割这样的复杂挑战时,我们使用容器化的Grounded Segment Anything模块,与Grounded DINO和Segment Anything Model(SAM)机制协同工作,进行基于文本的目标检测和分割。系统还使用DistilBERT进行进一步的优化,优化我们的对话引导的多类别分类过程。LangChain处理流水线协调这些组件,它是一种精密机制,能够剖析文本或语音输入,区分用户意图,并有条理地将子任务分配给相关服务。这些操作的综合产生了聚合输出,提供精准而具有环境意识的多模态答案。
以下图示展示了我们对话引导的VLP解决方案的体系结构。
文本生成推理
文本生成推理(Text Generation Inference,TGI)是Hugging Face开发的开源工具包,用于部署LLMs以及VLMs进行推理。它利用张量并行性、模型并行性和动态批处理等功能,实现高性能的文本生成,支持一些领先的开源LLMs,如Falcon和Llama V2,以及IDEFICS等VLMs。通过在Amazon SageMaker上使用最新的Hugging Face LLM模块,AWS客户现在可以利用SageMaker深度学习容器(DLCs)的强大功能。这样就可以通过预构建的SageMaker DLCs支持TGI,实现LLMs的无缝部署。这种推理设置不仅具有出色的性能,还消除了管理繁重的GPU基础架构的需求。此外,您还可以从先进的功能中受益,如推理端点的自动扩展、增强的安全性和内置的模型监控。
TGI提供的文本生成速度比传统推理方法快100倍,并且能有效地处理增加的请求。其设计确保与各种LLM兼容,并且作为开源项目,为技术社区提供了先进功能的民主化。 TGI的多功能性延伸到各个领域,可以增强聊天机器人、改善机器翻译、总结文本,并生成各种内容,从诗歌到代码。因此,TGI成为应对文本生成挑战的综合解决方案。TGI是使用Python实现的,并使用PyTorch框架。它是开源的,可在GitHub上获得。它还支持PEFT与QLoRA,以实现更快的性能和对生成的文本属性进行逻辑扭曲的控制,例如确定其长度和多样性,而不修改底层模型。
您可以直接从以下 Dockerfile 构建定制的TGI Docker容器,然后将容器映像推送到亚马逊弹性容器注册表( ECR)进行推断部署。请参阅以下代码:
%%sh #定义docker图像名称和容器的Amazon资源名称在ECRcontainer_name =“tgi1.03”region =`aws configure get region`account =`aws sts get-caller-identity -query“ Account”-output text`full_name =“$ {account}。dkr.ecr。 $ {region}。amazonaws.com / $ {container_name}:latest”#从ECR获取登录命令并直接执行它aws ecr get-login-password --region $ {region} | docker login --username AWS \ --password-stdin $ {account}。dkr.ecr。 $ {region}。amazonaws.com#在本地构建TGI docker映像docker build . -f Dockerfile -t $ {container_name}docker tag $ {container_name} $ {full_name}docker push $ {full_name}
TGI的LLM推理
本文中的VLP解决方案与LangChain并排使用LLM,利用思维链(CoT)方法来实现更准确的意图分类。 CoT处理查询以确定意图并触发相关子任务以实现查询目标。Llama-2-7b-chat-hf(协议许可)是Llama-2系列的简化版本,专为对话环境设计。 Llama-2-7b-chat-hf的推断由TGI容器映像驱动,使其作为启用API的服务可用。
建议在Llama-2-7b-chat-hf推断中使用g5.2xlarge(24G VRAM)以实现最佳性能。对于需要更强大的LLM的应用程序,Llama-v2-13b模型与g5.12xlarge(96G VRAM)实例非常匹配。对于Llama-2-70b模型,可以考虑使用GPU [2xlarge] 2x Nvidia A100利用bitsandbytes量化或使用g5.48xlarge。值得注意的是,使用bitsandbytes量化可以将所需的推断GPU VRAM减少50%。
您可以使用早期详细介绍的TGI容器映像与SageMaker DLC一起部署Llama-2-7b-chat-hf进行推断(请参阅以下代码)。或者,您可以使用Docker容器在g5.2xlarge实例上快速搭建本地推断以进行概念验证。
import jsonfrom time import gmtime, strftimefrom sagemaker.huggingface import get_huggingface_llm_image_urifrom sagemaker.huggingface import HuggingFaceModelfrom sagemaker import get_execution_role# 先决条件:创建唯一模型名称model_name ='Llama-7b-chat-hf'+ strftime("%Y-%m-%d-%H-%M-%S", gmtime())# 检索SageMaker预构建的DLC TGI v1.03的llm图像uri tgi_image_ecr_uri = get_huggingface_llm_image_uri("huggingface", version ="1.0.3")# 定义模型和端点配置参数hf_config = {'HF_MODEL_ID': "meta-research/Llama-2-7b-chat-hf",#与Hugging Face Hub上的model_id匹配'SM_NUM_GPUS':json.dumps(number_of_gpu),'MAX_TOTAL_TOKENS':json.dumps(1024),“HF_MODEL_QUANTIZE”:“bitsandbytes”#使用量化要求较小的vram,如果不需要,请进行注释。 }# 使用SageMaker预构建的DLC TGI映像urism_null_model = HuggingFaceModel(role = get_execution_role(),image_uri = TGI_image_ecr_uri,env = hf_config)# 部署模型sm_llm_model = sm_null_model.deploy(initial_instance_count = 1,instance_type = "ml.g5.2xlarge",container_startup_health_check_timeout = 300,# in sec。允许5分钟加载模型)#定义推断负载prompt = "< | prompter |&gt;如何为生成式AI项目选择正确的LLM?&lt; | endoftext |&gt;&lt; | assistant |&gt;“#llm的超参数payload = {“ inputs”:prompt,“ parameters”:{“ best_of”:1,“ decoder_input_details”:true,“ details”:true, “do_sample”:true, “max_new_tokens”:20, “repetition_penalty”:1.03, “return_full_text”:false, “seed”:null, “stop”:[“摄影师”],“ temperature”:0.5, “top_k”:10, “top_p”:0.95,“截断”:null,“典型”:0.95,“水印”:true}, “stream”:false}#发送到端点的请求response = llm.predict(payload)
精细调整和定制您的LLM
SageMaker JumpStart提供了许多笔记本样本,演示了参数高效微调(PEFT)的使用,包括用于训练和微调LLM的QLoRA。QLoRA将预训练模型权重保持在静态状态,并在Transformer结构的每一层中引入可训练的秩分解矩阵。这种方法显著减少了下游任务所需的可训练参数的数量。
另外,您还可以探索无需设置奖励模型、在微调过程中从LLM获取样本或进行广泛超参数调整的Direct Preference Optimization (DPO)。最近的研究表明,DPO的微调在管理情感生成方面超越了RLHF,并提高了摘要和单次对话回复的质量,同时设置和教育过程相当简单。 DPO训练过程有三个主要步骤(请参阅GitHub仓库获取详细信息):
- 对预训练的基础LLM进行监督微调,创建微调后的LLM。
- 使用微调模型运行DPO训练器,创建强化学习模型。
- 将DPO中的适配器合并到基础LLM模型中进行文本生成推断。
您可以使用TGI容器映像部署合并模型以进行推断。
视觉语言模型
视觉语言模型(VLM)将视觉和语言模态相结合,已经显示出在泛化能力方面的提升,可实现各种使用案例,包括零-shot提示或少量-shot提示与说明。 VLM通常由三个关键要素组成:图像编码器、文本编码器和从这两个编码器中融合信息的策略。这些关键要素是紧密耦合在一起的,因为损失函数是围绕模型架构和学习策略设计的。许多最先进的VLM使用CLIP/ViT(如OpenCLIP)和LLM(如Llama-v1),并在多个公开可用数据集(如Wikipedia、LAION和Public Multimodal Dataset)上进行训练。
本演示使用了IDEFICS-9b-instruct模型,这是由HuggingFaceM4开发的预训练模型,是IDEFICS-9b的微调版本,采用了Flamingo中确定的训练过程,该过程将两个预训练模型(laion/CLIP-ViT-H-14-laion2B-s32B-b79K和huggyllama/llama-7b)与修改后的Transformer块结合。IDEFICS-9b在OBELIC、Wikipedia、LAION和PMD多模态数据集上训练,共有1500亿个标记和1.582亿个分辨率为224×224的图像。IDEFICS-9b基于Llama-7b,具有131万的有效批次大小。然后,使用生成AI进行数据增强,通过解冻所有参数(视觉编码器、语言模型、交叉注意力)对IDEFICS-9b-instruct进行微调,创建了680万个多模态指令数据集。微调数据集包括带有以下采样比例的预训练数据:图像-文本对的5.1%,OBELICS多模态Web文档的30.7%。
培训软件构建在Hugging Face Transformers和Accelerate之上,使用DeepSpeed ZeRO-3进行训练,以及WebDataset和Image2DataSets进行数据加载。IDEFICS-9b的预训练在128个Nvidia A100 GPU上完成了350小时,而IDEFICS-9b-instruct的微调在128个Nvidia A100 GPU上花费了70小时,均在AWS p4.24xlarge实例上进行。
使用SageMaker,您可以无缝地在g5.2xlarge实例上部署IDEFICS-9b-instruct进行推断任务。以下代码片段示例了如何启动一个定制的深度学习本地容器,集成了自定义的TGI Docker映像:
%%shllm_model='HuggingFaceM4/idefics-9b-instruct'docker_rt_name='idefics-9b-instruct'docker_image_name='tgi1.03'docker run --gpus="1,2,3,4" --shm-size 20g -p 8080:80 --restart unless-stopped --name ${docker_rt_name} ${docker_image_name} --model-id ${llm_model}# 使用curl测试LLM APIcurl -X 'POST' \ 'http://<主机名或IP地址>:8080/' \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "inputs": "用户:这张图片是哪个设备拍摄的?请解释这张图片的主要临床目的。您能根据这张图片写一份放射学报告吗?<end_of_utterance>", \
"parameters": { "best_of": 1, "decoder_input_details": true, \ "details": true, "do_sample": true, "max_new_tokens": 20, \ "repetition_penalty": 1.03, "return_full_text": false, \ "seed": null, "stop": [ "摄影师" ], \ "temperature": 0.5, "top_k": 10, "top_p": 0.95, \ "truncate": null, "typical_p": 0.95, "watermark": true }, \ "stream": false \ }'
您可以使用自己领域特定的数据和指令来微调IDEFICS或其他VLM。有关多模态数据集准备,请参阅以下README,有关详细信息,请参阅微调脚本。
带有思维链的意图分类
一张图片胜过千言万语,因此VLM需要指导来从给定的图片和问题生成准确的标题。我们可以使用少量示例进行提示,以实现上下文学习,在提示中提供演示,以引导模型取得更好的性能。演示作为条件为后续示例提供了指导,我们希望模型能够生成响应。
标准的少量示例提示对许多任务都很有效,但对于更复杂的推理任务来说,它仍然不是一种完美的技术。少量示例提示模板不足以获得可靠的响应。如果我们将问题拆分为步骤并向模型演示这些步骤,那可能会有所帮助。最近,思维链(CoT)提示已经流行起来,用于处理更复杂的算术、常识和符号推理任务。
CoT通过使用LLMs和”让我们逐步考虑”的提示,一次生成说明链中的推理链,从而消除了手动工作。然而,这个自动化过程仍可能在生成的链中出现错误。为了减轻错误所带来的影响,演示的多样性很重要。本文提出了Auto-CoT,它具有多样性的样本问题并生成推理链以构建示例。CoT包括两个主要阶段:
- 问题聚类-将给定数据集的问题分成几个簇
- 演示抽样-从每个簇中选择一个代表性问题,并使用零样本CoT和简单的启发式算法生成其推理链
请参阅以下代码片段:
from langchain.llms import HuggingFaceTextGenInferencefrom langchain import PromptTemplate, LLMChaininference_server_url_local = <您本地llm的url:端口>llm_local = HuggingFaceTextGenInference( inference_server_url=inference_server_url_local, max_new_tokens=512, top_k=10, top_p=0.95, typical_p=0.95, temperature=0.1, repetition_penalty=1.05, template = """使用以下上下文片段回答结尾的问题。如果您不知道答案,只需说您不知道,不要试图凭空编造答案。使用十分之五的最大数量并尽量保持答案的细微差别。详细列出所有可行的子任务步骤。请注意避免使用可能重复之前查询的措辞。这将有助于获得准确和详细的答案。为了清晰起见,请避免重复提问。问题:{question}答案:了解问题的意图,然后将{question}拆分为子任务步骤。"""prompt = PromptTemplate( template=template, input_variables= ["question"])llm_chain_local = LLMChain(prompt=prompt, llm=llm_local)llm_chain_local("您能描述这张图片的性质吗?您认为它是真实的吗?")
自动语音识别
VLP解决方案集成了OpenAI的Whisper自动语音识别(ASR)模型,用于处理音频查询。借助SageMaker JumpStart的模板,可以轻松部署Whisper。SageMaker JumpStart以其简单的设置、高性能、可扩展性和可靠性而闻名,非常适合开发人员打造卓越的语音驱动应用程序。以下GitHub repo演示了如何利用SageMaker实时推理端点对Whisper进行微调和托管,展示了SageMaker托管和生成模型之间的协同效应。
或者,您可以直接从GitHub下载由ahmetoner开发的Dockerfile.gpu,其中包含预配置的RESTful API。然后,您可以构建Docker映像,并在配备GPU的Amazon 弹性计算云(EC2)实例上运行容器,以快速验证概念。请参阅以下代码:
%%shdocker_iamge_name = 'whisper-asr-webservice-gpu'docker build -f Dockerfile.gpu -t ${docker_iamge_nam}docker run -d --gpus all -p 8083:9000 --restart unless-stopped -e ASR_MODEL=base ${docker_iamge_nam}curl -X 'POST' \ 'http://<asr_api_hostname>:<port>/asr?task=transcribe&encode=true&output=txt' \ -H 'accept: application/json' \ -H 'Content-Type: multipart/form-data' \ -F 'audio_file=@dgvlp_3_5.mp3;type=audio/mpeg'
在提供的示例中,选择端口8083来托管Whisper API,并激活入站网络安全规则。要进行测试,请将网络浏览器指向http://<IP_or_hostname>:8083/docs
并启动POST请求以测试ASR端点的连接。作为替代方案,您可以运行给定的命令或使用whisper-live模块来验证API连接。
!pip install whisper-livefrom whisper_live.client import TranscriptionClientclient = TranscriptionClient("<whisper_hostname_or_IP>", 8083, is_multilingual=True, lang="zh", translate=True)client(audio_file_path) # Use sudio fileclient() # Use microphone for transcribe
多类文本分类和关键词提取
多类分类在以文本提示驱动的对象检测和分割中扮演着重要角色。 distilbert-base-uncased-finetuned-sst-2-english模型是Hugging Face优化了DistilBERT-base-uncased并在Stanford情感树库(SST2)数据集上进行了优化的精细化检查点。该模型在开发集上实现了91.3%的准确性,而其对应的bert-base-uncased则有92.7%的准确性。Hugging Face Hub提供了对1000多个预训练文本分类模型的访问。对于那些寻求更高精度的用户,SageMaker JumpStart提供了模板以使用自定义注释数据集对DistilBERT进行微调,以进行更具针对性的分类任务。
import torchfrom transformers import pipelinedef mclass(text_prompt, top_k=3, topics = ['创建遮罩', '对象检测', '修复', '分割', '放大', '用另一个图像创建图像', '从文本生成图像'], model='distilbert-base-uncased-finetuned-sst-2-english'): device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') # 定义德语假设模板以及可能的蕴涵/矛盾候选人 template_de = '主题是 {}' #来自Hugging Face的管道抽象 pipe = pipeline(task='zero-shot-classification', model=model, tokenizer=model, device=device) # 使用测试用例运行管道 prediction = pipe(text_prompt, topics, hypothesis_template=template_de) # 预测的前3个主题在零-shot范围内 return zip(prediction['labels'][0:top_k], prediction['scores'][0:top_k])top_3_intend = mclass(text_prompt=user_prompt_str, topics=['其他', '创建图像遮罩', '图像分割'], top_k=3)
关键词提取过程采用了KeyBERT模块,这是一种简化且用户友好的方法,利用BERT嵌入生成与文档密切相关的关键词和关键短语,这里是指查询中指定的对象:
# 关键词提取
from keybert import KeyBERT
kw_model = KeyBERT()
words_list = kw_model.extract_keywords(docs=<user_prompt_str>, keyphrase_ngram_range=(1,3))
基于文本提示的目标检测和分类
VLP解决方案采用对话引导的目标检测和分割,通过分析文本的语义含义并从文本提示中识别行为和对象来进行。Grounded-SAM是IDEA-Research创建的开源软件包,用于检测和分割给定图像中的任何物体。它结合了Grounding DINO和Segment Anything的优势,构建了一个非常强大的管道来解决复杂问题。
以下图示说明了Grounded-SAM如何通过理解文本输入来检测对象并进行实例分割。
SAM作为一种强大的分割模型,虽然需要提示(如边界框或点)才能产生高质量的物体蒙版。Grounding DINO作为一种零样本检测器表现出色,可以使用自由形式的文本提示智能创建高质量的框和标签。将这两个模型结合起来,就可以通过纯文本输入来检测和分割任何对象。Python实用脚本dino_sam_inpainting.py用于集成Grounded-SAM方法:
!pip install git+https://github.com/facebookresearch/segment-anything.git
import dino_sam_inpainting as D
def dino_sam(image_path, text_prompt, text_threshold=0.4, box_threshold=0.5, output_dir='/temp/gradio/outputs'):
config_file = 'GroundingDINO/groundingdino/config/GroundingDINO_SwinT_OGC.py' # 更改模型配置文件的路径
grounded_checkpoint = './models/groundingdino_swint_ogc.pth' # 更改模型的路径
sam_checkpoint = './models/sam_vit_h_4b8939.pth'
sam_hq_checkpoint = '' #如果使用高质量模型,如sam_hq_vit_h.pth
use_sam_hq = ''
output_dir = '/tmp/gradio/outputs'
device = 'cuda'
# 创建目录
os.makedirs(output_dir, exist_ok=True)
# 加载图像
image_pil, image = D.load_image(image_path)
# 加载模型
model = D.load_model(config_file, grounded_checkpoint, device=device)
output_file_name = f'{format(os.path.basename(image_path))}'
# 可视化原始图像
image_pil.save(os.path.join(output_dir, output_file_name))
# 运行grounding dino模型
boxes_filt, pred_phrases = D.get_grounding_output(
model, image, text_prompt, box_threshold, text_threshold, device=device
)
# 初始化SAM
if use_sam_hq:
predictor = D.SamPredictor(D.build_sam_hq(checkpoint=sam_hq_checkpoint).to(device))
else:
predictor = D.SamPredictor(D.build_sam(checkpoint=sam_checkpoint).to(device))
image = cv2.imread(image_path)
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
predictor.set_image(image)
size = image_pil.size
H, W = size[1], size[0]
for i in range(boxes_filt.size(0)):
boxes_filt[i] = boxes_filt[i] * torch.Tensor([W, H, W, H])
boxes_filt[i][:2] -= boxes_filt[i][2:] / 2
boxes_filt[i][2:] += boxes_filt[i][:2]
boxes_filt = boxes_filt.cpu()
transformed_boxes = predictor.transform.apply_boxes_torch(boxes_filt, image.shape[:2]).to(device)
masks, _, _ = predictor.predict_torch(
point_coords = None,
point_labels = None,
boxes = transformed_boxes.to(device),
multimask_output = False,
)
# 绘制输出图像
plt.figure(figsize=(10, 10))
plt.imshow(image)
for mask in masks:
D.show_mask(mask.cpu().numpy(), plt.gca(), random_color=True)
for box, label in zip(boxes_filt, pred_phrases):
D.show_box(box.numpy(), plt.gca(), label)
output_file_name = f'{format(os.path.basename(image_path))}'
plt.axis('off')
plt.savefig(
os.path.join(output_dir, f'grounded_sam_{output_file_name}'),
bbox_inches="tight", dpi=300, pad_inches=0.0
)
D.save_mask_data(output_dir, masks, boxes_filt, pred_phrases)
return f'grounded_sam_{output_file_name}'
filename = dino_sam(image_path=<image_path_str>, text_prompt=<object_name_str>, output_dir=<output_image_filename_path_str>, box_threshold=0.5, text_threshold=0.55)
您可以选择使用HQ-SAM来升级高质量的零样本分割。请参考以下论文和GitHub上的代码示例获取更多详细信息。
VLP处理流程
VLP处理流程的主要目标是结合不同模型的优势,创建一个专门针对VLP的复杂工作流程。重要的是要强调这个设置优先考虑了在视觉、文本和语音领域整合顶级模型的集成。流程的每个部分都是模块化的,方便独立使用或组合操作。此外,设计确保了灵活性,能够替换掉未来更先进的模型组件,同时支持多线程和可靠实现的错误处理。
下图说明了VLP流程的数据流和服务组件。
在我们对VLP流程的探索中,我们设计了一个可以处理来自开放文本格式的文本提示和来自麦克风的非正式语音输入的流程。音频处理由Whisper完成,可以进行多语言语音识别和翻译。转录的文本随后被引导到一个意图分类模块,该模块辨别提示的语义本质。这与由LangChain驱动的CoT引擎协同工作,将主要意图分解为更细的子任务,以获取更详细的信息检索和生成。如果根据输入推断出需要进行图像处理,则流程开始进行关键词提取,并通过交叉参考原始图像中检测到的对象来选择前N个关键词。随后,这些关键词被传递给Grounded-SAM引擎,该引擎生成边界框。然后,这些边界框被提供给SAM模型,该模型创建精确的分割蒙版,定位原始图像中的每个唯一对象实例。最后一步涉及将蒙版和边界框叠加到原始图像上,生成作为多模式输出呈现的处理图像。
当输入查询需要解释一张图片时,流程将启动LLM来组织子任务并通过有针对性的目标对查询进行改进。随后,结果被发送到VLM API,并携带少样本指令、输入图像的URL和重新表述的文本提示。作为响应,VLM提供了文本输出。VLP流程可以使用基于Python的工作流程管道或其他编排工具进行实现。这些流程通过将一系列复杂模型的顺序链接在一起运行,以结构化的建模程序连续完成。流程为演示目的集成了Gradio引擎:
def vlp_text_pipeline(str input_text, str original_image_path, chat_history): intent_class = intent_classification(input_text) key_words = keyword_extraction(input_text) image_caption = vlm(input_text, original_image_path) chat_history.append(image_caption) if intent_class in {supported intents}: object_bounding_box = object_detection(intent_class, key_words, original_image_path) mask_image_path = image_segmentation(object_bounding_box, key_words, original_image_path) chat_history.append(mask_image_path) return chat_history def vlp_voice_pipeline(str audio_file_path, str original_image_path, chat_history): asr_text = whisper_transcrib(audio_file_path) chat_history.append(asr_text, original_image_path, chat_history) return chat_history chat_history = map(vlp_pipelines, input_text, original_image_path, chat_history) \ if (audio_file_path is None) \ else map(vlp_voice_pipelines, original_image_path, chat_history)
限制
使用预训练的VLM模型进行VLP已经显示出对图像理解的潜在潜力。除了基于语言的目标检测和分割外,VLP还可以生成具有合理质量的有用输出。然而,VLP仍然存在结果不一致、缺失图片细节甚至可能出现虚构情况的问题。此外,模型可能会产生事实不正确的文本,不能依赖它们来产生事实准确的信息。由于没有一个被引用的预训练的VLM、SAM或LLM模型是针对特定领域的生产级应用进行训练或微调的,因此该解决方案不适用于可能影响生计或造成实质损失的关键应用。
通过提示工程,IDEFICS模型有时可以在文本提示后识别出额外的细节;然而,结果并不一致和可靠。它坚持保持不准确性,甚至在用户在对话过程中强调错误时也可能无法或不愿意进行更正。通过集成Swin-ViT将骨干模型改进并与基于CNN的模型(如DualToken-ViT)融合,并使用更先进的模型(如Llama-v2)进行训练,可能可以解决其中一些限制。
下一步
VLP解决方案正准备取得显著进展。展望未来,有几个关键机会可以推进VLP解决方案:
- 优先整合动态提示说明和少样本学习提示。这些改进将使AI反馈更准确。
- 意图分类团队应重点努力改进分类器,以从开放提示中捕捉到微妙的领域特定意图。能够理解精确的用户意图将至关重要。
- 在推理流程中实施一个思维树模型。这种结构将允许明确的推理步骤完成子任务。
- 在领先的模型上进行微调计划。通过微调来适应关键行业和用例的VLM、LLM和SAM模型将至关重要。
鸣谢
作者对Vivek Madan和Ashish Rawat在这篇文章中提供的有见地的反馈和审查表示衷心的感谢。