SmolVLA快速原型开发:在ComfyUI中集成视觉语言模型工作流

SmolVLA快速原型开发:在ComfyUI中集成视觉语言模型工作流 SmolVLA快速原型开发在ComfyUI中集成视觉语言模型工作流你是不是也遇到过这样的场景手头有一个很酷的视觉语言模型比如能看图说话的SmolVLA想快速做个应用原型试试效果。但一想到要写代码、搭环境、处理API调用头就大了。特别是对于那些不常写代码的设计师、产品经理或者只是想快速验证想法的人来说这个门槛有点高。别担心今天咱们就来解决这个问题。我要介绍一种特别简单的方法让你不用写复杂的代码就能把SmolVLA这样的模型能力用起来。这个方法就是通过ComfyUI——一个现在特别流行的图形化AI工作流工具。简单来说你可以把ComfyUI想象成一个乐高积木平台。SmolVLA模型是一块有特殊功能的积木比如能识别图片内容的积木而ComfyUI就是那个底板。我们今天要做的就是亲手做一个能连接SmolVLA的“自定义积木”然后把它插到底板上。之后你只需要用鼠标拖拽几下连几条线就能让模型处理图片和文字了。听起来是不是挺有意思的咱们这就开始。1. 准备工作你需要的东西在动手搭建之前咱们先看看需要准备些什么。放心东西不多也不复杂。首先你得有一个能正常运行的ComfyUI环境。如果你还没装过去它的官方GitHub页面按照说明下载安装就行。现在很多一键安装包做得都不错基本上点几下就能装好。其次你需要能访问SmolVLA模型。通常这类模型会提供一个API接口。也就是说你给它发送一张图片和一段文字描述或问题它就能返回分析结果。为了教程的通用性我们假设这个API的调用地址是https://api.example-smolvla.com/v1/analyze请注意这是示例地址你需要替换成你实际使用的API端点。调用时一般需要以POST方式发送一个JSON数据包。最后你需要准备一张用来测试的图片以及一个你想问的问题。比如你可以找一张有小猫在沙发上的照片然后问“图片里的小猫是什么颜色的”准备好这些咱们就可以进入ComfyUI开始制作属于我们自己的SmolVLA节点了。2. 第一步在ComfyUI中创建自定义节点打开你的ComfyUI。它的界面主要分为三块左边是节点选择区中间是画布工作区右边是参数调整和队列管理区。我们所有的操作都会在画布上完成。但首先我们需要创建一个能代表SmolVLA功能的“节点”。ComfyUI允许我们通过编写简单的Python脚本来创建自定义节点。找到ComfyUI的安装目录里面会有一个叫custom_nodes的文件夹。所有第三方或自己开发的节点都放在这里。在custom_nodes文件夹里新建一个文件夹名字可以叫SmolVLA_Node这样好区分。在这个新文件夹里创建一个Python文件比如叫smolvla_node.py。现在用你喜欢的代码编辑器打开这个smolvla_node.py文件。我们将从这里开始编写节点的核心逻辑。3. 第二步编写SmolVLA节点的核心逻辑节点的代码结构其实很清晰。我们需要定义一个类这个类告诉ComfyUI我这个节点需要什么输入比如图片、文本能产生什么输出比如分析后的文本以及具体的处理函数是什么。下面是一个最基础的代码框架你可以先看看我们再来一步步解释import torch import numpy as np from PIL import Image import requests import json import io import folder_paths import comfy.utils class SmolVLAAnalyzer: classmethod def INPUT_TYPES(cls): return { required: { image: (IMAGE,), prompt: (STRING, {multiline: True, default: 描述这张图片的内容。}), api_endpoint: (STRING, {default: https://api.example-smolvla.com/v1/analyze}), }, } RETURN_TYPES (STRING,) RETURN_NAMES (analysis_result,) FUNCTION analyze_image CATEGORY SmolVLA def analyze_image(self, image, prompt, api_endpoint): # 1. 将ComfyUI的图片张量转换为PIL Image image_np image[0].cpu().numpy() # 取批次中的第一张图 image_np (image_np * 255).astype(np.uint8) if image_np.shape[2] 4: # 如果有Alpha通道去掉 image_np image_np[:, :, :3] pil_image Image.fromarray(image_np) # 2. 将图片转换为字节流准备上传 img_byte_arr io.BytesIO() pil_image.save(img_byte_arr, formatPNG) img_byte_arr img_byte_arr.getvalue() # 3. 准备调用API的数据 # 这里假设API接受form-data格式包含图片文件和文本prompt files {image: (image.png, img_byte_arr, image/png)} data {prompt: prompt} # 4. 发送请求到SmolVLA API try: response requests.post(api_endpoint, filesfiles, datadata) response.raise_for_status() # 检查请求是否成功 result response.json() # 假设API返回的JSON中分析结果在result或analysis字段里 analysis_text result.get(result, result.get(analysis, No result found.)) except requests.exceptions.RequestException as e: analysis_text fAPI请求失败: {e} except json.JSONDecodeError: analysis_text API返回了非JSON格式的数据。 # 5. 返回分析结果 return (analysis_text,)我来解释一下这段代码的关键部分INPUT_TYPES这里定义了节点的输入参数。我们定义了三个image类型是IMAGE这是ComfyUI内置的图片数据类型。prompt类型是STRING我们设置它为多行文本输入并给了个默认提示词。api_endpoint类型是STRING让你可以自由填写实际的API地址。RETURN_TYPES和RETURN_NAMES定义了节点的输出。我们只输出一个字符串类型的结果并给它起名叫analysis_result。FUNCTION指定当节点执行时调用哪个函数。这里就是analyze_image函数。CATEGORY这个节点在ComfyUI节点列表里会被分到哪个类别下方便查找。最重要的analyze_image函数做了以下几件事图片格式转换把ComfyUI内部的图片数据转换成标准的PIL图片格式再变成字节流方便通过网络发送。组装请求按照假设的API格式把图片文件和文字提示词打包。调用API使用requests库把数据发送到SmolVLA的服务端。处理结果收到回复后解析JSON提取出我们需要的文本分析结果。返回结果将结果返回给ComfyUI以便后续节点使用。保存这个文件。现在你的自定义节点文件就准备好了。4. 第三步在ComfyUI中加载并使用节点代码写好了怎么让ComfyUI认识我们这个新节点呢重启ComfyUI。通常ComfyUI会在启动时自动扫描custom_nodes文件夹里的所有Python脚本。重启后在节点选择区左侧你应该能看到多了一个叫“SmolVLA”的类别。点开它里面就躺着我们刚刚创建的“SmolVLAAnalyzer”节点。现在让我们来搭一个最简单的测试工作流从节点列表里拖一个“Load Image”节点到画布上用它加载你准备好的测试图片。拖一个“SmolVLAAnalyzer”节点到画布上。用鼠标连线将“Load Image”节点的IMAGE输出连接到“SmolVLAAnalyzer”节点的image输入。在“SmolVLAAnalyzer”节点的prompt输入框里写上你的问题比如“图片里的小猫是什么颜色的”。关键一步在api_endpoint输入框里务必填写你真实的、可用的SmolVLA API地址替换掉代码中的示例地址。最后再拖一个“Preview Text”或“Text Display”这样的节点ComfyUI可能自带或需要安装文本预览节点连接到“SmolVLAAnalyzer”节点的输出上用于显示结果。你的工作流看起来应该像一条简单的链加载图片 - SmolVLA分析 - 显示文本结果。点击“Queue Prompt”按钮运行工作流。如果一切顺利几秒钟后你就能在文本预览节点中看到SmolVLA模型对图片的分析回答了5. 让节点更好用一些实用技巧第一次成功调用总是最令人兴奋的。但为了让这个节点更实用、更强大我们还可以给它添加一些“技能”。技巧一增加模型参数调节有些视觉语言模型允许你调节一些参数比如生成答案的“创造性”temperature或者答案的最大长度。我们可以在节点上增加这些输入框让控制更精细。只需要在INPUT_TYPES的required或optional字段里添加新的参数定义即可。技巧二处理不同类型的API响应不同的模型API返回的数据格式可能不同。我们可以让代码更健壮一些尝试从多个可能的字段名如answer,text,output中提取结果避免因为字段名不对而失败。技巧三添加错误处理和状态提示在网络请求中什么都可能发生。我们可以在节点上增加一个额外的输出比如一个状态码或信息字符串来明确告诉用户这次调用是成功还是失败以及失败的原因是什么。这在你调试复杂工作流时会非常有用。技巧四将节点集成到更大的工作流中ComfyUI的强大之处在于连接。SmolVLA节点输出的文本可以立刻作为输入送给一个文本生成图像的节点。想象一下你上传一张凌乱房间的图片问SmolVLA“房间里有什么物品”得到文本描述后直接送给另一个AI让它生成一张“整理后的房间”概念图。这种多模型串联的创造力是无限的。6. 总结好了走到这一步你已经成功地把一个需要通过代码调用的视觉语言模型变成了ComfyUI里一个可以随意拖拽、连接的图形化节点。这个过程本身并不复杂核心就是写一个中间人脚本负责把ComfyUI的数据“翻译”成API能听懂的语言再把API的回复“翻译”回ComfyUI能显示的结果。这种方法最大的好处是降低了原型开发的门槛。你不需要每次都从头写一个Python脚本不需要处理复杂的异步或并发问题。在ComfyUI的可视化界面里你可以像搭积木一样快速尝试不同的模型组合和流程。比如把图片生成、图片分析、文本总结这几个节点串起来一个自动化的内容创作流水线就有了雏形。当然今天这个节点只是一个起点。在实际使用中你可能会遇到API格式不同、需要认证密钥、或者想要批量处理图片等情况。但万变不离其宗你都可以通过修改我们编写的那个Python文件来适应。希望这个教程能给你开一扇门让你更轻松地把各种有趣的AI模型能力整合起来玩出更多新花样。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。