EP03. "Prompt Engineering 核心技巧:清晰直接、具体化与 XML 结构"
🔒 登录后可标记已读- Prompt engineering 不是玄学,是一个能反复跑的循环:定目标 → 写草稿 → 拿评测数据打分 → 套一个技巧改一版 → 再评测确认真的有进步——跟 EP02 的评测 pipeline 是同一套东西,这篇讲的是「改哪里」
- 课程用同一个「帮运动员生成一天的饮食计划」prompt 全程示范,从 2.32 分(写得含糊)一路改到 3.92 分(写清楚直接)、再到 7.86 分(加上具体指引)——每一步改动都有分数验证,不是凭感觉
- 一次只改一个地方再重新评测,才知道这个改动到底有没有用,不要一次把好几个技巧全塞进去,说不清是哪个起了作用
- 评测时并发请求先设低一点(1-3 个),避免撞到 API 的 rate limit
- 前置知识:EP02 的评测 pipeline(跑分、比较改动前后分数)
重点内容
循环怎么跑:五步
- 定义目标:搞清楚这个 prompt 到底要做到什么
- 写初版草稿:先有一个能跑的基础版本
- 拿评测标准测试:用 EP02 的评测 pipeline 量出目前分数
- 套改进技巧:用具体手法(下面几节)改善输出
- 验证有没有真的变好:重新评测,对比改动前后的分数
反复跑这个循环,直到分数达到满意的水平为止。
📌 一份好的评测框架要具备三件事:测试数据集要贴近真实使用场景、打分标准要前后一致、进度要每一版都记录下来,方便回头比较。
定评测标准:具体到能打分
以「生成运动员一日饮食计划」为例,评测标准要写清楚输出应该包含什么,例如:
- 全天总卡路里
- 三大营养素(蛋白质/碳水/脂肪)的比例
- 每一餐的份量和用餐时间
💡 一开始拿到很低的分数(比如 2.3/10)是件好事——它证明了后面每一步改动能带来可衡量的进步,不用靠瞎猜。
技巧一:清晰直接(Clear and Direct)
📌 Prompt 的第一句话是整个请求里最重要的部分。
清晰(Clarity):用直白的语言,不要含糊。例如别写「我想知道那些人们装在屋顶上、靠太阳发电的东西」,直接写「写三段介绍太阳能板怎么运作」。
直接(Directness):用祈使句/动作动词,不要用疑问句。例如把「哪些国家用地热能?」改成「列出三个使用地热能的国家,附上各自的发电数据。」
饮食计划的例子:
- 改前:「这个人该吃什么?」
- 改后:
Generate a one-day meal plan for an athlete that meets their dietary restrictions.
改后的版本清楚交代了三件事:动作(生成)、产出物(饮食计划)、关键限制(一天、运动员、饮食限制)。
📌 光是把开头这句话改清楚直接,评测分数就从 2.32 涨到 3.92。
技巧二:具体化(Being Specific)
比起含糊的要求,给 Claude 明确的指引或步骤,能让它更准确地朝你要的输出方向走。指引分两种:
质量指引(Quality Guidelines):规定输出该有的属性——长度限制、结构要求、内容规格。饮食计划例子里包括:准确的卡路里数字、营养素占比、用餐时间、以克为单位的份量、预算考量。
流程步骤(Process Steps):引导 Claude 的思考顺序,例如写小说角色设定时:
Brainstorm 3 talents that would create dramatic tension.
Pick the most interesting talent.
Outline a pivotal scene.
Brainstorm 3 supporting character types.
📌 质量指引几乎任何场景都适用;流程步骤特别适合复杂问题排查、决策判断、批判性思考这类需要多角度分析的任务。
💡 加上具体指引后,饮食计划 prompt 的评测分数从 3.92 涨到 7.86,几乎翻倍——具体化不是在「微观管理」AI,而是替它把成功的条件铺好。
技巧三:用 XML 标签建立结构
Prompt 里塞了大量内容时,Claude 有时会分不清哪几段文字该归在一起——没有清楚的边界,Claude 可能分不清哪部分是指令、哪部分是数据。
自定义 XML 标签能当容器,把 prompt 里不同性质的部分分隔开,标签名称本身就该说明这段内容是什么,例如用 <sales_records> 包住销售数据。
调试代码与文档混杂的例子:
<my_code>
from datavortex import Pipeline, DataSource
def process_data(input_file, output_file):
pipeline = Pipeline()
source = DataSource.from_csv(input_file)
</my_code>
<docs>
# Creating a data source from data vortex
csv_source = DataSource.from_csv("data.csv")
</docs>
饮食计划例子,把运动员的资料包成一组:
<athlete_information>
- Height: {prompt_inputs["height"]}
- Weight: {prompt_inputs["weight"]}
- Goal: {prompt_inputs["goal"]}
- Dietary restrictions: {prompt_inputs["restrictions"]}
</athlete_information>
📌 XML 标签对「指令 + 数据 + 范例混在一起」的复杂 prompt 特别有用,能帮 Claude 分清楚各部分之间的关系。
技巧四:给例子(One-shot / Multi-shot)
给 Claude 看几组「输入 → 期望输出」的示范配对,比单纯用文字描述规则更有效——例子是用「示范」而不是「讲道理」在教 Claude。
典型场景:讽刺语气的情感分类
像 "Yeah, sure, that was the best movie I've seen since 'Plan 9 from Outer Space'" 这类反讽推文,Claude 单靠字面很容易判断错方向(误判成正面),需要靠范例才能学会识别这种反讽。
推荐用 XML 标签包住范例,结构清楚:
<sample_input>
[范例输入]
</sample_input>
<ideal_output>
[期望输出]
</ideal_output>
针对边界情况给范例:
Be especially careful with tweets that contain sarcasm.
For example:
<sample_input>
Oh yeah, I really needed a flight delay tonight! Excellent!
</sample_input>
<ideal_output>
Negative
</ideal_output>
方法怎么选
| 做法 | 适合场景 |
|---|---|
| 用 XML 标签包住范例 | 结构清楚、Claude 容易分清哪段是范例哪段是指令 |
| 先给一个范例,不够再加 | 不用一开始就堆一大堆例子,按评测结果决定要不要加 |
| 针对性地挑「Claude 容易出错的边界情况」给范例 | 比给一堆普通例子更有效,比如反讽语气这种模型天生容易判断错的场景 |
| 范例里附带「为什么这样判断」的理由 | 帮 Claude 理解规则背后的逻辑,不只是死记这一条 |
调整范例数量和内容时,同样要照评测结果迭代,不是凭直觉加到「感觉够了」为止。
Sources
官方文档:
- Claude with Google Cloud's Vertex AI(Claude Academy 课程)— https://academy.claude.com/courses/claude-with-google-cloud-s-vertex-ai