用提示词工程引导大语言模型进行创意写作:以Codex生成“摇曳鳗之舞”为例
30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度最近在尝试将AI生成内容与创意表达结合时发现了一个有趣的方向如何让一个强大的代码生成模型如Codex去“扮演”或“生成”一个充满想象力的、非代码的实体比如“摇曳鳗的一舞”。这听起来像是让一个严谨的工程师去写一首诗挑战在于如何引导模型跳出其固有的代码生成模式进入一个更具描述性和叙事性的领域。本文将分享一套完整的实践方案从理解核心概念、设计有效提示词到构建生成流程和优化输出结果。无论你是对AI创意应用感兴趣的开发者还是想探索大语言模型LLM能力边界的技术爱好者都能从中获得一套可复用的方法论和代码示例。1. 背景与核心概念当Codex遇见“摇曳鳗”在深入技术细节之前我们首先要厘清几个关键概念并理解这个项目的本质。1.1 什么是CodexCodex是OpenAI基于GPT-3微调的一系列模型专门用于将自然语言转换为代码。它最著名的应用是驱动GitHub Copilot。其核心能力是理解开发者的意图并生成对应编程语言如Python、JavaScript的代码片段、函数甚至整个文件。它的“思维”模式是逻辑化、结构化和面向解决问题的。1.2 “摇曳鳗的一舞”是什么这是一个极具画面感和诗意的虚构概念。我们可以将其解构为摇曳鳗一个想象中的生物核心特征是“摇曳”可能指其身体柔软、姿态优美、动作带有韵律感。一舞一个完整的、动态的舞蹈过程包含起承转合、节奏变化和情感表达。 这个组合要求输出不是代码而是一段富有文学性、画面感的文字描述可能是一段散文、一首诗或一个场景剧本。1.3 项目的核心挑战与目标让Codex生成“摇曳鳗的一舞”本质上是大语言模型的“角色扮演”与“风格迁移”任务。我们需要引导一个以生成代码见长的模型暂时“忘记”它的编程语法转而使用描述性、比喻性的语言并遵循一个虚构生物的特定“人设”。挑战Codex的训练数据以代码和技术文档为主直接要求它进行文学创作可能效果不佳容易产生干瘪或逻辑错乱的文本。目标设计一套提示词Prompt工程和生成策略成功“欺骗”或“引导”Codex进入创作状态输出符合我们想象的高质量文本。2. 环境准备与版本说明本项目主要基于OpenAI的API进行因此不局限于Codex模型本身也可以使用功能更通用、文本生成能力更强的GPT-3.5或GPT-4模型。本文将以gpt-3.5-turbo模型为例进行演示其原理与提示词设计对Codex系列同样有很高的参考价值。2.1 基础环境操作系统Windows 10/11, macOS, 或 Linux (如Ubuntu 20.04)均可。编程语言Python 3.8。包管理工具pip。2.2 关键依赖库我们需要openai库来调用API以及可选的python-dotenv来管理密钥。# 创建项目目录并安装依赖 mkdir codex_eel_dance cd codex_eel_dance python -m venv venv # 创建虚拟环境 # Windows: venv\Scripts\activate # macOS/Linux: source venv/bin/activate pip install openai python-dotenv2.3 获取OpenAI API密钥访问 OpenAI平台 并注册登录。点击右上角个人头像选择“View API keys”。点击“Create new secret key”生成一个新的密钥并妥善保存。2.4 项目结构codex_eel_dance/ ├── .env # 存储API密钥切勿提交至Git ├── .gitignore # 忽略.env文件 ├── requirements.txt # 依赖列表 ├── config.py # 配置模块 ├── prompt_engineer.py # 提示词设计与测试模块 ├── generator.py # 主生成模块 └── outputs/ # 存放生成结果 └── dance_001.txt3. 核心原理提示词工程与上下文引导能否让Codex或GPT跳出代码生成模式关键在于提示词的设计。这不仅仅是输入一句话而是构建一个包含角色、任务、格式和示例的完整上下文。3.1 基础提示词设计一个糟糕的提示词“生成摇曳鳗的一舞。” 一个有效的提示词需要包含以下要素角色定义 (Role): 明确告诉模型它现在是谁。任务说明 (Task): 清晰、具体地说明要做什么。输出格式 (Format): 规定输出的形式如散文、诗歌、分镜。风格与约束 (Style Constraints): 限定语言风格、长度、避免的内容。示例 (Few-Shot): 提供一两个输入-输出示例让模型模仿可选但效果显著。3.2 构建系统消息 (System Message)在Chat Completion API中system消息用于设定模型的整体行为。这是植入“角色”和“基础规则”的最佳位置。# config.py 或 prompt_engineer.py 中定义系统提示 SYSTEM_PROMPT 你是一位才华横溢的奇幻生物作家和诗人尤其擅长用细腻、优美、充满想象力的文字描绘虚构生物的形态与动作。你的文字富有画面感和韵律感善于运用比喻、拟人和通感等修辞手法。 你的核心任务是根据用户提供的简单概念展开成一幅生动、完整、令人印象深刻的文字画卷。 请严格以散文或诗歌的形式进行创作避免使用任何项目符号、列表或代码结构。直接开始你的描写。 3.3 设计用户消息 (User Message)用户消息是触发本次生成的具体指令。它需要精准、充满细节。# 一个强引导性的用户提示 USER_PROMPT_TEMPLATE 请描绘“{creature_name}”的“{action_name}”。 以下是关于这个生物和动作的关键词供你激发灵感 * 生物特征{creature_features} * 动作特质{action_characteristics} * 场景氛围{scene_atmosphere} * 情感核心{emotional_core} 请创作一段约{word_count}字的独立作品。请直接开始不要有任何前言或解释。 4. 完整实战案例生成“摇曳鳗的一舞”现在我们将把上述设计组合起来编写一个完整的生成脚本。4.1 创建配置文件首先安全地管理API密钥。# config.py import os from dotenv import load_dotenv load_dotenv() # 从 .env 文件加载环境变量 class Config: OPENAI_API_KEY os.getenv(OPENAI_API_KEY) if not OPENAI_API_KEY: raise ValueError(请在项目根目录的 .env 文件中设置 OPENAI_API_KEY) MODEL gpt-3.5-turbo # 也可尝试 gpt-4 MAX_TOKENS 800 # 生成文本的最大长度 TEMPERATURE 0.8 # 创造性0.0-2.0越高越随机 TOP_P 0.9 # 核采样参数与temperature二选一在项目根目录创建.env文件# .env OPENAI_API_KEY你的实际API密钥4.2 编写提示词引擎模块这个模块负责组装系统提示和用户提示。# prompt_engineer.py from config import Config class DancePromptEngineer: SYSTEM_MESSAGE { role: system, content: Config.SYSTEM_PROMPT if hasattr(Config, SYSTEM_PROMPT) else 你是一位充满想象力的生物描绘大师。用优美、生动的文字进行创作。 } staticmethod def create_user_message(creature_name, action_name, **kwargs): 动态创建用户消息 # 默认参数 params { creature_features: 身体修长柔软半透明泛着幽蓝或银白的微光行动如水流如丝带。, action_characteristics: 动作非机械的充满韵律感时而舒缓如波浪时而急促如颤音整体连贯如一首视觉化的音乐。, scene_atmosphere: 可能在幽暗的深海也可能在星光下的湖面光线朦胧周围有微光浮游生物。, emotional_core: 孤独的优雅静谧的欢愉生命本身的流动之美。, word_count: 300 } # 用传入的关键词更新默认参数 params.update(kwargs) user_content f 请描绘“{creature_name}”的“{action_name}”。 以下是关于这个生物和动作的关键词供你激发灵感 * 生物特征{params[creature_features]} * 动作特质{params[action_characteristics]} * 场景氛围{params[scene_atmosphere]} * 情感核心{params[emotional_core]} 请创作一段约{params[word_count]}字的独立作品。请直接开始不要有任何前言或解释。 return {role: user, content: user_content}4.3 编写主生成模块这个模块调用OpenAI API并处理响应。# generator.py import openai import json from datetime import datetime from config import Config from prompt_engineer import DancePromptEngineer openai.api_key Config.OPENAI_API_KEY def generate_dance_description(creature_name摇曳鳗, action_name一舞, **prompt_kwargs): 生成舞蹈描述 :param creature_name: 生物名称 :param action_name: 动作名称 :param prompt_kwargs: 传递给提示词引擎的关键词参数 :return: 生成的文本 # 1. 构建消息列表 messages [ DancePromptEngineer.SYSTEM_MESSAGE, DancePromptEngineer.create_user_message(creature_name, action_name, **prompt_kwargs) ] # 2. 调用OpenAI API try: response openai.ChatCompletion.create( modelConfig.MODEL, messagesmessages, max_tokensConfig.MAX_TOKENS, temperatureConfig.TEMPERATURE, top_pConfig.TOP_P, # frequency_penalty0.5, # 可降低重复用词 # presence_penalty0.3, # 可鼓励谈论新主题 ) except openai.error.OpenAIError as e: print(fOpenAI API调用出错: {e}) return None # 3. 提取并返回生成的文本 generated_text response.choices[0].message.content.strip() return generated_text def save_output(text, filename_prefixdance): 保存生成结果到文件 if not text: return timestamp datetime.now().strftime(%Y%m%d_%H%M%S) filename foutputs/{filename_prefix}_{timestamp}.txt with open(filename, w, encodingutf-8) as f: f.write(text) print(f结果已保存至: {filename}) return filename if __name__ __main__: # 示例生成基础版的“摇曳鳗的一舞” print(正在生成“摇曳鳗的一舞”...) result generate_dance_description() if result: print(- * 40) print(result) print(- * 40) save_output(result) # 示例使用自定义关键词生成变体 print(\n正在生成变体炽焰摇曳鳗之舞...) custom_result generate_dance_description( creature_name炽焰摇曳鳗, creature_features身体由跃动的橙红色火焰构成核心明亮如熔岩边缘飘散着火星在黑暗中划出流光轨迹。, action_characteristics舞蹈充满爆发力与激情动作迅猛如闪电旋转时带起灼热的气流停顿处有如余烬闪烁。, scene_atmosphere一片漆黑的虚空或古老的熔岩洞穴只有舞动的鳗是唯一的光与热源。, emotional_core狂野的解放不羁的生命力毁灭与创造交织的原始力量。, word_count250 ) if custom_result: print(- * 40) print(custom_result) print(- * 40) save_output(custom_result, flaming_dance)4.4 运行与验证确保已在虚拟环境中且.env文件已正确配置。在项目根目录运行python generator.py观察控制台输出并检查outputs/文件夹下生成的文件。4.5 结果说明运行成功后你可能会得到类似下面的文本实际输出每次都会不同在无垠的深蓝之中一缕幽光悄然苏醒。那不是光是摇曳鳗修长的身躯半透明的肌理里流淌着星砂般的银蓝。它静止时宛如一脉被遗忘的银河碎片而动起来便成了水写的诗。它的“一舞”始于一次微不可察的颤栗。尾尖轻轻一摆不是游动是试探一个音符。紧接着波纹从脊椎处荡漾开去一节推着一节像有看不见的手指拨动了水的琴弦。它的身体弯成一道柔和的弧旋即松开又拧成更复杂的螺旋。那动作里没有骨骼的僵硬只有纯粹的、液态的韵律。它时而舒展开来如一条被风吹拂的丝绸缓慢地起伏、飘荡将周遭的黑暗晕染成朦胧的光晕时而又急速收拢颤动仿佛在模仿海面上碎金的跳跃细密而欢快。发光的浮游生物被它的舞姿吸引环绕成追随的星环明灭之间为这独舞打着静谧的节拍。这不是求偶也非狩猎只是存在本身到了极致便化作了舞蹈。一种孤独的、自足的、静谧的欢愉在无人见证的深海里完成了对自己生命形态最隆重的赞美。当最后一个涟漪平息它重新没入幽暗仿佛从未出现过只留下水波中一丝若有若无的光之记忆。可以看到通过精心设计的提示词模型成功输出了富有文学性和画面感的描述完全脱离了代码生成的范式。5. 常见问题与排查思路在实际操作中你可能会遇到以下问题问题现象常见原因解决思路生成内容仍像代码或技术文档系统提示词角色设定不强或用户提示词指令不明确。1. 强化system消息中的角色设定如“你是诗人”。2. 在user消息中明确要求“避免任何列表、代码或技术术语”。3. 使用“Few-Shot”示例直接给出一段你期望风格的样本。输出内容过于简短或空洞max_tokens参数设置过小或提示词中缺乏细节引导。1. 适当增加max_tokens值如1000。2. 在用户提示词中提供更丰富的关键词和场景细节。3. 提高temperature值如0.9-1.2以增加创造性。输出偏离主题如开始讨论真实鳗鱼模型对虚构概念理解偏差上下文约束不足。1. 在生物名称上使用引号或特定称谓如“传说中的‘摇曳鳗’”。2. 在特征描述中强调其虚构性、奇幻性。3. 在提示词开头明确“请基于以下虚构设定进行创作”。API调用返回错误如认证失败、额度不足API密钥错误、未设置、或账户额度用尽。1. 检查.env文件格式是否正确无空格无引号。2. 在代码中打印Config.OPENAI_API_KEY的前几位确认已加载。3. 登录OpenAI平台检查API使用情况和余额。生成速度慢使用了较大模型如gpt-4或网络问题。1. 对于快速迭代测试优先使用gpt-3.5-turbo。2. 适当降低max_tokens。3. 检查网络连接。6. 最佳实践与工程建议要将这个实验转化为更稳定、可用的工具或创作流程需要考虑以下工程化实践6.1 提示词迭代与管理版本化提示词不要直接在代码里硬编码提示词。可以将提示词模板存储在JSON或YAML配置文件中方便对比不同版本的效果。// prompts.json { v1: { system: ..., user_template: ... }, v2_poetic: { system: ...更诗意的系统设定, user_template: ... } }A/B测试对于关键应用可以同时用两套提示词生成结果由人工或简单规则如长度、关键词出现频率选择更优者。6.2 生成结果的后处理与评估自动过滤与清洗编写规则过滤掉明显不符合要求的输出如包含“作为一个AI模型”等套话或长度不达标。质量评估对于严肃应用可以训练一个简单的分类器或设计一套启发式规则如句子多样性、形容词密度、情感一致性对生成文本进行初步评分。6.3 系统优化与成本控制缓存机制对于相同的提示词输入可以将结果缓存起来避免重复调用API产生费用。异步生成如果需要批量生成大量内容使用异步请求如aiohttp可以大幅提升效率。使用更经济的模型对于创意生成gpt-3.5-turbo通常性价比最高。只有在需要极强逻辑或复杂指令跟随时才考虑gpt-4。6.4 创意融合与扩展多模态扩展将生成的文本描述作为输入传递给文生图模型如DALL-E 3、Stable Diffusion可以自动生成“摇曳鳗一舞”的配图实现从概念到文字再到图像的完整创作流水线。交互式创作构建一个简单的前端界面让用户实时调整“生物特征”、“场景氛围”等关键词并实时看到生成文本的变化形成互动创作工具。通过这个项目我们实践了如何通过提示词工程引导大语言模型突破其默认的“人格”或“技能树”完成一项看似与其核心训练目标代码生成相悖的创意任务。这充分展示了现代LLM的灵活性和潜力。关键在于理解模型的工作原理并通过精心设计的上下文为其构建一个临时的、特定的“思维框架”。 30款热门AI模型一站整合DeepSeek/GLM/Claude 随心用限时 5 折。 点击领海量免费额度