3B 模型改写你的 prompt——ERNIE-Image PE 增强器完全指南
ERNIE-Image 的 Prompt Enhancer 不是一个简单的关键词补全工具,而是一个完整的 30 亿参数语言模型。它基于 Mistral AI 的 Ministral-3B-Instruct 微调而来,专门执行一个任务:把你的 prompt 改写成扩散模型更容易理解的版本。
这篇文章从技术角度完整拆解 PE 的工作原理、模型架构、参数配置、各平台集成方式以及底层行为机制。
一、模型架构:Ministral-3B 是什么?
基座模型
| 属性 | 值 |
|---|---|
| 模型名称 | Ministral-3B-Instruct-2512 |
| 开发者 | Mistral AI |
| 参数量 | ~3B(30 亿) |
| 架构类型 | Transformer Decoder + MoE(混合专家) |
| 上下文窗口 | 32K tokens |
| 发布时间 | 2025 年 12 月 |
| 许可证 | Apache 2.0 / 开源友好 |
MoE 架构的核心优势
Ministral 3 系列采用 Mixture of Experts(混合专家)架构。与传统 Dense Transformer 每次推理激活全部参数不同,MoE 结构在每次推理时只激活部分"专家"模块。
这意味着:
- 标称参数:3B
- 激活参数:显著低于 3B
- 推理速度:比同参数 Dense 模型快得多
- 资源消耗:显存占用更低
对于 PE 这种需要"快速响应"的前置模块,MoE 架构是天然优势。
百度做了什么?
百度在 Ministral-3B-Instruct 基础上进行了指令微调(Instruction Fine-tuning),训练数据是高质量的"短 prompt → 结构化长 prompt"配对数据。
微调后的模型被保存为 ernie-image-prompt-enhancer.safetensors,文件大小约为基座模型的压缩版本(具体取决于量化格式)。
二、PE 的推理流程:从输入到输出的每一步
步骤 1:Prompt 接收与预处理
用户输入原始 prompt,PE 接收后先进行 tokenization:
原始输入: "a ceramic coffee mug"
Tokenize: [a] [ceramic] [coffee] [mug]
Token 数: ~4 tokens
步骤 2:系统指令注入
PE 在用户 prompt 之前注入系统指令(类似 Chat 模型的 system prompt),指示模型执行 prompt 扩展任务。系统指令的大致内容:
You are a prompt enhancer for image generation. Expand the user's brief description into a detailed, structured prompt that includes subject details, environment, lighting, composition, and style. Maintain the user's original intent. Output the enhanced prompt.
步骤 3:MoE 推理
Ministral-3B 的 MoE 路由机制选择激活哪些专家模块。对于 prompt 扩展任务,主要激活与"文本生成"和"描述性语言"相关的专家。
推理参数:
- max_length: 1536–2048(输出 token 上限)
- temperature: 0.6(平衡创意与稳定性)
- top_p: 0.8(核采样)
- thinking mode: Disabled(关闭推理链,直接输出)
步骤 4:输出截断与后处理
PE 生成扩展后的 prompt,截断到指定长度,然后传递给 Text Encoder(Ministral-3B Text Encoder,注意这不是同一个模型实例,是另一个 Ministral-3B 实例用于文本编码)。
三、PE 的 ComfyUI 集成细节
文件结构
ComfyUI/models/text_encoders/
├── ministral-3-3b.safetensors ← Text Encoder(文本编码)
└── ernie-image-prompt-enhancer.safetensors ← PE 模块(prompt 扩展)
注意:这两个模型虽然都基于 Ministral-3B,但用途不同:
- Text Encoder:将 prompt 编码为文本特征向量,供扩散模型使用
- PE 模块:改写 prompt 文本,输出仍然是文本
节点配置
PE 在 ComfyUI 中使用 CLIPLoader 节点加载,虽然它实际上是 LLM 而不是 CLIP 模型。这是 ComfyUI 的接口复用设计。
PE 节点的关键设置(通过子图访问):
{
"model": "ernie-image-prompt-enhancer.safetensors",
"max_length": 2048,
"temperature": 0.6,
"top_p": 0.8,
"thinking_enabled": false,
"enabled": true
}
工作流中的位置
在 ComfyUI 的 ERNIE-Image 标准工作流中,PE 节点位于 Text Encoder 之前:
[CustomText (用户输入)] → [PE 节点] → [Text Encoder (Ministral-3B)] → [DiT 扩散模型]
如果 PE 被禁用(enabled: false),工作流变为:
[CustomText (用户输入)] → [Text Encoder (Ministral-3B)] → [DiT 扩散模型]
四、Diffusers API 集成
Python 代码示例
from diffusers import ErnieImagePipeline
import torch
pipe = ErnieImagePipeline.from_pretrained(
"Baidu/ERNIE-Image-Turbo",
torch_dtype=torch.bfloat16
).to("cuda")
开启 PE(默认)
image_on = pipe(
prompt="a ceramic coffee mug",
use_pe=True, # PE 开启
height=1264,
width=848,
num_inference_steps=8,
guidance_scale=1.0
).images[0]
关闭 PE
image_off = pipe(
prompt="a ceramic coffee mug",
use_pe=False, # PE 关闭
height=1264,
width=848,
num_inference_steps=8,
guidance_scale=1.0
).images[0]
PE 的推理开销
启用 PE 会增加一次 LLM 推理开销:
| 配置 | 额外时间 | 额外显存 |
|---|---|---|
| PE 开启 + 8B DiT | ~2-5 秒(PE 推理) | ~6-8GB(PE 模型) |
| PE 关闭 + 8B DiT | 0 | 0 |
在显存紧张的环境下(12-16GB GPU),关闭 PE 可以释放约 6-8GB 显存给扩散模型。
五、PE 的语言行为分析
中文翻译倾向的根源
PE 倾向于将 prompt 翻译为中文,原因来自训练数据分布:
- 百度训练数据:百度的 prompt 扩展训练数据中,中文 prompt 占比较高
- Ministral 基座:Ministral-3B-Instruct 本身多语言能力均衡,但微调后偏向训练数据主导的语言
- ERNIE-Image 定位:ERNIE-Image 的主要目标市场是中国,中文优先是合理的训练策略
对多语言用户的影响
| 用户语言 | PE 行为 | 影响 |
|---|---|---|
| 英文输入 | 可能翻译为中文或中英混合 | 英文文字渲染可能变中文 |
| 中文输入 | 保持中文或中英混合 | 基本不影响 |
| 其他语言 | 可能翻译为中文 | 可能改变原始语义 |
解决方案
- 精确文字渲染:关闭 PE
- 英文用户:关闭 PE 或用外部 LLM 辅助
- 中文用户:PE 友好,但文字渲染仍需关闭
六、GGUF 量化:PE 的盲区
Unsloth 提供了 ERNIE-Image DiT 和 Ministral-3B Text Encoder 的 GGUF 量化版本,但 PE 模块没有 GGUF 版本。
原因可能是:
- PE 本身就是 3B 模型,量化收益有限
- PE 使用 CLIPLoader 接口加载,GGUF 量化需要专门的 Loader
- 优先级较低——核心扩散模型和 Text Encoder 的量化对显存节省更大
结果:GGUF 工作流无法使用 PE,低显存用户需要自己写详细 prompt。
七、PE 参数调优指南
temperature 的影响
| temperature | 效果 | 适用场景 |
|---|---|---|
| 0.3 | 保守,输出稳定但模板化 | 需要一致性的批量生成 |
| 0.6 | 平衡(默认) | 通用场景 |
| 0.8+ | 创意性强,但可能偏离原始意图 | 探索性创作 |
max_length 的影响
| max_length | 效果 | 适用场景 |
|---|---|---|
| 512 | 简短扩展 | 快速预览 |
| 1536 | 标准扩展(推荐) | 通用场景 |
| 2048 | 详细扩展 | 复杂场景 |
| 4096+ | 过长,浪费 | 不推荐 |
top_p 的影响
| top_p | 效果 |
|---|---|
| 0.5 | 非常保守,只选最可能的词 |
| 0.8 | 平衡(推荐) |
| 0.95 | 更开放,允许长尾词汇 |
八、外部 LLM 替代方案的技术实现
方案 1:手动替代
1. 用 GPT-4/Claude 扩展 prompt
2. 关闭 PE
3. 粘贴扩展后的 prompt
方案 2:自动化 Pipeline
# 伪代码
def generate_with_custom_pe(user_prompt, llm_client):
enhanced = llm_client.chat(
system="Expand this image generation prompt into detailed description...",
user=user_prompt
)
image = ernie_image_pipe(
prompt=enhanced,
use_pe=False
)
return image
方案 3:自定义 PE 微调
如果你有大量特定领域的 prompt 数据,可以基于 Ministral-3B 自行微调 PE:
1. 下载 ministral/Ministral-3b-instruct
2. 准备 [短prompt, 长prompt] 配对数据
3. 使用 LoRA/QLoRA 微调
4. 导出为 safetensors
5. 替换 ComfyUI 中的 PE 模块
九、总结
PE 是一个基于 Ministral-3B MoE 架构的指令微调语言模型,核心任务是将短 prompt 扩展为结构化长 prompt。
- 架构:MoE → 推理快、显存低
- 行为:改写而非增强,有中文翻译倾向
- 参数:temperature 0.6、max_length 2048、top_p 0.8 为推荐配置
- 限制:GGUF 工作流不可用
- 替代:外部 LLM 或自定义微调
理解 PE 的技术底层,有助于你做出更准确的开关决策和参数调优。