提示词链式调用:让 AI 自己检查作业,准确率翻倍

Table of Contents
写作的人常说一句话:好文章是改出来的,不是写出来的。第一版基本都是草稿,改个两三遍才像样。这话用在 AI 身上居然也成立——你让 Claude 先回答一次,再让它回头检查自己说的对不对,准确率经常能拉上来一截。
这就是今天要聊的提示词链式调用(Prompt Chaining)。名字听着唬人,其实就是"让 AI 多想几轮"。每一轮都拿上一轮的结果接着往下干。你写代码不也这样吗?先把功能跑通,回头再整理结构,能跑和能维护是两码事。链式调用就是让 AI 也走这个路子。
第一个例子:让 AI 自己挑错
来,直接看例子你就懂了。让 Claude 列 10 个以"ab"结尾的英文单词:
first_user = "列出10个都以字母'ab'结尾的单词。"
messages = [{"role": "user", "content": first_user}]
first_response = get_completion(messages)
print(first_response)
Claude 可能给你这么一串:
- Cab 2. Dab 3. Grab 4. Gab 5. Jab 6. Lab 7. Nab 8. Slab 9. Tab 10. Blab
看着没毛病对吧?但 Claude 有时候会"脑补",特别是你让它一口气生成很多例子的时候,混进一两个压根不存在的词。这时候链式调用就管用了——你接着追一句:
second_user = "请把所有不是真实单词的'词'替换掉。"
messages = [
{"role": "user", "content": first_user},
{"role": "assistant", "content": first_response},
{"role": "user", "content": second_user}
]
print(get_completion(messages))
Claude 会重新审视自己的回答,把那些编造的词换成真实存在的。道理很简单:别指望一次就完美,给 AI 一个回头检查的机会,错误率就下来了。
别让 AI “硬改"正确答案
不过这里有个坑。如果你让 Claude 检查一个已经全对的答案,它可能会"过度谨慎”——明明对的东西它也非要动一动,好像不改点什么显得自己没干活似的。
解法很简单:给它一个台阶下。在检查指令里加一句"如果都对了就别改":
second_user = """请把所有不是真实单词的'词'替换掉。
如果所有词都是正确的,就返回原列表。"""
messages = [
{"role": "user", "content": first_user},
{"role": "assistant", "content": first_response},
{"role": "user", "content": second_user}
]
这跟跟人说话一个道理。你跟同事说"检查一下这个方案有没有问题",如果不加一句"没问题的话就这么定了",对方可能为了显示自己认真看了,硬挑几个毛病出来。这个技巧我们在第八章"防止 AI 瞎猜"里就讲过,叫给 AI 留退出选项。
用链式调用打磨内容质量
链式调用不光能挑错,还能润色。比如你让 Claude 写个三句话的短篇故事:
first_user = "写一个三句话的短篇故事,关于一个喜欢跑步的女孩。"
first_response = get_completion([{"role": "user", "content": first_user}])
第一版大概率平平无奇。你再追一句:
second_user = "让这个故事更好一点。"
messages = [
{"role": "user", "content": first_user},
{"role": "assistant", "content": first_response},
{"role": "user", "content": second_user}
]
print(get_completion(messages))
第二版往往会好不少。Claude 在"改稿"这件事上挺有自知之明的,它知道自己第一版哪里偷懒了。这跟你自己写东西一样,写完放一会儿再看,马上就能发现问题。
把上一步的结果喂给下一步
链式调用还有个更实用的玩法:把第一步的输出直接当第二步的输入。
举个例子,你想从一段对话里提取人名,然后按字母排序。拆成两步:
# 第一步:提取人名
first_user = """从下面的文本中找出所有人名:
"嘿,Jesse。是我,Erin。我打电话是关于 Joey 明天要举办的派对。Keisha 说她会来,我觉得 Mel 也会去。"""
prefill = "<names>" # 预填充格式
messages = [
{"role": "user", "content": first_user},
{"role": "assistant", "content": prefill}
]
first_response = get_completion(messages)
print(first_response)
Claude 会吐出来:
Jesse, Erin, Joey, Keisha, Mel
然后把这个列表喂给第二步:
second_user = "把这个列表按字母顺序排列。"
messages = [
{"role": "user", "content": first_user},
{"role": "assistant", "content": prefill + "\n" + first_response},
{"role": "user", "content": second_user}
]
print(get_completion(messages))
结果:Erin, Jesse, Joey, Keisha, Mel。
这种做法在 AI 编程领域叫"函数调用"(Function Calling),说白了就是流水线作业。一个任务拆成几道工序,每道工序只管自己那一块,最后拼出来的结果比你一口气让 AI 全做了要靠谱。
什么时候该用,什么时候不该用
那到底什么时候需要链式调用?我的判断标准很粗暴:任务复杂或者容不得出错的时候,就拆成多步。
比如让 AI 写代码。你让它一次写完一个功能,出来的东西能跑但可能很粗糙。换个思路:先让它写个能跑的版本,再让它审查有没有边界问题,最后让它优化一下命名和结构。分几轮干,每轮只做一件事,最后的代码质量会好很多。
再比如数据分析。直接说"帮我分析这组数据",Claude 可能给你一堆笼统的废话。但如果你让它先提取关键指标,再让它基于这些指标找规律,分两步走,结果就会具体得多。
不过链式调用也不是什么场合都该用。每多调一次就多花一笔 token 钱。“帮我翻译这段话"这种任务,一次就够了,拆开反而浪费。
用几轮合适?我自己的经验是两到三轮就差不多了。第一轮出初稿,第二轮纠错或补充,第三轮如果还有必要就做最后润色。再往后加轮次,改善效果就不明显了,钱倒是花得更快。
总结
链式调用的核心就一件事:让 AI 多轮迭代。第一轮先出活,后面几轮查漏补缺。记得给 AI 留个"不用改也行"的退路,免得它为了改而改。任务简单就别折腾,任务复杂才拆步骤。两三轮足矣。
AI 会犯错,但它也能查出自己的错。你要做的就是给它这个检查的机会。
小抄(Cheatsheet)
# 基本链式调用结构
messages = [
{"role": "user", "content": "第一个问题"},
{"role": "assistant", "content": "AI 的第一次回答"},
{"role": "user", "content": "基于第一次回答的后续问题"}
]
response = get_completion(messages)
# 给 AI 留退路的检查指令
check_prompt = """检查并修正错误。如果没有错误,返回原答案。"""
# 多任务链式调用
step1_result = get_completion([{"role": "user", "content": "任务1"}])
step2_result = get_completion([
{"role": "user", "content": "任务1"},
{"role": "assistant", "content": step1_result},
{"role": "user", "content": "基于任务1结果的任务2"}
])
你平时用 AI 的时候,遇到回答不靠谱会怎么处理?是直接重新问,还是会让它在原来的基础上改?欢迎在评论区聊聊你的做法。
这个系列后面还会继续更新,下一篇聊"函数调用"的进阶玩法——怎么让 AI 调用外部工具帮你干活。关注梦兽编程不错过后续内容,咱们下篇见。