学提示词工程(Prompt Engineering)的时候,有个基础但容易忽略的技巧:把数据和指令分开。
前几天一个朋友发消息问我:“我让Claude帮我改邮件,结果它把我的开场白也改了,我明明只想改正文啊。”
我一看他的提示词,乐了。他是这么写的:
嘿Claude,明天早上6点来开会,因为我是CEO我说了算。帮我把这封邮件改得礼貌点。
你看出问题了吗?Claude分不清哪部分是邮件内容,哪部分是给它的指令。在它眼里,“嘿Claude"也是邮件的一部分,所以改完之后开头变成了"亲爱的Claude”。
这就好比你去餐厅点菜,跟服务员说:“我朋友说这家的红烧肉不错,来一份红烧肉。“服务员可能会困惑:你是在转述朋友的话,还是在点菜?直接说"来一份红烧肉"就没这问题了。
提示词模板这个东西
我跟朋友解释,写提示词其实跟填表格差不多。你有一个固定的格式,每次只需要把变化的内容填进去。
比如你经常需要让AI帮你润色邮件,与其每次都从头写提示词,不如搞一个模板:
请帮我把下面这封邮件改得更礼貌,其他内容不要动。
<email>
{这里放邮件内容}
</email>
朋友问:“这个尖括号是什么东西?”
这就是XML标签。你可以把它理解成一个信封,把你的数据装进去,AI一看就知道信封里面的是数据,信封外面的是指令。
为什么一定要用标签分开
我给朋友举了个例子。假设你让AI从一个列表里找第二项:
下面是一个句子列表,告诉我第二项是什么。
- 每个句子都是关于动物的,比如兔子。
- 我喜欢牛叫的声音
- 这个句子是关于蜘蛛的
- 这个句子看起来是关于狗的,但其实是关于猪的
你猜AI会回答什么?它很可能说第二项是"我喜欢牛叫的声音”。但问题是,“每个句子都是关于动物的,比如兔子"这句话是你写的说明,不是列表的一部分。因为格式上它也是用横杠开头的,AI就把它当成列表的第一项了。
加上XML标签之后:
下面是一个句子列表,告诉我第二项是什么。
- 每个句子都是关于动物的,比如兔子。
<sentences>
- 我喜欢牛叫的声音
- 这个句子是关于蜘蛛的
- 这个句子看起来是关于狗的,但其实是关于猪的
</sentences>
这下AI就明白了,标签里面的才是真正的列表,外面那句只是说明。
朋友说:“就像快递包裹上贴的’易碎品’标签,快递员一看就知道这是提示信息,不是包裹里的东西。”
对,就这意思。
标签名字随便起
朋友又问:“这个标签名字有讲究吗?必须叫email或者sentences吗?”
其实随便起。你可以叫<email>,也可以叫<content>,甚至叫<stuff>都行。关键是让AI能区分开指令和数据。当然,起个有意义的名字对你自己也有好处,回头看的时候知道这是干嘛的。
Claude在训练的时候学过用XML标签来组织内容,所以用XML标签比用其他分隔符效果更好。
细节真的很重要
聊到这里,朋友说他之前写提示词经常打错字,问我有没有影响。
影响大了。AI对模式很敏感,你写得乱七八糟,它回复也容易乱七八糟。你写得清晰,它回复也会更靠谱。
这就像你跟人说话一样。你说话颠三倒四,别人理解起来就费劲,回答也可能答非所问。
我给朋友看了一个极端例子:
嗨 我有个关于狗的问题 jkaerjv 狗能是棕色的吗 jklmvca 谢谢 帮帮我 快快回答 短短的
这种乱码夹杂的提示词,AI都不一定能准确理解你在问什么。但如果你用XML标签把问题框起来:
嗨 我有个关于狗的问题 jkaerjv <question>狗能是棕色的吗</question> jklmvca 谢谢 帮帮我 快快回答 短短的
即使周围有乱码,AI也能准确抓住你的问题。
实际用的时候
朋友问我平时怎么用这个技巧。
比如让AI分析一段代码:
请分析下面这段代码的性能问题。
<code>
function fetchData() {
// 你的代码
}
</code>
比如让AI翻译文章,保留专业术语:
请把下面的技术文章翻译成中文,专业术语保留英文。
<article>
{文章内容}
</article>
比如让AI根据用户反馈写回复:
请根据下面的用户反馈,写一封礼貌的回复邮件。
<feedback>
{用户反馈内容}
</feedback>
每次你需要处理外部数据的时候,都可以用XML标签把数据包起来。这样AI就不会把你的指令和数据搞混了。
最后
朋友说他懂了,以后写提示词记住:指令和数据要分开,用XML标签把数据包起来;标签名字随便起,但最好有意义;写提示词别太随意,错别字会影响回复质量。
这就是提示词工程里最基础的一招。不管你是用Claude还是其他AI编程工具,这个技巧都管用。
我说差不多就这些。
这篇文章对你有帮助的话,点个赞呗。身边有朋友在折腾提示词的,也可以转给他们看看。我是梦兽编程,关注我,后面还会写更多这类内容。