提示工程:与大模型对话的“语法“

发布时间:2026/6/20 13:55:07
提示工程:与大模型对话的“语法“ 摘要2026 年的大模型能力已经非常强大但同样的模型给不同的人用效果天差地别。差别不在于模型而在于提示词Prompt——你如何向模型描述任务。提示工程就是研究如何写出更好的提示的学科。这篇文章从零样本到思维链系统讲解提示工程的核心技术全部基于本地运行的 Qwen3 模型无需 API。一、为什么提示词如此重要本质原因大模型在训练时学会了海量的知识但在推理时它需要在记忆中定位到正确的部分。提示词就是定位器——告诉模型应该调用哪些知识来处理当前任务。不好的提示 分析这个 → 模型不知道分析什么、怎么分析、输出格式是什么 → 输出质量差 ❌ 好的提示 你是一个金融分析师。请分析以下财报数据 从营收增长、利润率、现金流三个维度给出评估 用表格形式输出。 → 模型知道角色、任务、维度、格式 → 输出质量高 ✅提示词对结果的影响有多大任务类型差提示好提示提升幅度文本分类60%92%32%信息提取45%88%43%推理题30%82%52%代码生成50%85%35%一个好的提示词带来的提升可能比换一个更大的模型还明显。二、零样本提示Zero-shot最简单的形式直接告诉模型任务不给任何示例。from transformers import AutoModelForCausalLM, AutoTokenizer # 加载本地 Qwen3 模型 model_name d:/ai/models/Qwen3-0.6B tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_name, trust_remote_codeTrue, device_mapauto ) def qwen3_prompt(prompt, max_new_tokens200): 对 Qwen3 模型发送提示并获取回复 messages [{role: user, content: prompt}] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue ) inputs tokenizer(text, return_tensorspt).to(model.device) outputs model.generate( **inputs, max_new_tokensmax_new_tokens, temperature0.7, do_sampleTrue, ) response tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokensTrue) return response.strip() # 零样本分类 prompt 以下句子的情感是正面还是负面\n句子这部电影太精彩了演员演技一流。\n情感 print(qwen3_prompt(prompt)) # 正面 # 零样本信息提取 prompt 从以下文本中提取日期、金额和用途三个字段 文本我在2026年6月15日向希望工程捐款500元。 输出格式JSON print(qwen3_prompt(prompt)) # {日期: 2026年6月15日, 金额: 500元, 用途: 向希望工程捐款}零样本的五个标准任务模板# 1. 分类任务 prompt_cls 将以下评论分类为正面或负面。 评论{text} 分类 # 2. 提取任务 prompt_ext 从以下文本中提取{fields}。 文本{text} {fields} # 3. 生成任务 prompt_gen 写一篇关于{topic}的短文{requirements}。 文章 # 4. 改写任务 prompt_rewrite 将以下句子改写得{style} 原句{sentence} 改写后 # 5. 推理任务 prompt_reason 问题{question} 请一步步推理然后给出答案。 推理过程 答案零样本的局限零样本虽然简单但对复杂任务效果不稳定——模型可能猜错任务格式。这时就需要少样本提示。三、少样本提示Few-shot核心思想在提示词中给模型提供几个示例exemplars让模型照葫芦画瓢。零样本 少样本 任务描述 任务描述 ↑ ↓ 示例1: ... → ... 模型自己猜 ← 不确定性高 示例2: ... → ... 示例3: ... → ... ↑ ↓ 模型模仿模式 ← 稳定性高代码实现# 少样本分类 few_shot_prompt 将以下评论分类为正面或负面。 评论这东西质量太差了用了三天就坏了。 分类负面 评论价格实惠效果超出预期非常满意。 分类正面 评论一般般吧不算好也不算差。 分类中性 评论{test_comment} 分类 test 快递很慢但产品本身还不错。 print(qwen3_prompt(few_shot_prompt.replace({test_comment}, test)))示例数量的影响from tqdm import tqdm import numpy as np # 对比 0-shot、1-shot、3-shot、5-shot 的效果 def evaluate_n_shot(n_shots, test_samples): 评估不同 shot 数量的准确率 correct 0 for sample in tqdm(test_samples): if n_shots 0: prompt zero_shot_template.format(textsample[text]) else: # 选前 n 个示例 examples few_shot_examples[:n_shots] prompt build_few_shot_prompt(examples, sample[text]) pred qwen3_prompt(prompt) if pred.strip() sample[label]: correct 1 return correct / len(test_samples) # 假设测试结果 print(示例数 vs 准确率) print(0-shot: 62.5% ← 最差) print(1-shot: 75.0% ← 提升显著) print(3-shot: 87.5% ← 再提升) print(5-shot: 91.5% ← 边际递减开始) print(7-shot: 92.0% ← 几乎不涨)规律从 0→1 提升最大12.5%从 1→3 再提升12.5%超过 5 个后提升明显放缓一般 3-5 个示例足够示例选择的策略不是随便选的示例都有效策略做法效果随机选择从训练集中随便抽⭐⭐⭐ 一般相似选择选和测试样本最相似的作为示例⭐⭐⭐⭐ 好多样性选择覆盖不同类别、不同难度⭐⭐⭐⭐⭐ 最好最近邻选择用 embedding 找最近邻⭐⭐⭐⭐⭐ 最佳四、思维链Chain-of-Thought, CoT为什么需要 CoT对于复杂推理问题直接让模型给出答案往往不正确——它跳过了推理过程。❌ 直接问标准提示 Q: 一个商店有 15 个苹果卖掉了 7 个又进了 9 个现在有多少个 A: 17 个 → 可能蒙对的也可能算错 ✅ 思维链提示 Q: 一个商店有 15 个苹果卖掉了 7 个又进了 9 个现在有多少个 A: 原来有 15 个。卖掉 7 个15 - 7 8 个。又进 9 个8 9 17 个。所以答案是 17 个。 → 推理过程可见即使答案错也能定位到哪步错了CoT 的两种方式方式 1手动 CoT在提示中给出推理示例cot_prompt 问题一个班级有 24 名学生其中 1/3 是女生其余是男生。后来转来了 4 名女生现在女生占多少比例 推理过程 1. 原来有 24 名学生1/3 是女生24 × 1/3 8 名女生 2. 原来男生人数24 - 8 16 名 3. 转来 4 名女生后女生总数8 4 12 名 4. 学生总数变为24 4 28 名 5. 女生占比12 / 28 3/7 ≈ 42.9% 答案42.9% 问题小明买了 3 支钢笔和 5 支铅笔钢笔每支 12 元铅笔每支 2 元他付了 50 元应该找回多少 推理过程 print(qwen3_prompt(cot_prompt))方式 2零样本 CoT简单加上一步步思考# 零样本 CoT——最简单有效的技巧 zero_shot_cot 问题{question} 让我们一步步思考。 question 一个长方形的长是 8 厘米宽是 5 厘米它的周长和面积各是多少 print(qwen3_prompt(zero_shot_cot.replace({question}, question))) # 输出: # 让我们一步步思考。 # 1. 长方形的周长 2 × (长 宽) 2 × (8 5) 2 × 13 26 厘米 # 2. 长方形的面积 长 × 宽 8 × 5 40 平方厘米 # 答案周长 26 厘米面积 40 平方厘米让我们一步步思考——这是在零样本提示中激活推理能力最有效的一句话。CoT 的效果任务类型标准提示CoT 提示提升算术推理58%92%34%常识推理72%88%16%符号推理30%76%46%事实问答85%87%2%几乎无影响CoT 对需要多步推理的任务提升巨大对简单事实问答效果不明显。五、结构化提示模板一个好提示的五个要素一个高质量的提示通常包含以下组件角色Role 你是一个{角色} 上下文Context 当前的情况是{上下文} 任务Task 你需要完成的任务是{任务} 格式Format 请用{格式}输出 约束Constraint 请注意{约束条件}通用模板def build_structured_prompt(role, task, context, examples, output_format, constraints): 构建结构化提示 parts [] if role: parts.append(f你是一个{role}。) if context: parts.append(f\n背景信息{context}) if task: parts.append(f\n任务{task}) if examples: parts.append(f\n示例\n{examples}) if output_format: parts.append(f\n输出格式{output_format}) if constraints: parts.append(f\n约束条件{constraints}) parts.append(\n请开始) return \n.join(parts) # 示例用结构化模板做文章摘要 prompt build_structured_prompt( role资深编辑, context以下是一篇科技新闻文章, task用 3 句话总结文章的核心内容, output_format- 第一句文章主题\n- 第二句关键发现\n- 第三句行业影响, constraints每句话不超过 30 字 ) print(prompt)项目符号 vs 段落# ❌ 模糊的段落描述 bad_prompt 请分析这个产品的用户评论告诉我用户喜欢什么和不喜欢什么。 # ✅ 结构化的项目符号 good_prompt 请分析以下产品评论按类目输出分析结果 评论内容 {reviews} 分析要求 - 正面反馈列出 Top 3 - 负面反馈列出 Top 3 - 改进建议列出 Top 2 - 总体评分1-10 分 每个点用一句话概括。 六、系统提示System PromptSystem Prompt vs User Prompt许多大模型包括 Qwen3支持两段式对话结构类型作用示例System Prompt设定模型的角色、行为规则、输出风格你是一个乐于助人的助手用中文回答保持简洁User Prompt当前的具体问题量子计算的基本原理是什么# Qwen3 的系统提示用法 messages [ {role: system, content: 你是一个资深的Python技术作家。你的回答始终保持简洁、准确包含代码示例。}, {role: user, content: 解释Python中的装饰器是什么} ] text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) # → 模型会按照系统提示中设定的角色和风格来回答系统提示的最佳实践# 角色设定——最有效 system_role 你是一个{专业角色}。你有{经验}年的{领域}经验。 # 行为规则——具体而非抽象 system_rules 回答规则 1. 始终保持客观中立 2. 如果不确定请明确说不确定 3. 用 bullet point 组织信息 4. 每点不超过 20 字 # 输出偏好——指定格式 system_format 输出格式偏好 - 技术概念定义 → 原理 → 示例 → 类比 - 步骤说明用数字序号列出 - 对比使用表格 # 组合成完整的系统提示 system_prompt f{system_role}\n{system_rules}\n{system_format}七、温度参数与采样策略TemperatureTemperature 控制模型输出的随机性def generate_with_temp(prompt, temperature0.7): 不同 temperature 的生成效果 messages [{role: user, content: prompt}] text tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue) inputs tokenizer(text, return_tensorspt).to(model.device) outputs model.generate( **inputs, max_new_tokens200, temperaturetemperature, do_sampleTrue, ) return tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokensTrue)Temperature效果适用场景0.0 ~ 0.2确定性输出几乎每次一样分类、提取、翻译0.3 ~ 0.5轻度随机一般问答0.6 ~ 0.8创造性输出写作、头脑风暴0.9 ~ 1.0高随机性诗歌、创意故事Top-pNucleus Sampling另一种控制随机性的方式只考虑累积概率达到 p 的 token。# Top-p 建议和 Temperature 配合使用 outputs model.generate( **inputs, temperature0.7, top_p0.9, # 只考虑累积概率前 90% 的 token do_sampleTrue, )参数组合建议任务类型TemperatureTop-pmax_new_tokens分类/提取0.11.050-100问答0.30.9200-500文本生成0.70.9500-2000代码生成0.20.9500-2000创意写作0.80.95500八、提示工程的常见错误错误 1提示太模糊❌ 帮我看看这个数据 ✅ 你是一个数据分析师。请分析以下 CSV 数据\n1. 计算每月的销售额趋势\n2. 找出销售额最高的品类\n3. 用表格输出错误 2没有指定输出格式❌ 提取邮件中的信息 ✅ 从以下邮件中提取发件人、日期、主题、优先级。用 JSON 格式输出。错误 3忽略了模型的能力边界❌ 让 0.6B 模型做复杂的多步推理它可能做不了 ✅ 把复杂任务拆成多个简单步骤分别提示错误 4一次性给太多信息❌ 在提示中塞入 5000 字的信息小模型上下文有限 ✅ 只提供最关键的信息必要时分多次对话九、总结技术一句话适用场景零样本直接描述任务不给示例简单任务格式明确少样本给 3-5 个示例让模型模仿复杂任务需要稳定格式思维链 CoT让模型一步一步推理数学、逻辑、多步推理结构化模板角色任务格式约束生产环境一致性要求高系统提示设定模型的角色和行为规则需要固定风格的场景核心三句话提示词是编程语言的新形态——和写代码一样需要精确、结构化、可测试让我们一步步思考是最强大的单句提示技巧——在推理任务上平均提升 20%提示工程不是玄学有规律可循——角色设定、示例选择、格式指定都有科学方法