漫画脸描述生成实战:基于Qwen3-32B的AI绘图提示词生成教程
漫画脸描述生成实战:基于Qwen3-32B的AI绘图提示词生成教程
你是不是也遇到过这样的情况:想用AI画一个二次元角色,脑子里有大概的样子,但就是不知道怎么用文字描述出来?要么描述得太简单,生成出来完全不是那么回事;要么描述得太复杂,AI又理解不了。
我之前也是这样,直到我开始用大模型来帮我生成提示词。今天要跟你分享的,就是怎么用Qwen3-32B这个模型,快速生成高质量的漫画脸描述,让你能轻松画出想要的二次元角色。
这个教程特别适合刚开始接触AI绘画的朋友,不需要你有编程基础,跟着步骤走就行。我会带你从环境搭建开始,一步步教你用起来。
1. 准备工作:环境搭建
首先,你需要一个能运行Qwen3-32B模型的环境。我推荐用星图GPU平台,因为它已经预置了相关的镜像,省去了很多配置的麻烦。
1.1 创建实例
登录星图平台后,找到“创建实例”的选项。在镜像选择里,搜索“Qwen3-32B”相关的镜像。通常会有一些预置好的镜像,比如“Qwen3-32B-Chat”或者“Qwen3-32B-Instruct”,选一个最新的版本就行。
配置方面,建议选择至少16GB显存的GPU,因为32B的模型对显存要求比较高。内存选32GB以上,这样运行起来会更流畅。
1.2 启动服务
实例创建好后,等几分钟让它启动完成。然后通过SSH或者平台提供的Web终端连接到你的实例。
第一次连接时,可能需要安装一些依赖。不过如果用的是预置镜像,大部分依赖应该都已经装好了。你可以先检查一下Python环境:
python --version
如果显示Python 3.8或以上版本,就说明环境基本没问题。
2. 快速上手:第一个漫画脸描述
环境准备好了,咱们先来试试最简单的用法,看看这个模型能做什么。
2.1 安装必要的库
虽然预置镜像可能已经包含了一些库,但为了确保完整,我们还是安装一下transformers和torch:
pip install transformers torch
这个命令会安装运行模型需要的核心库。如果安装速度慢,可以加上国内的镜像源,比如清华源。
2.2 写一个简单的调用脚本
创建一个Python文件,比如叫generate_prompt.py,然后写入以下代码:
from transformers import AutoModelForCausalLM, AutoTokenizer
# 加载模型和分词器
model_name = "Qwen/Qwen3-32B-Instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype="auto",
device_map="auto"
)
# 准备一个简单的提示
prompt = "请生成一个二次元少女角色的详细描述,用于AI绘画。要求:蓝色长发,红色眼睛,穿着学院制服,表情温柔。"
# 编码输入
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
# 生成描述
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=200,
temperature=0.7,
do_sample=True
)
# 解码输出
generated_text = tokenizer.decode(outputs[0], skip_special_tokens=True)
print("生成的描述:")
print(generated_text)
这段代码做了几件事:
- 加载Qwen3-32B模型和对应的分词器
- 准备一个简单的提示,告诉模型我们想要什么样的角色
- 让模型根据提示生成更详细的描述
- 把生成的结果打印出来
2.3 运行看看效果
在终端里运行这个脚本:
python generate_prompt.py
第一次运行会下载模型文件,可能需要一些时间,取决于你的网络速度。模型大小大概60多GB,所以耐心等一下。
下载完成后,你应该能看到类似这样的输出:
生成的描述:
请生成一个二次元少女角色的详细描述,用于AI绘画。要求:蓝色长发,红色眼睛,穿着学院制服,表情温柔。
角色描述:一位拥有飘逸蓝色长发的二次元少女,发丝在阳光下泛着淡淡的光泽。她的眼睛是鲜艳的红色,如同红宝石般璀璨,眼神温柔而清澈。她穿着标准的日式学院制服,白色衬衫搭配深蓝色西装外套,系着红色领结。制服裙是深蓝色的百褶裙,长度及膝。她微微笑着,表情温柔亲切,背景可以是樱花飘落的校园场景。整体画风偏向日系动漫风格,线条清晰,色彩明亮。
看到没?模型把我们简单的几句话,扩展成了很详细的描述,连背景、画风都考虑到了。这就是用大模型生成提示词的好处——它能帮你把模糊的想法具体化。
3. 进阶技巧:让描述更精准
刚才的例子比较简单,但实际使用时,你可能会有更具体的要求。下面我分享几个让描述更精准的技巧。
3.1 使用更详细的提示
模型的表现很大程度上取决于你给的提示。试试这个更详细的提示:
detailed_prompt = """你是一个专业的AI绘画提示词生成专家。请根据以下要求生成一个详细的二次元角色描述:
角色类型:魔法少女
外貌特征:
- 发色:粉色渐变到紫色
- 眼睛:金色,有星星形状的高光
- 服装:华丽的魔法少女服装,有大量蕾丝和蝴蝶结
- 配饰:手持魔法杖,头上有月亮形状的发饰
场景:夜晚的星空下,站在魔法阵中央
画风:精细的日系插画风格,背景有发光粒子效果
请生成一个完整、详细的描述,包含所有视觉细节,适合直接用于AI绘画。"""
inputs = tokenizer(detailed_prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=300,
temperature=0.6,
do_sample=True
)
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(result)
这种结构化的提示能让模型更好地理解你的需求。注意我用了具体的特征描述,还指定了场景和画风。
3.2 调整生成参数
生成结果的质量可以通过参数来调整。主要关注这几个:
- max_new_tokens:控制生成文本的长度。对于角色描述,200-500通常够用。
- temperature:控制随机性。值越低(如0.3-0.6),结果越确定和保守;值越高(如0.8-1.2),结果越有创意但也可能偏离要求。
- top_p:核采样参数,通常0.9-0.95效果不错。
- repetition_penalty:防止重复,可以设为1.1-1.2。
这里有个调整后的例子:
def generate_character_description(prompt, style="anime"):
"""生成角色描述的通用函数"""
# 根据风格调整提示
if style == "anime":
style_note = "日系动漫风格,大眼睛,色彩鲜艳"
elif style == "semi-realistic":
style_note = "半写实风格,有一定真实感但保留动漫特征"
else:
style_note = "二次元插画风格"
full_prompt = f"{prompt}\n画风要求:{style_note}\n请生成详细描述:"
inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=250,
temperature=0.65,
top_p=0.92,
repetition_penalty=1.15,
do_sample=True
)
return tokenizer.decode(outputs[0], skip_special_tokens=True)
# 使用示例
prompt = "生成一个酷炫的赛博朋克风格角色,有机械义眼和发光纹身"
description = generate_character_description(prompt, style="semi-realistic")
print(description)
3.3 处理常见问题
新手在用的时候可能会遇到一些问题,我整理了几个常见的:
问题1:生成的描述太笼统 解决:在提示里明确要求“详细描述”、“包含所有细节”、“具体到颜色、材质、光影”。
问题2:角色特征不符合要求 解决:把关键特征放在提示开头,用强调的语气,比如“必须包含:蓝色头发、红色眼睛”。
问题3:描述逻辑混乱 解决:让模型按顺序描述,比如“请按以下顺序描述:1. 外貌特征 2. 服装 3. 场景 4. 画风”。
这里有个处理这些问题的完整示例:
def generate_detailed_prompt(character_traits, scene, style):
"""生成详细提示词的函数"""
prompt_template = """作为AI绘画提示词专家,请生成一个极其详细的角色描述。
必须包含以下特征:
{traits}
场景设定:{scene}
画风要求:{style}
请按此顺序详细描述:
1. 角色整体外观和气质
2. 面部特征细节(眼睛、鼻子、嘴巴、表情)
3. 发型和发色细节
4. 服装的每个部分(上衣、下装、鞋子、配饰)
5. 场景环境和背景元素
6. 光影效果和色彩搭配
7. 画面构图和视角
生成描述:"""
full_prompt = prompt_template.format(
traits="\n".join([f"- {trait}" for trait in character_traits]),
scene=scene,
style=style
)
inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=400,
temperature=0.6,
top_p=0.9,
do_sample=True
)
result = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 提取生成的描述部分
if "生成描述:" in result:
return result.split("生成描述:")[1].strip()
return result
# 使用示例
traits = [
"银色短发,有蓝色挑染",
"异色瞳:左眼金色,右眼蓝色",
"穿着未来风格的战斗服",
"手持能量剑"
]
scene = "未来城市的屋顶,夜晚,霓虹灯闪烁"
style = "赛博朋克动漫风格,有光污染效果"
description = generate_detailed_prompt(traits, scene, style)
print("生成的详细描述:")
print(description)
4. 实际应用:批量生成和优化
学会了基本用法后,你可能需要批量生成多个角色的描述,或者对生成的描述进行优化。
4.1 批量生成不同角色
如果你需要一系列相关角色的描述,可以这样做:
def batch_generate_characters(character_types, base_scene, base_style):
"""批量生成多个角色描述"""
results = []
for char_type in character_types:
prompt = f"""生成一个{char_type}的二次元角色描述。
角色特点要符合{char_type}的常见设定。
场景:{base_scene}
画风:{base_style}
请生成详细描述:"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=200,
temperature=0.7,
do_sample=True
)
description = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 清理结果,只保留生成的部分
if "请生成详细描述:" in description:
description = description.split("请生成详细描述:")[1].strip()
results.append({
"type": char_type,
"description": description
})
print(f"已生成:{char_type}")
return results
# 示例:生成一个冒险队伍的角色
character_types = [
"勇敢的剑士",
"神秘的魔法师",
"敏捷的弓箭手",
"治愈的牧师"
]
base_scene = "奇幻世界的冒险途中"
base_style = "日系幻想RPG风格"
team_descriptions = batch_generate_characters(character_types, base_scene, base_style)
# 保存结果
import json
with open("character_descriptions.json", "w", encoding="utf-8") as f:
json.dump(team_descriptions, f, ensure_ascii=False, indent=2)
print("批量生成完成,结果已保存到character_descriptions.json")
4.2 优化已有描述
有时候你可能对生成的描述不太满意,想要调整某些部分。可以这样优化:
def optimize_description(original_desc, changes):
"""优化已有的角色描述"""
prompt = f"""以下是某个角色的描述:
{original_desc}
请根据以下要求修改这个描述:
{changes}
请输出修改后的完整描述,保持相同的详细程度。"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=300,
temperature=0.5, # 温度低一些,让修改更准确
do_sample=True
)
optimized = tokenizer.decode(outputs[0], skip_special_tokens=True)
return optimized
# 使用示例
original = """一位金发碧眼的骑士,穿着银色盔甲,手持长剑,站在城堡前。"""
changes = """1. 把金发改成银白色长发
2. 盔甲改成黑色带有金色纹路
3. 场景改成雨中的废墟
4. 增加一些悲伤的表情细节"""
optimized = optimize_description(original, changes)
print("优化后的描述:")
print(optimized)
4.3 提取关键信息
生成了描述后,你可能想从中提取一些关键信息,比如颜色、服装类型等:
def extract_character_info(description):
"""从描述中提取关键信息"""
prompt = f"""请从以下角色描述中提取关键信息:
{description}
请提取:
1. 发色和发型
2. 眼睛颜色和特征
3. 服装的主要颜色和样式
4. 主要配饰
5. 场景环境
6. 整体色彩基调
用简洁的列表形式回答。"""
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=150,
temperature=0.3, # 低温度确保提取准确
do_sample=False # 贪婪解码,更确定
)
info = tokenizer.decode(outputs[0], skip_special_tokens=True)
return info
# 使用示例
sample_description = """一位拥有粉色双马尾的少女,眼睛是碧绿色,戴着星星形状的眼罩。她穿着粉白相间的洛丽塔连衣裙,裙摆有大量蕾丝。手持魔法少女手杖,顶端有月亮装饰。背景是星空下的魔法学校,整体色彩梦幻柔和。"""
info = extract_character_info(sample_description)
print("提取的关键信息:")
print(info)
5. 整合到工作流中
最后,咱们来看看怎么把这些功能整合到你的实际工作流中。
5.1 创建简单的Web界面
如果你想让非技术人员也能用,可以做个简单的Web界面。这里用Flask做个例子:
from flask import Flask, request, jsonify, render_template_string
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
app = Flask(__name__)
# 全局加载模型(实际生产环境要考虑内存管理)
model = None
tokenizer = None
def load_model():
global model, tokenizer
if model is None:
print("正在加载模型...")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-32B-Instruct")
model = AutoModelForCausalLM.from_pretrained(
"Qwen/Qwen3-32B-Instruct",
torch_dtype="auto",
device_map="auto"
)
print("模型加载完成")
@app.route('/')
def home():
# 简单的HTML界面
html = '''
<!DOCTYPE html>
<html>
<head>
<title>漫画脸提示词生成器</title>
<style>
body { font-family: Arial; max-width: 800px; margin: 0 auto; padding: 20px; }
textarea { width: 100%; height: 100px; margin: 10px 0; }
button { padding: 10px 20px; background: #007bff; color: white; border: none; cursor: pointer; }
.result { background: #f5f5f5; padding: 15px; margin-top: 20px; border-radius: 5px; }
</style>
</head>
<body>
<h1>漫画脸提示词生成器</h1>
<form id="generateForm">
<label>角色描述要求:</label><br>
<textarea name="prompt" placeholder="例如:生成一个傲娇的猫娘角色,有猫耳和尾巴"></textarea><br>
<label>画风:</label>
<select name="style">
<option value="anime">日系动漫</option>
<option value="semi-realistic">半写实</option>
<option value="cartoon">美式卡通</option>
</select><br><br>
<button type="button" onclick="generate()">生成描述</button>
</form>
<div id="result" class="result" style="display:none;">
<h3>生成的描述:</h3>
<p id="generatedText"></p>
<button onclick="copyToClipboard()">复制到剪贴板</button>
</div>
<script>
async function generate() {
const form = document.getElementById('generateForm');
const data = new FormData(form);
const response = await fetch('/generate', {
method: 'POST',
body: JSON.stringify({
prompt: data.get('prompt'),
style: data.get('style')
}),
headers: { 'Content-Type': 'application/json' }
});
const result = await response.json();
document.getElementById('generatedText').textContent = result.description;
document.getElementById('result').style.display = 'block';
}
function copyToClipboard() {
const text = document.getElementById('generatedText').textContent;
navigator.clipboard.writeText(text);
alert('已复制到剪贴板!');
}
</script>
</body>
</html>
'''
return render_template_string(html)
@app.route('/generate', methods=['POST'])
def generate():
load_model()
data = request.json
prompt = data.get('prompt', '')
style = data.get('style', 'anime')
# 构建完整提示
full_prompt = f"根据以下要求生成二次元角色描述:{prompt}\n画风:{style}\n请生成详细描述:"
inputs = tokenizer(full_prompt, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=250,
temperature=0.7,
do_sample=True
)
description = tokenizer.decode(outputs[0], skip_special_tokens=True)
# 清理结果
if "请生成详细描述:" in description:
description = description.split("请生成详细描述:")[1].strip()
return jsonify({"description": description})
if __name__ == '__main__':
# 注意:生产环境要用更专业的部署方式
app.run(host='0.0.0.0', port=5000, debug=False)
这个简单的Web应用让你可以通过浏览器界面生成描述,不需要写代码。运行后,在浏览器访问 http://你的服务器IP:5000 就能用了。
5.2 保存和管理生成的描述
随着使用次数增多,你可能需要管理生成的描述。可以建个简单的数据库:
import sqlite3
from datetime import datetime
class PromptDatabase:
def __init__(self, db_path="prompts.db"):
self.conn = sqlite3.connect(db_path)
self.create_table()
def create_table(self):
cursor = self.conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS prompts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
original_prompt TEXT,
generated_description TEXT,
style TEXT,
created_at TIMESTAMP,
tags TEXT
)
''')
self.conn.commit()
def save_prompt(self, original, generated, style, tags=None):
cursor = self.conn.cursor()
cursor.execute('''
INSERT INTO prompts (original_prompt, generated_description, style, created_at, tags)
VALUES (?, ?, ?, ?, ?)
''', (original, generated, style, datetime.now(), tags))
self.conn.commit()
return cursor.lastrowid
def search_prompts(self, keyword=None, style=None, limit=50):
cursor = self.conn.cursor()
query = "SELECT * FROM prompts WHERE 1=1"
params = []
if keyword:
query += " AND (original_prompt LIKE ? OR generated_description LIKE ?)"
params.extend([f"%{keyword}%", f"%{keyword}%"])
if style:
query += " AND style = ?"
params.append(style)
query += " ORDER BY created_at DESC LIMIT ?"
params.append(limit)
cursor.execute(query, params)
return cursor.fetchall()
def close(self):
self.conn.close()
# 使用示例
db = PromptDatabase()
# 保存生成的描述
original = "生成一个魔法学院的学生"
generated = "一位戴着尖顶帽的年轻魔法师,手持橡木法杖..."
style = "fantasy"
tags = "魔法,学生,学院"
prompt_id = db.save_prompt(original, generated, style, tags)
print(f"已保存,ID:{prompt_id}")
# 搜索描述
results = db.search_prompts(keyword="魔法", style="fantasy")
for row in results:
print(f"ID: {row[0]}, 风格: {row[3]}")
print(f"描述: {row[2][:100]}...")
print("-" * 50)
db.close()
6. 总结
用Qwen3-32B生成漫画脸描述,整个过程其实没有想象中那么复杂。从环境搭建到实际使用,关键是要理解怎么给模型清晰的指令,以及怎么调整参数得到想要的结果。
我自己的使用感受是,刚开始可能需要多试几次,熟悉模型的“脾气”。但一旦掌握了方法,它真的能大大提升创作效率。特别是当你需要批量生成角色,或者对细节有特定要求时,用模型来辅助比完全自己想要快得多。
如果你刚开始接触,建议先从简单的例子开始,慢慢尝试更复杂的提示。遇到不满意的结果时,不要灰心,调整一下提示语或者参数,往往就能得到改善。
最后要提醒的是,虽然模型很强大,但它毕竟是个工具。最好的结果通常来自人和AI的合作——你提供创意和方向,AI帮你丰富细节。多尝试,多调整,你会找到最适合自己的使用方式。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。
更多推荐



所有评论(0)