<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>潘锦的空间 &#187; AIGC</title>
	<atom:link href="https://www.phppan.com/tag/aigc/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.phppan.com</link>
	<description>SaaS SaaS架构 团队管理 技术管理 技术架构 PHP 内核 扩展 项目管理</description>
	<lastBuildDate>Sat, 04 Apr 2026 01:19:58 +0000</lastBuildDate>
	<language>zh-CN</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=3.9.40</generator>
	<item>
		<title>稳住！AIGC 架构中的排队系统与限流策略</title>
		<link>https://www.phppan.com/2025/04/aigc-queue-system-and-rate-limiting-strategies/</link>
		<comments>https://www.phppan.com/2025/04/aigc-queue-system-and-rate-limiting-strategies/#comments</comments>
		<pubDate>Sat, 19 Apr 2025 00:15:22 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AIGC]]></category>
		<category><![CDATA[排队系统]]></category>
		<category><![CDATA[稳定性]]></category>
		<category><![CDATA[限流]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2357</guid>
		<description><![CDATA[&#160; 我们见过那么多 AIGC 的酷炫功能，文生图、图生视频，……，是不是觉得 AI 特别强大？但你想 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>&nbsp;</p>
<section id="nice" style="color: #000000;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">我们见过那么多 AIGC 的酷炫功能，文生图、图生视频，……，是不是觉得 AI 特别强大？但你想过没，当成千上万的用户同时涌进来，都想让 AI 帮他们画画、写诗、做视频时，后台那些强大的模型和昂贵的计算资源（比如 GPU）会发生什么？</p>
<p data-tool="mdnice编辑器">如果不加管理，它们很可能瞬间就被「挤爆」了！服务器宕机、用户请求失败、体验直线下降，甚至可能因为资源滥用导致<strong style="color: #0e88eb;">成本失控</strong>。就像一家超火的餐厅，没有排队叫号系统，也没有门口保安/服务员控制人流，那里面肯定乱成一锅粥，谁也吃不好饭，对吧？</p>
<p data-tool="mdnice编辑器">比如年初 DeepSeek 不能用的场景。</p>
<p data-tool="mdnice编辑器">这就是为什么在设计 AIGC 架构时，排队系统和限流是绝对不能少的「定海神针」。它们就像餐厅的叫号系统和门口保安，确保整个服务流程既高效又有序，还能保护好咱们宝贵的「厨房」（计算资源）。</p>
<p data-tool="mdnice编辑器">那当排队系统或限流策略出现的时候，我们的产品可能会有哪些表现呢？或者作为一个用户我们能看到哪些？</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1. 产品表现</span></h1>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1.1 排队系统的「产品表现」</span></h2>
<p data-tool="mdnice编辑器">排队系统主要是为了处理「来不及马上做」的请求，但让用户知道「我已经收到你的指令了，正在处理中，请稍候」。所以它的表现形式通常和 <strong style="color: #0e88eb;">等待、状态更新、异步通知</strong> 有关。</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">「转圈圈」与进度条:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 你提交一个请求（比如让 AI 生成一张图片），界面上出现一个加载动画或者一个不太精确的进度条，告诉你「正在处理中」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 这时候你的请求很可能已经进入了后台的队列，正在等待 GPU 资源。这个动画就是前端在告诉你：「别急，后台在排队/处理呢！」 对于耗时较短、用户愿意在线等待的任务，这是最常见的表现。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">明确的「排队中」或「处理中」状态 :</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 对于耗时较长的任务（比如生成一个几分钟的视频），产品界面可能会更明确地显示任务状态，比如在一个「我的任务」列表里看到：「排队中」 (排队位置 5)”、「处理中 (还剩 3 minutes )」、「已完成」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 这直接反映了后台队列和处理单元的状态。用户可以离开页面，稍后再回来看结果。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">异步通知:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 你提交任务后，系统提示「任务已提交，处理完成后会通知您」。然后你该干嘛干嘛去。过了一会儿，你收到一个 App 内推送、邮件、短信或者其他形式的通知，告诉你「你的图片/视频生成好了，快来看看吧！」</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 这是典型的异步处理 + 队列的应用。请求入队后，用户界面就响应了，处理完成后，通过通知机制把结果推给用户。用户体验非常好，不用傻等。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">预估等待时间:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 有些产品会根据当前队列的长度和系统的处理速度，给你一个大概的等待时间估计，比如「预计等待时间：约 5 分钟」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 系统监控着队列状态，并基于历史数据或当前负载进行预测，用来管理用户的预期。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">暂时无法提交新任务:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 在极少数极端高峰期，如果队列积压得实在太严重，产品可能会暂时禁止提交新的同类型任务，并提示「系统繁忙，请稍后再试」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 这是一种保护机制，防止队列无限增长导致系统崩溃或等待时间过长。虽然体验不好，但有时是必要的。</section>
</li>
</ul>
</section>
</li>
</ol>
<p data-tool="mdnice编辑器">第 5 点的暂时无法提交新任务其实就是触发了限流策略。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1.2 限流的「产品表现」</span></h2>
<p data-tool="mdnice编辑器">限流是为了保护系统不被过多请求压垮，所以它的表现形式通常和 <strong style="color: #0e88eb;">拒绝服务、错误提示、配额显示</strong> 有关。</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">「太快了，请稍后再试」:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 你在短时间内疯狂点击某个按钮，或者一个脚本高频调用某个 API，突然收到一个错误提示，比如「操作过于频繁，请稍后再试」、「API 调用次数已达上限」、「429 Too Many Requests」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 你触发了限流规则（比如每分钟只能调用 10 次）。服务器拒绝了你超额的请求，并明确告诉你原因。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">需要人机验证:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 在你进行某些敏感操作（如登录、发帖）过于频繁时，突然弹出一个图片验证码、滑动验证或者 reCAPTCHA，要求你证明自己是人类。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 这是一种常见的反爬虫、反刷量的限流手段。系统怀疑可能是机器人在高频操作，用人机验证来增加门槛，降低请求频率。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">功能暂时不可用或降级:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 比如在一个免费的 AIGC 工具里，你可能发现每天只能生成 5 张图片，超过之后「生成」按钮就变灰了，或者提示你需要升级到付费版。或者，高峰期时，免费用户生成的图片分辨率会降低。或者，我们在使用一些大模型频繁的时候，会出现<strong style="color: #0e88eb;">降智</strong>的情况。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 这是基于用户身份或套餐的限流策略。通过限制使用次数或降低服务质量来保证核心资源的可用性，并引导用户付费。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">明确的配额/用量显示:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">表现：</strong> 在你的账户设置、API 控制台或者产品界面上，能清楚地看到你的使用额度，比如「本月 API 调用剩余次数：850/1000」、「今日图片生成次数：3/5」、「并行队列：5」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">背后逻辑：</strong> 透明地展示限流规则和当前用量，让用户心里有数，可以合理规划自己的使用，避免突然被拒。</section>
</li>
</ul>
</section>
</li>
</ol>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">1.3 产品表现小结</span></h2>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">排队系统</strong>主要通过<strong style="color: #0e88eb;">管理等待预期</strong>和<strong style="color: #0e88eb;">提供状态反馈</strong>来影响产品表现，目标是让耗时任务的处理过程更平滑、用户体验更好（即使需要等待）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流</strong>则主要通过<strong style="color: #0e88eb;">明确的拒绝或限制</strong>来影响产品表现，目标是保护系统、保证公平性、控制成本，有时也作为商业模式的一部分（区分不同用户等级）。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">限流是入口保安，决定「你能不能进」 以及 「进来的速度有多快」。</p>
<p data-tool="mdnice编辑器">排队系统是等候区管理员，负责管理「已经进来了但需要等待的人（任务）该怎么排队」。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2. 设计考量</span></h1>
<p data-tool="mdnice编辑器">咱们已经知道用户可能会看到「转圈圈」或者「稍后再试」了。但作为产品的设计者和开发者，在决定用什么样的排队和限流策略时，背后有一大堆门道需要考虑。这就像规划一场大型活动，既要保证大家玩得开心（用户体验），又要控制好场地容量和资源消耗（系统稳定性和成本），还得考虑 VIP 客人是不是有特殊通道（公平性与商业模式）。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.1 目标第一：想达到什么效果？</span></h2>
<p data-tool="mdnice编辑器">这绝对是第一步，也是最重要的一步。我们引入排队和限流，到底是为了解决什么核心问题？</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">保命要紧:</strong> 是不是首要目标就是防止系统在高并发下崩溃？比如像 DeepSeek 那样，突然涌入大量用户，如果没有任何防护，服务器可能直接就「躺平」了。这时候，强力的限流和能有效缓冲的队列就是救命稻草。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">控制成本:</strong> AIGC 服务，尤其是 GPU 推理，那是「吞金兽」。是不是想确保资源使用不超预算？限流可以直接控制调用总量，排队也能让我们更平稳地调度昂贵资源，避免为了应对短暂高峰而过度配置。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">用户体验:</strong> 我们希望用户等待多久是可接受的？是希望尽量快地给结果（可能需要更多资源），还是可以接受一定等待但保证任务最终完成？排队系统的设计（比如优先级、等待时间预估）和限流策略（是直接拒绝还是友好提示）都直接影响用户感受。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">公平性与差异化服务:</strong> 是不是所有用户都一视同仁？还是说付费用户、高等级用户应该有更高的请求频率、更短的等待时间？这就需要在限流和排队策略里体现出差异化。比如，给 VIP 用户更高的 QPS 限制和专属的优先队列。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">防止滥用:</strong> 是不是担心有人恶意刷接口、爬数据，或者用脚本进行大规模、低价值的调用？限流（特别是基于 IP、用户 ID 的精细化限流）和人机验证就是重要的防御手段。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">想清楚了主要目标，后面的设计才有了方向。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.2 量体裁衣：系统和业务长啥样？</span></h2>
<p data-tool="mdnice编辑器">没有放之四海而皆准的完美方案，我们的设计必须契合自身的特点：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">任务特性:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">耗时:</strong> AIGC 任务耗时差异很大。文生图可能几秒到几十秒，训练一个模型可能几小时甚至几天。耗时长的任务更适合异步队列处理。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">资源消耗:</strong> 不同任务对 CPU、GPU、内存的需求不同。瓶颈在哪里？是 GPU 显存容易爆，还是 CPU 计算跟不上？这决定了我们的限流和队列应该重点保护哪些资源。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">可并行度:</strong> 某些任务能很好地并行处理，而有些则不行。这影响了你可以同时从队列中取出多少任务来处理。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">流量模式:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">峰值与均值:</strong> 我们的应用流量是比较平稳，还是有明显的潮汐效应（比如白天高峰，晚上低谷）或者突发尖峰（比如搞活动、上热搜）？应对突发尖峰，限流的令牌桶算法和有足够缓冲能力的队列就比较有用。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">用户构成:</strong> 主要用户是 C 端普通用户，还是 B 端开发者通过 API 调用？他们的行为模式和容忍度是不同的。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">技术栈与基础设施:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;">用的是云服务（AWS, Azure, GCP）还是自建机房？云服务通常自带成熟的队列（如 SQS, Pub/Sub）和网关限流功能，用起来方便。</section>
</li>
<li>
<section style="color: #010101;">系统是单体架构还是微服务？微服务架构下，限流可能需要在网关层和具体服务层都做考虑。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">商业模式 (Business Model):</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;">免费增值模式？那免费用户的限流策略和付费用户的肯定不一样。</section>
</li>
<li>
<section style="color: #010101;">按量付费？那精确的用量统计和限额就非常重要。</section>
</li>
</ul>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.3 队列怎么玩：策略与选择</span></h2>
<p data-tool="mdnice编辑器">如果决定用排队系统，具体怎么设计呢？</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">队列类型:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">先进先出 (FIFO):</strong> 最简单公平，按顺序处理。适合大部分场景。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">优先级队列:</strong> 可以让付费用户或紧急任务插队。实现起来复杂些，但能满足差异化服务需求。并且可以作为商业化的重要组成。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">延迟队列:</strong> 可以让任务在指定时间后才被处理，比如用于定时任务或重试。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">队列数量:</strong> 是所有任务都进一个大队列，还是按任务类型（文生图、文生文）、用户等级（免费、付费）分成多个队列？分队列可以实现更精细的控制和资源隔离，但管理更复杂。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">消息持久化:</strong> 请求（消息）进入队列后，是否需要保证即使系统重启也不会丢失？对于重要任务，需要选择支持持久化的消息队列（如 Kafka, RabbitMQ 持久化模式, SQS 标准队列）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">死信队列:</strong> 如果一个任务处理失败（比如代码 bug、资源问题），尝试几次后还是不行，总不能一直卡在队列里吧？可以把它移到一个特殊的「死信队列」，后续再人工分析处理。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">消费者逻辑:</strong> 从队列里取任务来处理的「消费者」程序，它的并发数怎么控制？怎么处理任务失败和重试？怎么向用户更新状态？</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.4 限流怎么限：策略与选择</span></h2>
<p data-tool="mdnice编辑器">限流策略的设计同样关键：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流算法:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">令牌桶:</strong> 最常用，允许一定的突发流量（只要桶里有令牌），控制平均速率。比较灵活。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">漏桶:</strong> 强制平滑请求速率，不管来多少请求，处理速度是恒定的。对于需要严格控制下游压力的场景有用。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">固定窗口/滑动窗口计数器:</strong> 实现相对简单，但固定窗口有边界问题，滑动窗口更精确但实现和存储开销稍大。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流维度:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">按用户/API Key:</strong> 最常见，实现差异化服务和防止单一用户滥用。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">按 IP 地址:</strong> 可以限制匿名用户或来自特定 IP 的恶意流量，但可能误伤使用共享 IP（如 NAT、VPN）的正常用户。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">按接口/服务:</strong> 对不同的 API 或服务设置不同的限制，保护核心或资源消耗大的接口。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">按模型:</strong> 模型云厂商中最常见，不同的模型，资源不同，限制的大小也不同。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">全局限流:</strong> 对整个系统设置一个总的入口限制。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流位置:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">网关层:</strong> 统一入口，实现方便，可以拦截大量非法请求。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">服务层:</strong> 更靠近业务逻辑，可以做更精细的控制。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">中间件/库:</strong> 在代码层面集成限流逻辑。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">超出限制后的行为:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">直接拒绝:</strong> 返回错误码（如 429 Too Many Requests）。最简单直接。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">排队等待:</strong> 把超出的请求放入一个短暂的等待队列（注意，这和我们前面说的主要用于异步任务的队列不同，这里的队列更像是限流器内部的一种缓冲机制），如果短时间内有处理能力空出来就处理。体验稍好，但增加了复杂性。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">降级处理:</strong> 比如返回一个缓存的、旧的结果，或者调用一个计算量更小的备用模型（一般称为降智）。</section>
</li>
</ul>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.5 用户体验：别让用户一脸懵</span></h2>
<p data-tool="mdnice编辑器">技术实现很重要，但最终是为用户服务的。怎么让这些机制不那么「讨人嫌」？</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">透明度:</strong> 尽可能让用户知道发生了什么。</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">等待时:</strong> 显示明确的状态（排队中、处理中）、进度条（即使不精确）、预估时间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">被限流时:</strong> 返回清晰、友好的错误信息，说明原因（「操作太频繁」、「今日额度已用完」）以及何时可以重试。提供文档说明 API 的限流规则。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">配额显示:</strong> 在用户界面或账户中心清晰展示当前用量和总额度。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">预期管理:</strong> 通过预估等待时间、明确的配额等，让用户对可能发生的等待或限制有心理准备。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">友好的错误处理:</strong> 即使必须拒绝，也要给用户明确的指引，而不是冷冰冰的错误代码。</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">2.6 监控与迭代：持续观察与调整</span></h2>
<p data-tool="mdnice编辑器">最后，别忘了，这些都不是一成不变的。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">监控指标:</strong> 你需要实时监控关键指标：</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">队列:</strong> 队列长度、消息平均等待时间、消息积压数量、消费者处理速率、死信队列数量。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流:</strong> 请求总数、被限流的请求数、触发限流的规则/用户/IP 分布、响应时间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">系统:</strong> CPU/GPU 使用率、内存占用、网络带宽、错误率。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">告警:</strong> 当指标超过阈值时（比如队列长度过长、限流拒绝率过高），需要及时收到告警。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">调优:</strong> 根据监控数据和业务变化，不断调整限流阈值、队列优先级、消费者数量等参数。可能需要进行 A/B 测试来验证不同策略的效果。</section>
</li>
</ul>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3. 技术实现</span></h1>
<p data-tool="mdnice编辑器">聊完了「是什么」和「怎么想」，现在就到了「怎么做」的环节了。要把排队系统和限流策略落地，咱们得选对工具、用对方法。市面上成熟的方案很多，就像工具箱里的各种扳手和螺丝刀，得挑顺手的、合适的才行。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.1 排队系统的技术选型与实现</span></h2>
<p data-tool="mdnice编辑器">要搞个靠谱的排队系统，我们通常不会自己从零开始造轮子（那太复杂了！），而是会选用一些成熟的<strong style="color: #0e88eb;">消息队列中间件</strong>。这些中间件就像是专业的「排队调度中心」。</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">常见的「排队调度中心」有哪些？</strong></p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">RabbitMQ:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">特点:</strong> 老牌劲旅，功能非常全面，支持多种消息协议（比如 AMQP），路由规则特别灵活（可以搞得很复杂，比如根据消息内容决定发给哪个处理单元），社区成熟，文档丰富。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">适合场景:</strong> 需要复杂的消息路由逻辑、任务分发、对消息可靠性要求高的场景。比如，不同类型的 AIGC 任务（文生图、图生文）需要交给不同的处理集群。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">上手:</strong> 相对来说，配置和管理比 Kafka 简单一些。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">Kafka:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">特点:</strong> 设计目标就是<strong style="color: #0e88eb;">超高吞吐量</strong>！它更像是一个「可持久化的日志流」，数据来了就顺序写盘，消费者可以从任意位置开始读。天生适合分布式、高并发写入和读取。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">适合场景:</strong> 需要处理海量请求（比如用户行为日志、实时数据流）、对消息顺序有要求、能容忍稍高一点的延迟（相比内存队列）、需要消息回溯（重新消费）的场景。AIGC 的请求量如果巨大，或者需要记录详细的请求日志流，Kafka 是个好选择。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">上手:</strong> 集群部署和运维相对复杂一些。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">Redis:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">特点:</strong> Redis 本身是个内存数据库，速度飞快！可以用它的 List 数据结构（<code style="color: #0e8aeb;">LPUSH</code>/<code style="color: #0e8aeb;">RPOP</code>）模拟简单队列，或者用更现代的 Streams 数据类型（5.0 版本后的功能，功能更强，支持消费组、持久化等，有点像迷你版 Kafka）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">适合场景:</strong> 对性能要求极高、队列逻辑相对简单、可以接受一定的数据丢失风险（如果 Redis 挂了且没做持久化或主从）、或者你系统里已经重度使用 Redis，不想引入新组件。很多限流实现也会用到 Redis。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">上手:</strong> 如果你熟悉 Redis，用起来非常方便。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">云服务商提供的 MQ:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">特点:</strong> 云平台提供的托管服务。我们不用关心服务器运维、扩容缩容，按量付费，和云上其他服务（如 Lambda 函数、云存储）集成得非常好。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">适合场景:</strong> 应用部署在云上，想省心省力，快速搭建排队系统。它们通常提供标准队列（保证至少一次送达）和 FIFO 队列（保证顺序）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">上手:</strong> 非常简单，控制台点几下或者几行 SDK 代码就能用起来。</section>
</li>
</ul>
</section>
</li>
</ol>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">怎么选？</strong> 简单说：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">要灵活路由、功能全面？考虑 RabbitMQ。</section>
</li>
<li>
<section style="color: #010101;">要超高吞吐、能接受一定复杂性？考虑 Kafka。</section>
</li>
<li>
<section style="color: #010101;">要简单快速、或者已有 Redis？试试 Redis Streams/List。</section>
</li>
<li>
<section style="color: #010101;">在云上、想省事？用云厂商的 MQ 服务。</section>
</li>
</ul>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">实现时要注意啥？</strong></p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">生产者:</strong> 就是你接收用户请求的那部分服务（比如你的 Web API）。它需要把用户的请求（比如“画一只猫”）包装成一个**消息 (Message)**，扔进选好的队列里。这个消息里得包含足够的信息，比如任务类型、用户输入的提示词 (Prompt)、用户 ID、可能还有优先级等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">消费者</strong> 这是真正干活的「工人」（比如运行 AIGC 模型的 GPU 服务器上的程序）。它会不断地从队列里拉取（Pull）或接收推送（Push）过来的消息，然后根据消息内容执行任务（比如调用模型生成图片）。</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">并发控制:</strong> 你可以启动多个消费者实例来并行处理队列里的任务，提高效率。但要控制好数量，别把 GPU 资源撑爆了。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">任务确认:</strong> 消费者处理完一个任务后，一定要告诉队列：“这个活我干完了（Ack）！”这样队列才会把这个消息彻底删除。如果消费者处理失败或者挂了，没来得及确认，队列通常会把这个消息重新交给其他消费者处理（保证任务不丢失）。处理不了的坏消息，可以考虑扔进<strong style="color: #0e88eb;">死信队列</strong>。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">消息体设计:</strong> 消息里具体放啥内容得设计好。是直接把图片数据放进去（不推荐，太大），还是放一个指向存储的链接？用户 ID 要不要带上，方便后续通知？</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.2 限流的技术选型与实现</span></h2>
<p data-tool="mdnice编辑器">限流的实现方式也很多样，可以在不同的地方「设卡」。</p>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">在哪儿「设卡」？</strong></p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">网关层:</strong> 这是最常见的做法。在所有请求进入你系统的大门口（比如 API Gateway）就进行拦截。</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">工具:</strong> Nginx (自带 <code style="color: #0e8aeb;">limit_req</code> 模块)、Kong、Apigee、AWS API Gateway、Google Cloud API Gateway 等。这些网关通常都内置了限流功能，配置一下就行，对后端服务是透明的。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">优点:</strong> 统一管理，效率高，能把大量不合规的请求挡在外面，保护后端服务。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">缺点:</strong> 可能不够灵活，无法基于非常复杂的业务逻辑来限流。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">应用层/代码层:</strong> 直接在你的后端服务代码里加入限流逻辑。</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">工具:</strong></p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">各种语言的库/框架:</strong> 几乎每种流行的编程语言都有现成的限流库。比如 Java 的 Guava RateLimiter，Go 的 <code style="color: #0e8aeb;">golang.org/x/time/rate</code>，Python 的 <code style="color: #0e8aeb;">ratelimiter</code> 或集成在 Web 框架（如 Django/Flask）的插件，Node.js 的 <code style="color: #0e8aeb;">express-rate-limit</code> 等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">Web 框架中间件 (Middleware):</strong> 很多 Web 框架允许你插入中间件，在处理请求前后执行逻辑，非常适合放限流代码。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">优点:</strong> 最灵活，可以根据任意业务逻辑（比如用户等级、请求参数）来定制限流策略。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">缺点:</strong> 需要在每个需要限流的服务里都实现或引入，可能有点重复工作；性能开销比网关层高一点。</section>
</li>
</ul>
</section>
</li>
</ol>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">限流状态存哪儿？(尤其是在分布式系统里)</strong></p>
<p data-tool="mdnice编辑器">限流算法（比如令牌桶、滑动窗口）需要记录当前的状态（比如桶里还有多少令牌、窗口内有多少请求）。在分布式环境下（你有多个服务实例），这个状态必须是共享的。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">Redis:</strong> <strong style="color: #0e88eb;">绝对的主力！</strong> 因为它：</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">快:</strong> 基于内存，读写速度非常快，对限流这种高频操作很友好。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">原子操作:</strong> Redis 提供了像 <code style="color: #0e8aeb;">INCR</code> (原子加一)、<code style="color: #0e8aeb;">EXPIRE</code> (设置过期时间) 这样的原子命令，这对于并发环境下的计数和状态更新至关重要，避免了竞态条件。很多复杂的限流逻辑可以通过 <strong style="color: #0e88eb;">Lua 脚本</strong> 在 Redis 服务端原子执行，保证一致性。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">适合分布式:</strong> 所有服务实例都可以访问同一个 Redis 来读写限流状态。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">内存</strong> 如果你的服务是单实例部署，或者限流逻辑不要求跨实例共享状态，那么用内存记录状态是最快的。但服务一重启状态就没了，也不适用于分布式系统。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">数据库:</strong> 理论上也可以，但数据库通常比 Redis 慢，对于限流这种需要快速响应的操作，可能会成为性能瓶颈，所以不太常用。</section>
</li>
</ul>
<p data-tool="mdnice编辑器"><strong style="color: #0e88eb;">算法怎么用代码大概实现一下？(概念性)</strong></p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">令牌桶:</strong></p>
<ol style="color: #000000;">
<li>
<section style="color: #010101;">每个用户/API Key 在 Redis 里对应一个 Key，存当前令牌数 (token count) 和上次添加令牌的时间戳 (last refill timestamp)。</section>
</li>
<li>
<section style="color: #010101;">请求来了，先根据时间差计算需要补充多少令牌（不能超过桶容量），更新令牌数和时间戳。</section>
</li>
<li>
<section style="color: #010101;">检查当前令牌数是否大于 0。</section>
</li>
<li>
<section style="color: #010101;">如果大于 0，令牌数减 1，允许请求通过。</section>
</li>
<li>
<section style="color: #010101;">如果等于 0，拒绝请求。</section>
</li>
</ol>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">关键:</strong> 上述步骤最好用 Lua 脚本在 Redis 里原子执行，防止并发问题。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;">
<p style="color: #000000;"><strong style="color: #0e88eb;">滑动窗口日志:</strong></p>
<ol style="color: #000000;">
<li>
<section style="color: #010101;">每个用户/API Key 在 Redis 里对应一个 Sorted Set。</section>
</li>
<li>
<section style="color: #010101;">请求来了，用当前时间戳作为 score，请求 ID (或时间戳+随机数) 作为 member，添加到 Sorted Set (<code style="color: #0e8aeb;">ZADD</code>)。</section>
</li>
<li>
<section style="color: #010101;">移除窗口之外的旧记录 (<code style="color: #0e8aeb;">ZREMRANGEBYSCORE</code>，移除时间戳小于 &#8220;当前时间 &#8211; 窗口大小&#8221; 的记录)。</section>
</li>
<li>
<section style="color: #010101;">获取当前窗口内的记录数量 (<code style="color: #0e8aeb;">ZCARD</code>)。</section>
</li>
<li>
<section style="color: #010101;">如果数量小于阈值，允许请求；否则拒绝。</section>
</li>
</ol>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">关键:</strong> 同样，这些操作最好也封装在 Lua 脚本里保证原子性。</section>
</li>
</ul>
</section>
</li>
</ul>
<h2 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">3.3 整合到 AIGC 流程</span></h2>
<p data-tool="mdnice编辑器">现在我们有了排队和限流的工具，怎么把它们串到咱们的 AIGC 服务流程里呢？想象一下一个典型的流程：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">用户请求抵达:</strong> 比如用户在网页上点了“生成图片”按钮，请求发往后端。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">入口限流 (网关/服务):</strong> 请求首先经过<strong style="color: #0e88eb;">限流器</strong>。检查这个用户/IP 的请求频率是否超标。</p>
<ul style="color: #000000;">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">超标:</strong> 直接返回错误（如 429 Too Many Requests），流程结束。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">未超标:</strong> 请求继续往下走。</section>
</li>
</ul>
</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">请求处理与任务提交:</strong> 后端服务（比如 Web API）接收到请求，进行一些基本校验，然后把需要执行的 AIGC 任务（包含提示词、参数等）封装成一个消息。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">进入队列:</strong> 这个消息被发送到<strong style="color: #0e88eb;">消息队列 (MQ)</strong> 中。此时可以告诉用户「任务已提交，正在排队/处理中」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">任务排队等待:</strong> 消息在队列里按照策略（FIFO、优先级等）排队，等待有空闲的「工人」。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">工人处理任务 (消费者):</strong> 后台的 GPU 工作节点（消费者）从队列里拉取消息。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">(可选) 资源访问限流:</strong> 如果这个工人需要访问外部资源（比如调用另一个受限的 API），它内部可能也需要遵守相应的限流规则。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">执行 AIGC 任务:</strong> 工人调用模型，执行计算密集型的生成任务。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">存储结果:</strong> 生成结果（比如图片 URL、生成的文本）被存储到数据库或对象存储中。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">任务完成确认:</strong> 工人向消息队列发送确认信号 (Ack)。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">通知用户:</strong> 通过某种方式（比如 WebSocket 推送、回调 URL、或者用户主动查询状态）告知用户任务已完成，并提供结果。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">从整个流程来看，限流主要作用在<strong style="color: #0e88eb;">入口处（步骤 2）</strong>，有时也可能在<strong style="color: #0e88eb;">资源消耗端（步骤 7）</strong>。而排队系统则承担了<strong style="color: #0e88eb;">削峰填谷、异步解耦（步骤 4-6, 10）</strong> 的核心作用。</p>
<p data-tool="mdnice编辑器">技术实现这块，选型和细节非常多，但核心思路就是这样：根据我们的需求（性能、可靠性、成本、复杂度）选择合适的 MQ 和限流工具/库，然后把它们合理地嵌入到服务流程中，再配上完善的监控。这样，我们的 AIGC 应用就能更从容地应对用户的热情啦！=</p>
<p data-tool="mdnice编辑器">看到这里，你可能会问：排队和限流是不是有点像？它们都管理请求，但侧重点不同，而且经常一起工作：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限流是「准入控制」</strong>：决定一个请求<strong style="color: #0e88eb;">能不能</strong>进入系统处理流程。它关注的是「速率」和「总量」，防止系统被瞬间打垮。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">排队是「流量整形」和「缓冲」</strong>：处理那些<strong style="color: #0e88eb;">已经被允许进入</strong>，但暂时无法立即处理的请求。它关注的是「平滑度」、「异步性」和「可靠性」。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">想象一下：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">请求先到达<strong style="color: #0e88eb;">限流器</strong>（保安）。保安检查你的「票」（比如 API Key）以及当前人流速度，决定是否放你进去。</section>
</li>
<li>
<section style="color: #010101;">如果你被允许进入，但「处理台」（GPU）正忙，你就被引导到<strong style="color: #0e88eb;">排队系统</strong>（等候区）等待。</section>
</li>
<li>
<section style="color: #010101;">等处理台空闲了，就从队列里叫下一个号来处理。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">这样一套组合拳下来，AIGC 系统就能在汹涌的请求浪潮中保持稳定、高效、公平地运行啦！</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e8aeb;">4. 小结</span></h1>
<p data-tool="mdnice编辑器">对于 AIGC 架构而言，排队系统和限流策略并非「可选件」，而是保障系统<strong style="color: #0e88eb;">稳定性</strong>、<strong style="color: #0e88eb;">可用性</strong>、<strong style="color: #0e88eb;">公平性</strong> 和 <strong style="color: #0e88eb;">成本效益</strong> 的核心组件。在设计阶段就必须充分考虑：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">识别瓶颈：</strong> 哪些环节是资源密集型的？（通常是模型推理）</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">定义策略：</strong> 基于业务目标（用户体验、成本、公平性）设定合理的限流阈值和排队机制（如优先级）。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">选择工具：</strong> 根据技术栈、性能需求、运维复杂度选择合适的限流组件和消息队列。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">监控与调优：</strong> 持续监控队列长度、等待时间、限流触发次数、系统负载等指标，并根据实际运行情况不断调整策略。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">以上。</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/04/aigc-queue-system-and-rate-limiting-strategies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AI 编程真的会让程序员失业！</title>
		<link>https://www.phppan.com/2025/01/ai-programming-will-really-make-programmers-unemployed/</link>
		<comments>https://www.phppan.com/2025/01/ai-programming-will-really-make-programmers-unemployed/#comments</comments>
		<pubDate>Fri, 24 Jan 2025 12:11:49 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AI 编程]]></category>
		<category><![CDATA[AIGC]]></category>
		<category><![CDATA[trae]]></category>

		<guid isPermaLink="false">https://www.phppan.com/?p=2324</guid>
		<description><![CDATA[2025 年 1 月 20 日上午 10:24 ，这个包含了 1024 的时间点，字节发布了其 AI 编程 I [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>2025 年 1 月 20 日上午 10:24 ，这个包含了 <strong>1024</strong> 的时间点，字节发布了其 AI 编程 IDE: Trae <a title="https://www.trae.ai/" href="https://www.trae.ai/" target="_blank">www.trae.ai/</a></p>
<p><img class="medium-zoom-image" src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/d3bc39b192b842c2bf864ea1d816faab~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1738324527&amp;x-signature=yw%2Buua4u3862D%2Fcm7QCnQLo7XwQ%3D" alt="ai_1.png" /></p>
<p>对标 Cursor，Windsurf 的国内出海的一个 IDE，当前可使用 Claude-3.5-Sonnet 和 GPT-4o 大语言模型</p>
<p>深入使用，花了三个小时，<strong>不写一行代码</strong>，实现了一个前端后端分离架构，包含登录/退出，数据库查询，跨域，以及首页功能的小管理后台，包括前端和后端的代码。前端所使用技术栈为 Vue，后端使用了 golang + beego。</p>
<p>这 3 个小时有一个耗时点是想让 AI 来解决跨域的问题，我们知道跨域主要是 Access-Control-Allow-Origin 等头信息的处理，把前后端的代码上下文都给了，反复试 OPTIONS 请求跨域总是不成功，后来发现是后台接口实现所修改的跨域文件没有加载导致的。</p>
<p>除了通用功能，实际业务开发中，花了 30 分钟实现了 Java 的流式输出，其场景是要实现 DeepSeek 的模型调用，以实现打字机的输出效果。 <img class="medium-zoom-image" src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/da0529a374a9431d9cf9f666730cc617~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1738324527&amp;x-signature=L20OTLp3Ar44LOsqujK2LIpuYHk%3D" alt="ai_2.png" /></p>
<p>这里 AI 给的 golang 的实现，但是当前我需要的是 Java 的，这里的问题是没有把需求讲清楚。同时也表示在开始对话时，需要把一些背景信息讲清楚能提高整体的效率。</p>
<p><img class="medium-zoom-image" src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/286c8a8c3948463289d1cefc8b6f5fd4~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1738324527&amp;x-signature=Dl5xwXgHUnJXoajDreQP0b3cIDg%3D" alt="ai_3.png" /></p>
<p><img class="medium-zoom-image" src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/eb704077048b4388a66b8119fb60fd16~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1738324527&amp;x-signature=bFs9bwKAvdswo3iboVXN13rka%2B0%3D" alt="ai_5.png" /></p>
<p>经过了大概 10 轮对话，他大概就了解我真正想要的是什么了，再经过 6 轮对话补全，把过程中有问题的地方和相关代码圈出来给到 AI，很快就有结果，并解决了问题。</p>
<p><img class="medium-zoom-image" src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/02c027f6f81b41ad960c28d5eef40991~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1738324527&amp;x-signature=L%2B27m5%2FJvozXaLGGwUv3WUmUIYc%3D" alt="ai_6.png" /></p>
<h2 data-id="heading-0">1. 使用过程中的感受</h2>
<ol>
<li>表述清楚需求很重要，在最开始的时候一些背景重要的背景信息可以提前给出，如技术栈，表结构、想做的事情等等；</li>
<li>给到更多的上下文，更容易得到正确的答案，在 Trea 中使用 # 号引入，当前支持代码、文件、目录及工作区间；</li>
<li>从 AI 中来，到 AI 中去，可以跳出 AI 来解决问题，当 AI 限入解决问题的死循环，可以找 google 要一些答案喂给 AI，后续应该会自动支持这个功能；</li>
<li>出错的地方，选中后，直接让 AI 解决，甚至不需要多说一句话，当然，你也可以多说几句，更清晰的表述你想要的东西；</li>
<li>多模态的能力，在界面有问题的地方，截图说明给到 AI 就能解决；</li>
<li>先做框架，再逐个功能实现，当前阶段，AI 解决小范围的问题会更合适一些。</li>
</ol>
<p>到这里，对于这种通用类的功能，AI 已经能发挥出很大的能力了，再进化一段时间，程序员的大部分编码工作真的就会被 AI 取代了。那是不是我们就失业了呢？从纯粹写代码的角度来说，是的，但是从整个项目的角度不一定。</p>
<h2 data-id="heading-1">2. 程序员的当前职责</h2>
<p>和康总有聊到这块，当前我们程序员基本在解决的问题包括决策、连接和编码三部分。</p>
<ul>
<li><strong>决策</strong>：技术选型、架构设计等高层次决策，AI 尚无法完全替代。</li>
<li><strong>连接</strong>：跨部门需求分析、团队沟通与资源协调。</li>
<li><strong>编码</strong>：过去程序员的核心工作，但 AI 的介入正在加速其主要功能的边缘化。</li>
</ul>
<h3 data-id="heading-2">2.1 决策</h3>
<p>项目开发的过程实际上是一个个的决策过程组成的，决策是咱们的核心职责之一，是一个项目从业务需求到技术实现的过程中，如何选择解决方案的过程。</p>
<p>我们需要在不确定性和多种选择中，基于经验、知识和实际需求，做出技术上的关键决定。这些决策往往会对团队的效率、产品的质量和未来的技术发展方向产生深远影响。</p>
<p><strong>决策</strong>指的它涉及从业务层面到技术层面的全局性规划，包括但不限于：</p>
<ul>
<li><strong>需求分析</strong>：
<ul>
<li>理解并提炼业务需求，制定核心目标和功能优先级。</li>
<li>与产品经理、业务方的沟通，明确业务目标和用户需求。</li>
</ul>
</li>
<li><strong>技术选型</strong>：
<ul>
<li>决定使用何种技术栈（前端框架、后端框架、数据库、云服务等）。</li>
<li>评估不同技术的可行性、扩展性和成本。</li>
</ul>
</li>
<li><strong>架构设计</strong>：
<ul>
<li>系统架构的顶层设计，比如单体架构 vs 微服务架构。</li>
<li>数据库选择（SQL vs NoSQL）、缓存策略、性能优化方案。</li>
</ul>
</li>
<li><strong>风险评估与管理</strong>：
<ul>
<li>评估技术方案的风险（如性能瓶颈、技术债务、团队技术栈能力）。</li>
<li>制定备选方案和应急措施。</li>
</ul>
</li>
</ul>
<p><strong>AI 替代能力：</strong></p>
<ul>
<li><strong>当前能力</strong>：
<ul>
<li>AI 已能提供强大的技术选型建议（如根据场景推荐框架、库、工具）。</li>
<li>在简单的架构设计中，AI 已能生成初步方案（如微服务与单体架构优劣分析）。</li>
</ul>
</li>
<li><strong>未来潜力</strong>：
<ul>
<li>AI 可能在复杂的技术决策中辅助更精准的数据分析和方案评估。</li>
<li>但最终决策依赖对业务需求的深刻理解，这仍需要人类的经验和判断。</li>
</ul>
</li>
</ul>
<p><strong>程序员核心竞争力：</strong></p>
<ul>
<li>理解业务需求和行业背景，能够将技术与业务深度结合。</li>
<li>解决复杂的非结构化问题，比如协调跨团队需求冲突，平衡业务优先级。</li>
<li>创新能力：AI 只能在已有知识中提供建议，真正的创新需要人类。</li>
</ul>
<h3 data-id="heading-3">2.2 连接</h3>
<p><strong>连接</strong>是将技术方案具体化并协调各方资源，使其从理论走向实践的过程。重点包括：</p>
<ul>
<li><strong>需求转化</strong>：
<ul>
<li>将业务需求拆解为可执行的技术任务。</li>
<li>明确模块划分、接口定义以及交互方式。</li>
</ul>
</li>
<li><strong>团队协作</strong>：
<ul>
<li>前后端、测试、运维、产品经理之间的沟通与协作。</li>
<li>协调跨部门资源，解决技术与运营、市场等职能间的矛盾。</li>
</ul>
</li>
<li><strong>接口与模块设计</strong>：
<ul>
<li>定义 API 接口规范（RESTful、GraphQL）。</li>
<li>确保接口的安全性、性能和兼容性。</li>
</ul>
</li>
<li><strong>测试与迭代</strong>：
<ul>
<li>制定测试方案，组织单元测试、集成测试。</li>
<li>根据测试反馈快速调整，推动迭代优化。</li>
</ul>
</li>
</ul>
<p><strong>AI 替代能力：</strong></p>
<ul>
<li><strong>当前能力</strong>：
<ul>
<li>AI 已能快速生成接口文档、代码示例、测试用例。</li>
<li>在协作方面，AI 可以辅助生成任务拆解、需求文档、项目计划等。</li>
</ul>
</li>
<li><strong>未来潜力</strong>：
<ul>
<li>AI 可以成为跨部门的沟通桥梁，如生成更加精确的技术-业务对接文档。</li>
<li>但复杂、动态的沟通和协调仍是 AI 难以替代的领域。</li>
</ul>
</li>
</ul>
<p><strong>程序员核心竞争力：</strong></p>
<ul>
<li>优秀的沟通能力和团队协作能力，能在矛盾或模糊的需求中推动项目前进。</li>
<li>对复杂系统的整体把控力，确保各模块之间的高效协作。</li>
<li>快速适应变化的能力，能够在项目中临时调整资源和策略。</li>
</ul>
<h3 data-id="heading-4">2.3 编码</h3>
<p><strong>编码</strong>是程序员的核心工作之一，涉及将设计方案转化为实际运行代码的过程。它包括：</p>
<ul>
<li><strong>代码实现</strong>：
<ul>
<li>基于需求和设计文档，开发具体功能模块。</li>
<li>包括前端开发（UI、交互逻辑）和后端开发（业务逻辑、数据库操作）。</li>
</ul>
</li>
<li><strong>调试与优化</strong>：
<ul>
<li>修复 BUG，优化代码性能。</li>
<li>解决复杂的技术难点（如跨域问题、性能瓶颈、并发冲突）。</li>
</ul>
</li>
<li><strong>代码质量保障</strong>：
<ul>
<li>编写单元测试、集成测试，确保代码质量。</li>
<li>遵循代码规范，进行代码审查。</li>
</ul>
</li>
<li><strong>持续集成与发布</strong>：
<ul>
<li>使用 CI/CD 工具进行自动化构建和部署。</li>
<li>实现代码版本管理和持续优化。</li>
</ul>
</li>
</ul>
<p><strong>AI 替代能力：</strong></p>
<ul>
<li><strong>当前能力</strong>：
<ul>
<li>AI 已能生成高质量的代码片段、调试建议，甚至完整的模块代码。</li>
<li>对于常见的编码任务（如脚本处理类，CRUD 功能），AI 的效率和准确性已超过人类。</li>
</ul>
</li>
<li><strong>未来潜力</strong>：
<ul>
<li>AI 将进一步替代大部分重复性、模板化的编码工作。</li>
<li>但对于复杂场景下的创新性编码，AI 的能力仍有限。</li>
</ul>
</li>
</ul>
<p><strong>程序员核心竞争力：</strong></p>
<ul>
<li>对技术深度的理解，能够在 AI 提供的代码基础上进行优化和扩展。</li>
<li>解决复杂问题的能力，比如在非标准化场景下实现创新功能。</li>
<li>对代码质量的把控能力，确保生成代码的安全性、性能和可维护性。</li>
</ul>
<h2 data-id="heading-5">3. AI 替代的趋势与程序员未来的价值</h2>
<h3 data-id="heading-6">3.1 当前 AI 会逐步替代哪些部分？</h3>
<ol>
<li><strong>重复性、模板化的工作</strong>：
<ul>
<li>例如脚本类、通用类、CRUD 重复类的功能。</li>
<li>常见的 BUG 修复、代码优化建议。</li>
</ul>
</li>
<li><strong>常规化的架构设计和技术选型</strong>：
<ul>
<li>AI 将能处理大部分标准化场景下的技术决策。</li>
<li>在数据驱动的决策场景中，AI 的效率更高。</li>
</ul>
</li>
<li><strong>文档、接口、测试的自动化</strong>：
<ul>
<li>自动生成 API 文档、测试用例，将成为默认功能。</li>
</ul>
</li>
</ol>
<h3 data-id="heading-7">3.2 程序员的核心竞争力是什么？</h3>
<ol>
<li><strong>业务理解与技术结合能力</strong>：
<ul>
<li>AI 不理解业务逻辑背后的真实需求，程序员能够通过与产品、业务沟通，设计出更贴合实际的解决方案。</li>
</ul>
</li>
<li><strong>复杂场景的解决能力</strong>：
<ul>
<li>比如跨团队协作、大规模分布式系统设计、非标准化需求的实现。</li>
</ul>
</li>
<li><strong>创新与创意能力</strong>：
<ul>
<li>AI 是基于已有数据训练的，无法真正创新。程序员在新领域和新需求中的创意能力不可替代。</li>
</ul>
</li>
<li><strong>人际沟通与团队协作能力</strong>：
<ul>
<li>项目中的决策、问题协调、资源整合都需要人类来推动。</li>
</ul>
</li>
</ol>
<h3 data-id="heading-8">3.3 程序员未来应该做什么？</h3>
<ol>
<li><strong>提升抽象能力和建模能力</strong>：
<ul>
<li>从写代码转向设计方案，专注于高层次的架构和技术规划。</li>
</ul>
</li>
<li><strong>拥抱 AI 工具</strong>：
<ul>
<li>熟练使用 AI 编程工具（如 Trea、Cursor）提升效率，将 AI 当作“助手”。</li>
</ul>
</li>
<li><strong>深耕行业知识</strong>：
<ul>
<li>了解特定行业的业务逻辑，成为领域专家。</li>
</ul>
</li>
<li><strong>培养软技能</strong>：
<ul>
<li>强化沟通能力、团队协作能力和项目管理能力。</li>
</ul>
</li>
</ol>
<p>画了一个思维导图，大概是这样：</p>
<p><img class="medium-zoom-image" src="https://p3-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/446d071cf44f4649bf2799efff050813~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5r2Y6ZSm:q75.awebp?rk3s=f64ab15b&amp;x-expires=1738324527&amp;x-signature=b02BUkFyXatf6kbQ%2FyAc0%2Fif9ro%3D" alt="ai_sj.png" /></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2025/01/ai-programming-will-really-make-programmers-unemployed/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>深入源码解析 ComfyUI 的模块化节点设计架构</title>
		<link>https://www.phppan.com/2024/11/comfyui-node-system-source-analysis/</link>
		<comments>https://www.phppan.com/2024/11/comfyui-node-system-source-analysis/#comments</comments>
		<pubDate>Sat, 16 Nov 2024 01:25:39 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AIGC]]></category>
		<category><![CDATA[AI架构]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2294</guid>
		<description><![CDATA[ComfyUI 是一个基于 Stable Diffusion 的开源 AI 绘图工具，采用了模块化的节点式工作 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 是一个基于 Stable Diffusion 的开源 AI 绘图工具，采用了<strong style="color: #0e88eb;">模块化的节点式工作流设计</strong>。它通过将 Stable Diffusion 的各个组件和处理步骤抽象为独立的节点，使得用户可以通过直观的拖拽、连接操作来构建复杂的图像生成流程。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 解决了传统 AI 绘图工具易用性差、扩展性低的问题。其模块化设计和直观的 Web 界面大大降低了用户的使用门槛，无需深入了解底层技术细节，即可快速构建和调整工作流。同时，ComfyUI 还提供了强大的自定义节点机制，允许开发者轻松扩展新的功能和模型，使其能够适应不断发展的AI绘图领域。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 最初由开发者 Comfyanonymous 在 2022 年末发起，旨在提供一个简单、直观的 Stable Diffusion Web UI。<strong style="color: #0e88eb;">早期版本实现了基本的节点类型和 Web 界面</strong>，展示了其模块化设计的优势，吸引了一批 AI 绘图爱好者的关注。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">在 2023 年春夏，ComfyUI 进入了快速发展阶段。项目不断增加新的节点类型，如 ControlNet、Inpaint、Upscale等，支持更多的图像控制和后处理功能。同时，ComfyUI 引入了自定义节点机制，大大扩展了其功能和适用范围。项目也集成了更多 Stable Diffusion 衍生模型，为用户提供了更多选择。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">随着用户社区的不断壮大，ComfyUI 的生态也日益丰富。社区成员积极贡献工作流、节点脚本、训练模型等资源，推动项目的发展。ComfyUI 举办了一系列社区活动，促进了用户间的交流和创作。项目代码库也迎来了更多贡献者，社区力量成为 ComfyUI 发展的重要推动力。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">2023 年冬开始，ComfyUI 开始着眼于生态融合和应用拓展。项目与其他 AI 绘图工具建立了联系，支持工作流的导入导出和 API 集成。ComfyUI 也开始探索更多应用场景，如虚拟主播、游戏 mod 等，拓宽了 AI绘图的应用范围。越来越多的开发者和公司开始关注和使用 ComfyUI，其发展前景备受看好。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">前两周，Comfy 推出跨平台的 ComfyUI 安装包，现在我们可以一键安装 ComfyUI 了，这次更新不仅带来了全新的桌面版应用，还对用户界面进行了全面升级，并新增了自定义按键绑定、自动资源导入等一系列实用功能，让工作流程更加流畅。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">今天我们深入到 ComyUI 的源码去看一下其实现原理和过程。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 执行的大概流程如下：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;">用户界面 -&gt; 工作流定义 -&gt; PromptQueue
   ↓
PromptExecutor 开始执行
   ↓
验证输入 (validate_prompt)
   ↓
构建执行图
   ↓
按顺序执行节点
   ↓
缓存结果
   ↓
返回结果到界面

</code></pre>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1. ComfyUI 的初始化与执行流程详解</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的一个明显的优点是有着灵活的图形用户界面，可以用于处理复杂的图像生成和处理工作流。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">它具有精良的架构设计，通过模块化设计、缓存优化、资源管理以及错误处理机制，确保了系统的高效性和可靠性。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1.1 系统初始化流程</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的启动过程分为几个主要阶段：预启动脚本的执行、节点系统的初始化、服务器的启动与 WebSocket 的连接。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">1. 启动前准备</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">在系统启动前，ComfyUI 会首先执行预启动脚本，确保自定义节点的环境准备就绪。这一过程允许在加载节点之前执行一些必要的自定义操作。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">execute_prestartup_script</span>():
    <span style="font-style: italic; color: #5c6370;"># 执行自定义节点的预启动脚本</span>
    <span style="color: #c678dd;">for</span> custom_node_path <span style="color: #c678dd;">in</span> node_paths:
        <span style="color: #c678dd;">if</span> os.path.exists(script_path):
            execute_script(script_path)
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">2. 节点系统初始化</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">节点系统是 ComfyUI 的核心组件。此阶段会加载内置节点以及用户自定义的节点，并注册到系统中供后续使用。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">init_extra_nodes</span>():
    <span style="font-style: italic; color: #5c6370;"># 加载内置节点</span>
    import_failed = init_builtin_extra_nodes()
    <span style="font-style: italic; color: #5c6370;"># 加载自定义节点</span>
    init_external_custom_nodes()
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">内置节点</strong>: 位于 <code style="color: #0e8aeb;">comfy_extras</code> 目录下，定义了基本的图像处理功能。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">自定义节点</strong>: 用户可以通过 <code style="color: #0e8aeb;">custom_nodes</code> 目录添加自定义节点，扩展系统的功能。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">3. 服务器初始化</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">服务器初始化是启动 ComfyUI 的 Web 服务器的过程。它包括 WebSocket 的初始化，允许前端和后端实时通信。此外，执行队列也会在此阶段创建，用于管理节点的执行顺序和任务调度。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">class</span> <span style="color: #e6c07b;">PromptServer</span>:
    <span style="color: #c678dd;">def</span> <span style="color: #61aeee;">__init__</span>(self, loop):
        <span style="font-style: italic; color: #5c6370;"># 初始化 Web 服务器</span>
        self.app = web.Application()
        <span style="font-style: italic; color: #5c6370;"># 初始化 WebSocket</span>
        self.sockets = dict()
        <span style="font-style: italic; color: #5c6370;"># 初始化执行队列</span>
        self.prompt_queue = <span style="color: #56b6c2;">None</span>
</code></pre>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1.2 工作流执行流程</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">工作流执行是 ComfyUI 的核心功能，它包括从提交工作流到执行节点的整个过程。以下是工作流执行的几个关键步骤。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">1. 工作流验证</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">首先，系统会对提交的工作流进行验证，确保节点的类型存在、节点连接有效，并且每个节点的输入符合要求。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">validate_prompt</span>(prompt):
    <span style="font-style: italic; color: #5c6370;"># 1. 验证节点类型是否存在</span>
    <span style="font-style: italic; color: #5c6370;"># 2. 验证是否有输出节点</span>
    <span style="font-style: italic; color: #5c6370;"># 3. 验证节点输入</span>
    <span style="color: #c678dd;">return</span> (valid, error, good_outputs, node_errors)
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">2. 执行准备</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">在验证通过后，系统会初始化执行环境。这包括创建动态的提示（<code style="color: #0e8aeb;">DynamicPrompt</code>），以及初始化缓存系统，以避免重复计算并提高执行效率。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">execute</span>(self, prompt, prompt_id, extra_data={}, execute_outputs=[]):
    <span style="font-style: italic; color: #5c6370;"># 1. 初始化执行环境</span>
    <span style="color: #c678dd;">with</span> torch.inference_mode():
        <span style="font-style: italic; color: #5c6370;"># 2. 创建动态提示</span>
        dynamic_prompt = DynamicPrompt(prompt)
        <span style="font-style: italic; color: #5c6370;"># 3. 初始化缓存</span>
        is_changed_cache = IsChangedCache(dynamic_prompt, self.caches.outputs)
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">3. 节点执行</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">每个节点的执行流程包括获取节点的输入数据、检查是否有缓存的数据可以复用、执行节点逻辑、并缓存执行结果。节点执行是系统的核心环节，其过程如下：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">execute</span>(server, dynprompt, caches, current_item, extra_data, executed, prompt_id, execution_list, pending_subgraph_results):
    <span style="font-style: italic; color: #5c6370;"># 1. 获取节点信息</span>
    unique_id = current_item
    inputs = dynprompt.get_node(unique_id)[<span style="color: #98c379;">'inputs'</span>]
    class_type = dynprompt.get_node(unique_id)[<span style="color: #98c379;">'class_type'</span>]
    
    <span style="font-style: italic; color: #5c6370;"># 2. 检查缓存</span>
    <span style="color: #c678dd;">if</span> caches.outputs.get(unique_id) <span style="color: #c678dd;">is</span> <span style="color: #c678dd;">not</span> <span style="color: #56b6c2;">None</span>:
        <span style="color: #c678dd;">return</span> (ExecutionResult.SUCCESS, <span style="color: #56b6c2;">None</span>, <span style="color: #56b6c2;">None</span>)
    
    <span style="font-style: italic; color: #5c6370;"># 3. 获取输入数据</span>
    input_data_all, missing_keys = get_input_data(inputs, class_def, unique_id, caches.outputs, dynprompt, extra_data)
    
    <span style="font-style: italic; color: #5c6370;"># 4. 执行节点</span>
    output_data, output_ui, has_subgraph = get_output_data(obj, input_data_all)
    
    <span style="font-style: italic; color: #5c6370;"># 5. 缓存结果</span>
    caches.ui.set(unique_id, {...})
</code></pre>
<ol class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">获取节点信息</strong>: 获取当前节点的输入和类型信息。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">检查缓存</strong>: 如果节点的输出已经缓存，则直接返回缓存结果，避免重复执行。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">获取输入数据</strong>: 从上一个节点或缓存中获取需要的输入数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">执行节点</strong>: 调用节点的执行函数，处理输入并生成输出数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">缓存结果</strong>: 将执行结果缓存，以便后续节点使用。</section>
</li>
</ol>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1.3 执行队列管理</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 通过执行队列管理工作流中的节点执行顺序。每个节点的执行任务会被放入队列中，系统按顺序处理这些任务。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">prompt_worker</span>(q, server):
    e = execution.PromptExecutor(server, lru_size=args.cache_lru)
    
    <span style="color: #c678dd;">while</span> <span style="color: #56b6c2;">True</span>:
        <span style="font-style: italic; color: #5c6370;"># 1. 获取队列任务</span>
        queue_item = q.get(timeout=timeout)
        
        <span style="font-style: italic; color: #5c6370;"># 2. 执行提示</span>
        e.execute(item[<span style="color: #d19a66;">2</span>], prompt_id, item[<span style="color: #d19a66;">3</span>], item[<span style="color: #d19a66;">4</span>])
        
        <span style="font-style: italic; color: #5c6370;"># 3. 资源管理</span>
        <span style="color: #c678dd;">if</span> need_gc:
            comfy.model_management.cleanup_models()
            gc.collect()
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">获取队列任务</strong>: 从队列中取出下一个需要执行的节点任务。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">执行节点</strong>: 调用执行器执行当前节点。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">资源管理</strong>: 在必要时触发模型清理和垃圾回收，确保系统资源不被过度占用。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1.4 缓存系统</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的缓存系统采用层次化设计，可以缓存节点的输出、对象和 UI 相关的数据，极大地提高了执行效率。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">class</span> <span style="color: #e6c07b;">HierarchicalCache</span>:
    <span style="color: #c678dd;">def</span> <span style="color: #61aeee;">__init__</span>(self):
        self.outputs = {}  <span style="font-style: italic; color: #5c6370;"># 节点输出缓存</span>
        self.ui = {}  <span style="font-style: italic; color: #5c6370;"># UI 相关缓存</span>
        self.objects = {}  <span style="font-style: italic; color: #5c6370;"># 节点对象缓存</span>
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">输出缓存（outputs）</strong>: 缓存节点的执行结果，避免重复计算。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">对象缓存（objects）</strong>: 缓存大数据对象，如模型和图像，以减少加载时间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">UI 缓存（ui）</strong>: 缓存与前端界面相关的信息，如预览图像和执行状态。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">1.5 资源管理与错误处理</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">为了确保系统的稳定性，ComfyUI 提供了完善的资源管理和错误处理机制。在执行工作流的过程中，系统会自动清理未使用的模型和缓存，并在必要时触发内存回收。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">资源管理</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">资源管理包括内存清理、模型卸载以及缓存清理。系统会根据内存使用情况自动卸载不必要的模型，并定期触发垃圾回收。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="font-style: italic; color: #5c6370;"># 1. 内存清理</span>
comfy.model_management.cleanup_models()
gc.collect()

<span style="font-style: italic; color: #5c6370;"># 2. 模型卸载</span>
comfy.model_management.unload_all_models()

<span style="font-style: italic; color: #5c6370;"># 3. 缓存清理</span>
cache.clean_unused()
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">错误处理</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 实现了详细的错误处理机制，能够捕获并处理执行过程中发生的各种异常。对于节点执行中的错误，系统会记录错误信息并通知用户。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">handle_execution_error</span>(self, prompt_id, prompt, current_outputs, executed, error, ex):
    <span style="font-style: italic; color: #5c6370;"># 1. 处理中断异常</span>
    <span style="color: #c678dd;">if</span> isinstance(ex, comfy.model_management.InterruptProcessingException):
        self.add_message(<span style="color: #98c379;">"execution_interrupted"</span>, mes)
    <span style="font-style: italic; color: #5c6370;"># 2. 处理其他错误</span>
    <span style="color: #c678dd;">else</span>:
        self.add_message(<span style="color: #98c379;">"execution_error"</span>, mes)
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">处理中断异常</strong>: 当执行被中断时，系统会捕获异常并记录中断信息。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">处理其他错误</strong>: 处理其他执行错误，并通过 UI 向用户报告错误详情。</section>
</li>
</ul>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2. 节点系统架构</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">节点系统是 ComfyUI 的核心系统，其节点系统架构设计精巧，支持动态节点的加载、执行和扩展。今天我们详细介绍 ComfyUI 的节点系统架构，涵盖节点定义、执行流程、缓存机制、扩展性和系统特性等方面。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.1 节点系统的基础架构</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的节点系统基于 Python 模块化设计，所有节点及其行为都通过类的形式进行定义。这些节点在启动时会进行注册，允许系统灵活地加载和使用内置节点与自定义节点。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">核心节点定义与注册</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的节点系统在 <code style="color: #0e8aeb;">nodes.py</code> 中定义，并通过以下映射存储所有节点类及其显示名称：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;">NODE_CLASS_MAPPINGS = {}  <span style="font-style: italic; color: #5c6370;"># 存储所有节点类的映射</span>
NODE_DISPLAY_NAME_MAPPINGS = {}  <span style="font-style: italic; color: #5c6370;"># 节点显示名称映射</span>
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器">节点通过类定义，并包含以下几个关键属性：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">INPUT_TYPES</strong>: 输入参数的类型定义。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">RETURN_TYPES</strong>: 返回数据的类型定义。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">FUNCTION</strong>: 节点的具体执行函数。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">CATEGORY</strong>: 节点的类别，用于在 UI 中分类显示。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">节点类型</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 支持两种类型的节点：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">内置节点</strong>: 在系统启动时加载，存储在 <code style="color: #0e8aeb;">comfy_extras</code> 目录下。内置节点提供了常见的图像操作、模型加载和处理功能。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">自定义节点</strong>: 用户可以在 <code style="color: #0e8aeb;">custom_nodes</code> 目录中添加自定义节点，系统在启动时自动加载这些节点。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">节点加载机制</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 提供了灵活的节点加载机制，允许动态加载内置节点和自定义节点：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">init_builtin_extra_nodes</span>():
    extras_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), <span style="color: #98c379;">"comfy_extras"</span>)
    extras_files = [<span style="color: #98c379;">"nodes_latent.py"</span>, <span style="color: #98c379;">"nodes_hypernetwork.py"</span>]
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器">对于自定义节点，ComfyUI 使用动态模块导入的方式加载：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">load_custom_node</span>(module_path: str, ignore=set(), module_parent=<span style="color: #98c379;">"custom_nodes"</span>) -&gt; bool:
    module_spec = importlib.util.spec_from_file_location(module_name, module_path)
    module = importlib.util.module_from_spec(module_spec)
    <span style="color: #c678dd;">if</span> hasattr(module, <span style="color: #98c379;">"NODE_CLASS_MAPPINGS"</span>):
        <span style="color: #c678dd;">for</span> name, node_cls <span style="color: #c678dd;">in</span> module.NODE_CLASS_MAPPINGS.items():
            NODE_CLASS_MAPPINGS[name] = node_cls
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器">这种设计使得 ComfyUI 可以方便地扩展和加载新节点，用户可以根据需求自定义节点功能并动态加载。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.2 节点执行系统</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">节点的执行逻辑由 <code style="color: #0e8aeb;">execution.py</code> 中的 <code style="color: #0e8aeb;">PromptExecutor</code> 类负责。该类管理了节点的执行流程，包括输入验证、节点函数执行、结果缓存和输出返回等。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">执行流程</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">节点的执行流程如下：</p>
<ol class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">输入验证</strong>: 系统首先验证节点的输入是否符合预定义的输入类型。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">获取输入数据</strong>: 从上一个节点或缓存中获取节点的输入数据。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">执行节点函数</strong>: 根据定义的 <code style="color: #0e8aeb;">FUNCTION</code> 执行节点逻辑。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">缓存结果</strong>: 执行结果会缓存，避免重复计算。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">返回输出</strong>: 将执行结果返回给下游节点或 UI。</section>
</li>
</ol>
<p style="color: #000000;" data-tool="mdnice编辑器">执行器的核心代码如下：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">class</span> <span style="color: #e6c07b;">PromptExecutor</span>:
    <span style="color: #c678dd;">def</span> <span style="color: #61aeee;">execute</span>(self, prompt, prompt_id, extra_data=None, execute_outputs=[]):
        <span style="font-style: italic; color: #5c6370;"># 节点执行的主要逻辑</span>
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 通过此执行器确保节点按顺序执行，并管理节点间的数据流动。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.3 缓存机制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">为了提高性能，减少重复计算，ComfyUI 实现了多层缓存系统，缓存节点的输出、对象和 UI 相关数据。缓存的实现类为 <code style="color: #0e8aeb;">HierarchicalCache</code>，并且系统支持 <strong style="color: #0e88eb;">LRU（最近最少使用）</strong> 缓存策略。后续章节会详细讲一下缓存，这里先略过。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.4 数据流与依赖管理</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的节点系统依赖于图形化的数据流管理。节点之间通过输入和输出相互连接，系统会自动分析节点间的依赖关系，确保数据流在节点间正确传递。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">节点图解析与执行顺序</strong></p>
<ol class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">节点图解析</strong>: ComfyUI 解析 JSON 格式的节点图，识别节点之间的连接关系。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">依赖管理</strong>: 系统自动分析节点间的依赖，确保每个节点在其依赖的节点完成后执行。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">执行顺序构建</strong>: 系统基于依赖关系构建节点的执行顺序，防止循环依赖和执行死锁的发生。</section>
</li>
</ol>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.5 错误处理与资源管理</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 实现了完善的错误处理机制，确保节点执行过程中出现错误时，系统能够及时捕获并反馈给用户，避免系统崩溃。同时，ComfyUI 通过自动垃圾回收和内存管理功能，定期清理未使用的模型和缓存，优化系统资源使用。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">常见的错误处理机制包括：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">输入验证失败</strong>: 如果输入数据类型不匹配或数据缺失，系统会抛出异常。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">执行错误</strong>: 如果节点在执行过程中遇到错误，系统会捕获并将错误信息反馈到前端 UI。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">垃圾回收机制由以下代码管理：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;">gc_collect_interval = <span style="color: #d19a66;">10.0</span>  <span style="font-style: italic; color: #5c6370;"># 每10秒进行一次垃圾回收</span>
</code></pre>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.6 前端接口与用户交互</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 提供了 WebSocket 和 REST API 来管理前端与后端的通信。通过这些接口，前端 UI 可以实时监控节点的执行状态，并获取节点的执行结果。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">WebSocket 通信</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">WebSocket 负责处理前端与后端的实时通信，包括节点执行状态的推送和执行命令的接收。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #61aeee;">@routes.get('/ws')</span>
<span style="color: #c678dd;">async</span> <span style="color: #c678dd;">def</span> <span style="color: #61aeee;">websocket_handler</span>(request):
    <span style="font-style: italic; color: #5c6370;"># 处理前端连接</span>
    <span style="font-style: italic; color: #5c6370;"># 发送执行状态</span>
    <span style="font-style: italic; color: #5c6370;"># 处理节点执行</span>
</code></pre>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">REST API</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">REST API 用于获取节点信息和处理其他非实时请求。例如，可以通过以下 API 获取节点的详细信息：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #61aeee;">@routes.get("/object_info/{node_class}")</span>
<span style="color: #c678dd;">async</span> <span style="color: #c678dd;">def</span> <span style="color: #61aeee;">get_object_info_node</span>(request):
    <span style="font-style: italic; color: #5c6370;"># 获取节点信息</span>
</code></pre>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">2.7 系统扩展与自定义</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的节点系统设计非常灵活，支持用户根据需求扩展新功能。用户可以通过编写自定义节点来扩展系统的功能，而无需修改核心代码。系统支持热插拔的节点加载机制，使得自定义节点的开发和调试更加便捷。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">动态类型系统</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 支持动态类型系统，可以根据运行时情况自动调整节点的输入输出类型，确保系统的灵活性和可扩展性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">插件与自定义节点</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">自定义节点通过 <code style="color: #0e8aeb;">custom_nodes</code> 目录加载，用户可以编写自己的节点并通过 <code style="color: #0e8aeb;">NODE_CLASS_MAPPINGS</code> 注册到系统中。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3. 缓存系统</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">在 ComfyUI 项目中，缓存系统的设计主要由以下几个部分组成：</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.1 缓存类型</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的缓存系统主要包括三种缓存类型：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">outputs</strong>: 用于缓存节点的输出结果，减少不必要的重复计算。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">ui</strong>: 缓存与用户界面相关的数据，比如预览图像、状态信息等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">objects</strong>: 专门用于存储大型对象，如模型等大体积数据。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">这三种缓存通过 <strong style="color: #0e88eb;"><code style="color: #0e8aeb;">CacheSet</code></strong> 类进行初始化和管理，具体实现如下：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">class</span> <span style="color: #e6c07b;">CacheSet</span>:
    <span style="color: #c678dd;">def</span> <span style="color: #61aeee;">__init__</span>(self, lru_size=None):
        <span style="color: #c678dd;">if</span> lru_size <span style="color: #c678dd;">is</span> <span style="color: #56b6c2;">None</span> <span style="color: #c678dd;">or</span> lru_size == <span style="color: #d19a66;">0</span>:
            self.init_classic_cache() 
        <span style="color: #c678dd;">else</span>:
            self.init_lru_cache(lru_size)
        self.all = [self.outputs, self.ui, self.objects]
</code></pre>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.2 缓存实现方式</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">缓存系统可以根据不同的需求选择不同的实现方式：</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">Classic Cache（传统缓存）</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">当没有设置 LRU 缓存大小时，缓存系统会初始化为经典的层级缓存。具体实现如下：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">init_classic_cache</span>(self):
    self.outputs = HierarchicalCache(CacheKeySetInputSignature)
    self.ui = HierarchicalCache(CacheKeySetInputSignature)
    self.objects = HierarchicalCache(CacheKeySetID)
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">outputs</strong> 和 <strong style="color: #0e88eb;">ui</strong> 都使用 <code style="color: #0e8aeb;">CacheKeySetInputSignature</code> 作为缓存键，用于基于输入签名进行缓存。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">objects</strong> 使用的是 <code style="color: #0e8aeb;">CacheKeySetID</code> 作为缓存键，主要是为了存储大型对象，如模型数据。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">LRU Cache（最近最少使用缓存）</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">如果设置了 LRU 缓存大小，系统会初始化为 LRU 缓存，适用于内存较充足的情况下，以优化性能。</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">init_lru_cache</span>(self, cache_size):
    self.outputs = LRUCache(CacheKeySetInputSignature, max_size=cache_size)
    self.ui = LRUCache(CacheKeySetInputSignature, max_size=cache_size)
    self.objects = HierarchicalCache(CacheKeySetID)
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">outputs</strong> 和 <strong style="color: #0e88eb;">ui</strong> 使用 LRU 缓存，能够根据使用频率自动淘汰最少使用的缓存项，保证内存得到最优管理。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">objects</strong> 仍然使用 <code style="color: #0e8aeb;">HierarchicalCache</code>，因为模型等大型对象的加载和卸载代价较高，不适合频繁淘汰。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.3 缓存键策略</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">为了确保缓存的正确性，缓存系统使用两种不同的缓存键策略：</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">CacheKeySetInputSignature</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">用于 <strong style="color: #0e88eb;">outputs</strong> 和 <strong style="color: #0e88eb;">ui</strong> 缓存。</section>
</li>
<li>
<section style="color: #010101;">该缓存键基于节点的输入签名，包含节点类型、输入参数及祖先节点关系等，可以确保相同的输入得到相同的输出。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">CacheKeySetID</strong></p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">用于 <strong style="color: #0e88eb;">objects</strong> 缓存。</section>
</li>
<li>
<section style="color: #010101;">这是一种基于节点 ID 和类型的简单缓存键，用于存储与输入无关的大型对象，如模型等。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.4 缓存清理机制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">无论是传统缓存还是 LRU 缓存，ComfyUI 都提供了缓存清理机制，避免过多的缓存占用内存资源。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">经典缓存清理</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">经典缓存会及时释放不再需要的数据，防止内存溢出。</p>
<p style="color: #000000;" data-tool="mdnice编辑器"><strong style="color: #0e88eb;">LRU 缓存清理</strong></p>
<p style="color: #000000;" data-tool="mdnice编辑器">LRU 缓存通过一个 <code style="color: #0e8aeb;">generation</code> 计数器和 <code style="color: #0e8aeb;">used_generation</code> 字典记录每个缓存项的使用时间。当缓存超出预设大小时，LRU 算法会移除最久未使用的项。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.5 扩展性和调试</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的缓存系统支持扩展和调试：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">扩展性</strong>: 缓存系统支持自定义节点和模型的缓存策略，可以根据需要调整缓存大小和键生成逻辑。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">调试</strong>: 提供了 <code style="color: #0e8aeb;">recursive_debug_dump</code> 函数，能够以递归方式输出缓存的调试信息，方便开发者进行问题排查。</section>
</li>
</ul>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">recursive_debug_dump</span>(self):
    result = {
        <span style="color: #98c379;">"outputs"</span>: self.outputs.recursive_debug_dump(),
        <span style="color: #98c379;">"ui"</span>: self.ui.recursive_debug_dump(),
    }
    <span style="color: #c678dd;">return</span> result
</code></pre>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">3.6 缓存小结</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的缓存系统设计非常灵活，它通过 <code style="color: #0e8aeb;">CacheSet</code> 类将不同类型的数据（节点输出、UI 数据、大型对象）分离管理，并支持经典缓存和 LRU 缓存两种策略。依靠层次化的缓存结构和精确的缓存键策略，ComfyUI 能够有效地减少重复计算，并优化内存使用。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4. 使用限制</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">在使用 ComfyUI 时，虽然系统本身没有硬性限制节点数量，但仍然存在一些与性能、资源管理和系统稳定性相关的限制。这些限制大多与历史记录、图像分辨率、缓存、内存管理等方面有关。</p>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.1 历史记录限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 会保存工作流中的历史记录，用于回溯和调试。系统中对历史记录的最大保存数量有如下限制：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;">MAXIMUM_HISTORY_SIZE = <span style="color: #d19a66;">10000</span>
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: 系统最多保存 10000 条历史记录。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 当历史记录达到上限时，旧的记录会被移除，无法继续回溯到更早的操作。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 如果不需要长时间保存历史记录，定期清理历史记录可以释放内存资源，提升系统的运行效率。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.2 图像分辨率限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 中对单个图像处理的最大分辨率有限制，防止超大图像导致系统崩溃或内存不足：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;">MAX_RESOLUTION = <span style="color: #d19a66;">16384</span>
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: 系统允许的最大图像分辨率为 16384&#215;16384 像素。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 超过此分辨率的图像无法处理，可能会导致内存溢出或显存不足的情况。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 尽量避免处理过于高分辨率的图像，尤其是在显存较小的 GPU 上运行时。对于需要处理大图像的工作流，可以考虑将图像分割成多个较小的瓦片。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.3 VAE 解码瓦片大小限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">在图像生成过程中，VAE 解码器对瓦片大小进行了限制，以确保解码过程的效率与内存管理：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #98c379;">"tile_size"</span>: (<span style="color: #98c379;">"INT"</span>, {<span style="color: #98c379;">"default"</span>: <span style="color: #d19a66;">512</span>, <span style="color: #98c379;">"min"</span>: <span style="color: #d19a66;">128</span>, <span style="color: #98c379;">"max"</span>: <span style="color: #d19a66;">4096</span>, <span style="color: #98c379;">"step"</span>: <span style="color: #d19a66;">32</span>})
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: VAE 解码时，允许的瓦片大小在 128 到 4096 像素之间。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 如果瓦片大小设置过大，系统可能会因为内存不足而运行缓慢或崩溃；瓦片大小过小则可能影响解码效率。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 根据 GPU 显存大小合理调整瓦片大小，找到性能和内存占用之间的平衡点。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.4 文件上传大小限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">在使用 ComfyUI 时，文件上传的大小受限于系统的配置，特别是通过命令行参数 <code style="color: #0e8aeb;">max_upload_size</code> 来控制：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;">max_upload_size = round(args.max_upload_size * <span style="color: #d19a66;">1024</span> * <span style="color: #d19a66;">1024</span>)
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: 上传文件的最大尺寸由命令行参数 <code style="color: #0e8aeb;">max_upload_size</code> 控制，单位为 MB。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 超过上传文件大小限制的文件将无法上传或处理。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 如果需要上传较大的文件，可以通过调整命令行参数来提高上传文件的大小限制。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.5 缓存限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 使用缓存系统来优化计算效率，减少重复计算。缓存的大小和管理方式可以通过 LRU（最近最少使用）策略进行控制：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #c678dd;">def</span> <span style="color: #61aeee;">__init__</span>(self, lru_size=None):
    <span style="color: #c678dd;">if</span> lru_size <span style="color: #c678dd;">is</span> <span style="color: #56b6c2;">None</span> <span style="color: #c678dd;">or</span> lru_size == <span style="color: #d19a66;">0</span>:
        self.init_classic_cache() 
    <span style="color: #c678dd;">else</span>:
        self.init_lru_cache(lru_size)
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: 缓存的大小受 LRU 策略控制，缓存过多时，系统会淘汰最少使用的缓存项。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 当缓存大小设置过小，可能会频繁清除缓存，导致重复计算；缓存过大则可能占用大量内存。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 根据内存资源合理设置缓存大小。对于内存充足的系统，可以增加缓存大小，以减少重复计算；对于内存紧张的系统，建议定期清理缓存。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.6 执行队列限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">节点的执行通过队列进行管理，系统按顺序执行节点，避免同时执行过多节点造成性能瓶颈：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: 系统使用队列调度节点执行，包括当前运行的队列和等待执行的队列。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 如果节点过多，执行速度会受到队列调度的影响，可能出现等待时间过长的情况。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 尽量简化工作流，避免过多的节点同时排队执行。如果遇到性能瓶颈，可以将大规模的工作流分解为多个子工作流逐步执行。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.7 Tokenizer 限制</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">在文本处理方面，CLIP 模型的 Tokenizer 有一个最大长度限制：</p>
<pre style="color: #000000;" data-tool="mdnice编辑器"><code style="color: #abb2bf;"><span style="color: #98c379;">"model_max_length"</span>: <span style="color: #d19a66;">77</span>
</code></pre>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">限制描述</strong>: CLIP 模型的 Tokenizer 最多支持 77 个 token。可修改配置。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">影响</strong>: 超过 77 个 token 的输入文本将被截断，可能会影响文本生成的精度。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">建议</strong>: 尽量保持输入文本简洁，避免过长的描述。如果必须使用长文本，可以通过分段输入的方式进行处理。</section>
</li>
</ul>
<h2 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">4.8 限制小结</span></h2>
<p style="color: #000000;" data-tool="mdnice编辑器">虽然 ComfyUI 对节点数量没有明确的硬性限制，但在使用过程中仍然受到一些系统资源和配置的限制。这些限制大多是为了确保系统的稳定性、优化性能以及合理使用内存资源。为了避免因这些限制导致的性能瓶颈或崩溃，建议在使用时遵循以下最佳实践：</p>
<ul class="list-paddingleft-1" style="color: #000000;" data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">保持工作流简洁</strong>: 避免不必要的节点，定期清理历史记录和缓存。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">监控系统资源</strong>: 注意监控内存和显存的使用情况，避免资源耗尽。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">分解大型工作流</strong>: 对于复杂的工作流，可以分成多个子工作流来逐步执行，减少单次执行的节点数量。</section>
</li>
<li>
<section style="color: #010101;"><strong style="color: #0e88eb;">调整系统配置</strong>: 根据实际需求调整文件上传大小、缓存设置等参数。</section>
</li>
</ul>
<p style="color: #000000;" data-tool="mdnice编辑器">通过合理地管理工作流和系统资源，ComfyUI 可以在大型工作流中保持高效运行，避免因资源限制导致的性能问题。</p>
<h1 style="color: #000000;" data-tool="mdnice编辑器"><span style="font-weight: bold; color: #0e8aeb;">模块化设计带来的无限可能</span></h1>
<p style="color: #000000;" data-tool="mdnice编辑器">ComfyUI 的模块化节点系统不仅提升了用户的易用性，还通过灵活的扩展机制和高效的缓存管理提供了强大的自定义能力。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">它的图形化工作流设计大大降低了 AI 绘图的技术门槛，使得更多用户能够轻松上手，并根据自己的需求定制不同的图像生成方案。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">随着社区的不断壮大和功能的持续扩展，ComfyUI 有望成为 AI 绘图领域的重要基础设施之一，为创作与开发者提供无限的可能性。</p>
<p style="color: #000000;" data-tool="mdnice编辑器">以上。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/11/comfyui-node-system-source-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一文了解文生图中 ControlNet 的实现原理和生态发展</title>
		<link>https://www.phppan.com/2024/07/the-implementation-principle-and-ecological-development-of-controlnet-aigc/</link>
		<comments>https://www.phppan.com/2024/07/the-implementation-principle-and-ecological-development-of-controlnet-aigc/#comments</comments>
		<pubDate>Sun, 07 Jul 2024 09:06:05 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AIGC]]></category>
		<category><![CDATA[ControlNet]]></category>
		<category><![CDATA[SD]]></category>
		<category><![CDATA[SDXL]]></category>
		<category><![CDATA[Stable Diffusion]]></category>
		<category><![CDATA[文生图]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2253</guid>
		<description><![CDATA[在聊 ControlNet 的之前，先了解一下 ControlNet 的基础模型 Stable Diffusi [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">在聊 ControlNet 的之前，先了解一下 ControlNet 的基础模型 Stable Diffusion 的生成过程。</p>
<p data-tool="mdnice编辑器">Stable Diffusion (SD) 是一种基于扩散模型的文本到图像生成技术，它可以根据输入的文字描述，生成与之语义相符的高质量图片。整个 SD 模型的架构包含了多个关键组件，它们分工协作、相互配合，共同完成了这一令人惊叹的创意生成任务。</p>
<h1 data-tool="mdnice编辑器"><span class="content">Stable Diffusion 的实现原理</span></h1>
<p data-tool="mdnice编辑器">SD 的核心思路源自扩散模型。扩散模型是一类生成式模型，它的基本原理是：<strong>先将原始数据加入大量随机噪声，然后学习如何一步步去除噪声、恢复数据。</strong> SD 正是利用了这一思路来生成图像。它先将原始图片加入高斯噪声，得到一张几乎全是噪点的图。然后，使用一个名为 UNet 的神经网络，通过多轮迭代去噪，最终生成干净、清晰的图像。</p>
<p data-tool="mdnice编辑器">在训练阶段，SD 模型接受三个输入：<strong>原始图片、加噪后的图片、以及对原始图片的文本描述</strong>。其中，UNet 学习建立起加噪图片和原始图片之间的映射关系。通过最小化预测噪声与真实噪声的差异，UNet 掌握了去噪的能力。同时，由于训练数据中包含了图像-文本对，UNet 也学会了如何根据文本线索对图像去噪，这是后续根据文字生图的基础。</p>
<p data-tool="mdnice编辑器">但是，直接对原始图片进行去噪训练会带来巨大的计算开销。为了提高效率，SD 先使用<strong>变分自编码器(VAE)将高维图像压缩到低维隐空间</strong>，然后在隐空间中进行去噪操作。VAE 不仅大幅降低了数据维度，它学习到的隐空间还具有良好的语义结构，使得相似图像在隐空间中更紧邻、更易融合。</p>
<p data-tool="mdnice编辑器">为了让输入的文本 Prompt 有效地指引图像生成，SD 使用 <strong>CLIP 模型对文本进行编码</strong>。CLIP 模型擅长捕捉图像和文本的对齐关系，它生成的文本特征向量与图像视觉特征的分布更加一致。在生成阶段，文本编码和初始噪声图像一起输入 UNet，共同决定去噪的方向和结果，使得最终图像在语义上与文本描述相匹配。</p>
<p data-tool="mdnice编辑器">但是，扩散模型通常需要上千步去噪迭代才能生成好的图像，这非常耗时。为了加速生成过程，SD <strong>借鉴了 DDIM 等快速采样方法</strong>。它们通过跳过一些中间去噪步骤，在保证质量的同时大幅提升了生成速度。</p>
<p data-tool="mdnice编辑器">SD 模型的生成流程可以概括为：<strong>输入的文本描述先被 CLIP 编码为语义向量，同时在隐空间中随机生成一张噪声图像。二者一同输入 UNet 进行多步去噪，并使用 DDIM 等采样加速。最终，去噪得到的隐空间图像通过 VAE 解码，还原为高清的 RGB 图片输出。</strong></p>
<p data-tool="mdnice编辑器">SD 的一大亮点是其开源、模块化的设计。得益于此，各个组件都可以灵活地替换升级，社区还发明了ControlNet、LoRA 等参数高效微调技术，使得 SD 模型可以快速适应各种新的应用场景。这极大地激发了开发者和艺术家们的创造力，SD 已成为当前 AIGC 领域的一大热点。</p>
<p data-tool="mdnice编辑器">虽然 SD 已经很优秀了，超出了人们的想象，但是 SD 模型本身有一些问题需要解决，如<strong>无条件的生成，生成过程难以控制，无法根据用户的特定意图或要求来生成或编辑图像</strong>等。</p>
<p data-tool="mdnice编辑器">这导致SD模型在实际应用中面临一些局限性，如缺乏可控性、灵活性不足、难以进行精细的图像编辑等。</p>
<p data-tool="mdnice编辑器">2023 年年初 ControlNet 横空出世，通过引入额外的控制信号和可学习的控制器网络，解决了 SD 模型在可控图像生成方面的这些问题，使其能够根据用户提供的边缘、关键点、分割掩码等条件，生成满足特定约束的高质量图像，大大扩展了 SD 模型的应用场景和实用性。</p>
<h1 data-tool="mdnice编辑器"><span class="content">ControlNet 的原理</span></h1>
<p data-tool="mdnice编辑器">ControlNet 是一种用于可控图像生成的扩散模型。它通过接受额外的控制信号(如边缘、关键点、分割掩码等)来指导图像生成过程，使生成的图像符合给定的控制约束。</p>
<p data-tool="mdnice编辑器">ControlNet 解决的主要问题是如何在图像生成过程中引入更多的控制和约束，使生成的图像符合用户的特定要求。具体来说，ControlNet 解决了以下几个问题：</p>
<ol data-tool="mdnice编辑器">
<li>
<section><strong>可控性问题</strong>：传统的扩散模型通常是无条件的，生成的图像无法根据用户的意图进行控制。ControlNet通过引入额外的控制信号，如边缘、关键点、分割掩码等，使得生成的图像能够满足特定的约束条件，提高了图像生成的可控性。</section>
</li>
<li>
<section><strong>灵活性问题</strong>：以往的图像生成方法通常针对特定的任务或控制类型设计，泛化能力有限。ControlNet 提出了一种通用的控制器网络设计，可以适应不同类型的控制信号，无需为每种控制任务重新训练整个模型，大大提高了模型的灵活性和适用性。</section>
</li>
<li>
<section><strong>图像编辑问题</strong>：传统的图像编辑方法通常需要复杂的人工操作或专门设计的算法。ControlNet 允许用户通过提供简单的控制信号(如涂鸦、关键点等)来指导图像的编辑过程，使得图像编辑更加直观和便捷。</section>
</li>
<li>
<section><strong>多模态融合问题</strong>：在许多应用场景中，需要将不同模态的信息(如文本、语音、图像等)融合生成图像。ControlNet提 供了一种将不同模态信息编码为控制信号的方法，使得扩散模型能够根据多模态输入生成相应的图像。</section>
</li>
<li>
<section><strong>数据效率问题</strong>：训练高质量的图像生成模型通常需要大量的数据和计算资源。ControlNet 通过固定预训练的扩散模型，只训练控制器网络，大大减少了训练所需的数据和计算量，提高了数据利用效率。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">ControlNet 的核心思路是<strong>通过引入额外的控制信号，在扩散模型的生成过程中引导图像的合成使其符合预定的约束条件</strong>。其主要思路简单来说如下:</p>
<ol data-tool="mdnice编辑器">
<li>
<section>利用预训练的扩散模型作为图像生成的基础，保持其参数不变。</section>
</li>
<li>
<section>设计一个控制器网络，将其插入到扩散模型的每个去噪步骤中，使得扩散模型的每一步与对应的控制信号相结合，这个控制网络是 ControlNet 的核心。</section>
</li>
<li>
<section>控制器网络接受图像的潜在表示和对应步骤的控制信号表示，学习如何将它们融合以调制扩散过程。</section>
</li>
<li>
<section>通过控制器网络的调制，使扩散模型的去噪过程朝着满足控制约束的方向进行，最终生成符合要求的图像。ControlNet 支持多种类型的控制信号，如边缘、关键点、分割掩码、深度图等。针对不同类型的控制，控制器网络的结构可能有所不同，但基本原理类似。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">ControlNet 通过引入可学习的控制器网络，有效解决了扩散模型在可控图像生成领域面临的局限性。</p>
<p data-tool="mdnice编辑器">它支持多种类型的控制信号，如边缘、关键点、分割掩码等，使得用户能够根据特定意图对生成图像进行精细控制。ControlNet 生成的图像在满足控制约束的同时，保持了高质量和逼真性。</p>
<p data-tool="mdnice编辑器">此外，ControlNet采用了固定预训练扩散模型、仅训练控制器网络的策略，大大提高了数据和计算效率。ControlNet 为图像生成和编辑任务带来了新的可能性，在创意设计、虚拟内容生成等领域展现出广泛的应用前景。</p>
<p data-tool="mdnice编辑器">ControlNet 的性能在一定程度上依赖于控制信号的质量，噪声或不完整的控制信号可能导致生成图像的缺陷。</p>
<p data-tool="mdnice编辑器">目前，ControlNet 主要针对低级视觉控制进行设计，对高层语义控制的支持有限。此外，ControlNet在生成高分辨率、细节丰富图像时，可能面临计算开销大、推理速度慢的挑战，在实时交互场景中的应用受到一定限制。</p>
<p data-tool="mdnice编辑器">未来，提高 ControlNet 在语义理解、鲁棒性和计算效率方面的表现，将是其进一步发展的重点方向。同时，探索 ControlNet 与其他生成模型、编辑工具的结合，有望进一步拓展其应用范围和功能。</p>
<h1 data-tool="mdnice编辑器"><span class="content">ControlNet 的生态</span></h1>
<p data-tool="mdnice编辑器">从 SD 模型版本支持来看，ControlNet 可以分为 SD1.5 和 SDXL 两个常用版本。其中 SD1.5 在生态方面更完善一些，SDXL 发展过程中，大家不约而同选择了闭源自己玩多一些。</p>
<p data-tool="mdnice编辑器">从发行机构来看，分为官方模型和第三方模型。</p>
<p data-tool="mdnice编辑器">官方模型多分支 SD1.5 和 SD2.0 模型，<strong>没有 SDXL 的模型</strong>，SDXL 的模型多来源于社区，大概的生态情况如下：</p>
<p data-tool="mdnice编辑器"><strong>ControlNet 1.1 包括 14 个模型（10 个生产就绪模型、2 个实验模型、2 个融合版本）：</strong></p>
<p data-tool="mdnice编辑器"><strong>10 个生产模型：</strong></p>
<ul data-tool="mdnice编辑器">
<li>
<section>control_v11p_sd15_canny.pth <strong>Canny边缘检测模型</strong>：使用 Canny 算法提取图像主体轮廓的边缘线条，再进行填色。1.1 版本相对于之前的版本，消除训练数据缺陷，并通过大规模训练提升了模型性能和输出质量。</section>
</li>
<li>
<section>control_v11p_sd15_inpaint.pth <strong>Inpaint 修补模型</strong>：对图像局部重绘修饰,保留其他部分。用于小范围创意设计。</section>
</li>
<li>
<section>control_v11p_sd15_lineart.pth <strong>Lineart 线性检测模型</strong>：提取精细丰富的线稿，适用于产品设计等。</section>
</li>
<li>
<section>control_v11p_sd15_mlsd.pth <strong>MLSD 模型</strong>：善于提取直线线段，如建筑线条结构，适合建筑/室内设计风格。1.1 版本相对于之前的版本，扩充训练集并增加训练量，使直线检测能力得到进一步提高。</section>
</li>
<li>
<section>control_v11p_sd15_normalbae.pth <strong>Normal 法线贴图模型</strong>：检测像素的 RGB 值和表面法线方向，分离主体和背景，用于整体色彩调整。1.1 版本相对于之前的版本，采用更准确的法线贴图估计方法，增强了模型的鲁棒性和实用性。</section>
</li>
<li>
<section>control_v11p_sd15_openpose.pth <strong>Openpose 人体姿态检测模型</strong>：识别人体关键点和运动轨迹，用于调整人物姿态、表情等。1.1 版本相对于之前的版本，对 Openpose 实现细节进行改进，提高了人体姿态估计，尤其是手部的准确度。</section>
</li>
<li>
<section>control_v11p_sd15_scribble.pth <strong>Scribble 涂鸦模型</strong>：可以基于用户手绘的线条、涂鸦等输入生成相关图像。1.1 版本相对于之前的版本，适应更粗的涂鸦输入，同时通过修正数据和延长训练改善效果。</section>
</li>
<li>
<section>control_v11p_sd15_seg.pth <strong>Segmentation 语义分割网络</strong>：将图像分割为约 150 种颜色代表的物体，可单独处理天空、建筑、树木等要素。1.1 版本相对于之前的版本，扩展了对COCO数据集的支持,向下兼容旧版输入。</section>
</li>
<li>
<section>control_v11p_sd15_softedge.pth <strong>Softedge 软线性检测模型</strong>：一种边缘检测模型，生成更柔和自然的线条。1.1 版本相对于之前的版本，新的预处理方法和针对性数据筛选，使模型的边缘处理能力大幅提升，实用性与depth相当。</section>
</li>
<li>
<section>control_v11p_sd15s2_lineart_anime.pth <strong>Anime Lineart动漫线稿检测模型</strong>：Lineart的升级版，专门用于动漫线稿上色，效果更自然流畅。</section>
</li>
</ul>
<p data-tool="mdnice编辑器"><strong>2 个实验版本：</strong></p>
<ul data-tool="mdnice编辑器">
<li>
<section>control_v11e_sd15_ip2p.pth <strong>IP2P 直接编辑模型</strong>：根据文本描述直接编辑图像，如&#8221;让房子着火&#8221;。需要用户有创意和想象力。</section>
</li>
<li>
<section>control_v11e_sd15_shuffle.pth <strong>Shuffle 随机处理模型</strong>：随机组合图像要素,生成风格化图像。可用于风格迁移。</section>
</li>
</ul>
<p data-tool="mdnice编辑器"><strong>2 个融合版本</strong>：</p>
<ul data-tool="mdnice编辑器">
<li>
<section>control_v11f1e_sd15_tile.pth <strong>Tile 模型</strong>：将图像分割成小块处理,用于放大图像细节或图像修复。</section>
</li>
<li>
<section>control_v11f1p_sd15_depth.pth <strong>Depth 深度图模型</strong>：分析图像中物体的空间位置关系，常用于人物换背景，调整手臂位置等创意设计。1.1 版本相对于之前的版本，通过修复训练数据和采用无偏方法，使模型在更多场景下表现出色。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">官方的文件名看起来是有规律的，其规则如下：</p>
<ol data-tool="mdnice编辑器">
<li>
<section>版本号(v11)：表示 ControlNet 的版本号，如 v11 代表 1.1 版本，v10 代表 1.0 版本。版本号升级通常意味着模型性能和功能的优化和扩展。</section>
</li>
<li>
<section>模型状态(p):表示模型所处的状态，其中:</p>
<ul>
<li>
<section>p表示正式版(production)，该模型已经比较稳定，适合新手使用。</section>
</li>
<li>
<section>e表示实验版本(experimental)，该模型仍在实验阶段，结果可能不太稳定，更适合研究者探索。</section>
</li>
<li>
<section>u表示未完成版本(unfinished)，表示模型尚未完成。</section>
</li>
</ul>
</section>
</li>
<li>
<section>Stable Diffusion版本(sd15):表示该ControlNet模型所基于的Stable Diffusion版本，如sd15代表Stable Diffusion 1.5，sd21 代表Stable Diffusion 2.1。不同版本的Stable Diffusion在模型结构和训练数据上可能有所差异，因此 ControlNet 模型需要指定兼容的 SD 版本。</section>
</li>
<li>
<section>模型类型(canny)：表示该 ControlNet 模型的主要功能和用途,如 canny 代表 Canny边缘检测，openpose 代表人体姿态估计，hed 代表 Holistically-Nested Edge Detection 用于提取软边缘，scribble 代表涂鸦等。不同类型的 ControlNet 模型在控制方式和生成效果上各有特点。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">举个例子：control_v11p_sd15_canny 这个模型名称表示：这是一个 ControlNet 1.1 版本的模型，已经发布为正式版，基于 Stable Diffusion 1.5 训练，主要用于 Canny 边缘检测任务。</p>
<p data-tool="mdnice编辑器">模型下载地址：https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main</p>
<p data-tool="mdnice编辑器">第三方模型相对无序一些，并且以在 SDXL 表现较多，大概有如下的一些：</p>
<ul data-tool="mdnice编辑器">
<li>
<section>Lvmin 的模型集合：包括diffusers ControlNet、Controllllite、Stability AI Control LoRA、T2I Adapter等。</section>
</li>
<li>
<section>Qinglong的Controllllite SDXL模型：包括Normal Dsine、Tile realistic、Tile anime、MLSD、DW pose、Normal、Recolor Luminance、Softedge、Segment animeface等。</section>
</li>
<li>
<section>TTPLanet Tile Realistic：由社区为SDXL训练的逼真瓷砖模型。</section>
</li>
<li>
<section>2vXpSwA7 cnllliteL：grey2color和anystyle模型。</section>
</li>
<li>
<section>MistoLine:SDXL softedge模型。</section>
</li>
<li>
<section>Kataragi的SDXL模型：包括 Inpaint、Recolor、Lineart、Line2Color 等，提供半精度模型和rank128 LoRA。</section>
</li>
<li>
<section>Xinsir的SDXL模型：包括Canny、Openpose、Scribble、Scribble-Anime等。</section>
</li>
</ul>
<h1 data-tool="mdnice编辑器"><span class="content">一些应用场景</span></h1>
<p data-tool="mdnice编辑器">ControlNet 目前在多个领域展现出了广阔的应用前景，主要有以下几个方面:</p>
<ol data-tool="mdnice编辑器">
<li>
<section><strong>设计辅助</strong>：通过输入简单的线稿、轮廓或布局，ControlNet 可以帮助平面设计、工业设计、服装设计等领域快速生成多样的设计方案，提高设计效率和创意。</section>
</li>
<li>
<section><strong>影视动漫创作</strong>：ControlNet 能够根据故事板或概念草图等粗略输入，生成细致的场景、人物、道具等素材，辅助影视、动画、游戏等视觉创意行业的前期创作。甚至是后期的合成及剪辑。</section>
</li>
<li>
<section><strong>虚拟试衣/试妆</strong>：基于 ControlNet 的姿态估计和人像生成能力，可实现虚拟试衣、试妆等功能，应用于电商、社交、美妆等领域，提供沉浸式的交互体验。</section>
</li>
<li>
<section><strong>建筑与室内设计</strong>：通过点线面等简单输入，ControlNet 可以辅助建筑外观、室内布局、家居陈设等设计任务，提供多种风格选择，用于方案展示和评估。</section>
</li>
<li>
<section><strong>医疗影像分析</strong>：ControlNet 能够根据医学影像的轮廓或标注，生成更清晰、更符合诊断需求的医学图像，辅助医生进行疾病诊断和手术规划等。</section>
</li>
<li>
<section><strong>教育与培训</strong>：基于ControlNet生成各种教学演示素材，如解剖图、示意图等，提高学习效率。在VR/AR场景中自动生成训练环境。</section>
</li>
<li>
<section><strong>文旅与数字展览</strong>：通过简单的场景布局输入，ControlNet可快速生成丰富多样的游览场景、数字藏品，应用于文旅推广、虚拟展览等。</section>
</li>
<li>
<section><strong>智能图像编辑</strong>：ControlNet可以实现图像修复、抠图、换背景、图像风格转换等常见图像编辑功能，提供更智能、更简便的图像处理工具。</section>
</li>
</ol>
<h1 data-tool="mdnice编辑器"><span class="content">小结</span></h1>
<p data-tool="mdnice编辑器">在 ControlNet 没有出来之前，很多时候能不能出来一个好看的画面，只能通过大量的 Prompt 测试实现，以数量去对冲概率。</p>
<p data-tool="mdnice编辑器">在当下，如果能用好控制出图的三个最关键因素：提示词、Lora、ControlNet，能让「出图与我们想象的画面一致」概率更高。</p>
<p data-tool="mdnice编辑器">通过前面的几个小节，我们可以看到:</p>
<ol data-tool="mdnice编辑器">
<li>
<section>ControlNet 通过使用额外的条件控制输入，如语义分割图、边缘检测图等，让文本到图像生成更加可控。这大大提升了生成图像与用户期望相符的概率。</section>
</li>
<li>
<section>ControlNet 的一大优势在于它的通用性和灵活性。通过使用不同类型的控制条件，可以引导模型生成各种不同风格和内容的图像。而且这些控制条件可以通过现有的 CV 模型自动获取，方便集成。</section>
</li>
<li>
<section>围绕 ControlNet 已经形成了活跃的生态。各种开源实现和 web 应用让普通用户也能轻松使用，专业的 GUI 让艺术创作者可以更高效地把控细节。社区也在不断贡献新的模型权重，扩展 ControlNet 的应用边界。</section>
</li>
<li>
<section>但 ControlNet 并非万能，提示词的设计、LoRA 模型的选择仍然是影响效果的关键因素。掌握并灵活组合这三者，才能最大限度提升「如我所愿」出图的成功率。</section>
</li>
<li>
<section>展望未来，ControlNet 为可控文生图开辟了新的方向，但仍有很多挑战亟待解决，如更精细的空间控制、更强的全局一致性等。相信随着研究的深入，ControlNet 会带来更多惊喜。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">以上</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/07/the-implementation-principle-and-ecological-development-of-controlnet-aigc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>快速了解文生图 AIGC 的 15 个关键词</title>
		<link>https://www.phppan.com/2024/02/quickly-understand-the-15-keywords-of-vincentian-diagram-aigc/</link>
		<comments>https://www.phppan.com/2024/02/quickly-understand-the-15-keywords-of-vincentian-diagram-aigc/#comments</comments>
		<pubDate>Thu, 08 Feb 2024 07:44:28 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AIGC]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2164</guid>
		<description><![CDATA[冯唐在《成事心法》中提到过这样一个观点：「只要你把这 100 个相关的关键词搞清楚，而且每个关键词，你都能给出 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color: #191b1f;" data-first-child="" data-pid="1a91gmUd">冯唐在《成事心法》中提到过这样一个观点：「只要你把这 100 个相关的关键词搞清楚，而且每个关键词，你都能给出合理的答案，那么你也可以成为这个领域的专家」。</p>
<p style="color: #191b1f;" data-pid="HxWdr2aO">想要快速了解 AIGC 文生图，从了解下面的 15 个关键词开始吧。</p>
<h2 style="color: #191b1f;">AI 概念名称</h2>
<h2 style="color: #191b1f;">AI</h2>
<p style="color: #191b1f;" data-pid="F1DFgXp3">AI，Artificial Intelligence，人工智能</p>
<p style="color: #191b1f;" data-pid="IRNvgoPh">人工智能这个词在大众想象中常常会勾起有关自主思考的机器人和智能机器的画面。但核心上，AI 是关于创建智能算法的学科，目的是执行通常需要人类智慧才能完成的任务。人工智能的概念自 20 世纪中叶以来就已存在，但它是在 1956 年的达特茅斯会议上，由约翰·麦卡锡正式提出的术语。</p>
<p style="color: #191b1f;" data-pid="lrxyB391">从那时起的几十年里，AI 已经从理论概念演变成一个涵盖机器学习、神经网络和深度学习等的强大领域。如今，AI 不仅仅是一个研究领域；它已成为我们日常生活中不可或缺的一部分，改变着行业并创造出曾经只存在于科幻小说中的新可能性。</p>
<h2 style="color: #191b1f;">AGI</h2>
<p style="color: #191b1f;" data-pid="cF_0-ghF">AGI，Artificial General Intelligence，人工通用智能，也称为强人工智能或全能 AI</p>
<p style="color: #191b1f;" data-pid="amso-pcw">AGI 指一种具有普遍的认知能力的机器智能，它能在各种领域和任务中表现出与人类相当或更高的效能。与目前的人工智能系统（被称为弱 AI 或专用 AI ）不同，这些系统通常设计用来解决特定问题或执行特定任务，AGI 将能够像人类一样学习、理解、推理和应用知识于新的和多样化的情境中。</p>
<p style="color: #191b1f;" data-pid="L5j1zPHm">AGI 的概念和 AI 一起发展，但成为独立研究的重点是在 21 世纪初</p>
<h2 style="color: #191b1f;">AIGC</h2>
<p style="color: #191b1f;" data-pid="A5WP1rLN">AIGC，AI Generated Content，AI 生成内容</p>
<p style="color: #191b1f;" data-pid="yUE0w3T5">AIGC 指的是通过人工智能算法自动创建的内容，这些内容可以包括文字、图像、音频、视频和其它多媒体格式。</p>
<p style="color: #191b1f;" data-pid="1pIsIHup">现在主要是利用了像生成对抗网络（GANs）和 Transformer 模型等技术，这些工具能够生成逼真和具有创造性的输出。</p>
<p style="color: #191b1f;" data-pid="DbziJtF0">在文本领域，AIGC体现在自动撰写新闻、小说创作、营销文案编写等；在视觉艺术领域，AIGC 则能够创作出新的图像作品、动画和视频。</p>
<p style="color: #191b1f;" data-pid="4Ugaitwr">AIGC 技术的优势在于其高效性和能够处理大量内容的能力，从而在一定程度上减轻了人类内容创作者的负担，并为他们的工作提供辅助。例如，新闻机构可以利用 AIGC 生成初稿或基于数据的报告，艺术家可以使用 AI 来生成新颖的素材或灵感，而企业可以通过 AIGC 定制个性化的广告内容或提供客户支持。</p>
<p style="color: #191b1f;" data-pid="a9nMqYYC">然而，AIGC 也带来了一些挑战和风险。在版权和创意归属方面，AIGC 生成的内容可能引起版权所有者的争议。此外，AIGC 产生的内容可能被滥用，例如制作虚假新闻或所谓的深度伪造内容，这些都可能对公众信息的真实性和信任造成影响。</p>
<p style="color: #191b1f;" data-pid="1h1d2u_h">尽管存在挑战，AIGC 的未来发展前景依然被广泛看好。随着算法的不断进步和创作工具的日益智能化，AIGC 有望在提高内容创作效率、降低成本以及驱动创新方面发挥重要作用。同时，它也将促进新的艺术形式和娱乐方式的产生，为人类文化和创意表达开辟新的可能性。</p>
<h2 style="color: #191b1f;">GPU</h2>
<p style="color: #191b1f;" data-pid="5ALmN0q0">图形处理单元 (GPU) 是一种专门设计来处理计算机图形和图像处理任务的芯片。</p>
<p style="color: #191b1f;" data-pid="326IpOt9">GPU 的历史可以追溯到 1990 年代初，但是它作为通用计算设备在 21 世纪初开始流行。NVIDIA 在 1999 年推出了市场上第一个真正的GPU，名为 GeForce 256。</p>
<p style="color: #191b1f;" data-pid="oVEl4d0b">GPU 最初是为了加速电脑游戏中的图形渲染而设计的，但它也已经成为现代人工智能和深度学习领域的核心硬件组件。</p>
<p style="color: #191b1f;" data-pid="6pIF1-xf">GPU 的设计理念是处理成千上万的并行任务，这使得它在执行大规模且复杂的计算时特别高效。与 CPU 的少量核心相比，GPU 拥有大量的小核心，它们可以在同一时间处理大量的数据。</p>
<p style="color: #191b1f;" data-pid="2v0NxiEP">GPU 内部的核心可以分为不同的类型，包括着色器核心、纹理单元和渲染输出单元等，共同执行复杂的图形处理操作。这些核心特别适合执行深度学习所需的高度并行的矩阵和向量运算。此外，GPU 的高内存带宽允许快速的数据读取和写入，这对于处理大型深度学习模型和数据集是必需的。</p>
<p style="color: #191b1f;" data-pid="ipUIe5j9">在 AI 应用中，GPU 显著加速了深度学习模型的训练和推理过程。训练过程涉及到数据的前向传播和反向传播算法，用以计算损失函数并且更新网络的权重。这些计算步骤需要重复进行，并且每一步都要处理大量的数据。GPU 可以同时执行这些步骤中的多个操作，从而大大减少了训练时间。</p>
<p style="color: #191b1f;" data-pid="X7CgDxBR">除了硬件上的优势，GPU 制造商还提供了专门优化的软件工具和库，如 NVIDIA 的 CUDA 和 cuDNN，这些工具为深度学习任务提供了额外的加速。这些软件库简化了在 GPU 上编程的过程，使研究人员和开发人员能够更容易地利用 GPU 进行大规模并行计算，而不需要深入了解其底层硬件架构。</p>
<p style="color: #191b1f;" data-pid="eX40y0Yf">无论是在科学研究、游戏渲染、多媒体内容创作还是 AI 和机器学习的推进中，GPU 都已经成为不可或缺的计算工具。它的并行处理能力、高速内存带宽和专用软件库共同推动了当今最前沿技术的发展，使得AI的训练和部署更加快速和高效。随着技术的进步，GPU 在现代计算生态系统中的作用将继续扩大。</p>
<h2 style="color: #191b1f;">AI 产品</h2>
<h2 style="color: #191b1f;">DALL-E 系列</h2>
<p style="color: #191b1f;" data-pid="vVSG4XIv">DALL-E 是一个由 OpenAI 研发的人工智能系统，能够根据文本描述生成相应的图像。这个名字是对艺术家萨尔瓦多·达利（Salvador Dalí）和动画片《WALL-E》的致敬。</p>
<p style="color: #191b1f;" data-pid="6sNstbZM">DALL-E 于 2021 年 1 月 5 日由 OpenAI 首次发布；2022 年 4 月，OpenAI 宣布了新版本的DALL-E 2，声称它可以从文本描述中生成照片般逼真的图像，另外还有一个允许对输出进行简单修改的编辑器。2023 年 9 月份发布 DALL・E ‍3，与 2 相比，它可以利用 ChatGPT 生成提示，然后让模型根据该提示生成图像。</p>
<p style="color: #191b1f;" data-pid="q5kQXb6r">DALL-E 能够生成各种风格的图像，从照相写实主义图像到绘画和表情符号。它还可以「操纵和重新排列」图像中的对象。其创作者指出DALL-E 的一项能力是在没有明确指示的情况下将设计元素正确放置在新颖的作品中</p>
<p style="color: #191b1f;" data-pid="OXgcDWI5">DALL-E 使用了 Transformer 架构，这种架构最初是为了处理自然语言处理任务而设计的。OpenAI 通过将 Transformer 与生成对抗网络（GANs）等图像生成技术结合，使 DALL-E 能够理解文本提示并创造出新颖的、与文本内容相符的图像。</p>
<p style="color: #191b1f;" data-pid="k20RqSAO">DALL-E 的技术架构基于 GPT-3 的多模态版本，它具备 120 亿个参数，并通过网络上收集的大量文本-图像对进行训练。这种训练使得 DALL-E 能够进行零样本学习，即在没有额外训练的情况下根据描述生成图像。生成的图像随后由 CLIP 模型进行评分和筛选，以提供最高质量的输出。CLIP 自身是一个强大的图像识别系统，它使用了超过 4 亿对图像和文本对进行训练，从而能够将图像与大量文本相关联，并识别出训练集之外的图像内容。</p>
<h2 style="color: #191b1f;">Midjourney</h2>
<p style="color: #191b1f;" data-pid="0gKp1rLc">Midjourney 是由 Midjourney 公司开发的一种基于扩散模型的图像生成平台，于 2022 年 7 月进入公测阶段，面向大众开放。</p>
<p style="color: #191b1f;" data-pid="6ukVBDmx">Midjourney 的绘画能力很强，几乎无需 prompt 能力即可得到效果很不错的图，人像、细节方面尤为突出。</p>
<p style="color: #191b1f;" data-pid="1E70Idzq">与大部分同类服务不同，Midjourney 选择在 Discord 平台上运行，用户无须学习各种烦琐的操作步骤，也无须自行部署，只要在Discord 中用聊天的方式与 Midjourney 的机器人交互就能生成图片。这一平台上手门槛极低，但其生成的图片效果却不输于 DALL·E 和 Stable Diffusion ，于是很快赢得了大量用户。据 Midjourney 的创始人大卫·霍尔兹(David Holz)介绍，仅在发布一个月之后，Midjourney 就已经盈利。</p>
<p style="color: #191b1f;" data-pid="5kuFqEnI">在 2022 年 9 月 5 日，在美国科罗拉多州博览会的年度美术比赛中，一张名为《太空歌剧院》的画作获得了第一名，然而这幅画并非出自人类画家之手，而是由游戏设计师杰森·艾伦(Jason Allen)使用 Midjourney 生成，再经 Photoshop 润色而来。它是首批获得此类奖项的人工智能生成图像之一。</p>
<p style="color: #191b1f;" data-pid="lA7bMPry">Midjourney 创始人 David Holz 在说到关于 Midjourney 背后的理念时有说到：</p>
<blockquote style="color: #535861;" data-pid="z2dzkO5a"><p>MJ 的目标是成为新的人类基础设施，这样才能支撑更多人构建新事物。所以 MJ 的主题是反思、想象和协调。反思自己是谁，想要什么；想象会是什么；协调大家如何抵达。同时也会思考其人性的一面，例如人类通过计算机来想象就能像汽车旅行一样，这意味着什么；又或者人类在想象的过程中以什么方式互动等。</p>
<p>MJ 其实是水。人们误解了人工智能是什么，就像认为其是一只老虎，会吃掉我们。但其实水也很危险，能淹死我们，但流动的河水和老虎完全不同，水是危险的，但是你可以在其中游泳，造船，建造发电站等。水虽然是危险的，但却是文明的驱动力，作为知道如何与水共处的人类，我们能过的更好。水没有意志，也没有恶意，你可以淹死在其中，但并不能应该因此惧怕并禁止水。所以 MJ 试图弄清楚的是，我们如何将其用于人们？我们如何教人们游泳？我们如何造船？我们怎么把它堵起来？我们如何从害怕溺水的人变成未来冲浪的孩子？我们正在制造冲浪板而不是制造水。这才是一些深刻的意义。</p>
<p>困难和有趣是事情的两面，MJ 面临的许多问题无法量化。比如什么是一张「好的狗狗照片」，这很难回答，但也因此有趣。类似的问题还有「什么是好的图像」「人们想从图像中得到什么」「他们是如何沟通的」「他们如何通过文字描绘出他们想要的东西」 —— 这些问题几近哲学，但却很让人喜欢。</p>
<p>关于愿景，希望能以某种方式创造一个更有想象力的世界。因为今天世界最大的问题是信仰崩溃，包括对自己的，对未来的信念。而造成这种问题的主要愿意那就是缺乏想象力，缺乏自己可以成为什么人的想象力，缺乏对未来的想象力。所以想象力才是我们在世界上所需要的东西的重要支柱。所以我想通过 MJ 来将其变成一种可以「扩展人类想象力的力量」</p>
<p>当计算机比 99% 的人类更善于视觉想象时，这意味着什么？这并不意味着我们将停止想象。汽车比人类快，但这并不意味着我们停止步行。当我们远距离运输大量物品时，我们需要发动机，无论是飞机、轮船还是汽车。我们将这项技术视为想象力的引擎。所以这是一个非常积极和人性化的事情。</p></blockquote>
<p style="color: #191b1f;" data-pid="ln3mN1KX"><a class=" external" style="color: inherit;" href="https://link.zhihu.com/?target=https%3A//midjourney.com/showcase/" target="_blank" rel="nofollow noreferrer" data-za-detail-view-id="1043"><span class="invisible" style="color: transparent;">https://</span><span class="visible">midjourney.com/showcase</span><span class="invisible" style="color: transparent;">/</span></a></p>
<h2 style="color: #191b1f;">Stable Diffusion</h2>
<p style="color: #191b1f;" data-pid="chHAPxUn">Stable Diffusion 是由 CompVis、Stability AI 和 LAION 的研究人员实现并开源的。从 Stable Diffusion 模型应用用户的角度来看，其核心是根据文本生成图像，可以通过一些技巧，或通过调整用户参数，来改变文本生成图像的过程，从而达到优化最终生成图像的目的。</p>
<p style="color: #191b1f;" data-pid="HjKhf3sR">得益于其卓越的图片生成效果、完全开源的特点以及相对较低的配置需求（可在消费级GPU上运行），在推出后不久它就流行开来，大量开发者以及公司加入它的社区参与共建，同时，还有很多公司基于 Stable Diffusion 推出了自己的 AI 绘画应用。</p>
<p style="color: #191b1f;" data-pid="U-ZZqZ04"><span style="font-weight: 600;">Stable Diffusion 是 AI 绘画最为重要的开源力量，创业生态的基石</span></p>
<p style="color: #191b1f;" data-pid="7TmrMziy">Stable Diffusion 在多个方面表现出色，尤其是在图像质量和生成速度方面。它能够根据复杂的文本描述生成高分辨率和高质量的图像，这在以前的模型中往往难以实现。Stable Diffusion 还能够处理多样化的艺术风格和主题，从现实主义到超现实主义，从肖像画到风景画，甚至是科幻和奇幻的主题。用户可以通过详细的文本提示，引导模型创造出各种各样的视觉内容。</p>
<p style="color: #191b1f;" data-pid="VR9FRmWT">Stable Diffusion 的核心技术包括变分自编码器（VAE）和转换器网络。它通过大规模的图像和文本对数据集进行训练，学习了如何解释文本提示并将其转换为相应的图像。这种结合了自编码器和转换器的架构，不仅使得图像生成过程更为高效，而且还有助于保持生成图像的多样性和创造性。此外，Stable Diffusion 的模型训练采用了强调数据质量和多样性的方法，以确保生成的图像既准确又引人入胜。</p>
<h2 style="color: #191b1f;">AI 公司</h2>
<h2 style="color: #191b1f;">OpenAI</h2>
<p style="color: #191b1f;" data-pid="9JDZCrgN">OpenAI 成立于 2015 年 12 月，由埃隆·马斯克、萨姆·奥特曼、格雷格·布罗克曼、伊莱亚·萨斯克、约翰·舒尔茨菲尔德等科技行业领袖共同发起。OpenAI 的初衷是作为一个非营利组织，旨在推动和发展友好的人工智能，确保人工智能的发展能够惠及全人类。</p>
<p style="color: #191b1f;" data-pid="Y8y9Or8-">在成立之初，OpenAI 提出了一系列雄心勃勃的目标，包括在人工智能领域进行开创性的研究，并且将研究成果公开分享，以促进整个领域的发展。OpenAI 迅速在人工智能研究领域崭露头角，特别是在强化学习和深度学习的应用上取得了显著的成就。</p>
<p style="color: #191b1f;" data-pid="B1enOiiA">OpenAI 原本是以非营利组织的身份成立的，但在 2019 年初，OpenAI 宣布将采取一种新的「有限利润」公司结构，即 OpenAI LP，这是为了吸引更多的投资以支持其研究和开发。这个结构允许外部投资者投资，但限制了投资回报率。OpenAI LP 的创始投资者包括 Kholsa Ventures、Reid Hoffman 的基金、微软等。</p>
<p style="color: #191b1f;" data-pid="EUnZ_jGy">所以，OpenAI 这个美国人工智能研究实验室由非营利组织OpenAI Inc，和其营利组织子公司 OpenAI LP 所组成。</p>
<p style="color: #191b1f;" data-pid="IuXMLkpl">OpenAI 已经推出了多个影响深远的产品和技术，其中包括 GPT 系列、DALL-E 系列、CLIP、Codex等。</p>
<p style="color: #191b1f;" data-pid="PZaqiieD">除了这些产品，OpenAI 还在多个领域进行研究，包括机器人、强化学习、游戏（如Dota 2中的AI）、自然语言理解和生成等。</p>
<h2 style="color: #191b1f;">Stability AI</h2>
<p style="color: #191b1f;" data-pid="7i_9l3cH">Stability AI 是由首席执行官 Emad Mostaque 创立的初创公司。Mostaque 毕业于牛津大学，拥有数学和计算机科学硕士学位（据福布斯的爆料说，其仅为学士学位）。他曾在多家对冲基金担任分析师，后来转向更加公众化的工作。Mostaque 在 2020 年创立了 Stability AI，旨在解决开源人工智能社区中的「组织」问题。</p>
<p style="color: #191b1f;" data-pid="YRIH8IUV">Stability AI 拥有超过 4,000 个 Nvidia A100 GPU 的集群，用于训练 AI 系统，包括 Stable Diffusion。然而，维护这个集群非常昂贵，据报道，Stability AI 的运营和云计算支出超过了 5000 万美元。但是，Mostaque 反复表示，公司的研发将使其能够更高效地训练模型。</p>
<p style="color: #191b1f;" data-pid="sP_Ihqij">除了 Stable Diffusion，Stability AI 还可能提供包括自然语言处理工具、数据分析服务以及 AI 模型定制和咨询服务在内的多种产品和解决方案。公司倡导开源精神，通过提供开源工具和资源，鼓励技术社区的参与与合作，以促进人工智能技术的创新和发展。</p>
<p style="color: #191b1f;" data-pid="nxVgTzwW">为了支持更大规模的用户定制版本的 Stable Diffusion，并投资更多的超级计算能力，Stability AI 在最近一轮融资中筹集了1.01 亿美元。这笔资金还将用于招聘更多员工，Mostaque 预计在未来一年内将员工规模从 100 人增加到 300 人。此外，Stability AI 还计划开发其他可商业化的项目，包括用于生成音频、语言、3D 和视频的 AI 模型。</p>
<h2 style="color: #191b1f;">模型相关</h2>
<h2 style="color: #191b1f;">VAE</h2>
<p style="color: #191b1f;" data-pid="IHfZpuqz">VAE，Variational Auto-Encoder，变分自编码器</p>
<p style="color: #191b1f;" data-pid="l4X0f1hI">VAE 是一种深度学习模型，用于学习输入数据的概率分布，并生成新的数据样本。它由两大部分组成：编码器将输入数据转换为潜在表示，解码器则将这些潜在表示转换回原始数据空间。VAE 的目标是通过最小化重构误差和正则化潜在空间来训练模型，从而能够生成与训练数据相似的新样本。</p>
<p style="color: #191b1f;" data-pid="dJj3Nc9y">VAE 是在自编码器的基础上发展而来，它引入了概率图模型的概念，使得生成的数据能够具有多样性和连续性。自从 2013 年由 Kingma 和 Welling 提出以来，VAE 成为了无监督学习和生成模型领域的一个重要里程碑，催生了一系列相关研究和更复杂的模型变种。</p>
<p style="color: #191b1f;" data-pid="KO-ALUCj">VAE 模型是一个经典的生成式模型，在传统深度学习时代，GAN 的风头完全盖过了 VAE，但 VAE 简洁稳定的 Encoder-Decoder 架构，以及能够高效提取数据 Latent 特征和 Latent 特征像素级重建的关键能力，让其跨过了周期，在 AIGC 时代重新繁荣。</p>
<p style="color: #191b1f;" data-pid="KzeyPDZP">VAE 在 AIGC 领域中非常有用，尤其是在图像生成、文本生成、音乐创作等创造性任务中。它的特点是能够创建一个平滑且连续的潜在空间，使得我们可以通过遍历这个空间来生成具有细微变化的数据样本。此外，VAE 的正则化特性也使其在处理复杂数据分布时具有鲁棒性，并且能够有效防止过拟合。</p>
<p style="color: #191b1f;" data-pid="dUz65DAF">技术上，VAE 的核心是基于神经网络的编解码器架构。编码器网络将数据映射到潜在空间的参数（均值和方差），而解码器网络则从潜在空间中采样点并重构数据。这个过程中，VAE 使用变分推断来逼近真实数据的概率分布，并通过一种特殊的损失函数（结合重构损失和KL散度）来训练网络。</p>
<h2 style="color: #191b1f;">CLIP</h2>
<p style="color: #191b1f;" data-pid="_uusC69-">CLIP，Contrastive Language-Image Pre-training，对比图文预训练模型</p>
<p style="color: #191b1f;" data-pid="Ni7TZzYv">CLIP 是 OpenAI 开发的一种多模态深度学习模型，设计用来理解图像内容及其对应的文本描述。通过将图像与文本匹配，CLIP 学会了识别图像中的物体、场景和动作，并理解相关的自然语言描述，如标签、说明和标题。</p>
<p style="color: #191b1f;" data-pid="HsbFY7F_">CLIP 包含两个主要部分：一个图像编码器和一个文本编码器。这两部分编码器在一个统一的向量空间内进行对比学习，以便最小化匹配文本和图像对之间的距离。这种方式允许 CLIP 在视觉和语言任务上表现出色。</p>
<p style="color: #191b1f;" data-pid="CYn_0IhD">CLIP 通过对比学习的方法进行预训练，学习了大量图像和文本对的共同表示。它超越了传统的图像分类模型，因为它不仅能够识别图像内容，还能理解与之相关的复杂文本信息。</p>
<p style="color: #191b1f;" data-pid="SoDGYzFj">CLIP 的主要特点是其对抗学习方式，类似于生成对抗网络（GAN）。在训练过程中，图像编码器致力于最小化匹配的文本和图像之间的距离，而文本编码器则尝试最大化它们之间的距离。这种方法有助于模型学习到更丰富、更准确的图像和文本表示。CLIP 在各种图像分类任务上都表现出色，并能够理解图像中的复杂概念，这使得它在多种视觉应用中非常有用。</p>
<p style="color: #191b1f;" data-pid="sq6VXOFH">CLIP 的应用非常广泛，包括但不限于图像检索、视觉问答、视觉导航以及图像生成。此外，基于 CLIP 的原理，OpenAI 还开发了 DALL-E 模型，该模型能够根据文本描述生成相应的图像。</p>
<h2 style="color: #191b1f;">Diffusion</h2>
<p style="color: #191b1f;" data-pid="9F6k3yMz">Diffusion 模型是一种生成模型，用于在人工智能生成内容(AIGC)中创建高质量的图像、音频或其他数据形式。</p>
<p style="color: #191b1f;" data-pid="XfhHBt49">Diffusion Model 的灵感来自 non-equilibrium thermodynamics (非平衡热力学), 理论首先定义扩散步骤的马尔可夫链，缓慢地将随机噪声添加到数据中，然后学习逆向扩散过程以从噪声中构造所需的数据样本。</p>
<p style="color: #191b1f;" data-pid="Lem1TW-S">与传统的生成模型如 GANs 不同， Diffusion 模型通过模拟数据的概率分布来生成新的实例。这些模型从一个随机噪声分布开始，逐渐引入结构，最终生成与训练数据类似的样本。扩散模型是通过固定过程学习，并且隐空间具有比较高的维度。</p>
<p style="color: #191b1f;" data-pid="2ruTZHCQ">Diffusion模型建立在去噪自编码器等前期工作的基础上，并因其在生成高质量样本方面的卓越性能而受到关注。与容易出现训练困难和模式崩溃的生成对抗网络(GANs)相比，Diffusion模型的训练过程更加稳定，能够更可靠地生成多样化的高质量内容。</p>
<p style="color: #191b1f;" data-pid="mIX0voa8">技术上，Diffusion模型包含正向扩散过程和逆向扩散过程。正向过程逐步加入噪声，直至数据完全随机化；而逆向过程则是学习如何从随机噪声中重建数据，这是通过训练一个神经网络来实现的，它能够在每一步预测并减少噪声，逐渐恢复出清晰的数据。</p>
<p style="color: #191b1f;" data-pid="6eIEFH0D">Diffusion 模型在过去几年中得到了快速发展，部分原因是它们在生成高质量样本方面的能力，尤其是在图像和音频生成上。它们在质量和多样性方面逐渐超过了 GANs，这是因为 Diffusion 模型在训练过程中更加稳定，并且它们生成数据的方式更加符合数据的内在分布。</p>
<p style="color: #191b1f;" data-pid="y5e-yZL4">Diffusion 模型在多种场景下都有应用，例如在图像生成领域，可以创造出不存在的逼真物体、场景和人物图像；在文本到图像的合成中，可以根据文本描述生成相应的图像；还可以用于音频合成，生成音乐和语音；或用于数据增强和图像超分辨率等领域。</p>
<h2 style="color: #191b1f;">Disco Diffusion</h2>
<p style="color: #191b1f;" data-pid="LZ4VztAq">Disco Diffusion 是一个开源项目，它是一种结合了多种人工智能技术的扩散模型，旨在将文本描述转换为详细的图像。它通过理解语言提示，并将这些提示映射到丰富的视觉表现上，实现了从抽象概念到具体图像的创造性转换。该模型可以接受复杂的文本输入并生成与之相匹配的高质量图像，使用户能够直观地表达和实现他们的创意构想。</p>
<p style="color: #191b1f;" data-pid="LHJztZhy">Disco Diffusion 的发展是建立在深度学习和生成模型领域的一系列创新之上的。最初的扩散模型在生成逼真图像方面已经取得了突破，但当结合了理解文本和图像关系的 CLIP 模型时，这些生成模型的能力得到了极大的扩展。Disco Diffusion 是这一进展的产物，它不仅继承了先前模型生成高质量图像的能力，还加入了对文本的理解，从而实现了更为直观和创造性的图像生成。</p>
<p style="color: #191b1f;" data-pid="_SY1LJaS">Disco Diffusion 的技术架构是基于扩散模型的，这是一种逐步引入并去除噪声以生成数据的方法。在这个基础上，Disco Diffusion 集成了 OpenAI 的 CLIP 模型，后者训练用于理解图像内容与自然语言描述之间的关联。该模型可能还结合了类似于生成对抗网络（GANs）的组件来提升最终图像的质量，以及变分自编码器（VAEs）来增强图像的多样性和创意表达。</p>
<p style="color: #191b1f;" data-pid="1wBFwQVI">Disco Diffusion 的主要特点是其能够将文本描述转化为高分辨率、高质量的图像。它通过灵活地理解和应用文本提示，结合了随机性和算法控制，生成独一无二的艺术作品。与传统的生成模型相比，Disco Diffusion 在保留图像真实感的同时，提供了更丰富的细节和更深层的创造性探索，使其成为 AIGC 领域中的一个创新和有影响力的工具。</p>
<p style="color: #191b1f;" data-pid="zod3HFls">Disco Diffusion 在艺术创作、媒体制作、设计和教育等多个领域都有广泛的应用。艺术家可以使用它来将他们的诗歌或故事变成视觉艺术作品；设计师可以通过它快速生成设计概念图；媒体制作者可以利用它为视频或游戏创造复杂的背景；教育者可以用它来激发学生的创造力并解释抽象概念。</p>
<h2 style="color: #191b1f;">Imagen 系列</h2>
<p style="color: #191b1f;" data-pid="CFJUONL5">Imagen 是 2022 年 5 月 Google Brain 团队研发的一个先进的文本到图像生成系统，它通过深度学习模型将文字描述转换为视觉图像。这种模型的核心功能是捕捉和解析人类语言中的复杂概念，并将这些概念以图像的形式表现出来，生成与文本描述高度一致且视觉上引人入胜的图像。</p>
<p style="color: #191b1f;" data-pid="FY8k-oL8">根据发布在 arXiv 的研究论文中，Imagen 使用了 Transformer 语言模型将文本转换成嵌入向量序列，三个连续的扩散模型将这些向量转换成高清图片。研究团队还开发了 U-Net 改进型扩散模型（Efficient U-Net）以及新的评估工具 DrawBench。Imagen 在 COCO 基准上取得了 7.27 的 FID 分数，优于 DALL-E 2。</p>
<p style="color: #191b1f;" data-pid="-4lKzBgM">与使用图像-文本数据集训练不同，Imagen 仅使用文本编码器（如T5）来处理输入文本。然后，扩散模型将嵌入向量转换为图像，通过迭代去噪过程生成高质量图片。</p>
<p style="color: #191b1f;" data-pid="rWpP0ddv">在 2023 年底 Google 发布 Imagen 2。Imagen 2 最与众不同之处在于，它能够以惊人的准确性，理解复杂抽象的概念，然后把这个概念可视化，细腻之程度令人惊叹！</p>
<p style="color: #191b1f;" data-pid="TMqSs_Tm">Imagen 2 的核心，还是复杂的神经网络架构。经过微调的 Transformer 模型，在文本理解和图像合成上，都表现出了无与伦比的性能。</p>
<h2 style="color: #191b1f;">SDXL</h2>
<p style="color: #191b1f;" data-pid="OW3t6ARQ">SDXL，Stable Diffusion XL，该模型是在 2022 年 AIGC 元年后推出的。其开发历程包括从 0.9 测试版到基于用户反馈的1.0正式版的逐步迭代，不断优化以提高图像质量。</p>
<p style="color: #191b1f;" data-pid="SHICxNVT">SDXL 是 Stable Diffusion 模型的进阶版，由 Stability AI 发布。这个模型通过双阶段扩散过程，即 Base 和 Refiner 模型，提供了高分辨率的图像生成和精细化处理。SDXL 特别适用于要求高细节图像的应用场景，如 AI 绘画和高级设计任务。</p>
<p style="color: #191b1f;" data-pid="k_4SgxqC">与原版 Stable Diffusion 相比，SDXL 引入了多项技术优化。其 U-Net 参数量显著增加，达到 2.6B，显著提高了模型的学习和图像细节处理能力。Refiner 模型的加入进一步提高了图像的精细度，而新的训练技巧，如多尺度训练，优化了整体模型性能。</p>
<p style="color: #191b1f;" data-pid="VRH6C89H">当输入是图片时，Stable Diffusion XL 和 Stable Diffusion 一样，首先会使用 VAE 的 Encoder 结构将输入图像转换为Latent 特征，然后 U-Net 不断对 Latent 特征进行优化，最后使用 VAE 的 Decoder 结构将 Latent 特征重建出像素级图像。除了提取 Latent 特征和图像的像素级重建外，VAE 还可以改进生成图像中的高频细节，小物体特征和整体图像色彩。</p>
<p style="color: #191b1f;" data-pid="7qQYzstw">当 Stable Diffusion XL 的输入是文字时，这时我们不需要 VAE 的 Encoder 结构，只需要 Decoder 进行图像重建。</p>
<p style="color: #191b1f;" data-pid="WB-0sf_C">Stable Diffusion XL 使用了和之前 Stable Diffusion 系列一样的 VAE 结构（KL-f8），但在训练中选择了更大的 Batch-Size（256 vs 9），并且对模型进行指数滑动平均操作（EMA，exponential moving average），EMA 对模型的参数做平均，从而提高性能并增加模型鲁棒性。</p>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2024/02/quickly-understand-the-15-keywords-of-vincentian-diagram-aigc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GPT-4 发布了，关于 AIGC 产品上线前后技术管理者要注意的五个重要事项</title>
		<link>https://www.phppan.com/2023/03/aigc/</link>
		<comments>https://www.phppan.com/2023/03/aigc/#comments</comments>
		<pubDate>Sat, 18 Mar 2023 14:04:31 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[架构和远方]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[AIGC]]></category>
		<category><![CDATA[内容安全]]></category>

		<guid isPermaLink="false">http://www.phppan.com/?p=2098</guid>
		<description><![CDATA[GPT-4 于 2023 年 3 月 14 日发布。目前 GPT-4 没有免费版本，仅向 ChatGPT Pl [&#8230;]]]></description>
				<content:encoded><![CDATA[<section id="nice" style="color: black;" data-tool="mdnice编辑器" data-website="https://www.mdnice.com">
<p data-tool="mdnice编辑器">GPT-4 于 2023 年 3 月 14 日发布。目前 GPT-4 没有免费版本，仅向 ChatGPT Plus 的付费订阅用户及企业和开发者开放。</p>
<p data-tool="mdnice编辑器">如比尔盖茨在 reddit 回答网友提问时回答时说的：「AI is the big one. I don’t think Web3 was that big or that metaverse stuff alone was revolutionary but AI is quite revolutionary」，<strong style="font-weight: border; color: #0e88eb;">我们可能又到了一个历史性的转折点</strong>。</p>
<p data-tool="mdnice编辑器">现在各家企业，包括 Google、微软，以及国内的 BAT 等大厂都在大量投入，一些中小厂也在垂直的应用赛道拔城攻寨，作为一个技术管理者一定会面对这样一个洪流，在洪流之中我们需要注意什么呢？</p>
<p data-tool="mdnice编辑器">如果你所在企业要上线 AIGC 的产品，或者已经上线 AIGC 的产品，以下的五个重要事项需要特别注意。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">1 安全</span></h1>
<p data-tool="mdnice编辑器">安全是产品的生命线，特别是对于 AIGC 产品来说，没有安全守护，不仅仅是产品玩完，甚至会连累其它产品甚至公司存续。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="font-weight: bolder; color: #0e88eb;">1.1 内容安全</span></h2>
<p data-tool="mdnice编辑器">这里内容安全的定义是指 AIGC 生成内容影响产品本身存在的领域。</p>
<p data-tool="mdnice编辑器">在国内与内容安全相关的场景包括涉政、色情、性感（性感和色情在内容安全中是不一样的）、暴恐、违禁、恶心、涉价值观等。其中每一项都需要检测，部分项出现问题甚至会关站和约谈。</p>
<p data-tool="mdnice编辑器">在 chatGPT 大火后，网络上有各种和 chatGPT 相关的段子，特别是一些场景下，对输入措辞的调整或多次尝试相同的提示很敏感，只要稍作改写，就可以以另一种方式回答出来。</p>
<p data-tool="mdnice编辑器">据最新发布的 GPT-4 的 OpenAI 工程师们们说，GPT-4 的训练在去年 8 月完成，剩下的时间都在进行微调提升，以及最重要的去除危险内容生成的工作。由此可见内容安全是一个多么重要且复杂的事情。</p>
<p data-tool="mdnice编辑器">GPT-4 在 RLHF 训练中加入了一个额外的安全奖励信号，通过训练模型拒绝对此类内容的请求来减少有害的输出。奖励是由 GPT-4 的零样本分类器提供的，它判断安全边界和安全相关 prompt 的完成方式。为了防止模型拒绝有效的请求，团队从各种来源（例如，标注的生产数据、人类的红队、模型生成的 prompt）收集多样化的数据集，在允许和不允许的类别上应用安全奖励信号（有正值或负值）。这是 OpenAI 的工程师在训练 GPT-4 时做的一些努力。</p>
<p data-tool="mdnice编辑器">GPT-4 现在是闭源的，模型本身我们做不了什么。</p>
<p data-tool="mdnice编辑器">除了 GPT-4 ，还有许多的 AIGC 的模型，并且更多的人只是作为一个应用开发方来实现一些功能。</p>
<p data-tool="mdnice编辑器">除了在训练时对模型本身危险内容生成的去除，在技术应用侧，我们可以考虑如下一些方面：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">接入内容安全审核平台</strong>，在输入和输出两个层面进行双重过滤。公司大的接自己的，公司内没有的接第三方，依靠审核平台的积累，规避掉涉政、色情等风险极大的情况。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">实名可追溯</strong>，类似于工厂里面的批号跟踪，对于用户上传图片、文字或视频、使用 AIGC 生产出来的内容、传播的内容进行跟踪，有系统支撑后台的查询和追溯，在后台中注意对用户敏感信息的保护，保持脱敏的逻辑。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">控制传播</strong>，控制传播一方面是在功能层面保证传播的内容是在上面安全审核平台的前置约束下进行，另一方面在传播进行<strong style="font-weight: border; color: #0e88eb;">多级防控</strong>，比如播放量达到不同的级别进行不同规格的检测，如播放量达到 10 万，需要重新进入审核等等。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">在互联网行业，内容安全一直面临着挑战，各内容平台不断提升对于内容安全的治理能力，随着 AIGC 的发展，内容爆炸式的增长，内容安全的挑战将会更大。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="font-weight: bolder; color: #0e88eb;">1.2 虚假信息</span></h2>
<p data-tool="mdnice编辑器">在对 chatGPT 深度体验后，往往会生成一种「一本正经的胡说八道」的感觉，甚至它会编造一些事实或者不存在的东西出来回答。对于模棱两可的问题，chatGPT 通常会猜测用户的意图，而非让用户澄清问题。</p>
<p data-tool="mdnice编辑器">举个例子，我在 chatGPT-3.5 中问： 「有没有什么现成的库可以检测图片清晰度，对原图和 avif 图进行清晰度检测」，它回答了三个库可以，Sharp、ImageJS和 Pica</p>
<p data-tool="mdnice编辑器">我接着问：「 Pica 的什么方法可以检测」，它告诉我 quality 方法可以，并给出了详细的示例，从代码上来看，像那么回事，并且代码前面的引入，输入的格式转化都没有问题，有问题的只是没有 quality 方法而已。</p>
<p data-tool="mdnice编辑器">又或者你随便取一个书名，问他是谁写的，比如我的问题是： 「《不想开车的夜晚，我在听歌》这本书是谁写的」，它的回答是：「 &#8220;不想开车的夜晚，我在听歌&#8221; 这本书的作者是中国作家韩寒。这本书是一本散文集，收录了韩寒的一些散文作品，其中包括《像少年啦飞驰》、《三重门》、《我所理解的生活》等等。这本书出版于2002年，是韩寒的第一本散文集。韩寒是中国当代著名的作家、音乐人、导演和投资人，他的作品包括小说、散文、音乐和电影等多个领域，深受年轻读者和网民的喜爱和追捧。」</p>
<p data-tool="mdnice编辑器">除了 chatGPT 以外，图片或视频生成领域有更多的虚假信息，如诈骗团队利用 DeepFake，通过截取马斯克在 TED 采访的视频，并为其配音，为的就是推出 BitVex 比特币诈骗平台。诈骗分子还伪造了方舟投资（Ark Invest）CEO 凯瑟琳·伍德、以太坊联合创始人查尔斯·霍斯金森等多位币圈名人推荐BitVex的视频。另外，2021 年初光是靠 DeepFake 技术换脸马斯克喊出「给我一个币，我给你两个」的骗局在一周内就达到 24.3 万美元，诈骗总额高达 3000 万美元（约人民币2亿）。</p>
<p data-tool="mdnice编辑器">诈骗团伙以及不法份子使用 AIGC 恶意使用，甚至滥用，引发新型的诈骗、色情、诽谤、假冒身份等违法犯罪行为。 AIGC 让其效率更高，鉴别难度更大。这样可能会引发人们对于个人身份的盗用，冒用，以及在网络上，或在元宇宙中数字身份安全的担忧。</p>
<p data-tool="mdnice编辑器">以上是在 GPT-4 出现之前，在 GPT-4 出来后，情况有所改变，如前面个问题：「《不想开车的夜晚，我在听歌》这本书是谁写的」，GPT-4 的回答是：「很抱歉，我无法找到与《不想开车的夜晚，我在听歌》这本书相关的作者信息。这本书可能不存在，或者没有足够的知名度。如果您能提供更多信息，我会尽力帮助您找到相关内容。」</p>
<p data-tool="mdnice编辑器">技术在进步，会越来越好，但是我们仍然需要结合实名制、内容安全检测等手段，我们只能尽量减少虚假信息在平台的产生和传播。</p>
<h2 data-tool="mdnice编辑器"><span class="content" style="font-weight: bolder; color: #0e88eb;">1.3 模型安全</span></h2>
<p data-tool="mdnice编辑器">现在 AIGC 内容生成对于我们来说是一个黑盒子，我们无法完全预知其过程和结果。我们所能做的是控制模型的参数和模型的数据输入，这里可能会导致安全问题。</p>
<p data-tool="mdnice编辑器">算法的公正性和透明度。AI 系统的决策往往是基于其算法的结果，但是，如果这些算法存在偏见或不公平的因素，将会对用户的权利和利益造成损害。因此，AIGC 需要确保 AI 算法的公正性和透明度，避免对用户造成不公平的影响。</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">对模型的攻击</strong>：通过某种方式向模型中注入恶意样本、有毒数据或有误导性的数据，来破坏模型；或者以某种方式篡改或操纵模型的训练数据，以达到改变模型输出的目的。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">模型后门</strong>：在模型的训练中，攻击者通过修改模型的训练数据和权重信息使模型学习到了隐藏的规则，以达到放置后门的目的（我也不知道怎么实现）。举个例子，假设有个开源的项目不想让人商用，于是采用了 GPL 的协议，但是如何判断有人商用了呢，于是在项目生成的模型中隐藏一些规则，比如某些特殊的输入能显示和特定的结果，以举证。比如「左耳朵耗子」在 Twitter 上分享的「百度的“文心一格”AI生成图片：“一只爱国的猫”，看来不但政治不正确，而且可以推测后面用的图片训练集的来源也不是自主可控的」，那只猫身上的国旗是美丽国的。不过现在你无法生成了，因为在输入层面做了限制，现在输入只会显示「请您更换输入后试试~」，这也就是我们前面说的在输入层面做一些控制。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">除了模型本身的安全问题，对于模型衍生的个人隐私保护，数据安全和标准，甚至后面可能会出现的模型病毒等等都需要持续关注起来。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">2 容量</span></h1>
<p data-tool="mdnice编辑器">AIGC 产品在面对大量用户使用时，可能会面临以下容量问题：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">存储容量</strong>： AIGC 产品生成的内容包含了大型文本、视频、图像等多媒体数据。如果用户数目众多，这可能需要大量的存储空间。假设用户生成的这些内容都是放到公有云上，随着用户的增加，这些内容将会成为一个巨大的成本，因此我们在项目设计之初就考虑存储容量的问题，给每个用户的容量，总的容量，以及存储的时长，因为成本是随着时间而变化的。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">处理容量</strong>： AIGC 产品处理大量数据，包括数据的采集、整合、分析和后期制作处理等多个环节。因此，AIGC 需要具备高质量的计算设备和计算能力来支持项目，将应用的各个环节结合起来，处理更多最终输出结果。如果计算能力不足，则可能会给用户带来等待时间过长的使用体验，增加流失率。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">带宽容量</strong>： AIGC 产品生成内容的访问请求峰值会在高峰期不断攀升，这需要具备良好的带宽容量来实现。如果网络峰值超过供应时，将影响用户体验和产品稳定性。 因此，就需要整合具有强网络连接性和容量传输能力的网络设备，包括高带宽和低延迟的数字通信方式，例如光纤和高性能互联网符合AIGC产品的要求。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">内容审核容量</strong>：AIGC 产品生成的内容需要进行审核和精细化调整，以确保内容的准确性和完整性。这需要大量的人工审核，提供符合要求的人选加入审核容量的组合当中。此外，随着 AIGC 的规模发展，产品审核过程的效率和质量也需要考虑如何优化。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">在应对容量问题时，AIGC 产品需要全面优化和规划系统架构、数据处理和存储、计算和运维等方面，以实现产品的高可靠性和高性能。同时，需要持续跟进技术发展和创新，以保持 AIGC 产品的竞争力和创新性。</p>
<p data-tool="mdnice编辑器">基于这些考虑我们在应用开发过程中需要考虑以下系统的实现：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">用户级的容量限制</strong>，包括存储容量，存储时长，使用次数等等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">用户试用灰度</strong>，如邀请机制，分批次邀请用户进来，以控制容量的发展，不仅仅是存储、还有处理容量和带宽的容量。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">接入多个第三方审核平台</strong>，在增加灾备的同时，增加内容审核的容量。</section>
</li>
</ol>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">3 成本</span></h1>
<p data-tool="mdnice编辑器">对于大模型，一般的企业是没有能力开发的，这种情况我们一般是接第三方的接口。</p>
<p data-tool="mdnice编辑器">以 OpenAI 为例，3.1 日，OpenAI 开放了 ChatGPT 的 API 接口，成本优化了 90%，百万 token 只需要 2 美元，并且提炼 otken 能力也大幅优化。新上的 GPT-4 要贵一个数量级，从 0.002 到 0.06，涨了 30 倍。</p>
<p data-tool="mdnice编辑器">此外，OpenAI 还提供了图像生成和编辑的服务，如 DALL·E。这些服务的价格取决于图像的分辨率。例如，1024×1024 的图像每张 0.02 美元，而 256×256 的图像每张 0.016 美元。</p>
<p data-tool="mdnice编辑器">更多详情见官网： https://openai.com/pricing</p>
<p data-tool="mdnice编辑器">在国内也有一些厂商的提供了完整方案报价，大概是 0.1 到 0.13 每张图。</p>
<p data-tool="mdnice编辑器">除了接入 API，有时我们也会基于开源的模型微调后上线自己的服务，这部分成本主要是训练的算力成本和上线后的 GPU 机器。以 ControlNet 模型为例，在公有云上，一台带有 v100 显卡的机器也就能跑一个大模型，且单台机器只能同时为一个用户提供服务。而这样一台 v100 的机器一个月的原价为 7000 多。</p>
<p data-tool="mdnice编辑器">不管是调用第三方的 API 还是自行构建模型服务，对于创业公司来说，成本都挺高的。</p>
<p data-tool="mdnice编辑器">如果想在 AIGC 中创业，从一开始就需要想好商业模式和变现手段，并且对于免费用户需要从一开始就限制其试用频率，以控制成本。</p>
<p data-tool="mdnice编辑器">从应用工程角度，我们大概可以做以下的一些事情：</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">排队系统</strong>，在成本方面主要是应用于自己搭建的服务，其主要是在用户体验和成本之间寻找一个平衡，通过排队的方式将用户的请求量消峰填谷，以尽可能提升机器的利用率。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">限频限额</strong>，对每个用户在使用次数或产出物的量上做限额，以防止恶意的攻击或者某个用户大量占用资源的情况。在限额方面我们一般可以采用对使用次数，如做图次数，或者对产出物的数量，如生成图片的数量或生成文字的数量等等。可以是<strong style="font-weight: border; color: #0e88eb;">日限或者总量限制</strong>。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">预约系</strong>统，提高用户的使用门槛，仅针对目标用户发放资格，减少用户量，提升用户精准度的同时能控制成本。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">存储限制</strong>，第 2 点的限制主要是针对使用的，如果产品有存储的需求，那么在应用上需要对存储空间的大小或者存储的时长做一些限制，最好是在商业化的逻辑里面把这块加上，因为存储的成本是一个递进累加的成本，随着产品的发展，其成本会越来越大，如果生成的内容中有视频，且你有几百万上千万的用户，这将是一个非常大的成本。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">以上主要是应用开发领域的成本，除了这些，其数据成本也是非常大块的成本。而数据是人工智能的基础，没有数据就没有模型。AIGC 需要大量的高质量的数据来训练模型，比如文本、图像、音频、视频等。这些数据的获取和处理是一个巨大的挑战，需要投入大量的时间和金钱。</p>
<p data-tool="mdnice编辑器">一方面，数据的来源可能不容易找到或者不免费。比如想要生成游戏场景或者角色，就需要收集各种类型和风格的游戏素材；想要生成影视剧本或者小说，就需要收集各种类型和风格的文学作品；想要生成音乐或者歌曲，就需要收集各种类型和风格的音乐素材。这些数据可能涉及版权问题，需要付费购买或者授权使用。</p>
<p data-tool="mdnice编辑器">另一方面，数据的质量可能不够高或者不一致。比如想要生成逼真的人脸图像，就需要收集各种角度和表情的人脸照片；想要生成流畅的语音或者歌声，就需要收集各种语言和口音的语音样本；想要生成合理的对话或者故事情节，就需要收集各种场景和情感的对话或者故事文本。这些数据可能存在噪声、错误、重复、缺失等问题，需要进行清洗、标注、对齐等处理。</p>
<p data-tool="mdnice编辑器">因此，在 AIGC 中使用现有数据是一种常见而有效的方法。通过利用公开可用或者自行采集整理好了格式统一且质量较高且数量较多且符合目标任务需求且无版权争议（例如：<a style="font-weight: bold; color: #0e88eb;" href="https://commoncrawl.org/">Common Crawl</a>） 的数据集来训练模型可以节省很多时间和金钱。</p>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">4 法律法规和版权</span></h1>
<h2 data-tool="mdnice编辑器"><span class="content" style="font-weight: bolder; color: #0e88eb;">4.1 法律法规</span></h2>
<p data-tool="mdnice编辑器">2022 年 11 月 25 日，国家网信办、工信部、公安部联合发布《互联网信息服务深度合成管理规定》（以下简称《规定》）。其中提出，深度合成服务提供者和技术支持者提供人脸、人声等生物识别信息编辑功能的，应当提示深度合成服务使用者依法告知被编辑的个人，并取得其单独同意。《规定》自 2023 年 1 月 10 日起施行。</p>
<p data-tool="mdnice编辑器">该规定的第五章第二十三条，对「深度合成技术」做了规定：「利用深度学习、虚拟现实等生成合成类算法制作文本、图像、音频、视频、虚拟场景等网络信息的技术。」，这也就是我们所说的 AIGC 的范畴了。</p>
<p data-tool="mdnice编辑器">在《规定》的第六条、第七条、第十一条等对服务提供主体责任进行了明确的定义，具体包括：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">不得利用深度合成服务制作、复制、发布、传播法律、行政法规禁止的信息，或从事法律、行政法规禁止的活动。</section>
</li>
<li>
<section style="color: #010101;">建立健全用户注册、算法机制机理审核、科技伦理审查、信息发布审核、数据安全、个人信息保护、反电信网络诈骗、应急处置等管理制度，具有安全可控的技术保障措施。</section>
</li>
<li>
<section style="color: #010101;">制定和公开管理规则、平台公约，完善服务协议，落实真实身份信息认证制度。</section>
</li>
<li>
<section style="color: #010101;">加强深度合成内容管理，采取技术或者人工方式对输入数据和合成结果进行审核，建立健全用于识别违法和不良信息的特征库，记录并留存相关网络日志。</section>
</li>
<li>
<section style="color: #010101;">建立健全辟谣机制，发现利用深度合成服务制作、复制、发布、传播虚假信息的，应当及时采取辟谣措施，保存有关记录，并向网信部门和有关主管部门报告。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">将上面的条文翻译成技术上的点就是要构建以下的系统或服务</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">用户实名注册及管理系统。</section>
</li>
<li>
<section style="color: #010101;">数据安全及敏感信息管理系统和体系。</section>
</li>
<li>
<section style="color: #010101;">内容安全管理系统，这里我们常规会采用第三方的服务，而不是自己开发。</section>
</li>
</ol>
<h2 data-tool="mdnice编辑器"><span class="content" style="font-weight: bolder; color: #0e88eb;">4.2 版权</span></h2>
<p data-tool="mdnice编辑器">AIGC 的版权一直存在争议，其根源在于 AIGC 模型的形成和完善依赖于大量的数据训练，而用于训练的数据往往包含受版权法保护的内容。AIGC 这种不同于传统的创作方式，目前尚未有明确的法律规定和司法裁定来界定其版权归属和保护范围。</p>
<p data-tool="mdnice编辑器">2023 年 1 月 23 日，美国三名漫画艺术家针对包括 Stability AI 在内的三家 AIGC 商业应用公司，在加州北区法院发起集体诉讼，指控 Stability AI 研发的 Stable Diffusion 模型以及三名被告各自推出的、基于上述模型开发的付费 AI 图像生成工具构成版权侵权。</p>
<p data-tool="mdnice编辑器">这应该算是全球首例知名的 AIGC 商业化应用领域，算法模型及训练数据版权侵权案。其主要争议点在于当前国内外对于 AIGC 获取与利用版权作品进行算法训练是否合法存在诸多争议，尚无立法和司法层面的明确共识，并且对于模型训练过程中利用版权作品的方式、利用行为的版权定性仍有待分析明确。</p>
<p data-tool="mdnice编辑器">在中国，计算机软件和作品的著作权属于开发者或者相关机构，而现行的《著作权法》框架难以直接认定人工智能或电脑算法为作品的作者。但是现阶段各界对于人工智能技术创作物的著作权保护整体上呈现积极的态度，主流的司法实践持相似的立场。AIGC 版权保护的是使用 AI 系统的人，不是 AI 本身，其保护的前提还是使用 AI 创作的人，在创作过程中付出了智力或创造性的劳动。</p>
<p data-tool="mdnice编辑器">目前，一些机构和个人在使用 AIGC 作品时，通常会尽力寻找并遵守相应的版权规定和道德准则，尊重原作者的知识产权，同时也会尝试探索 AIGC 版权的可行性和保护方式。</p>
<p data-tool="mdnice编辑器">我们需要持续的关注版权方面的进展。</p>
<p data-tool="mdnice编辑器">对于版权保护我们可以做如下的一些事情：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">数据授权和许可</strong>：在使用受版权保护的数据进行模型训练时，尽量获取数据所有者的授权和许可。这可以通过签订合同、购买许可证或加入版权组织等方式实现。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">数据脱敏和匿名化</strong>：在使用受版权保护的数据进行模型训练时，尽量对数据进行脱敏和匿名化处理，以降低侵权风险。例如，可以删除文本中的作者名、作品名等敏感信息，或将图像中的人物、地点等特征进行模糊处理。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">版权标识和归属</strong>：在发布和传播 AIGC 生成的作品时，明确标注作品的版权归属和来源。例如，可以在作品页面上添加版权声明、原作者名和许可证信息等。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">遵循道德准则</strong>：在使用 AIGC 技术进行创作时，遵循行业道德准则和社会公序良俗。例如，不要使用 AIGC 技术制作和传播违法、侵权、淫秽、暴力等不良内容。</section>
</li>
</ul>
<h1 data-tool="mdnice编辑器"><span class="content" style="color: #0e88eb;">5 模型的偏见性</span></h1>
<p data-tool="mdnice编辑器">现在大家常用到的 AIGC 技术的核心都是在大规模数据集上预先进行训练的模型，大多数的使用者都是在特定领域或垂直场景下进行微调。这种预训练模型，对比完全由人工规则控制的专家系统来说，预训练模型就像一个黑盒子。没有人能预知其生产出来的内容是什么。</p>
<p data-tool="mdnice编辑器">预训练模型的偏见性通常来自训练数据集中的样本分布不均或者存在系统性的偏差。比如：</p>
<ul data-tool="mdnice编辑器">
<li>
<section style="color: #010101;">在 chatGPT 模型中的<strong style="font-weight: border; color: #0e88eb;">语言性偏见</strong>，中文的内容语料只占了 0.1% 不到，更准确来说应该是 0.09905%，从而使得使用中文的效果远不如英文。</section>
</li>
<li>
<section style="color: #010101;">2.14 日情人节前夕发布的 ControlNet 模型，在测试过程中发现其会生成较多的性感卡通类图片，一些没有问题的照片或者词语都能生成极度「性感」的图片，比如痛苦这个词语。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">对于时间的偏见性</strong>，模型只能了解其生成之前的情况，或者说只能了解其数据集中的信息，在其生成后就没有信息了，除非快速迭代模型。</section>
</li>
<li>
<section style="color: #010101;">DALL·E 2 具有显著的种族和性别刻板印象。</section>
</li>
</ul>
<p data-tool="mdnice编辑器">除了以上的例子，还有在性别、地域、文化等的偏见性，这些都是因为训练得到的模型并不是非常可控的，模型可以看做对训练集分布的一个拟合。那么反馈到生成模型中，训练数据的分布便是影响生成内容的质量最重要的一个因素。于我们可以采取一些措施来规避将模型的偏见展示给用户。</p>
<ol data-tool="mdnice编辑器">
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">数据收集阶段</strong>：收集更多多样化的训练数据，以确保训练数据集具有平衡性和代表性，对训练数据进行分析和筛选，排除可能引入偏见的因素。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">模型训练阶段</strong>：在微调阶段使用公平性指标，从而评估模型在不同群体中的表现是否公平和平衡；不断监控和更新模型，及时发现并纠正偏见性问题。对一些特定的任务，可以使用迁移学习等技术，以减少偏见的影响。</section>
</li>
<li>
<section style="color: #010101;"><strong style="font-weight: border; color: #0e88eb;">产品应用阶段</strong>：通过人工或者基于深度学习的模型判断生成的内容是否具有偏见性，以规避一些极端的场景。</section>
</li>
</ol>
<p data-tool="mdnice编辑器">我们在上线 AIGC 产品时一定需要深刻的理解其偏见性，及时使用一定的措施规避或者减少其偏见性。</p>
<p data-tool="mdnice编辑器">想起网上看到的一句话：「<strong style="font-weight: border; color: #0e88eb;">在这个历史性的转折点，只能向前走，不能往后看，过往都被冲得看不着了。</strong>」</p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.phppan.com/2023/03/aigc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
