ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

ComfyUI零基础入门:从节点工作流搭建到问题排查

2026/9/7 13:37:52 拓冰建站 浏览量
ComfyUI零基础入门:从节点工作流搭建到问题排查 ComfyUI 在 AI 绘画社区里已经不是一个陌生词。它是一套基于节点和连线组织的 Stable Diffusion 图形界面用户不再通过页面上的几个输入框和按钮生成图片而是把模型加载、提示词编码、采样、解码、保存这些步骤拆成一个个节点用连线把数据流串起来。对于零基础用户来说第一次打开 ComfyUI 的空白画布往往会觉得无从下手到处都是节点面板不知道从哪里开始拖一个模型加载器也不知道采样器旁边的 sigma 参数为什么能动。本文会从最基础的概念讲起带你完成本地环境准备、下载并安装 ComfyUI 整合包或手动部署、搭建第一条文生图工作流、理解关键参数并重点解决导入别人工作流时最常见的“缺少节点”和“节点执行报错”问题。看完之后你能独立从零搭出可复用的工作流也能在社区上下载工作流后自己修复环境问题。1. 先理解 ComfyUI 的工作流到底是什么1.1 从 Stable Diffusion WebUI 到节点式界面使用 Stable Diffusion 生成图片本质上是一条固定链路加载模型、写提示词、随机噪声采样、解码成图片、保存到本地。传统 WebUI 界面把这条链路包装成表单用户填好提示词、设置好参数点击生成按钮背后的逻辑按固定顺序执行。ComfyUI 把这条链路彻底拆开。每一个环节变成一个独立节点节点之间用连线传递数据。这样做的好处是链路中任何一段都可以被替换、分支、合并或复用。同一个模型加载节点可以同时喂给多个采样分支同一张图可以继续进入图生图节点进行二次生成。这种设计看起来比表单复杂但表达能力更强。从技术上讲ComfyUI 后端是按图执行的。前端画布上的节点和连线会序列化成图数据结构后端遍历节点并执行每个节点从输入连接读取张量或配置数据计算后把结果传递给下游节点。理解这一点后面排查问题会轻松很多报错说哪个节点挂了就去检查它的输入引线是否接了正确类型的数据。1.2 工作流的基本组成节点、连线、数据一个最简单的文生图工作流至少包含下面几个节点节点作用关键输入关键输出Load Checkpoint加载底模ckpt_nameMODEL、CLIP、VAECLIP Text Encode编码提示词text、clipCONDITIONINGEmpty Latent Image创建空潜空间张量width、height、batch_sizeLATENTKSampler执行采样去噪model、positive、negative、latent_imageLATENTVAE Decode把潜空间张量解码为图像samples、vaeIMAGESave Image保存图片到 output 目录images无节点之间传递的不是普通文件而是 PyTorch 张量或配置对象。MODEL 是底模的网络权重对象CLIP 是文本编码器对象CONDITIONING 是编码后的条件特征LATENT 是潜空间噪声张量IMAGE 是解码后的像素值张量。连线接错类型执行时就会报错。新手最容易误解的一点是工作流不是“流程图的壳子”而是一张有严格数据类型的计算图。连线连接的是输入输出端口类型不匹配时即使节点都存在也跑不通。1.3 为什么要用工作流而不是只点“生成”工作流的核心价值有三个。第一是可复现。WebUI 改一次参数上一张图就找不回来了。ComfyUI 里整个生成链路连同参数一起保存在 JSON 文件里任何人导入同一个 JSON安装对应节点后理论上能还原同样的生成过程。第二是可组合。ControlNet、LoRA、表情控制、背景替换、超分放大这些能力在 WebUI 里往往以插件面板形式存在在 ComfyUI 里就是多接一段节点的事。你可以把一个节点的输出接到另一个模型的输入实现风格迁移或二次修图。第三是社区生态。GitHub、模型站和视频平台上有大量公开工作流从角色立绘到视频生成都有。能看懂、能加载、能改造这些工作流是这个工具最值得投入的学习内容。2. 本地安装方式整合包与手动部署怎么选2.1 整合包解决了什么问题ComfyUI 本身是 Python 项目运行依赖 Python 环境、PyTorch、transformers、safetensors 等一堆库。如果从源码自己装先要解决 CUDA 版本和 PyTorch 版本匹配问题再处理 git 拉取和依赖安装。对不熟悉命令行的用户来说这一关就能拦住大部分人。整合包把这些问题一次性打包解决。社区常见的秋叶整合包等发行版本内置了 Python 运行环境、依赖库、常用插件和基础模型解压后运行启动脚本即可进入界面。这类包特别适合零基础用户你不需要先装 Python不需要手动配 PyTorch只需要按说明解压到合适位置运行 bat 或 sh 脚本。需要注意整合包不是官方发布的安装程序它只是社区维护的“便携版”。不同整合包版本对应的 ComfyUI 内核版本可能不同内置模型也是文章作者自行挑选的。下载前先看发布说明里的适用 GPU、显存要求、支持的内核版本和更新方式不要直接拿着旧整合包去跑需要新内核特性的工作流。2.2 手动部署 ComfyUI 的步骤手动部署适合已经熟悉 Python 虚拟环境和 PyTorch 的用户优点是路径可控、升级灵活。这里给出一套通用步骤实际项目要结合自己的包名、路径和 Python 版本调整。第一步准备 Python 环境。ComfyUI 对 Python 版本有要求当前主流的 Linux 发行版可以安装 Python 3.10 或 3.11Windows 用户建议直接安装官方 Python 安装包安装时勾选 Add Python to PATH。第二步拉取源码并创建虚拟环境。git clone https://github.com/comfyanonymous/ComfyUI.git cd ComfyUI python -m venv venv source venv/bin/activate # Windows 下执行 venv\Scripts\activate第三步安装 PyTorch。这一步最容易踩版本坑。先去 PyTorch 官网的安装命令生成页选择自己的 CUDA 版本再执行对应的 pip 命令。这里的 CUDA 版本取决于你的显卡驱动不一定要装最新的。# 以 CUDA 12.1 为例实际版本以你本机为准 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121第四步安装 ComfyUI 依赖。pip install -r requirements.txt第五步启动。python main.py启动成功后终端会输出本地地址默认是http://127.0.0.1:8188浏览器打开即可进入画布。如果需要在局域网其他设备访问可以加--listen 0.0.0.0参数但生产环境还要配合权限和防火墙策略。2.3 两种方式的对比和选型建议对比项社区整合包手动部署上手难度低解压运行即可中高需要熟悉命令行和依赖管理Python 环境自带无需手动配置需要自己创建虚拟环境PyTorch 版本包作者固定可自由选择但要自己匹配 CUDA升级迭代跟随整合包版本迁移成本由作者决定自己维护git pull 即可排查问题环境问题可能被整合包掩盖问题链路清晰日志可见适合场景零基础学习、快速体验开发、二次开发、生产环境建议是第一次接触 ComfyUI 的新手优先用整合包跑通整体流程先建立对节点和连线的基本感觉等你开始频繁加载网上工作流、需要装各种自定义节点、或者打算通过 API 接入业务系统时再迁移到手动部署或 Docker 部署。学习阶段不必一开始就追求纯手动配置。3. 手把手搭建第一个文生图工作流3.1 启动后先确认环境无论用整合包还是手动部署启动后都应该先做三件事。第一确认界面能打开。浏览器访问http://127.0.0.1:8188看到节点画布即正常。如果打开的是默认工作流那说明 ComfyUI 加载了模板可以直接研究默认示例。第二确认模型目录。打开 ComfyUI 根目录检查models/checkpoints下是否有模型文件。整合包通常会放一两个基础模型手动部署的话默认是空的。模型文件一般以.safetensors或.ckpt结尾注意磁盘空间要预留足够常见底模体积在 2GB 到 7GB 之间。第三确认自定义节点列表。如果打算使用网上工作流先确认是否安装了 ComfyUI-Manager。它是管理自定义节点的核心工具很多缺失节点的安装都要靠它完成。注意不要只验证程序能启动还要验证模型能加载、采样能执行、图片能落盘。启动成功只是第一步。3.2 从空白画布开始搭建基础工作流ComfyUI 界面右侧有节点库面板也可以双击画布空白处弹出节点搜索框。按顺序添加以下节点并拖线连接。第一步添加 Load Checkpoint 节点。在搜索框输入 CheckpointLoaderSimple双击创建。节点上会出现一个下拉框选择你已有的底模。它的输出有三个端口MODEL、CLIP、VAE下方会显示各端口类型。第二步添加两个 CLIP Text Encode 节点。分别用来写正向提示词和负向提示词。把 Load Checkpoint 的 CLIP 端口分别连接到这两个节点的 clip 输入端口然后在 text 输入框中填写提示词。正向提示词示例: masterpiece, best quality, 1girl, city street, sunlight 负向提示词示例: lowres, bad anatomy, bad hands, blurry, watermark第三步添加 Empty Latent Image 节点。设置图片的宽和高默认 512 x 512。这个节点生成的是潜空间噪声张量的初始形态采样器会在它的基础上进行迭代去噪。第四步添加 KSampler 节点。关键连接如下model 输入接 Load Checkpoint 的 MODEL 输出positive 输入接正向提示词节点的 CONDITIONING 输出negative 输入接负向提示词节点的 CONDITIONING 输出latent_image 输入接 Empty Latent Image 的 LATENT 输出第五步添加 VAE Decode 节点。把 KSampler 的 LATENT 输出接到 VAE Decode 的 samples 输入再把 Load Checkpoint 的 VAE 输出接到 VAE Decode 的 vae 输入。第六步添加 Save Image 节点。把 VAE Decode 的 IMAGE 输出接到 Save Image 的 images 输入设置 filename_prefix 为自定义前缀例如my_first_workflow。连完线后点击界面上的 Queue Prompt 按钮。观察右侧日志输出正常会显示采样进度和图片保存路径。3.3 关键节点逐个讲解Load Checkpoint 是整个图的模型来源。它把一个底模文件同时拆成三个对象MODEL 负责图像生成网络CLIP 负责理解文本描述VAE 负责在潜空间和像素空间之间转换。理解这三个输出的意义对后续调试非常关键。很多报错就是误把 VAE 接到了 MODEL 端口或者把 CLIP 当成了 MODEL。CLIP Text Encode 做的事情是把自然语言提示词转换成条件向量。ComfyUI 对提示词做了自动补全处理你输入的逗号分隔标签会被拆分成多个语义片段。如果你需要更强的语义控制可以调整提示词格式但基础阶段直接用逗号分隔标签即可。Empty Latent Image 的宽高直接决定生成图片的分辨率。宽高越大采样耗时越长显存占用也越高。它的 batch_size 参数控制一次生成多少张图。初学者经常忽略显存限制直接设为 1024 x 1024结果在采样阶段直接爆显存。建议先用 512 x 512 跑通再逐步放大。KSampler 是执行噪声迭代去噪的采样节点。它负责把随机噪声逐步演化为符合提示词语义的图像潜空间张量。它的参数非常多也是新手最容易困惑的地方下一节单独展开。VAE Decode 把采样后的潜空间张量解码成标准像素图像这一步以后你才能看到实际画面。Save Image 则把图像保存到output目录默认按时间戳生成文件名。3.4 完整工作流 JSON 示例ComfyUI 的前端会把你画布上的节点和连线序列化成 JSON 文件。下面是文生图工作流的 API 格式示例用于说明数据结构。{ 1: { class_type: CheckpointLoaderSimple, inputs: { ckpt_name: v1-5-pruned-emaonly.safetensors } }, 2: { class_type: CLIPTextEncode, inputs: { text: masterpiece, best quality, landscape, mountains, clip: [1, 1] } }, 3: { class_type: CLIPTextEncode, inputs: { text: lowres, bad anatomy, watermark, clip: [1, 1] } }, 4: { class_type: EmptyLatentImage, inputs: { width: 512, height: 512, batch_size: 1 } }, 5: { class_type: KSampler, inputs: { seed: 156680208700286, steps: 20, cfg: 7, sampler_name: euler, scheduler: normal, denoise: 1.0, model: [1, 0], positive: [2, 0], negative: [3, 0], latent_image: [4, 0] } }, 6: { class_type: VAEDecode, inputs: { samples: [5, 0], vae: [1, 2] } }, 7: { class_type: SaveImage, inputs: { images: [6, 0], filename_prefix: my_first_workflow } } }这个 JSON 里每个顶层键是节点 IDclass_type是节点类型inputs里的[1, 0]表示引用节点 1 的第 0 个输出端口。导入别人分享的 PNG 图片时ComfyUI 会把嵌在图片中的工作流元数据读取出来自动还原成这种 JSON 结构。4. 核心参数解析模型、采样器、提示词和高级参数4.1 Checkpoint 模型加载器Checkpoint 节点只有一个关键参数ckpt_name。它下拉列出models/checkpoints目录下的所有模型文件。如果模型文件没有出现在列表里检查文件是否完整、后缀是否为.safetensors或.ckpt、是否放对了目录。完整底模文件通常包含 UNet、CLIP 和 VAE 三部分这也是该节点能输出 MODEL、CLIP、VAE 三个对象的原因。模型文件名不要随便改。社区模型经常用文件名描述模型风格或版本改名后容易丢失信息。而且模型文件体积大改动后要重新校验哈希完整性。4.2 正向和负向提示词正负提示词都通过 CLIP Text Encode 节点输入。正向提示词描述你希望画面中出现的内容负向提示词描述你希望排除的内容。负向提示词并不是 Stabile Diffusion 早期版本的强制要求而是社区实践总结出来的技巧它能有效减少常见畸形比如低分辨率、坏手、多余肢体和水印。提示词风格会影响生成质量但没有绝对标准。常见做法是先用质量词开头再接主体描述最后接环境和风格词。不要写一长串互相矛盾的关键词模型会尽力折中结果往往两边都不讨好。4.3 采样器参数KSampler 是工作流中最需要理解的节点它的参数直接决定生成图像的构图、噪点和稳定程度。seed 是随机种子。同一个 seed、同样的参数、同样的模型生成结果相同改变 seed 就能得到不同构图。steps 是采样步数值越大去噪过程越细化但耗时会增加。对于大多数模型20 到 30 步已经足够盲目调到 100 步不会带来明显质量提升。cfg 是提示词引导强度控制生成结果跟随提示词的程度。常见的范围是 4 到 12过高会出现色彩过饱和和边缘过度锐化过低则画面松散、不符合语义。不同底模对 cfg 的敏感度不同切换模型后要重新尝试。denoise 是重绘强度图生图中常用。它控制输入潜空间被修改的程度取值范围 0 到 1。denoise 为 1 时完全重新生成为 0.5 时会保留一半原图信息适合局部重绘和风格迁移。sampler_name 和 scheduler 决定去噪的具体数学策略。组合不同画面细腻程度和随机特征都会变化。下面列出常见组合说明。sampler_name特点适用场景euler基础采样器速度快通用、快速预览euler_ancestral带祖先随机性细节更丰富追求多样细节dpmpp_2m步数少时表现稳定20 步左右的通用生成dpmpp_2m_sde带 SDE 噪声质感和层次更好高质量出图ddim经典采样方法与特定模型配合scheduler特点适用场景normal默认均匀步长通用karras按 karras 噪声调度配合 dpmpp 系列效果较好exponential指数递减快速去噪参数并不是越大越好。提高 steps 超过一定阈值后画面提升变得非常有限。切换 sampler 和 scheduler 时建议只变更一个变量保持其他参数不变才能看清具体影响。4.4 高级参数速查表参数含义常见值值过小值过大seed随机种子任意正整数变化频繁不可复现固定后结果重复steps采样步数20~30噪声未收敛画面糊耗时增加提升有限cfg提示词引导强度5~8画面不符合描述色彩过饱和、生硬denoise重绘强度图生图常用 0.4~0.7基本不改变原图完全脱离原图width/height图片分辨率按模型训练分辨率构图变形显存不足、细节异常batch_size单次生成张数1~4单张耗时浪费显存很容易爆如果你准备手动部署并在生产环境跑批量生成seed 可以直接放随机数生成器但要在日志里记录每个 batch 的 seed方便回放。固定 seed、保存完整参数是排查图像质量问题的基础。5. 运行验证与结果检查5.1 第一次生成应该关注什么点击 Queue Prompt 后界面下方会出现执行进度条和节点状态。每个节点在运行时会短暂高亮执行结束后变成正常状态。如果节点变红并弹出错误报告说明该节点执行失败。生成完成后到ComfyUI/output目录确认图片文件存在。打开图片先不看画面美不美而是检查基础指标图片是否完整解码没有花屏或彩色噪点尺寸是否与 Empty Latent Image 设置一致是否出现明显肢体畸形或多余物体负向提示词里的关键词是否仍然出现在画面中如果画面正常说明这条链路从加载模型到保存输出已经走通。接下来可以逐步调节 seed、steps、cfg 和提示词观察图像变化。5.2 如何判断输出是否符合预期判断生成质量没有统一标准但可以按这三层检查。第一层是结构层。人物是否有合理肢体结构和五官位置场景是否有合理透视。如果结构崩溃优先检查底模是否适合当前提示词、负向提示词是否写全以及 cfg 是否过高。第二层是语义层。画面内容是否符合正向提示词描述。如果不匹配可能是指提示词冲突、采样器组合不合适或者 denoise 值影响了重绘幅度。第三层是画质层。噪点、色彩断裂、过曝或过暗。这类问题通常和采样步数、scheduler 选择以及 cfg 值相关。建议第一次跑图时用固定 seed 做一组参数对比实验每次只改一个参数记录参数和结果相当于给自己建一个小型参数实验记录。5.3 保存和复用工作流ComfyUI 画布右上角有 Save 按钮可以把工作流保存为 JSON 文件。点击 Export 可以导出到本地。分享工作流时最常用的方式是把生成出来的 PNG 图片直接发给别人因为 ComfyUI 会把工作流 JSON 写入图像的元数据。导入工作流时把 PNG 文件直接拖进 ComfyUI 画布或者点击 Load 选择 JSON 文件。这时最容易爆出一堆红色节点就是下一节要讲的“缺少节点”问题。注意不要只验证工作流能加载还要验证每个节点在任何一台机器上都能正确执行。别人的环境装了哪些自定义节点、哪些模型不会自动跟着工作流走。6. 导入别人工作流时的常见错误排查6.1 提示“缺少节点”或“请安装缺失的包”这是社区工作流导入时最高频的报错。现象有两种一种是画布上某些节点直接显示为红色节点名变成UNKNOWN另一种是运行时报错提示类似于“请安装缺失的包以使用此工作流要安装缺失的节点请先在你的 python 环境中运行”的日志。原因很简单你本地缺少工作流所依赖的自定义节点。自定义节点是一段独立插件代码放在custom_nodes目录下ComfyUI 启动时会加载它们。别人分享的工作流引用了这些自定义节点的class_type本地没有安装时前端就无法识别。处理流程按以下顺序找到红名节点对应的自定义节点名称。鼠标悬停在红名节点上记录提示中的类名或插件仓库名。确认是否安装了 ComfyUI-Manager。如果安装了打开 Manager 面板在 Missing Custom Nodes 分类下查找同名节点一键安装。如果没有 Manager手动安装。在ComfyUI/custom_nodes目录下执行git clone https://github.com/作者名/节点仓库名.git cd 节点仓库名 pip install -r requirements.txt重新启动 ComfyUI再加载工作流。自定义节点安装后必须重启服务才会生效。如果安装后仍然提示缺失检查节点仓库路径是否放在了custom_nodes根目录而不是嵌套了多余目录。现象常见原因检查方式处理建议节点显示为红色缺少自定义节点查看节点名和类名安装对应自定义节点并重启提示请安装缺失的包自定义节点已存在但依赖库未安装查看节点仓库 requirements.txt在 Python 环境中执行 pip 安装节点存在但无法连接端口数据类型不匹配查看输入输出端口类型添加转换节点或修正连线模型下拉框为空模型目录没有对应文件查看 models 目录下载模型并放入正确目录6.2 节点执行报错的定位路径运行中节点变红ComfyUI 会弹出 error report。这个报告是排查问题的第一手资料不要急着清理日志先记录以下字段node 节点名node_id 节点 IDexception 异常类型traceback 堆栈信息常见异常类型对应关系如下异常类型常见原因定位方向KeyError输入的模型文件名或节点参数不存在检查 ckpt_name 是否在模型列表里OSError文件路径错误或文件损坏检查模型文件完整度和目录权限RuntimeError: CUDA out of memory显存不足降低分辨率、减少 batch_size、关闭多余后台任务AttributeError节点版本过旧接口不兼容更新自定义节点或 ComfyUI 内核TypeError某个输入端口接到了错误类型按端口类型要求重新连线定位步骤建议从下往上查先看是哪一个节点抛出的异常再检查该节点的所有输入是否完整连接然后看异常信息里提到的文件或路径是否存在最后检查该节点依赖的模型文件是否已经下载到本地。6.3 模型和文件路径问题工作流 JSON 里记录的 ckpt_name、lora_name 都是文件名不会自动帮你下载模型。导入工作流后如果看到模型节点上显示红字或下拉框空白说明本地缺少对应模型。需要去模型站搜索对应文件名下载放到正确目录。ComfyUI 的标准模型目录如下models/ ├── checkpoints/ # 底模 ├── loras/ # LoRA 模型 ├── vae/ # 独立 VAE ├── controlnet/ # ControlNet 模型 ├── embeddings/ # 文本嵌入 ├── clip/ # CLIP 模型 └── upscale_models # 超分模型放置模型后大部分节点需要重启或重新刷新下拉框才能识别。整合包用户尤其要注意部分整合包把模型目录做了软链接或迁移到其他磁盘不要想当然以为模型一定都在models/checkpoints下。7. 学习环境与生产实践建议7.1 学习阶段怎么用零基础阶段建议按三条主线学习。第一条主线是配方理解。把默认的文生图工作流每个节点都点一遍逐个修改 steps、cfg、seed、denoise记录输出差异。不要贪多先把一个工作流吃透。第二条主线是工作流复刻。去社区下载 5 到 10 个热门工作流先成功加载运行再手动删掉一半节点理解哪些节点是核心、哪些是可选的增强功能。这个过程会逼你认识大量自定义节点。第三条主线是模型适配。同一个工作流换不同底模观察输出差异理解模型在生成链路中的位置。这个阶段你会真正理解 checkpoint、LoRA 和 VAE 的分工。学习环境建议使用整合包快速跑通但要在日志打开的状态下操作习惯看终端输出。隐藏日志会让很多问题的真相被掩盖。7.2 生产级使用需要补充什么如果 ComfyUI 要接入业务系统或有长时间批量生成需求只靠前端点按钮是不够的至少补充以下几项。配置外置化。模型路径、输出目录、CUDA 版本这些信息不要硬编码在脚本里使用环境变量或配置文件管理。ComfyUI 的参数组合越来越复杂固定参数放在 JSON 模板里管理业务侧只传实际变化值。API 集成。ComfyUI 提供 HTTP API可以 POST 工作流 JSON 到指定端口触发执行。生产环境建议把工作流模板和服务端代码、调用方接口分开维护避免某次画布改动直接污染线上服务。异常和监控。批量生成时记录每个任务的 seed、模型、采样参数、耗时和失败原因。显存不足、模型文件被占位、磁盘写满这些异常在长跑任务里是常态必须有日志和告警。资源控制。多实例并行时要基于显存和任务队列做并发限制。GPU 是稀缺资源不要允许任务无限并发导致整卡崩溃。回滚方案同样重要模型文件和节点版本升级前要备份保证升级失败能快速回退到上一个可用版本。7.3 ComfyUI 的扩展方向ComfyUI 的应用范围已经超出文字生成静态图。LoRA 让风格微调变得非常轻量ControlNet 让姿态、深度图、边缘图都能参与生成控制视频生成类和图像动画类节点也在持续演进。掌握基础工作流之后可以按 LoRA、ControlNet、视频生成、批量处理四条线路继续深入。给新手的练习建议不要一开始就追求复杂炫酷的高端工作流先保证三个最小闭环——文生图、图生图、LoRA 加载。这三个闭环覆盖了 ComfyUI 90% 的核心概念。把它们跑熟之后再去啃控制类和视频类节点。任何一次导入工作流失败排查顺序都一样先看节点是否存在再看模型是否齐全再看依赖是否安装最后看参数是否匹配。这套排查顺序本身比记忆任何单个节点的配置都有用。在实际项目里环境一致性是最大的隐性成本。无论用整合包还是手动部署把环境版本、依赖清单和模型清单记录下来能让同一份工作流在不同机器上稳定复现。ComfyUI 的上手门槛不在界面操作而在于理解数据流和依赖关系。把早期精力花在理解节点链路和环境管理上后面切换到任何复杂工作流都会轻松很多。