Qwen3-4B模型与ComfyUI工作流集成:可视化AI应用搭建教程

你是不是也对大模型的能力感到好奇,但又觉得写代码调用API太麻烦?或者,你想把大模型的能力和你熟悉的图像生成、视频处理工作流结合起来,却不知道从何下手?

今天,我们就来解决这个问题。我将带你一步步,把部署在星图GPU平台上的Qwen3-4B模型,无缝接入到ComfyUI这个强大的可视化节点界面里。这样一来,你不需要写一行复杂的代码,只需要像搭积木一样拖拽节点、连接线条,就能轻松调用大模型来帮你生成文本、编写代码,甚至把它作为你复杂AI工作流中的一个智能环节。

整个过程比你想象的要简单。我们不需要去修改ComfyUI的核心代码,而是通过一个非常巧妙的方式——创建自定义节点(Custom Nodes)来桥接。下面,就让我们开始这场从零开始的可视化AI应用搭建之旅。

1. 准备工作:理清思路与获取资源

在开始动手之前,我们先花几分钟把整个事情的逻辑理清楚。这能帮你更好地理解每一步在做什么,而不是机械地跟着操作。

核心思路是什么? ComfyUI本身是一个基于节点的流程编排工具,它擅长处理图像、视频类的数据流。而Qwen3-4B是一个文本大模型,它通过HTTP API提供服务。我们的目标,就是在ComfyUI里创建一个“特殊节点”。这个节点能接收你在ComfyUI界面里输入的文本,然后悄悄地去调用远处星图平台上的Qwen3-4B API,拿到生成的文本结果后,再传回ComfyUI的流程中,供后续节点使用。

你需要准备什么?

  1. 一个已经部署好的Qwen3-4B模型实例:假设你已经在星图GPU平台上成功部署了Qwen3-4B,并且知道它的API访问地址(例如:http://your-server-ip:port/v1/chat/completions)和可能的API Key。
  2. 一个安装好的ComfyUI环境:本地或服务器上的都可以。确保它能正常运行。
  3. 基础的文件编辑能力:我们会需要创建和修改几个Python文件。

思路清晰了,资源也备齐了,我们就可以进入核心的动手环节了。

2. 第一步:创建你的第一个自定义文本节点

ComfyUI的魅力在于其可扩展性。我们在其custom_nodes目录下创建一个专属文件夹,作为我们所有Qwen3-4B相关节点的家。

首先,找到你的ComfyUI安装目录,进入custom_nodes文件夹。创建一个新的文件夹,名字可以直观一点,比如 qwen3_comfy_nodes

在这个文件夹里,我们将创建第一个也是最重要的文件:__init__.py。这个文件是Python包的标识,也是ComfyUI发现和加载我们节点的入口。

# 文件:qwen3_comfy_nodes/__init__.py

# 导入我们即将创建的节点类
from .qwen_text_generator import QwenTextGenerator

# 这是一个标准的ComfyUI节点注册字典
# key “QwenTextGenerator” 是节点在菜单中显示的名称
# value 是对应的节点类
NODE_CLASS_MAPPINGS = {
    “QwenTextGenerator”: QwenTextGenerator
}

# 这是节点在菜单中的显示名称,可以和类名不同,方便阅读
NODE_DISPLAY_NAME_MAPPINGS = {
    “QwenTextGenerator”: “Qwen 3-4B 文本生成器”
}

# 这个字典用于定义节点需要的前端Web组件,我们先留空
WEB_DIRECTORY = “./js”

__all__ = [‘NODE_CLASS_MAPPINGS’, ‘NODE_DISPLAY_NAME_MAPPINGS’, ‘WEB_DIRECTORY’]

这个文件很简单,它告诉ComfyUI:“嘿,我这里有一个叫 QwenTextGenerator 的节点,你把它加载到界面上吧,显示的名字叫 ‘Qwen 3-4B 文本生成器’。”

接下来,就是实现这个节点核心逻辑的文件 qwen_text_generator.py

# 文件:qwen3_comfy_nodes/qwen_text_generator.py

import comfy.sd # 通常用于获取模型信息,这里可能用不到,但导入以备不时之需
import comfy.utils # ComfyUI的工具函数
import folder_paths # 用于管理文件路径
import torch # 深度学习框架,虽然我们调用API,但保持环境一致性
import json # 用于处理API的JSON数据
import requests # 用于发送HTTP请求到我们的Qwen3-4B API
import asyncio # 异步处理,避免界面卡顿

# 从ComfyUI继承基础节点类
from comfy.sd import CLIP
from nodes import Loader

# 定义一个函数类别,方便在ComfyUI节点菜单中归类
class QwenTextGenerator:
    # 定义节点的类别,会在节点菜单的“qwen”分组下找到它
    @classmethod
    def INPUT_TYPES(cls):
        return {
            “required”: {
                # 这是一个多行文本输入框,用于输入提示词
                “prompt”: (“STRING”, {“multiline”: True, “default”: “请用Python写一个快速排序函数。”}),
                # 这是你的Qwen3-4B API的服务地址
                “api_url”: (“STRING”, {“default”: “http://127.0.0.1:8000/v1/chat/completions”}),
                # API Key,如果部署时设置了则需要
                “api_key”: (“STRING”, {“default”: “your-api-key-here”, “multiline”: False}),
                # 生成文本的最大长度
                “max_tokens”: (“INT”, {“default”: 512, “min”: 1, “max”: 4096}),
                # 控制生成随机性的温度参数
                “temperature”: (“FLOAT”, {“default”: 0.7, “min”: 0.0, “max”: 2.0, “step”: 0.1}),
            },
        }

    # 定义节点的返回值类型,这里我们输出一个字符串
    RETURN_TYPES = (“STRING”,)
    # 定义返回值的显示名称
    RETURN_NAMES = (“generated_text”,)
    # 定义节点在界面上的显示名称
    FUNCTION = “generate_text”
    # 定义节点类别,这会在节点浏览器中创建一个名为“qwen”的组
    CATEGORY = “qwen”

    # 节点的核心执行函数
    def generate_text(self, prompt, api_url, api_key, max_tokens, temperature):
        # 准备请求头,通常需要包含认证信息和内容类型
        headers = {
            “Content-Type”: “application/json”,
        }
        if api_key and api_key != “your-api-key-here”:
            headers[“Authorization”] = f“Bearer {api_key}”

        # 构建符合OpenAI API格式的请求数据
        # 注意:你需要根据你的Qwen3-4B API的实际要求调整这个结构
        payload = {
            “model”: “qwen3-4b”, # 模型名称,根据你的部署调整
            “messages”: [
                {“role”: “user”, “content”: prompt}
            ],
            “max_tokens”: max_tokens,
            “temperature”: temperature,
        }

        try:
            # 发送POST请求到API
            response = requests.post(api_url, headers=headers, json=payload, timeout=30)
            response.raise_for_status() # 如果状态码不是200,抛出异常
            result = response.json()

            # 解析响应,提取生成的文本内容
            # 这个路径需要根据你的API返回的实际JSON结构进行调整
            generated_text = result[‘choices’][0][‘message’][‘content’].strip()

        except requests.exceptions.RequestException as e:
            # 处理网络或请求错误
            generated_text = f“API请求失败: {e}”
        except (KeyError, json.JSONDecodeError) as e:
            # 处理响应解析错误
            generated_text = f“解析API响应失败: {e}。原始响应: {response.text[:200] if ‘response’ in locals() else ‘N/A’}”

        # 将生成的文本返回给ComfyUI工作流
        return (generated_text,)

保存这两个文件后,重启你的ComfyUI。如果一切正常,你应该能在节点浏览器的搜索框里输入“qwen”或者“Qwen”,找到我们刚刚创建的“Qwen 3-4B 文本生成器”节点。把它拖到画布上,连接上输入输出,填入你的API地址,点击“Queue Prompt”,就能看到生成的文本了!

3. 第二步:打造专属参数调节面板

上面的节点虽然能用,但所有参数都挤在一起,不够直观。ComfyUI支持我们为节点创建美观的Web界面组件。让我们来给它加一个专属的“控制面板”。

首先,在 qwen3_comfy_nodes 文件夹下创建一个 js 文件夹,然后在里面创建一个 qwen_widgets.js 文件。

// 文件:qwen3_comfy_nodes/js/qwen_widgets.js

// 这是一个简单的示例,为我们的节点添加一个说明性的标题栏
import { app } from “../../../scripts/app.js”;

// 扩展ComfyUI的节点Widget类型
const ext = {
    // 当ComfyUI创建节点时调用
    async beforeRegisterNodeDef(nodeType, nodeData, app) {
        // 只对我们自定义的节点生效
        if (nodeData.name === “QwenTextGenerator”) {
            // 保存原始的onNodeCreated函数
            const originalOnNodeCreated = nodeType.prototype.onNodeCreated;
            // 重写onNodeCreated,在节点创建后添加自定义元素
            nodeType.prototype.onNodeCreated = function () {
                // 先执行原始的函数
                const result = originalOnNodeCreated ? originalOnNodeCreated.apply(this, arguments) : undefined;

                // 在节点的widgets区域上方添加一个自定义的标题栏
                const header = document.createElement(“div”);
                header.style.cssText = `
                    background: linear-gradient(90deg, #4f46e5, #7c3aed);
                    color: white;
                    padding: 8px 12px;
                    margin-bottom: 10px;
                    border-radius: 6px;
                    font-weight: bold;
                    text-align: center;
                    font-size: 0.9em;
                `;
                header.textContent = “🚀 Qwen3-4B 文本生成”;
                // 找到widgets容器,将标题插入到最前面
                const widgets = this.widgets;
                if (widgets && widgets.length > 0) {
                    this.addDOMWidget(header, widgets[0].parentElement, true);
                }

                return result;
            };
        }
    },
};

// 将扩展注册到ComfyUI
app.registerExtension(ext);

为了让ComfyUI加载这个JS文件,我们需要修改 __init__.py,确保 WEB_DIRECTORY 路径正确。

# 文件:qwen3_comfy_nodes/__init__.py (更新部分)

# ... 前面的导入和映射不变 ...

# 确保路径指向我们创建的js文件夹
WEB_DIRECTORY = “./js”

# ... 后面的代码不变 ...

重启ComfyUI后,你会发现“Qwen 3-4B 文本生成器”节点顶部多了一个漂亮的紫色标题栏。这只是一个开始,你可以用类似的方法添加滑块、下拉菜单等更复杂的交互控件,让参数调节更加可视化。

4. 第三步:构建代码生成与审查工作流

有了基础的文本生成节点,我们就可以发挥ComfyUI工作流的优势,搭建更复杂的应用。比如,一个自动化的“代码生成与审查”流水线。

这个工作流的思路是:

  1. 节点A(需求输入):输入一段自然语言描述的需求(如:“写一个Python函数,从列表中删除重复项”)。
  2. 节点B(代码生成):使用我们的QwenTextGenerator节点,将需求转换为代码。
  3. 节点C(代码审查):再连接一个QwenTextGenerator节点(或复用同一个,但用不同的提示词),让它扮演代码审查员的角色,对生成的代码进行审查,提出改进建议。
  4. 节点D(结果输出):将生成的代码和审查意见一起输出,或者保存到文件。

在ComfyUI画布上,你可以这样连接:

[需求输入文本节点] —> [Qwen 代码生成节点] —> [文本显示节点]
                                     |
                                     +—> [Qwen 代码审查节点] —> [文本显示节点]

你甚至可以为“代码审查”节点预设一个专门的提示词模板,比如:“你是一个资深的Python代码审查员。请审查以下代码,指出其潜在问题、可优化点,并给出修改后的代码:{code}”。这样,每次只需要把上一个节点生成的代码输入进来即可。

通过这种拖拽连接的方式,一个简单的自动化代码助手就搭建完成了。你可以保存这个工作流,以后每次需要时一键加载,无需重复配置。

5. 总结

走完这三个步骤,你应该已经成功地将Qwen3-4B模型接入了ComfyUI,并体验了可视化搭建AI应用的便捷。整个过程的核心,其实就是理解ComfyUI自定义节点的机制——它本质上是一个包装器,把对远程API的调用封装成一个有输入输出、有参数面板的“积木块”。

这种方法的好处非常明显。对于不熟悉编程的用户,他们终于可以绕过繁琐的curl命令或Python脚本,在一个直观的图形界面里调用大模型。对于开发者或AI工作流设计者,这意味着你可以把文本大模型的能力,轻松嵌入到以ComfyUI为核心的、更复杂的多模态处理流水线中,比如先让Qwen3-4B根据图片内容生成一段描述,再用这个描述去驱动文生图模型。

当然,我们这里只是一个起点。你可以基于这个模式,创建更多功能各异的节点,比如支持多轮对话的节点、专门用于总结长文的节点、或者集成不同模型API的调度节点。ComfyUI的生态和你的想象力,是唯一的限制。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐