
最近在开发一个AI绘画相关的项目时遇到了一个很有意思的需求如何将一段非常口语化、甚至有些模糊的用户描述精准地转化为AI绘画工具如Stable Diffusion、Midjourney能够理解并执行的提示词Prompt。这不仅是技术问题更是产品体验和用户沟通的关键。本文将以一个典型的用户请求为例手把手教你如何拆解、分析和重构自然语言描述最终生成高质量的AI绘画提示词并附上完整的代码示例和优化思路无论是前端交互设计还是后端提示词工程都能从中获得启发。1. 背景与核心概念从“人话”到“机器语言”的桥梁在AI绘画领域提示词Prompt是用户与模型沟通的核心媒介。一个优秀的提示词能够引导AI生成高度符合预期的图像。然而绝大多数普通用户并不了解提示词的语法和结构他们习惯用自然语言甚至是带有情绪和模糊指代的“口语”来表达需求。核心问题如何将“有人给此女画无偿吗。。后面例图替孩子谢谢你们了眼下有颗泪痣一边眼睛刘海遮住谢谢”这样的用户输入转化为结构清晰、要素明确的AI绘画指令解决思路这本质上是一个“自然语言理解NLU”加“结构化信息提取”的任务。我们需要设计一套流程或规则从杂乱的文本中提取出关于主体Subject、属性Attributes、构图Composition、风格Style等关键信息并按照目标AI绘画工具的提示词规范进行重组。为什么需要掌握对于开发者而言无论是构建一个AI绘画应用的输入界面还是开发一个提示词优化工具亦或是进行用户行为分析这项技能都至关重要。它能极大提升产品的易用性和生成结果的质量。2. 环境准备与思路设计本次实战不依赖于特定的深度学习框架重点在于逻辑和算法。我们将使用Python作为实现语言因为它拥有丰富的文本处理库。整个流程可以在任何支持Python的环境中进行。核心工具库re(正则表达式)用于模式匹配和关键词提取。jieba(结巴分词)用于中文分词和词性标注是处理中文的关键。逻辑判断与字符串处理构建规则引擎。版本说明Python 3.8jieba 0.42.1你可以通过以下命令安装必要的库pip install jieba项目结构设计prompt_engine/ ├── prompt_parser.py # 核心解析器 ├── keyword_rules.py # 关键词到提示词标签的映射规则 ├── test_parser.py # 测试脚本 └── requirements.txt # 依赖列表3. 核心解析逻辑拆解我们的目标是将输入文本解析成一个结构化的字典或JSON包含不同的绘画维度。然后再根据这个结构化数据生成最终的提示词。3.1 信息维度定义首先我们需要定义AI绘画提示词通常包含哪些维度主体 (subject): 画什么如“一个女孩”、“一座城堡”。外观描述 (appearance): 主体的具体样貌。如“棕色长发”、“蓝色眼睛”、“眼下有泪痣”。发型与发饰 (hair): 如“刘海遮住一边眼睛”、“双马尾”。表情与情绪 (emotion): 如“微笑”、“忧郁”。动作与姿态 (pose): 如“站立”、“回头”。服装 (clothing): 如“穿着校服”、“汉服”。场景与背景 (background): 如“在教室里”、“樱花树下”。构图与视角 (composition): 如“上半身特写”、“仰视”。灯光与色彩 (lighting): 如“电影灯光”、“暖色调”。艺术风格 (style): 如“动漫风格”、“写实照片”、“水墨画”。画质与细节 (quality): 如“高细节”、“大师之作”、“8K”。负面提示词 (negative): 不希望出现的内容。如“多只手”、“模糊”。3.2 解析流程设计解析流程可以分为以下几个步骤文本清洗去除无意义的语气词、重复标点、感谢语等。分词与词性标注将句子拆分成词语并判断词性名词、动词、形容词等有助于识别实体和描述。规则匹配建立一套规则库将特定的词语或模式映射到上述维度。上下文关联处理一些依赖关系例如“一边眼睛”需要和“刘海遮住”关联。结构化输出将匹配到的信息整理到定义好的维度中。提示词生成将结构化数据按照特定格式如逗号分隔的英文关键词拼接成最终提示词。4. 完整实战案例构建一个简易提示词解析器让我们一步步实现这个解析器。4.1 创建项目结构与基础规则首先创建keyword_rules.py文件定义我们的关键词映射规则。这里我们用字典来存储。# keyword_rules.py # 关键词到提示词维度及具体标签的映射规则 # 注意这是一个简化的示例实际应用需要更丰富的词库。 RULES { # 主体映射 ‘subject’: { ‘女孩’: ‘1girl’, ‘少女’: ‘1girl’, ‘男孩’: ‘1boy’, ‘人物’: ‘person’, # ... 可扩展 }, # 外观描述映射 ‘appearance’: { ‘泪痣’: ‘tear mole’, # 或 ‘mole under eye’ ‘痣’: ‘mole’, ‘大眼睛’: ‘big eyes’, ‘长睫毛’: ‘long eyelashes’, # ... 可扩展 }, # 发型映射 ‘hair’: { ‘刘海’: ‘bangs’, ‘遮住’: ‘covering’, ‘长发’: ‘long hair’, ‘短发’: ‘short hair’, # ... 可扩展 }, # 风格映射 ‘style’: { # 用户可能没说风格但我们可以根据“画”这个字和上下文赋予默认风格如动漫 ‘动漫’: ‘anime’, ‘二次元’: ‘anime’, ‘写实’: ‘photorealistic’, ‘油画’: ‘oil painting’, }, # 画质映射 (通常作为默认增强词) ‘quality’: { ‘高清’: ‘high resolution’, ‘精致’: ‘masterpiece’, ‘最佳质量’: ‘best quality’, }, # 负面提示词映射 (根据常见问题预设) ‘negative’: { ‘模糊’: ‘blurry’, ‘畸形’: ‘deformed’, ‘丑陋’: ‘ugly’, ‘水印’: ‘watermark’, } } # 一些需要特殊处理的模式或短语 PATTERNS { ‘一边眼睛刘海遮住’: (‘hair’, ‘bangs covering one eye’), # 这是一个整体描述 ‘眼下有颗泪痣’: (‘appearance’, ‘tear mole under eye’), }4.2 实现核心解析器创建prompt_parser.py文件实现解析逻辑。# prompt_parser.py import re import jieba import jieba.posseg as pseg from keyword_rules import RULES, PATTERNS class PromptParser: def __init__(self): # 初始化jieba可以加载自定义词典 # jieba.load_userdict(‘my_dict.txt’) pass def clean_text(self, text): 清洗输入文本 # 去除常见的请求语、感谢语、重复标点 remove_phrases [‘有人给’, ‘无偿吗’, ‘替孩子谢谢你们了’, ‘谢谢’, ‘。。’, ‘’, ‘、’] cleaned text for phrase in remove_phrases: cleaned cleaned.replace(phrase, ‘ ‘) # 合并多个空格 cleaned re.sub(r‘\s‘, ‘ ‘, cleaned).strip() return cleaned def parse_with_rules(self, text): 使用规则进行解析 result { ‘subject’: [], ‘appearance’: [], ‘hair’: [], ‘emotion’: [], ‘pose’: [], ‘clothing’: [], ‘background’: [], ‘composition’: [], ‘lighting’: [], ‘style’: [], ‘quality’: [], ‘negative’: [‘blurry’, ‘bad hands’, ‘deformed’] # 默认负面词 } cleaned_text self.clean_text(text) print(f“清洗后文本: {cleaned_text}”) # 1. 先检查预定义的模式整体短语 for pattern, (dimension, eng_tag) in PATTERNS.items(): if pattern in text: result[dimension].append(eng_tag) # 从文本中移除已匹配的模式避免重复匹配单词 cleaned_text cleaned_text.replace(pattern, ‘’) # 2. 分词和词性标注 words pseg.cut(cleaned_text) word_list [] for word, flag in words: if word.strip(): word_list.append((word, flag)) print(f“分词结果: {word_list}”) # 3. 遍历每个词进行规则匹配 for word, pos in word_list: word_added False # 遍历所有规则维度 for dimension, mapping in RULES.items(): if word in mapping and not word_added: result[dimension].append(mapping[word]) word_added True break # 一个词通常只属于一个维度 # 如果没有在规则中找到根据词性进行简单推断非常基础的 if not word_added: if pos.startswith(‘n’): # 名词 # 可能是主体或场景的一部分这里简单归类到subject # 更复杂的系统需要实体识别 pass elif pos.startswith(‘a’): # 形容词 # 可能是外观或风格描述 pass # 4. 处理逻辑关联 (示例如果提到了‘遮住’和‘眼睛’但没有匹配到模式可以尝试关联) if ‘covering’ in result[‘hair’] and ‘eye’ not in ‘ ‘.join(result[‘appearance’]): # 可以尝试添加一个关联描述但这里为了简单我们依赖模式匹配 pass # 5. 设置默认值如果用户未指定 if not result[‘subject’]: result[‘subject’] [‘1girl’] # 根据上下文默认画一个女孩 if not result[‘style’]: result[‘style’] [‘anime style’] # 默认动漫风格 if not result[‘quality’]: result[‘quality’] [‘best quality’, ‘masterpiece’] # 去重 for key in result: result[key] list(set(result[key])) return result def generate_prompt(self, parsed_dict): 将解析后的字典生成最终提示词字符串 # 提示词顺序通常画质 - 主体描述 - 场景 - 风格 - 构图等 order [‘quality’, ‘subject’, ‘appearance’, ‘hair’, ‘emotion’, ‘pose’, ‘clothing’, ‘background’, ‘composition’, ‘lighting’, ‘style’] prompt_parts [] for key in order: if parsed_dict.get(key): prompt_parts.extend(parsed_dict[key]) positive_prompt ‘, ‘.join(prompt_parts) negative_prompt ‘, ‘.join(parsed_dict.get(‘negative’, [])) return { ‘positive_prompt’: positive_prompt, ‘negative_prompt’: negative_prompt, ‘structured_data’: parsed_dict # 也返回结构化数据供调试 } if __name__ ‘__main__’: parser PromptParser() test_text “有人给此女画无偿吗。。后面例图替孩子谢谢你们了眼下有颗泪痣一边眼睛刘海遮住谢谢” parsed parser.parse_with_rules(test_text) print(“\n解析后的结构化数据:”) for k, v in parsed.items(): if v: print(f“ {k}: {v}”) final_prompt parser.generate_prompt(parsed) print(“\n生成的最终提示词:”) print(f“正面提示词: {final_prompt[‘positive_prompt’]}”) print(f“负面提示词: {final_prompt[‘negative_prompt’]}”)4.3 运行与验证创建test_parser.py来运行测试。# test_parser.py from prompt_parser import PromptParser def main(): parser PromptParser() # 测试用例1原始输入 input_text1 “有人给此女画无偿吗。。后面例图替孩子谢谢你们了眼下有颗泪痣一边眼睛刘海遮住谢谢” print(“ 测试用例1 ) print(f“原始输入: {input_text1}”) result1 parser.parse_with_rules(input_text1) prompt1 parser.generate_prompt(result1) print(f“正面提示词: {prompt1[‘positive_prompt’]}”) print(f“负面提示词: {prompt1[‘negative_prompt’]}”) print() # 测试用例2更简洁的描述 input_text2 “画一个女孩蓝色眼睛长发在公园里微笑” print(“ 测试用例2 ) print(f“原始输入: {input_text2}”) result2 parser.parse_with_rules(input_text2) prompt2 parser.generate_prompt(result2) print(f“正面提示词: {prompt2[‘positive_prompt’]}”) print(f“负面提示词: {prompt2[‘negative_prompt’]}”) if __name__ ‘__main__’: main()运行python test_parser.py查看输出结果。4.4 结果说明对于输入“有人给此女画无偿吗。。后面例图替孩子谢谢你们了眼下有颗泪痣一边眼睛刘海遮住谢谢”我们的解析器会输出类似以下内容清洗后文本: 此女画 例图 眼下有颗泪痣 一边眼睛刘海遮住 分词结果: [(‘此’, ‘r’), (‘女’, ‘n’), (‘画’, ‘v’), (‘例图’, ‘n’), (‘眼下’, ‘n’), (‘有’, ‘v’), (‘颗’, ‘m’), (‘泪痣’, ‘n’), (‘一边’, ‘m’), (‘眼睛’, ‘n’), (‘刘海’, ‘n’), (‘遮住’, ‘v’)] 解析后的结构化数据: subject: [‘1girl’] appearance: [‘tear mole’] hair: [‘bangs’, ‘bangs covering one eye’] style: [‘anime style’] quality: [‘best quality’, ‘masterpiece’] negative: [‘blurry’, ‘bad hands’, ‘deformed’] 生成的最终提示词: 正面提示词: best quality, masterpiece, 1girl, tear mole, bangs, bangs covering one eye, anime style 负面提示词: blurry, bad hands, deformed可以看到解析器成功提取了“女孩”、“泪痣”、“刘海遮住一边眼睛”等关键信息并补充了默认的“高质量”、“动漫风格”和通用负面词。这个提示词已经可以直接用于Stable Diffusion WebUI等工具生成效果会比原始描述精准得多。5. 常见问题与排查思路在开发和优化此类解析器时你可能会遇到以下问题问题现象常见原因解决思路关键词匹配失败1. 规则词典覆盖不全。2. 分词不准确例如“泪痣”被拆成“泪”和“痣”。1. 持续扩充RULES词典收集高频词汇。2. 为jieba加载自定义词典 (jieba.load_userdict(‘my_dict.txt’))将“泪痣”、“刘海”等作为整体词汇加入。解析结果歧义一个词可能属于多个维度。例如“画”既是动词也可能指“油画”风格。1. 结合词性标注 (pos) 进行判断。2. 引入上下文分析例如“画”前面是“油”则可能是风格前面是“给…画”则是动词应忽略。3. 为规则设置优先级。无法处理复杂句式规则匹配只能处理关键词对“除了...不要...”等否定句或条件句无效。1. 引入更复杂的NLP模型如BERT进行意图识别和实体关系抽取。2. 设计专门的句式处理规则例如用正则匹配“不要.*”来提取负面词。生成的提示词顺序不佳提示词顺序影响生成结果权重。调整generate_prompt函数中的order列表顺序。通常画质和主体在前风格和构图在后。可以做成可配置的模板。英文标签不准确规则中的英文标签是直译可能不是AI模型社区的最优术语。参考社区常用的提示词网站如PromptHero、Lexica使用更地道的标签例如“tear mole”可能不如“mole under eye”常见。6. 最佳实践与工程建议将上述简易解析器投入生产环境还需要考虑更多工程化细节分层与模块化预处理层负责清洗、标准化如繁体转简体、纠正错别字。解析层核心的规则引擎或模型推理层。可以设计为“规则引擎 统计模型 深度学习模型”的混合架构规则处理明确模式模型处理模糊语义。后处理层对解析结果进行校验、补全如根据“女孩”自动补全“1girl”、去冲突、排序。规则库管理不要将规则硬编码在代码中。应使用配置文件如JSON、YAML或数据库来管理RULES和PATTERNS便于动态更新和A/B测试。为规则添加权重和生效条件。结合领域知识深入理解所用AI绘画模型如Stable Diffusion的CLIP分词器。有些词组合在一起效果更好如“masterpiece, best quality”有些词需要特定语法如权重(word:1.5)。建立“同义词”或“增强词”映射例如用户说“好看”可以映射到“aesthetic, beautiful, detailed”。提供用户反馈与交互不要完全黑盒。可以将解析出的结构化标签展示给用户让用户确认、删除或添加。例如生成一个标签云供用户点选。记录用户的修改行为用于优化规则和模型。性能与扩展性对于纯规则的解析性能很高。但如果引入深度学习模型需要考虑推理延迟可以通过缓存、模型量化等方式优化。设计良好的接口使其可以轻松接入不同的前端Web、App、聊天机器人。持续迭代收集用户实际使用的提示词和生成的图片分析哪些解析是成功的哪些是失败的。建立评估体系定期用一批标准用户描述来测试解析器的效果。通过以上步骤你可以构建一个越来越智能和鲁棒的提示词解析引擎它将成为连接普通用户与强大AI绘画能力之间的关键桥梁。从简单的规则匹配开始逐步融入更先进的NLP技术这个迭代过程本身就是一个充满挑战和乐趣的AI工程项目。