鸿蒙智能体开发实战:34.鸿蒙壁纸大师 - 提示词工程与优化
引言
提示词工程(Prompt Engineering)是 AI 应用中决定输出质量的关键环节。在鸿蒙壁纸大师中,提示词的质量直接决定了最终生成的壁纸是否符合用户的审美期待。
本文将深入分析项目中的双层提示词优化策略:
- 第一层:根据用户选择的风格、主题和场景,使用
build_image_prompt()构建结构化的基础 prompt - 第二层:调用 LLM 对基础 prompt 进行艺术化增强和语义丰富
同时还涵盖 System Prompt 设计、负向提示词、8 大核心艺术要素等内容。
关键概念:提示词工程不是简单的「写描述」,而是一个涉及结构化约束、多轮优化、负向控制的系统工程。优秀的提示词应同时考虑「告诉模型做什么」和「告诉模型不做什么」。
一、双层提示词优化策略
1.1 优化流程总览
用户输入/选择 ↓ ┌─────────────────────────────────────┐ │ 第一层:基础 prompt 构建 │ │ build_image_prompt(style, theme, │ │ screen_type, resolution) │ │ → 结构化、标准化的基础 prompt │ │ → 包含风格、主题、场景、分辨率约束 │ └─────────────────────────────────────┘ ↓ ┌─────────────────────────────────────┐ │ 第二层:LLM 艺术增强 │ │ enhance_prompt_with_llm(base_prompt) │ │ → 调用 doubao-seed-2-0-mini 模型 │ │ → 添加艺术流派、色彩方案、材质纹理 │ │ → 确保输出结构规范 │ └─────────────────────────────────────┘ ↓ 最终 prompt → 调用文生图模型生成壁纸上图展示了双层提示词优化策略:第一层构建结构化基础 prompt,第二层通过 LLM 进行艺术增强,最终生成高质量壁纸
1.2 第一层:基础 prompt 构建
# services/wallpaper_flow_service.pydefbuild_image_prompt(style:str,theme:str,screen_type:str,resolution:str)->Tuple[str,str]:""" 构建图片生成提示词 Args: style: 风格名称(如"水墨国风") theme: 主题名称(如"青峦远山") screen_type: 屏幕类型(lock_screen 或 home_screen) resolution: 分辨率(如 1440x2560) Returns: (正向提示词,负向提示词) """# 计算宽高比ifresolution:try:width,height=map(int,resolution.split('x'))ifwidth>height:aspect_ratio="横屏 3:2"else:aspect_ratio="竖屏 9:16"except(ValueError,AttributeError):aspect_ratio="竖屏 9:16"else:aspect_ratio="竖屏 9:16"# 确定场景描述(锁屏 vs 主屏的差异化处理)ifscreen_type=="home_screen":scene_desc=("整体画面柔和虚化、低对比度、留白充足,""四周简洁不杂乱,不遮挡应用图标与卡片,""风格简约高级,色调统一细腻")else:# lock_screenscene_desc=("画面层次精致优雅,视觉柔和唯美,""不遮挡顶部时间区域")# 构建正向提示词positive_prompt=(f"生成一张{style}的{aspect_ratio}壁纸,"f"画面包含{theme},比例为{aspect_ratio.split()[-1]}。"f"{scene_desc}。高级艺术氛围,柔光质感。"f"8K 超高清,无文字、无水印、无多余杂物。")# 负向提示词negative_prompt=("丑陋、杂乱、刺眼、文字、水印、LOGO、低俗、""过度饱和、高对比、噪点、变形、低清、像素模糊、""多余杂物、主题堆砌、色彩脏乱、卡通化、俗气")returnpositive_prompt,negative_prompt核心设计理念:
- 场景差异化:主屏壁纸需要虚化留白以适应图标,锁屏壁纸则强调视觉层次
- 分辨率自适应:根据分辨率自动确定横竖屏比例
- 负向提示词硬编码:避免 LLM 优化时遗漏关键约束
- 基础模板稳定可靠:确保每次生成的壁纸都符合基本质量标准
设计提示:基础模板中的负向提示词不经过 LLM 优化,这是有意为之。LLM 在增强 prompt 时可能会「遗忘」或「弱化」某些约束条件,而文字、水印、LOGO 等禁止项是严格的合规需求,不可妥协。
1.3 第二层:LLM 艺术增强
基础 prompt 虽然结构清晰,但艺术表现力不足。第二层通过调用 LLM 进行深度增强:
# services/wallpaper_service.pyasyncdefenhance_prompt_with_llm(user_prompt:str,context_messages:List[Dict[str,str]]=None,log_id:str=None)->str:""" 调用语言模型完善用户输入的 prompt 返回优化后的 prompt """system_prompt="""你是一个专业的艺术插画提示词优化专家。 用户会输入简单的描述(可能包含主题、风格信息), 你需要将其优化为具有强烈艺术风格的插画提示词。 核心原则: - 禁止写实风格,必须是艺术插画 - 强调艺术性、设计感、高级感 - 融合多种艺术流派和质感 必须包含的核心要素: 1. 艺术风格定位:高定艺术插画、绘本风格、平面插画等 2. 主体元素:核心视觉元素具体化 3. 色彩方案:主色调+辅助色调,色彩情绪 4. 背景与材质:材质纹理、光影特征 5. 构图与排版:大师级排版,大量留白 6. 艺术质感:电影感、绘本感、版画质感等(至少3种) 7. 情绪氛围:梦幻、诗意、朦胧、宁静、治愈 8. 限制条件:不要出现文字 输出结构模板: 一张【主题】风格的艺术插画壁纸,融合【艺术流派】美学。 画面主体为【主体元素】,采用【主色调】与【辅助色调】, 呈现【情绪氛围】。背景使用【材质纹理】,带有【光影特征】。 构图采用【构图方式】,大量留白,点线面层次丰富。 融合【艺术质感关键词】。高定艺术插画,大师级排版, 极简与极繁结合,梦幻诗意,动态定格,电影级氛围。 不要出现文字。"""messages=[{"role":"system","content":system_prompt}]ifcontext_messages:messages.extend(context_messages[-10:])messages.append({"role":"user","content":f"请优化以下绘画提示词:{user_prompt}"})# 调用火山引擎 LLM(流式输出)asyncwithclient.stream("POST",f"{settings.VOLCANIC_BASE_URL}/chat/completions",headers={"Authorization":f"Bearer{settings.VOLCANIC_API_KEY}",},json={"model":settings.LANGUAGE_MODEL,# doubao-seed-2-0-mini"messages":messages,"max_tokens":1024,"temperature":0.7,"stream":True,},)asresponse:enhanced_prompt=""asyncforlineinresponse.aiter_lines():# 解析 SSE 流式响应,拼接完整 prompt# ...enhanced_prompt+=contentreturnenhanced_prompt二、System Prompt 设计详解
2.1 壁纸闲聊 System Prompt
用于闲聊场景下的 LLM 调用:
# services/wallpaper_service.pysystem_prompt="""你是一个友好的 AI 壁纸助手。你可以和用户聊天, 但主要专长是帮助用户生成各种风格的壁纸。 如果用户询问壁纸相关的问题,请热情地介绍你的能力; 如果是闲聊,请简洁友好地回应,并适时引导用户描述他们想要的壁纸。"""设计要点:
- 明确角色定位:告诉模型它是"AI 壁纸助手"
- 定义专业边界:主要专长是壁纸生成
- 交互引导:闲聊时适时引导回壁纸主题
2.2 意图识别 System Prompt
# utils/intent_classifier.pyINTENT_SYSTEM_PROMPT="""你是一个意图识别助手。请分析用户的输入,判断用户的意图。 可选的意图类型: 1. generate_wallpaper - 生成壁纸 2. chat - 闲聊 3. modify_wallpaper - 修改壁纸 4. regenerate - 重新生成 5. cancel - 取消 6. clear_context - 清理上下文 7. unknown - 未知 判断规则: - 问候语、感谢语、告别语 -> chat - 停止、取消、不要、别等 -> cancel - 清空、重新开始 -> clear_context - 有上下文时,"换一张"、"重新来" -> regenerate - 有上下文时,修改具体特征 -> modify_wallpaper - 描述场景、物体、风格 -> generate_wallpaper 请返回 JSON 格式: - intent: 意图类型 - confidence: 置信度 (0-1) - reason: 判断理由 - topic: 如果是 generate_wallpaper,提取壁纸主题;否则为空 """设计要点:
- 结构化输出要求:要求模型返回 JSON 格式,便于程序解析
- 枚举值约束:只允许返回预定义的7种意图类型
- 低温参数:
temperature=0.1确保分类结果的一致性 - 上下文感知:将"是否有历史壁纸"等信息传递给模型
2.3 主题生成 System Prompt
# wallpaper_flow_service.pysystem_prompt=f"""你是一个壁纸主题设计专家。 请为「{style}」风格的壁纸设计{count}个主题选项。 要求: 1. 主题名称要简短、有诗意、2-6 个中文字符 2. 主题要符合该风格的美学特征 3. 只返回 JSON 数组,不要其他说明 4. 例如:["远山暮色", "林间晨光", "湖畔倒影", "雪地初晴"]"""设计要点:
- 格式约束:要求返回纯 JSON 数组,避免解析错误
- 字符数限制:2-6 个中文字符,确保主题简洁
- 示例引导:通过 Few-shot 示例提示期望的输出格式
三、艺术插画提示词八要素
从enhance_prompt_with_llm()的 System Prompt 中可以提炼出艺术插画提示词八要素:
| # | 要素 | 说明 | 示例 |
|---|---|---|---|
| 1 | 艺术风格定位 | 确定画面整体艺术风格 | 高定艺术插画、绘本风格、极简主义 |
| 2 | 主体元素 | 核心视觉元素具体化 | 一只简化线条的橘色猫咪剪影 |
| 3 | 色彩方案 | 主色调+辅助色调+色彩情绪 | 暖橙色与奶油白,呈现宁静治愈 |
| 4 | 背景与材质 | 材质纹理和光影特征 | 细腻亚麻纹理,柔和散射光 |
| 5 | 构图与排版 | 构图方式和空间布局 | 极简留白式,点线面层次丰富 |
| 6 | 艺术质感 | 至少3种艺术质感叠加 | 绘本感、版画质感、胶片颗粒感 |
| 7 | 情绪氛围 | 画面传递的情感氛围 | 梦幻、诗意、朦胧、宁静、治愈 |
| 8 | 限制条件 | 不能出现的内容 | 不要出现文字 |
3.1 优化前后对比
以用户输入"水墨风山水"为例:
优化前(基础 prompt):
生成一张 水墨国风 的 竖屏 9:16 壁纸, 画面包含 远山轮廓,比例为9:16。 画面层次精致优雅,视觉柔和唯美,不遮挡顶部时间区域。 高级艺术氛围,柔光质感。8K 超高清,无文字、无水印、无多余杂物。优化后(LLM 增强):
一张水墨国风主题的艺术插画壁纸,融合宋代山水画美学。 画面主体为远山轮廓层叠,采用墨色与青灰色渐变, 呈现诗意朦胧氛围。背景使用宣纸质感纹理, 带有水墨晕染光影。构图采用深远式构图,大量留白, 点线面层次丰富。融合版画质感、宣纸肌理、水墨渲染。 高定艺术插画,传统与现代结合,梦幻诗意,电影级氛围。 不要出现文字。优化后的 prompt 增加了艺术流派参考(宋画)、材质细节(宣纸、墨色)、构图技巧(深远式),以及更丰富的艺术质感描述,能产生更具艺术感的壁纸。
四、负向提示词设计
负向提示词(Negative Prompt)是文生图模型的重要输入,告诉模型不要生成什么。
4.1 壁纸大师的负向提示词
negative_prompt=("丑陋、杂乱、刺眼、文字、水印、LOGO、低俗、""过度饱和、高对比、噪点、变形、低清、像素模糊、""多余杂物、主题堆砌、色彩脏乱、卡通化、俗气")4.2 负向提示词的分类策略
| 类别 | 关键词 | 目的 |
|---|---|---|
| 质量过滤 | 丑陋、杂乱、刺眼、低俗 | 避免低质量输出 |
| 技术问题 | 噪点、变形、低清、像素模糊 | 确保图像质量 |
| 内容限制 | 文字、水印、LOGO | 合规性要求 |
| 风格控制 | 卡通化、俗气 | 确保艺术插画风格 |
| 色彩控制 | 过度饱和、高对比、色彩脏乱 | 保证色彩和谐 |
| 构图控制 | 多余杂物、主题堆砌 | 确保简洁构图 |
4.3 为什么负向提示词要硬编码
在build_image_prompt()中,负向提示词是硬编码的,不经过 LLM 增强。原因是:
- 负向提示词的精确性要求高:少量关键词的遗漏可能导致大量不合格图片
- LLM 可能"遗忘"约束:模型在增强过程中可能忽略或曲解某些禁止项
- 合规性不可协商:文字、水印等限制是严格需求,不能被"优化"掉
五、提示词工程的性能优化
5.1 超时控制
LLM 调用的超时控制是提示词工程的重要环节:
# services/wallpaper_service.py# 基础 prompt 优化(非流式,快速返回)asyncwithhttpx.AsyncClient(timeout=15.0)asclient:...# LLM 增强 prompt(流式,需更长时间)asyncwithhttpx.AsyncClient(timeout=60.0)asclient:...# 文生图生成(最长超时)asyncwithhttpx.AsyncClient(timeout=120.0)asclient:...5.2 上下文窗口管理
上下文长度直接影响成本和响应速度:
# services/wallpaper_service.pyifcontext_messages:# 只保留最近的上下文,避免 token 过多messages.extend(context_messages[-6:])# 闲聊场景取6条...messages.extend(context_messages[-10:])# 提示词优化取10条不同场景使用不同的上下文窗口大小:
- 闲聊:保留最近6条对话,保持轻快响应
- 提示词优化:保留最近10条,获取更丰富的上下文
- 意图识别:仅传递关键状态信息,不传完整上下文
5.3 流式 vs 非流式
┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 提示词优化 │ │ 意图识别 │ │ 闲聊对话 │ │ (流式/非流式)│ │ (非流式) │ │ (流式) │ │ 需要完整输出 │ │ 仅需JSON │ │ 逐token输出 │ │ 来构建下一步 │ │ 响应可解析 │ │ 以提升体验 │ └──────────────┘ └──────────────┘ └──────────────┘- 提示词优化:使用流式,但最终拼接为完整字符串再传递给文生图模型
- 意图识别:使用非流式,等待完整 JSON 响应
- 闲聊对话:使用流式,逐 token 推送给用户
六、提示词优化的最佳实践总结
6.1 分层优化策略
| 层级 | 方法 | 优点 | 缺点 |
|---|---|---|---|
| 模板化 | 固定字符串拼接 | 速度快、稳定可靠 | 缺乏艺术性 |
| LLM 增强 | 调用语言模型优化 | 艺术表现力强 | 耗时增加 |
| 负向提示词 | 硬编码禁止内容 | 安全性高 | 不够灵活 |
6.2 质量保证清单
- System Prompt 明确定义角色和边界
- 输出格式结构化(JSON 或模板)
- 提供 Few-shot 示例引导期望输出
- 负向提示词不与正向提示词矛盾
- 温度参数根据任务类型调整(分类用低温,生成用中温)
- 上下文窗口大小适配场景需求
- 超时时间根据任务复杂度设置
- 兜底方案(LLM 失败时使用默认模板)
6.3 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 提示词被 LLM 改写过度 | 温度过高或约束不足 | 降低 temperature,增加结构化约束 |
| 生成图片含文字 | 负向提示词未生效 | 在正向提示词中也添加"无文字"约束 |
| 图片风格偏离 | 风格描述不够精确 | 参考艺术家风格或具体艺术流派 |
| 响应超时 | 提示词过长 | 控制上下文条数,精简 System Prompt |
七、常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| LLM 增强后 prompt 偏离原意 | temperature 过高或约束不足 | 降低 temperature 至 0.5,增加结构化模板约束 |
| 生成图片出现文字 | 负向提示词被 LLM 弱化 | 正向 prompt 中也显式添加「无文字」约束 |
| 图片风格不稳定 | 风格描述过于抽象 | 引用具体艺术流派或艺术家风格作为参考 |
| 流式调用超时 | 网络波动或 prompt 过长 | 缩短上下文窗口,增加流式超时时间至 60s |
八、性能优化建议
提示词工程的性能优化直接影响用户体验,以下是一些实测有效的策略:
# 根据任务类型选择 temperatureTEMPERATURE_MAP={"intent_classification":0.1,# 低温度,确保分类一致"prompt_enhancement":0.7,# 中等温度,平衡创意与稳定"chat":0.7,# 闲聊,适度创造性"theme_generation":0.8,# 主题生成,较高创造性}| 优化方向 | 措施 | 效果 |
|---|---|---|
| 缓存基础 prompt | 相同参数命中缓存 | 省去 LLM 调用,< 1ms |
| 压缩 System Prompt | 精简冗余描述 | Token 减少 30% |
| 上下文窗口裁剪 | 仅保留最近 6-10 条 | 降低延迟和成本 |
| 流式调用 | 避免非流式超时 | 提升用户体验 |
九、总结
本文详细解析了鸿蒙壁纸大师的提示词工程体系,核心内容:
- 双层优化策略:基础模板构建 + LLM 艺术增强,兼顾效率与质量
- 三种 System Prompt:闲聊、意图识别、主题生成,各有侧重
- 八要素提示词模板:艺术风格、主体元素、色彩方案、材质等
- 负向提示词设计:硬编码关键约束,确保输出质量和合规性
- 性能优化:超时控制、上下文窗口、流式与非流式的选择
提示词工程是一个持续迭代的过程,需要根据实际输出质量不断调整 System Prompt 的措辞和约束条件。
如果这篇文章对你有帮助,欢迎点赞👍、收藏⭐、关注🔔,你的支持是我持续创作的动力!
相关资源:
- 项目源码:[wallpaper_service.py](file:///Users/zacksleo/projects/gitlab/ai-wallpaper-server/services/wallpaper_service.py)
- 项目源码:[wallpaper_flow_service.py](file:///Users/zacksleo/projects/gitlab/ai-wallpaper-server/services/wallpaper_flow_service.py)
- 项目源码:[intent_classifier.py](file:///Users/zacksleo/projects/gitlab/ai-wallpaper-server/utils/intent_classifier.py)
- 火山引擎 - 豆包大模型
- 火山引擎 - API 文档
- A2A 协议规范 - 华为
- Python asyncio 官方文档
- Python httpx 异步 HTTP 客户端
- JSON-RPC 2.0 规范
- 华为开发者联盟 - 文档中心
- OpenAI API 参考
- 鸿蒙智能体开发实战系列 - 全部文章
