1.编写明确且具体的指令
通过提供尽可能清晰和具体的指令来表达希望模型执行的操作。这将引导模型给出正确的输出,并减少得到无关或不正确响应的可能。
**注意:**编写清晰的指令不意味着简短的指令,因为在许多情况下,更长的提示更清晰且提供了更多上下文,可能导致更详细和相关的输出。
**策略一:**使用分隔符清晰地表示输入的不同部分,将特定的文本部分和提示的其余部分隔开,例如:
python
prompt = f"""
把用三个反引号括起来的文本总结成一句话。
```{text}```
"""
# 指令内容,使用 ``` 来分隔指令和待总结的内容
这一策略可避免提示词冲突,提示词冲突是指如果允许用户向提示词中添加一些输入,则可能会给出与预期任务不符的指令,导致遵循的不是自己想要的指令。
**策略二:**要求一个结构化的输出,可以是 JSON、HTML 等格式。
该策略要求生成一个结构化的输出,这可以使模型的输出更容易被解析,在 Python 中将其读入字典或列表中。例如:
python
prompt = f"""
请生成包括书名、作者和类别的三本虚构书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。
"""
response = get_completion(prompt)
print(response)
结果:
{ "books": [ { "book_id": 1, "title": "The Shadow of the Wind", "author": "Carlos Ruiz Zafón", "genre": "Mystery" }, { "book_id": 2, "title": "The Name of the Wind", "author": "Patrick Rothfuss", "genre": "Fantasy" }, { "book_id": 3, "title": "The Hitchhiker's Guide to the Galaxy", "author": "Douglas Adams", "genre": "Science Fiction" } ] }
**策略三:**要求模型检查是否满足条件。
要求模型在执行前先验证假设,如果不符即停止;同时预判边缘情况并制定应对策略,以防意外错误。例如:
python
# 有步骤的文本
text_1 = f"""
泡一杯茶很容易。首先,需要把水烧开。\
在等待期间,拿一个杯子并把茶包放进去。\
一旦水足够热,就把它倒在茶包上。\
等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\
如果你愿意,可以加一些糖或牛奶调味。\
就这样,你可以享受一杯美味的茶了。
"""
prompt = f"""
您将获得由三个引号括起来的文本。\
如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ...
第二步 - ...
...
第N步 - ...
如果文本中不包含一系列的指令,则直接写"未提供步骤"。"
\"\"\"{text_1}\"\"\"
"""
response = get_completion(prompt)
print("Text 1 的总结:")
print(response)
结果:
Text 1 的总结: 第一步 - 把水烧开。 第二步 - 拿一个杯子并把茶包放进去。 第三步 - 把烧开的水倒在茶包上。 第四步 - 等待几分钟,让茶叶浸泡。 第五步 - 取出茶包。 第六步 - 如果你愿意,可以加一些糖或牛奶调味。 第七步 - 就这样,你可以享受一杯美味的茶了。
**策略四:**提供少量示例,即在要求模型执行实际任务之前,提供给它少量成功执行任务的示例。
python
prompt = f"""
你的任务是以一致的风格回答问题。
<孩子>: 教我耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 教我韧性。
"""
response = get_completion(prompt)
print(response)
结果:
<祖父母>: 韧性就像是一棵树,它需要经历风吹雨打、寒冬酷暑,才能成长得更加坚强。在生活中,我们也需要经历各种挫折和困难,才能锻炼出韧性。记住,不要轻易放弃,坚持下去,你会发现自己变得更加坚强。
2.给模型时间去思考
针对模型因任务复杂而匆忙得出错误结论的情况,建议通过重构查询,强制模型在输出最终答案前进行多步推理。给予模型更多的"思考时间"以分配充足的计算资源,能有效提升复杂任务的准确性。
策略一:指定完成任务所需的步骤
python
prompt_2 = f"""
1-用一句话概括下面用<>括起来的文本。
2-将摘要翻译成英语。
3-在英语摘要中列出每个名称。
4-输出一个 JSON 对象,其中包含以下键:English_summary,num_names。
请使用以下格式:
文本:<要总结的文本>
摘要:<摘要>
翻译:<摘要的翻译>
名称:<英语摘要中的名称列表>
输出 JSON:<带有 English_summary 和 num_names 的 JSON>
Text: <{text}>
"""
response = get_completion(prompt_2)
print("\nprompt 2:")
print(response)
**策略二:**指导模型在下结论之前找出一个解决方案,例如:
python
prompt = f"""
请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:
步骤:
首先,自己解决问题。
然后将你的解决方案与学生的解决方案进行比较,并评估学生的解决方案是否正确。在自己完成问题之前,请勿决定学生的解决方案是否正确。
使用以下格式:
问题:问题文本
学生的解决方案:学生的解决方案文本
实际解决方案和步骤:实际解决方案和步骤文本
学生的解决方案和实际解决方案是否相同:是或否
学生的成绩:正确或不正确
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。
- 土地费用为每平方英尺100美元
- 我可以以每平方英尺250美元的价格购买太阳能电池板
- 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。
费用:
1. 土地费用:100x
2. 太阳能电池板费用:250x
3. 维护费用:100,000+100x
总费用:100x+250x+100,000+100x=450x+100,000
实际解决方案和步骤:
"""
response = get_completion(prompt)
print(response)
结果:
正确的解决方案和步骤: 1. 计算土地费用:100美元/平方英尺 * x平方英尺 = 100x美元 2. 计算太阳能电池板费用:250美元/平方英尺 * x平方英尺 = 250x美元 3. 计算维护费用:10万美元 + 10美元/平方英尺 * x平方英尺 = 10万美元 + 10x美元 4. 计算总费用:100x美元 + 250x美元 + 10万美元 + 10x美元 = 360x + 10万美元 学生的解决方案和实际解决方案是否相同:否 学生的成绩:不正确
3.局限性
虚假知识:模型偶尔会生成一些看似真实实则编造的知识
模型在训练过程中接触了大量的知识,但它并没有完全记住所见的信息,因此它并不很清楚自己知识的边界。这意味着它可能会尝试回答有关晦涩主题的问题,并编造听起来合理但实际上并不正确的答案。我们称这些编造的想法为幻觉。
因此我们要根据以上策略来避免模型给出虚假知识,且另一个方法是,要求模型先定位源文本中的相关引用,再基于这些引用生成答案,通过追溯源文档来提升准确性。