二、原则二:给模型一点“思考时间”
跟人一样,大语言模型(LLM)在解决复杂问题时,也需要“思考”。如果你一上来就逼它立马给出结论,结果很可能就是草率甚至出错。
就像我们人类在考试时,遇到一道难题还没看清楚题目就急着写答案,那错的几率就大了。语言模型也一样——它不是魔法,它也得“慢慢来”。
那我们怎么让它慢一点、想清楚再回答呢?关键就在 Prompt 的设计上:你得教它“先分析、再总结”。而不是直接“说答案”。
2.1 一步一步来:分步骤引导模型
我们来举个例子。
假设我们给模型讲了一个“杰克和吉尔打水摔跤”的故事,现在我们要它做几件事:
-
把故事用一句话总结;
-
把这句话翻译成英文;
-
把里面出现的人名提取出来;
-
最后用 JSON 格式返回这句话和人名的数量。
你看,这就是一个“多步骤”的任务。如果我们一口气说“你帮我做完这四件事”,模型不一定知道你到底想让它怎么输出。
但如果我们明确列出每一步,甚至还告诉它输出的格式,效果就会好很多:
prompt = f"""
1- 用一句话总结下面用 <> 括起来的故事。
2- 把这句话翻译成英文。
3- 在英文摘要里找出人名。
4- 用 JSON 格式输出这两项内容:英文摘要 + 人名数量。
请按照下面的格式回答:
文本:<这里是原始文本>
摘要:<中文摘要>
翻译:<英文摘要>
人名:<人名列表>
输出 JSON:<JSON对象>
Text: <{text}>
"""
这样一步一步来,模型就不会乱,而且你还能轻松拿到你想要的结构化数据。
2.2 让模型“自己算一遍”再说结果
再举个数学题的例子。
你问模型:“学生说这个算式是对的,你看对不对?”
模型可能看都没认真看就说:“嗯,看起来挺对的。”结果其实错得离谱。
所以我们得这样提问:
“先别急着说学生对不对,你自己先做一遍题,再来判断他是不是算错了。”
这种方式特别适合判断题、逻辑题、推理题。我们来看个具体例子。
问题描述:
我要建一个太阳能发电站,费用包括:
-
每平方英尺土地费用 $100
-
每平方英尺太阳能板费用 $250
-
每年维护费用:10万美元 + 每平方英尺 $10
问:总费用是多少?用面积 xx 表示。
学生的答案:
土地:100x
太阳能板:250x
维护:100000 + 100x (错了!这里其实应该是10x)
总费用:100x + 250x + 100x + 100000 = 450x + 100000
你如果直接问模型:“他对不对?”,它可能会被“学生答案格式挺标准”这种表象蒙住,直接回你一句:“是的,正确。”
但如果你先要求模型 自己算一遍:
prompt = f"""
请你按以下步骤解决这个问题:
1. 自己先算出总费用。
2. 拿你的答案和学生的答案对比,看看一致不一致。
3. 然后判断学生到底对不对。
按照以下格式输出:
问题:
学生答案:
你自己的计算步骤:
学生的总费用:
你的总费用:
是否一致:
学生答得对吗:
"""
模型这时候会认真去算一次,得出正确答案是:360x + 100000,然后它才能判断:“噢,原来学生写成了450x,多加了90x,答错了。”
小结
你看,只要我们在 Prompt 里多给模型一点“思考空间”,它就能像一个认真考试的学生那样,先分析、再判断,而不是随便凑个答案。
所以写 Prompt 的时候,别急着让模型立刻回答。你可以:
-
引导它一步一步思考;
-
明确告诉它先推理再判断;
-
给出固定格式,减少它“自由发挥”。
这样,结果会靠谱很多,也更接近我们真正想要的东西。