周五下午 4 点,老板走过来:"梅雅达工作室下个月有暑期班招生,帮我出一套海报,下周一要用。"我联系设计师,对方回了一句:"感冒了,下周再来。"这个场景对小型工作室、教育培训机构、个体创业者来说太常见了——"做一张海报"听起来简单,实际操作起来全是坑:
- 请设计师:一张海报少说 300-800 块,一套下来好几千
- 自己用模板工具:Canva、稿定设计确实能用,但改到满意可能要花半天
- 找 AI 生图工具:Midjourney 要翻墙、DALL-E 要绑卡,门槛不低
有没有一种方案——用 Python 写几行代码,输入文字描述,直接出海报,而且免费?有。今天的主角是智谱的 CogView-4,国内目前最强的开源文生图模型之一,API 调用完全免费,而且原生支持中文提示词,甚至能在图片里写出汉字。
扩散模型到底在干嘛
写代码之前,花 3 分钟理解 AI 是怎么"画图"的。搞懂原理,写 Prompt 的时候就知道该怎么跟 AI 沟通。
扩散模型(Diffusion Model)的原理,说白了就是:先往一张清晰图片上加满噪点,直到变成纯雪花屏;然后训练 AI 学会"去噪",把雪花屏一步步还原成图片。
想象你有一张清晰的照片:
第一步:加噪(训练阶段)。你一步步往照片上撒沙子。第 1 步撒一点点,照片还有点轮廓;第 100 步撒完,整张照片全被沙子盖住,变成一块纯灰色的板子。这个过程叫前向扩散——从"有信息"到"纯噪声"。
第二步:去噪(生成阶段)。反过来,拿一块纯灰色的板子,让 AI 一步步把沙子吹掉。第 1 步吹掉一点,隐约出现一些色块;第 50 步,能看出大致的轮廓和颜色分布;第 100 步,一张全新的清晰图片出现了。这个过程叫反向去噪——从"纯噪声"到"有信息"。
关键来了:AI 学过的不是某一张具体的图,而是**"沙子应该怎么被吹掉"的规律**。所以给它一块全新的灰色板子,它能"吹"出一张从未存在过的图片。
纯噪声 ░░░░░ → 去噪1步 ░▒░░░ → 去噪50步 ▓▓▒░░ → 去噪100步 🖼️清晰图片
跟 Prompt 有什么关系? 去噪过程中,你的文字提示词就是导航仪。AI 在每一步去噪时,都会参考提示词来"决定"该怎么还原:
- 你说"蓝色海洋",AI 就会把噪点往蓝色、波浪方向还原
- 你说"赛博朋克风格的街道",AI 就会把噪点往霓虹灯、暗色调方向还原
- 你说"海报上写’暑期招生’五个大字",AI 就会尝试在画面中渲染这几个字
所以提示词要尽量具体——方向越明确,AI 去噪时越不会跑偏。
准备工作:API Key 与依赖
第一步:获取 API Key
# Windows (PowerShell)
$env:ZHIPUAI_API_KEY = "你的API Key"
# Mac / Linux
export ZHIPUAI_API_KEY="你的API Key"
第二步:安装依赖
pip install zhipuai requests
完整代码:生成一套招生海报
"""
Day03 – AI 生成营销素材:给梅雅达工作室生成招生海报
依赖:pip install zhipuai requests
环境变量:ZHIPUAI_API_KEY
"""
import os
import time
import requests
from pathlib import Path
from zhipuai import ZhipuAI
def get_client():
"""初始化智谱 AI 客户端"""
api_key = os.environ.get("ZHIPUAI_API_KEY")
if not api_key:
raise ValueError("请先设置环境变量 ZHIPUAI_API_KEY")
return ZhipuAI(api_key=api_key)
def generate_single_image(client, prompt, size="1024×1024", output_path=None):
"""调用 cogview-4 生成单张图片并下载到本地"""
response = client.images.generations(model="cogview-4", prompt=prompt, size=size)
image_url = response.data[0].url
output_path = output_path or f"poster_{int(time.time())}.png"
Path(output_path).parent.mkdir(parents=True, exist_ok=True)
with open(output_path, "wb") as f:
f.write(requests.get(image_url, timeout=60).content)
return output_path
def generate_poster_series(client):
"""实战:给梅雅达编程工作室生成一套招生海报(3 张不同风格)"""
output_dir = "day03_posters"
# 海报 1:科技风(prompt 写法示例)
prompt_1 = ("一张科技感十足的编程教育招生海报。深蓝色渐变背景,画面中央有发光的代码符号和电路纹理。"
"海报上方用白色大字写着“暑期编程训练营”,下方写着“梅雅达编程工作室”。"
"画面整体风格现代、专业,有未来感。竖版构图。")
generate_single_image(client, prompt=prompt_1.strip(), size="720×1440",
output_path=f"{output_dir}/01_tech_style.png")
# 海报 2 温暖教育风、海报 3 极简风:同样换 prompt 与 output_path 即可
# ……(完整三张海报见配套 day03.py)
if __name__ == "__main__":
client = get_client()
generate_poster_series(client)
运行结果
🎨 正在生成:一张科技感十足的编程教育招生海报。…
✅ 生成成功!URL: 2026-09-17kt03bozi4vj.png
💾 已保存至:day03_posters/01_tech_style.png
🎨 正在生成:一张温暖明亮的编程教育海报。…
✅ 生成成功!URL: 2026-09-17kt03bozi4vj.png
💾 已保存至:day03_posters/02_warm_style.png
🎨 正在生成:一张极简风格的编程课程海报。…
✅ 生成成功!URL: 2026-09-17kt03bozi4vj.png
💾 已保存至:day03_posters/03_minimal_style.png
🎉 全部生成完毕!海报保存在 day03_posters/ 目录下
从运行到出图,3 张海报大概 30-60 秒搞定。
实际生成效果
用真实 API Key 调用 CogView-4 生成的 3 张海报(本机实跑结果):
!在这里插入图片描述
!在这里插入图片描述
!在这里插入图片描述
控制台运行日志:
!在这里插入图片描述
Prompt 工程:出图质量的分水岭
代码跑通了,你会发现一个现实——同样的代码,Prompt 写得好和写得差,出图质量天差地别。这就是 Prompt 工程的魅力。
给你一个用了几个月的万能公式:
主体描述 + 环境/背景 + 风格/氛围 + 文字内容(如果需要)+ 构图/尺寸要求
反面教材:
一张招生海报
这种 Prompt 太笼统了,AI 完全不知道你想要什么,出来的东西基本是开盲盒。
正面教材:
一张面向家长的少儿编程招生海报。
背景是明亮的教室环境,蓝白配色。
画面中有孩子使用电脑的剪影。
顶部大字写着"暑期编程班 火热报名中"。
整体风格专业、可信、有亲和力。
竖版构图,适合手机端查看。
7 个实用技巧
技巧 1:先说主体,再说细节
AI 处理信息有优先级。先告诉它"画什么",再告诉它"怎么画"。
✅ 一只柴犬坐在咖啡馆门口,日系胶片风格,暖色调
❌ 暖色调的日系胶片风格的坐在咖啡馆门口的柴犬
技巧 2:用具体名词替代抽象形容词
✅ 背景是浅灰色混凝土墙面,上面有淡淡的苔藓纹理
❌ 背景很有质感
技巧 3:明确指定颜色方案
✅ 整体配色为深蓝底 + 金色文字 + 白色装饰线条
技巧 4:指定光线方向
✅ 侧面自然光照射,光线从画面左侧 45 度角打过来
技巧 5:写文字内容时用引号包裹
CogView-4 支持中文文字渲染,用引号明确告诉 AI 要写什么:
✅ 海报中央用白色大字写着"暑期招生"
技巧 6:加上"不要什么"也很有效
CogView-4 的 API 没有直接的 negative prompt 参数,但你可以把不想要的元素从描述中排除,或者明确说"画面中不要出现人物"。
技巧 7:一次只改一个变量
对生成结果不满意时,每次只调整 Prompt 的一个部分,这样才能知道是哪个改动起了作用。一次改三四个地方,你根本不知道是改好了还是改坏了。
前沿:Runway Media Router——让 AI 自动选模型
生图模型已经多到数不过来:Midjourney、DALL-E、Stable Diffusion、CogView、FLUX……问题来了:怎么知道哪个模型最适合当前这个需求?
这就是 2026 年 7 月 Runway 发布的 Media Router 要解决的问题。简单说,它是一个智能模型路由器——你不用手动选模型,它帮你自动挑最合适的。工作原理就三步:
你的请求 → 路由器评估 → 自动选择最优模型 → 生成结果
路由器的选择基于三个维度:
| 质量优先 | 选效果最好的模型 | 最终交付的营销海报 |
| 速度优先 | 选最快的模型 | 快速验证创意方向 |
| 成本优先 | 选最便宜的模型 | 批量生成素材初稿 |
你可以在后台配置好偏好(比如"这个工作流我要求质量优先,但单张成本不超过 X 元"),之后每次请求就自动按这个策略走。官方公告:Runway 官方博客 ,开发者入口:Runway 开发者文档
Media Router 目前主要面向企业级开发者,但模型路由的思路可以直接借鉴:
# 简化的模型路由思路
def smart_generate(prompt, priority="quality"):
"""根据优先级自动选择生成方案"""
if priority == "speed":
# 快速方案:CogView-3-Flash(免费,速度快)
return generate_with_cogview_flash(prompt)
elif priority == "quality":
# 高质量方案:CogView-4(免费,效果最好)
return generate_with_cogview4(prompt)
elif priority == "cost":
# 本地免费方案:Stable Diffusion(有显卡就行)
return generate_with_local_sd(prompt)
核心是:不绑定单一模型,而是根据任务需求动态选择。今天 CogView-4 免费又好用,如果明天出了更好的免费模型,只需要在路由逻辑里加一行判断。
本地部署:Stable Diffusion(有显卡的玩法)
如果你有 NVIDIA 显卡(显存 ≥ 6GB),可以本地跑 Stable Diffusion,完全免费、无限生成、不联网:
# 安装依赖
pip install diffusers torch transformers accelerate
# 最简单的文生图
python -c "
from diffusers import StableDiffusionPipeline
import torch
pipe = StableDiffusionPipeline.from_pretrained(
'stable-diffusion-v1-5/stable-diffusion-v1-5',
torch_dtype=torch.float16
).to('cuda')
image = pipe('a cute cat wearing sunglasses').images[0]
image.save('local_cat.png')
"
本地方案的优势:
- 完全免费:没有 API 调用次数限制
- 隐私安全:所有数据不出本机
- 可定制:可以加载各种 LoRA、ControlNet 做精细控制
劣势:
- 需要好显卡(推荐 RTX 3060 12GB 以上)
- 生成速度慢(单张 512×512 约 5-15 秒)
- 不支持中文文字渲染
建议:日常使用走 CogView-4 API(免费、快、支持中文),需要精细控制或批量生成时再考虑本地 SD。相关仓库:Stable Diffusion、Diffusers 文档、MJ 的 Prompt 指南(思路通用)。
费用
| CogView-4 API | ¥0 | 注册即送免费额度,够用很久 |
| CogView-3-Flash | ¥0 | 永久免费模型,速度更快 |
| Stable Diffusion(本地) | ¥0 | 开源免费,电费忽略不计 |
| Runway Media Router(基础版) | ¥0 | 官方基础版全球免费 |
整套方案从 API 到本地部署,一分钱不用花。如果你有显卡,连网都不用上。API 文档参考 智谱 API 文档 ,CogView-4 开源仓库在 GitHub 仓库 THUDM/CogView4 。
自己动手改
三道题,由易到难:
题 1:生成朋友圈封面图
修改代码,生成一张微信朋友圈封面图(尺寸 1080×1920),内容是"梅雅达编程工作室"的品牌宣传图。要求:竖版构图、包含工作室名称、风格自选。
题 2:批量生成 + 自动重命名
写一个脚本,根据 CSV 文件批量生成海报。CSV 格式如下:
filename,prompt,size
poster_a.png,科技风格海报,720×1440
poster_b.png,温馨风格海报,1024×1024
poster_c.png,极简风格海报,720×1440
脚本读取 CSV,逐行调用 API 生成图片,并按 filename 列命名保存。配套脚本里的 batch_generate_from_csv() 是参考答案。
题 3:实现简易模型路由
参考文中的 smart_generate 思路,写一个完整的模型路由函数:
- 输入:prompt + priority(speed/quality/cost)
- 输出:根据优先级调用不同模型
- 加上异常处理:如果主选模型报错,自动降级到备选模型
- 记录每次调用的模型名称和耗时
配套脚本里的 smart_generate() 实现了降级和计时,可以直接对照。把这三道题做完,"AI 生图"这件事基本就吃透了。

