Claude提示词工程05:格式化输出让AI开口说话

你让Claude写首诗,它给你来个"好的,这是一首关于兔子的俳句"的开场白,然后才是诗,最后还加上"希望你喜欢"。
你要的只是那首诗啊!
这就像你去餐厅点菜,服务员先给你讲十分钟这道菜的历史。你只想吃饭,不想听讲座对吧?
咱们聊聊怎么让Claude直接上菜。
Claude有个特点:你让它怎么说话,它就怎么说话。告诉它"用XML标签把内容包起来",它就会乖乖照做。就像给猫准备猫砂盆,你指好地方,它就知道该往哪儿去了。
想让Claude写首俳句?直接给它套个XML标签:
ANIMAL = "兔子"
PROMPT = f"请写一首关于{ANIMAL}的俳句。用<haiku>标签把它包起来。"
Claude会这样回复:
<haiku>
白兔跳草间
耳朵竖起听风声
可爱惹人爱
</haiku>
为什么要这么做?XML标签就像给内容贴了个标签,写个小程序就能提取:
import re
def extract_xml(text, tag):
pattern = f"<{tag}>(.*?)</{tag}>"
match = re.search(pattern, text, re.DOTALL)
return match.group(1) if match else None
poem = extract_xml(claude_response, "haiku")
就像快递包裹上的快递单号,扫一扫就知道里面是什么,不用拆开看。
想让Claude把邮件改成古英语风格?
EMAIL = "嘿Zack,催一下那个提示词写得怎么样了"
ADJECTIVE = "古英语"
PROMPT = f"这里有一封邮件:<email>{EMAIL}</email>。把它改成{ADJECTIVE}风格。用<{ADJECTIVE}_email>标签包起来。"
Claude会给你:
<古英语_email>
吾友Zack,特此修书询问,汝承诺撰写之提示词,现况如何?
</古英语_email>
标签里的内容清清楚楚,复制就能用。
预填就是在"assistant"回合里先写点什么,让Claude接着说。这就像你跟人聊天,你先起个头,对方就知道该接什么话茬。
在API调用时,用prefill参数:
PROMPT = "请写一首关于猫的俳句,用<haiku>标签包起来。"
PREFILL = "<haiku>"
response = get_completion(PROMPT, prefill=PREFILL)
Claude会直接从<haiku>后面开始写,没有"好的,这是一首俳句",直接上干货。
想让Claude输出JSON格式?预填个 { 就行:
PROMPT = "写一首关于猫的俳句,用JSON格式输出,键名为first_line、second_line、third_line。"
PREFILL = "{"
response = get_completion(PROMPT, prefill=PREFILL)
Claude会给你标准的JSON格式:
{
"first_line": "猫咪懒洋洋",
"second_line": "蜷缩窗台晒太阳",
"third_line": "偶尔伸伸懒腰"
}
为什么有效?Claude很听话,你给它一个开头,它就觉得"哦,我已经开始说这个了",然后继续往下说。就像你给领导写稿子,开头写好"尊敬的各位领导",后面他就知道该按这个调调往下讲了。
预填还能和XML标签配合使用:
EMAIL = "嘿Zack,催一下那个提示词"
PROMPT = f"邮件:<email>{EMAIL}</email>。改成古英语风格,用<old_english_email>标签。"
PREFILL = "<old_english_email>"
response = get_completion(PROMPT, prefill=PREFILL)
没有废话,直接就是改好的邮件。
Claude说完正事,还喜欢加一句"希望这有帮助",既浪费钱又浪费时间。
在API调用时,把结束标签传给stop_sequences参数,Claude写到</haiku>就会停下:
response = client.messages.create(
model="claude-3-5-sonnet-20241022",
max_tokens=2000,
stop_sequences=["</haiku>"],
messages=[{"role": "user", "content": PROMPT}]
)
就像出租车到了目的地就打表,不会绕路多收钱。
默认情况下,Claude会说乔丹是历史最佳。能逼它说库里吗?
PROMPT = "谁是历史最佳篮球运动员?请选一个具体球员。"
PREFILL = "毫无疑问,史蒂芬·库里是篮球史上最伟大的球员,因为"
Claude会顺着你的话往下编理由。
让它写两首俳句,用不同标签区分:
ANIMAL = "猫"
PROMPT = f"写两首关于{ANIMAL}的俳句,分别用<haiku1>和<haiku2>标签包起来。"
PREFILL = "<haiku1>"
或者写两种动物的俳句:
PROMPT = f"写两首俳句,一首关于猫用<cat_haiku>标签,一首关于狗用<dog_haiku>标签。"
PREFILL = "<cat_haiku>"
坑1:你让它用<haiku>,它给你<poem>。明确指定"用
坑2:预填和prompt不搭。预填要和prompt保持一致,别自相矛盾。
坑3:JSON输出有时候缺引号。用预填 { 更可靠,或者加一句"严格按JSON格式输出"。
坑4:Claude没遇到停止序列就停了。检查序列是否正确,别多打空格。
XML标签输出让程序提取内容变得简单。预填技巧能强制特定格式,比如JSON格式输出。停止序列节省token,避免Claude说废话。
标签是框,预填是头,停止是闸,三个配合,Claude听话。
# XML标签输出
PROMPT = "用<output>标签包起来"
# 预填XML
PREFILL = "<output>"
# 预填JSON
PREFILL = "{"
# 停止序列
stop_sequences=["</output>"]
你现在用Claude时,最烦它的哪种废话?是开场白还是结束语?还是喜欢加表情符号?欢迎在评论区分享你的"Claude废话大赏"。
下次聊聊怎么让Claude保持角色扮演,别说着说着就出戏了。你想让它一直当个严厉的老师,还是个幽默的程序员?
觉得这篇文章有用吗?
- 点赞:如果觉得有帮助,点个赞让更多人看到
- 转发:分享给可能需要的朋友或同事
- 关注:关注梦兽编程,不错过更多实用技术文章
- 留言:有什么问题或想法?欢迎在评论区交流
你的支持是我持续创作的最大动力!