面向开发者的提示词工程

Tags
Published
Author

简介

内容基于吴恩达老师的《Prompt Engineering for Developer》
 
LLM 后续可以分为:
  1. 基础 LLM 
    1. 是什么:就是基础的 pre-train得到的大模型。
    2. 它知道的:预训练的数据。
  1. 指令微调(Instruction Tuned)LLM
    1. 在上一步的基础上进行微调(fine-tuning)得到的模型。
    2. 它知道的:预训练数据+新告诉它的。
    3. 不过微调不会改变模型预训练得到的参数。
    4. 绝大部分模型都是根据 开源的模型+指令微调+RLHF
    5. 指令微调需要的数据量并不大,高质量的数据几千条,就可以明显提示大模型的能力。
 

提示原则

原则1:编写清晰、具体的指令

1.1 使用分隔符

是什么:分隔符就像是 Prompt 中的墙,将不同的指令、上下文、输入隔开,避免意外的混淆。你可以选择用 ```,""",< >,<tag> </tag>,: 等做分隔符,只要能明确起到隔断作用即可。
用处:防止“提示词注入”。
例子:
from tool import get_completion text = f""" 您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。\ 这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\ 不要将写清晰的提示词与写简短的提示词混淆。\ 在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。 """ # 需要总结的文本内容 prompt = f""" 把用三个反引号括起来的文本总结成一句话。 ```{text}``` """ # 指令内容,使用 ``` 来分隔指令和待总结的内容 response = get_completion(prompt) print(response)
 

1.2 结构化的输出

是什么:JSON格式的输出(gpt4o 已经支持)
思考🤔:结构化的输出,回答结果的语意更明确。
例子:
prompt = f""" 请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单,\ 并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。 """ response = get_completion(prompt) print(response)
结果:
{ "books": [ { "book_id": 1, "title": "迷失的时光", "author": "张三", "genre": "科幻" }, { "book_id": 2, "title": "幻境之门", "author": "李四", "genre": "奇幻" }, { "book_id": 3, "title": "虚拟现实", "author": "王五", "genre": "科幻" } ] }
 

1.3 要求模型检查是否满足限制条件

是什么:如果任务包含不一定能满足的假设(条件),我们可以告诉模型先检查这些假设,如果不满足,则会指出并停止执行后续的完整流程。您还可以考虑可能出现的边缘情况及模型的应对,以避免意外的结果或错误发生。
思考🤔:llm 的初始人设可能是尽量给答复的,不知道/不符合的时候可能会强行回答。所以要明确告诉它限制条件,防止llm 不知道的时候胡说。减少幻觉。

1.4 提供少量示例

是什么❓:在 prompt 里给它打个样。
思考🤔:我觉得这一点是非常有用的,总感觉 llm 在文字接龙的游戏中,下一个字受到附近的影响是最大的。所以给个例子是非常有效的。
prompt = f""" 您的任务是以一致的风格回答问题。 <孩子>: 请教我何为耐心。 <祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。 <孩子>: 请教我何为韧性。 """ response = get_completion(prompt) print(response)
 

原则二 给模型时间去思考


啥意思..不就是多等会吗,怎么放在了大原则里。
语言模型与人类一样,需要时间来思考并解决复杂问题。如果让语言模型匆忙给出结论,其结果很可能不准确。例如,若要语言模型推断一本书的主题,仅提供简单的书名和一句简介是不足够的。这就像让一个人在极短时间内解决困难的数学题,错误在所难免。
相反,我们应通过 Prompt 指引语言模型进行深入思考。可以要求其先列出对问题的各种看法,说明推理依据,然后再得出最终结论。在 Prompt 中添加逐步推理的要求,能让语言模型投入更多时间逻辑思维,输出结果也将更可靠准确。
综上所述,给予语言模型充足的推理时间,是 Prompt Engineering 中一个非常重要的设计原则。这将大大提高语言模型处理复杂问题的效果,也是构建高质量 Prompt 的关键之处。开发者应注意给模型留出思考空间,以发挥语言模型的最大潜力。

2.1 指定完成任务需要的步骤

是什么❓:针对复杂任务,需要让 gpt 一步一步的做,这样结果更准确。
思考🤔:有点像 cot,cot 的效果在 gpt4 以上的模型就效果不大了。cot 应该属于这个原则的一种,这种防范仍然是有效的。就像考试做数学题要写步骤一样,不能直接写答案。
例子🌰:
text = f""" 在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\ 他们一边唱着欢乐的歌,一边往上爬,\ 然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\ 虽然略有些摔伤,但他们还是回到了温馨的家中。\ 尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。 """ # example 1 prompt_1 = f""" 执行以下操作: 1-用一句话概括下面用三个反引号括起来的文本。 2-将摘要翻译成英语。 3-在英语摘要中列出每个人名。 4-输出一个 JSON 对象,其中包含以下键:english_summary,num_names。 请用换行符分隔您的答案。 Text: ```{text}``` """ response = get_completion(prompt_1) print("prompt 1:") print(response)
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)
 

指导模型在下结论之前找出一个自己的解法

 

局限性:

注意LLM 的幻觉问题,前面写了,llm 初始人设喜欢瞎逼逼,不知道的时候爱胡说。
在他看来,可能有答案>对错。(和给女朋友送礼物一样,不论喜欢不喜欢,必须要有。
 

迭代优化

总之,Prompt 工程师的核心是掌握 Prompt 的迭代开发和优化技巧,而非一开始就要求100%完美。通过不断调整试错,最终找到可靠适用的 Prompt 形式才是设计 Prompt 的正确方法。
 
 

文本概括

概括文本(设定字数限制,非严格)
from tool import get_completion prompt = f""" 您的任务是从电子商务网站上生成一个产品评论的简短摘要。 请对三个反引号之间的评论文本进行概括,最多30个字。 评论: ```{prod_review}``` """ response = get_completion(prompt) print(response)
设置侧重点
prompt = f""" 您的任务是从电子商务网站上生成一个产品评论的简短摘要。 请对三个反引号之间的评论文本进行概括,最多30个字,并且侧重在快递服务上。 评论: ```{prod_review}``` """ response = get_completion(prompt) print(response)
提取信息
prompt = f""" 您的任务是从电子商务网站上的产品评论中提取相关信息。 请从以下三个反引号之间的评论文本中提取产品运输相关的信息,最多30个词汇。 评论: ```{prod_review}``` """ response = get_completion(prompt) print(response)
 

推断

情感推断

prompt = f""" 以下用三个反引号分隔的产品评论的情感是什么? 用一个单词回答:「正面」或「负面」。 评论文本: ```{lamp_review}``` """ response = get_completion(prompt) print(response)

信息提取

# 中文 prompt = f""" 从评论文本中识别以下项目: - 评论者购买的物品 - 制造该物品的公司 评论文本用三个反引号分隔。将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。 如果信息不存在,请使用 “未知” 作为值。 让你的回应尽可能简短。 评论文本: ```{lamp_review}``` """ response = get_completion(prompt) print(response)

主题推断

# 中文 prompt = f""" 判断主题列表中的每一项是否是给定文本中的一个话题, 以列表的形式给出答案,每个元素是一个Json对象,键为对应主题,值为对应的 0 或 1。 主题列表:美国航空航天局、当地政府、工程、员工满意度、联邦政府 给定文本: ```{story}``` """ response = get_completion(prompt) print(response)
 

文本转换

文本翻译

import time for issue in user_messages: time.sleep(20) prompt = f"告诉我以下文本是什么语种,直接输出语种,如法语,无需输出标点符号: ```{issue}```" lang = get_completion(prompt) print(f"原始消息 ({lang}): {issue}\n") prompt = f""" 将以下消息分别翻译成英文和中文,并写成 中文翻译:xxx 英文翻译:yyy 的格式: ```{issue}``` """ response = get_completion(prompt) print(response, "\n=========================================")

语气风格调整

prompt = f""" 将以下文本翻译成商务信函的格式: ```小老弟,我小羊,上回你说咱部门要采购的显示器是多少寸来着?``` """ response = get_completion(prompt) print(response)

文件格式转换

prompt = f""" 将以下Python字典从JSON转换为HTML表格,保留表格标题和列名:{data_json} """ response = get_completion(prompt) print(response)
 

拼写和语法纠正

for i in range(len(text)): time.sleep(20) prompt = f"""请校对并更正以下文本,注意纠正文本保持原始语种,无需输出原始文本。 如果您没有发现任何错误,请说“未发现错误”。 例如: 输入:I are happy. 输出:I am happy. ```{text[i]}```""" response = get_completion(prompt) print(i, response)
prompt = f""" 针对以下三个反引号之间的英文评论文本, 首先进行拼写及语法纠错, 然后将其转化成中文, 再将其转化成优质淘宝评论的风格,从各种角度出发,分别说明产品的优点与缺点,并进行总结。 润色一下描述,使评论更具有吸引力。 输出结果格式为: 【优点】xxx 【缺点】xxx 【总结】xxx 注意,只需填写xxx部分,并分段输出。 将结果输出成Markdown格式。 ```{text}``` """ response = get_completion(prompt) display(Markdown(response))