提示词工程入门从 API 封装到 Prompt 设计的五种核心技巧一、背景LLM 接口并不复杂复杂的是怎么问在 ModelScope Notebook 环境中调用大模型只需要几行代码。DeepSeek 的接口与 OpenAI 完全兼容引入openai模块即可使用(ModelScope Notebook使用教程请观看主页上一篇文章)fromopenaiimportOpenAI clientOpenAI(api_keyyour-api-key,base_urlhttps://api.deepseek.com/v1)接口层面的事情很简单。真正需要花时间琢磨的是怎么设计 Prompt——同一个任务Prompt 写得好和写得随意输出质量相差悬殊。今天的学习就是围绕这个问题展开的从封装一个基础调用函数出发做了五组实验逐步摸清了 Prompt 设计的几条核心规律。二、封装基础调用函数2.1 函数设计defget_completion(prompt,modeldeepseek-chat):responseclient.chat.completions.create(modelmodel,messages[{role:user,content:prompt}],temperature0.5,max_tokens1024,)returnresponse.choices[0].message.content这个函数是后续所有实验的基础有几个细节值得展开说。2.2 参数解析messages的结构LLM 的 chat 接口本质上是多轮对话messages是一个列表每条消息包含role和content两个字段role含义user用户的输入即我们发出的 promptassistant模型的回复多轮对话时需要手动拼入历史system全局系统指令用于设定模型的角色和行为规则单轮调用只需要传user角色即可。多轮对话则需要把历史的user和assistant消息都追加进列表模型没有记忆上下文全靠调用方自己维护。temperature控制随机性0 0.5 1 2 |----------|------------|----------| 严谨确定 均衡适中 略有创意 随机发散写代码、做分析、提取信息 → 用低 temperature0~0.3写文案、写诗、头脑风暴 → 可以适当放高0.7~1.2max_tokens控制输出长度max_tokens限制的是输入 输出的总 token 数量不是单独的输出长度。设置过小会导致回复被截断实际使用时需要根据任务复杂度调整。2.3 第一次调用print(get_completion(写一首夏天游玩的七言诗))模型返回了一首工整的七言诗。这只是热身——真正有意思的在后面。三、Prompt 技巧一用分隔符隔离数据与指令3.1 问题背景当 Prompt 里既有指令又有待处理的文本时如果两者混在一起模型有时会搞混——把数据当成指令的一部分或者把指令当成需要处理的内容。3.2 实验textf 你应当通过尽可能清晰、具体的指令来明确你希望模型完成的任务。 这能引导模型产出符合预期的结果同时降低回复内容偏离主题或出现错误的概率。 不要把编写清晰的提示词和精简提示词混为一谈。 很多时候篇幅更长的提示词能为模型提供更完整的说明与背景信息进而让输出内容更加详实、贴合需求。 promptf 将三个反引号之间的文本总结为一句话 {text} print(get_completion(prompt))用三个反引号 把待处理的文本包裹起来指令放在外面数据和指令物理隔离。3.3 为什么这样做有效分隔符的作用不仅是格式好看而是给模型提供了明确的结构信号[指令区域] 将三个反引号之间的文本总结为一句话 [数据区域] ...待处理文本...模型可以明确区分什么是我要做的事和什么是我要处理的材料不会把数据内容误读为新的指令。常用的分隔符方案分隔符适用场景 代码块、多行文本长段落文字tag/tagXML 风格结构更清晰---简单分隔四、Prompt 技巧二约束输出格式4.1 实验让模型列出四大名著的信息并要求以 JSON 格式返回字段名称提前指定promptf 请列出四大名著并标注对应的作者与书籍类型。 使用JSON格式呈现需包含以下字段 book_id书籍编号、title书名、author作者、desc简介、genre书籍类型 responseget_completion(prompt)print(response)模型返回了结构整齐的四条 JSON 数据字段完整格式规范。4.2 格式约束的意义我要什么信息和我要什么格式是两件不同的事都需要明确说出来。不约束格式时模型可能以任意形式回答自然语言段落、Markdown 表格、Python 字典……格式不固定后续程序处理就很麻烦。约束为 JSON 之后importjson datajson.loads(response)# 直接可用不需要任何额外解析这是 Prompt 工程中非常实用的一条原则输出格式是给程序看的不只是给人看的。在 AI 应用开发中模型的输出往往是数据流水线的一个环节格式稳定是下游处理的前提。4.3 常用格式约束方式场景建议格式结构化数据需程序处理JSON指定字段名列表类输出Markdown 列表 或 JSON 数组文本摘要、翻译纯文本无需格式多任务并行输出XML 标签分区如summary.../summary五、Prompt 技巧三条件判断——让模型识别输入类型5.1 实验设计用同一个 Prompt 模板处理两段性质不同的文字文本一泡茶的操作步骤有明确的动作序列文本二晴天公园的景色描写纯描述性文字无操作指引Prompt 的逻辑是有步骤就格式化输出没有步骤就直接声明。# 文本一泡茶步骤textf 泡一杯茶其实很简单首先把水烧开。烧水的同时拿出茶杯放入茶包。 水烧开后将热水冲入杯中浸泡茶包。静置片刻让茶香析出。 几分钟后根据个人口味还可以加入糖或牛奶。这样一杯美味的茶饮就泡好了。 promptf 你将收到由三引号包裹的文本。若文本中包含一系列操作指令 请按照下述格式重新整理这些指令。 步骤 一 ... 步骤 二 ... ... 步骤 N ... 如果文本中没有一系列操作指引直接输出**没有提供步骤。** \\\{text}\\\ print(get_completion(prompt))# 文本二公园景色描写text_2f 今日阳光明媚鸟儿欢唱。这样的好天气很适合去公园散步。 花儿竞相绽放树木在微风中轻轻摇曳。 人们纷纷出门享受这宜人的天气…… 结果文本一被正确拆分为步骤列表文本二返回未提供步骤判断准确。5.2 分析Prompt 可以携带逻辑这个实验打破了一个认知误区很多人以为 Prompt 只是提问其实它可以携带完整的判断逻辑。IF 文本包含操作步骤 THEN 格式化输出步骤列表 ELSE THEN 输出固定文本这段逻辑用自然语言写进 Prompt模型完全能理解并执行。这意味着Prompt 本身就是一种轻量级的业务规则描述语言在不写代码的情况下可以处理一定复杂度的分类和判断任务。六、Prompt 技巧四Few-Shot 少样本提示6.1 实验直接问何为韧性会得到一段平铺直叙的解释。但先给一个示例效果截然不同promptf 你的任务是保持统一的行文风格作答。 提问请讲讲何为耐心。 回答能凿出幽深峡谷的江河源自涓涓细流 恢弘壮阔的交响乐起于单个音符 精美繁复的织锦始于一缕丝绒。 请问请讲讲何为韧性。 print(get_completion(prompt))模型的回答延续了示例的风格——依然是三句比喻并列依然是A 起于 B的句式结构甚至意象的层次感也保持一致。6.2 为什么 Few-Shot 比描述风格更有效这是今天最有收获的实验。描述风格的方式“请用诗意的、比喻性的语言回答采用三句并列结构每句从小到大递进……”描述越详细越难写准而且模型对诗意这类抽象词的理解因人而异。Few-Shot 的方式直接给一个符合要求的例子。模型会自动从示例中提取风格特征——句式、节奏、意象选取方式、逻辑结构并迁移到新的问题上。样本传递的信息密度远高于文字描述。6.3 Few-Shot 的使用场景场景是否适合 Few-Shot特定写作风格复现✅ 非常适合格式模板固定的输出✅ 适合分类任务如情感判断✅ 提供正负样本效果好事实性问答⚠️ 意义不大不如直接问需要泛化到未见类别⚠️ Zero-Shot 可能更合适七、Prompt 技巧五多步任务链——引导模型分步推理7.1 实验把四个子任务打包进一个 Prompt要求模型按顺序逐步完成textf 在一座风光宜人的小村庄里姐弟俩杰克和吉尔动身前往山顶的水井取水。 两人一路欢歌向上攀登不料意外突生——杰克被石头绊倒滚下山坡 吉尔也跟着摔了下去。二人虽受了些轻伤还是回到了家中得到家人温柔的安抚。 promptf 执行以下操作 1. 将三个反引号内的文本概括为一句话。 2. 把这句摘要翻译成法语。 3. 列出法语摘要中出现的所有人名。 4. 输出JSON对象包含字段french_summary、num_names。 答案分行展示。 文本 {text} print(get_completion(prompt))模型依次完成了摘要 → 翻译 → 提取人名 → 封装 JSON每一步的输出自然衔接为下一步的输入最终结果格式干净。7.2 分析为什么要引导分步推理直接问给我这段文字的法语摘要里有几个人名用 JSON 返回模型有时会跳步——摘要不够准确或者人名提取出现遗漏。让模型显式地一步步走相当于强制它把中间推理过程写出来每一步的结果都被检验过再进入下一步减少了跳步导致的错误积累。直接问答模式输入 ──→ 输出中间推理隐含容易出错 分步推理模式输入 → 步骤1输出 → 步骤2输出 → ... → 最终输出 ↑每步可验证这个思路在更复杂的 AI 应用中比如 Chain-of-Thought 提示、ReAct 框架是核心原则之一今天的实验是它最简单的形态。八、幻觉LLM 的边界问题8.1 实验promptf 介绍一下博依品牌的喜多多饮料 print(get_completion(prompt))“博依是一个不存在的品牌或极其小众但模型没有回答我不了解这个品牌”而是给出了一段有模有样的介绍产品特点、目标人群、市场定位……读起来像真的但全是编的。8.2 幻觉的本质LLM 的工作原理是基于概率预测下一个 token它不是在检索数据库也没有不知道这个选项——当它遇到没见过的信息时会用听起来最合理的内容填充。人类遇到不知道的问题 我不了解这个品牌没有相关信息。 LLM 遇到不知道的问题 生成一段在统计上像真实品牌介绍的文本。这不是模型的 bug是它的工作机制本身决定的。模型的强项是语言理解和生成不是事实存储和检索。8.3 应对策略场景建议创意写作、风格转换、格式处理可以充分信任模型输出知识性问答、品牌/人物/数据必须用外部资料验证代码生成需要运行测试不能只看看起来对需要引用文献或数据来源模型会编造务必核查原始来源在实际应用开发中通常的解法是RAG检索增强生成先从可信数据源检索相关文档再把文档内容作为上下文传给模型让它基于真实资料回答而不是凭空生成。九、总结今天围绕 Prompt 工程做了五组实验把学到的规律整理如下Prompt 工程的五条核心原则 ├── 用分隔符隔离数据与指令 → 防止模型混淆输入结构 ├── 约束输出格式 → 让结果可被程序直接消费 ├── 写入条件判断逻辑 → Prompt 本身是业务规则 ├── Few-Shot 给示例 → 样本比描述风格更精准 └── 分步骤引导推理 → 减少跳步错误提升稳定性加上幻觉问题的认识模型不会说我不知道使用者要知道什么时候该信它。Prompt 不是魔法咒语背后是明确的逻辑——你给的上下文越清晰约束越具体模型的输出就越稳定、越可用。下一步计划学习多轮对话的上下文管理尝试用system角色设定模型人格构建一个有记忆的对话应用。