本文最后更新于:2024年2月8日 中午
Prompt Engineering for
Developer
Guideline
编写清晰、具体的指令
分隔符
""",< >, 之类的作为,防止Prompt Rejection
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| from tool import get_completion
text = f""" 您应该提供尽可能清晰、具体的指示,以表达您希望模型执行的任务。\ 这将引导模型朝向所需的输出,并降低收到无关或不正确响应的可能性。\ 不要将写清晰的提示词与写简短的提示词混淆。\ 在许多情况下,更长的提示词可以为模型提供更多的清晰度和上下文信息,从而导致更详细和相关的输出。 """
prompt = f""" 把用三个反引号括起来的文本总结成一句话。 ```{text}``` """
response = get_completion(prompt) print(response)
prompt = f""" 请生成包括书名、作者和类别的三本虚构的、非真实存在的中文书籍清单,\ 并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre。 """ response = get_completion(prompt) print(response)
|
检查模型是否满足条件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| text_1 = f""" 泡一杯茶很容易。首先,需要把水烧开。\ 在等待期间,拿一个杯子并把茶包放进去。\ 一旦水足够热,就把它倒在茶包上。\ 等待一会儿,让茶叶浸泡。几分钟后,取出茶包。\ 如果您愿意,可以加一些糖或牛奶调味。\ 就这样,您可以享受一杯美味的茶了。 """ prompt = f""" 您将获得由三个引号括起来的文本。\ 如果它包含一系列的指令,则需要按照以下格式重新编写这些指令:
第一步 - ... 第二步 - … … 第N步 - …
如果文本中不包含一系列的指令,则直接写“未提供步骤”。" \"\"\"{text_1}\"\"\" """ response = get_completion(prompt) print("Text 1 的总结:") print(response)
|
提供少量示例
给模型一两个已经完成的用例
1 2 3 4 5 6 7 8 9 10 11
| prompt = f""" 您的任务是以一致的风格回答问题。
<孩子>: 请教我何为耐心。
<祖父母>: 挖出最深峡谷的河流源于一处不起眼的泉眼;最宏伟的交响乐从单一的音符开始;最复杂的挂毯以一根孤独的线开始编织。
<孩子>: 请教我何为韧性。 """ response = get_completion(prompt) print(response)
|
给模型时间思考
指定完成任务所需要的步骤
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
| text = f""" 在一个迷人的村庄里,兄妹杰克和吉尔出发去一个山顶井里打水。\ 他们一边唱着欢乐的歌,一边往上爬,\ 然而不幸降临——杰克绊了一块石头,从山上滚了下来,吉尔紧随其后。\ 虽然略有些摔伤,但他们还是回到了温馨的家中。\ 尽管出了这样的意外,他们的冒险精神依然没有减弱,继续充满愉悦地探索。 """
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)
|
指导模型在下结论之前找到一个自己的解法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| prompt = f""" 请判断学生的解决方案是否正确,请通过如下步骤解决这个问题:
步骤:
首先,自己解决问题。 然后将您的解决方案与学生的解决方案进行比较,对比计算得到的总费用与学生计算的总费用是否一致,并评估学生的解决方案是否正确。 在自己完成问题之前,请勿决定学生的解决方案是否正确。
使用以下格式:
问题:问题文本 学生的解决方案:学生的解决方案文本 实际解决方案和步骤:实际解决方案和步骤文本 学生计算的总费用:学生计算得到的总费用 实际计算的总费用:实际计算出的总费用 学生计算的费用和实际计算的费用是否相同:是或否 学生的解决方案和实际解决方案是否相同:是或否 学生的成绩:正确或不正确
问题:
我正在建造一个太阳能发电站,需要帮助计算财务。 - 土地费用为每平方英尺100美元 - 我可以以每平方英尺250美元的价格购买太阳能电池板 - 我已经谈判好了维护合同,每年需要支付固定的10万美元,并额外支付每平方英尺10美元;
作为平方英尺数的函数,首年运营的总费用是多少。
学生的解决方案:
设x为发电站的大小,单位为平方英尺。 费用: 1. 土地费用:100x美元 2. 太阳能电池板费用:250x美元 3. 维护费用:100,000+100x=10万美元+10x美元 总费用:100x美元+250x美元+10万美元+100x美元=450x+10万美元
实际解决方案和步骤: """ response = get_completion(prompt) print(response)
|
迭代优化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| fact_sheet_chair = """ 概述
美丽的中世纪风格办公家具系列的一部分,包括文件柜、办公桌、书柜、会议桌等。 多种外壳颜色和底座涂层可选。 可选塑料前后靠背装饰(SWC-100)或10种面料和6种皮革的全面装饰(SWC-110)。 底座涂层选项为:不锈钢、哑光黑色、光泽白色或铬。 椅子可带或不带扶手。 适用于家庭或商业场所。 符合合同使用资格。
结构
五个轮子的塑料涂层铝底座。 气动椅子调节,方便升降。
尺寸
宽度53厘米|20.87英寸 深度51厘米|20.08英寸 高度80厘米|31.50英寸 座椅高度44厘米|17.32英寸 座椅深度41厘米|16.14英寸
选项
软地板或硬地板滚轮选项。 两种座椅泡沫密度可选:中等(1.8磅/立方英尺)或高(2.8磅/立方英尺)。 无扶手或8个位置PU扶手。
材料 外壳底座滑动件
改性尼龙PA6/PA66涂层的铸铝。 外壳厚度:10毫米。 座椅 HD36泡沫
原产国
意大利 """ from tool import get_completion
prompt = f""" 您的任务是帮助营销团队基于技术说明书创建一个产品的营销描述。
根据```标记的技术说明书中提供的信息,编写一个产品描述。 可选!: 最多使用50个词 可选: 处理抓错文本细节:根据不同目标受众关注不同的方面,输出风格和内容上都适合的文本。
技术说明: ```{fact_sheet_chair}``` """ response = get_completion(prompt) print(response)
|
1
| for i in range(len(review))
|
inferring
情感倾向:
1 2 3 4 5
| from tool import get_completion prompt = f""" 三个反引号分割的产品评论的情感是什么 ‘’‘{lamp_review} ''''
|
信息提取
从文本中抽取特定的、我们关心的信息 1 2 3 4 5 6 7 8 9 10
| prompt = f"""
从评论文本中识别以下项目: - 评论者购买的物品 - 制造该物品的公司 - 评论文本用三个反引号分隔。将你的响应格式化为以 “物品” 和 “品牌” 为键的 JSON 对象。 如果信息不存在,请使用 “未知” 作为值。 让你的回应尽可能简短。 “”“
|
引入温度系数
温度控制生成文本的随机性以及多样性,随机程度高,多样性越高,总体来说,temperature
越高,语言模型的文本生成就越具有随机性。可以想象,高温度下,语言模型就像心绪更加活跃,但也可能更有创造力。
语言模型,提问范式与 Token
Helper function 辅助函数
(提问范式)
分类
1 2 3 4 5 6 7 8
| delimiter = "####" messages = [ {'role':'system', 'content': system_message}, {'role':'user', 'content': f"{delimiter}{user_message}{delimiter}"}, ] messages = []
|
在这个例子中,我们使用系统消息(system_message)作为整个系统的全局指导,并选择使用
“#”
作为分隔符。分隔符是用来区分指令或输出中不同部分的工具,它可以帮助模型更好地识别各个部分,从而提高系统在执行特定任务时的准确性和效率。
“#” 也是一个理想的分隔符,因为它可以被视为一个单独的 token 。
内心独白
1 2 3 4 5 6 7 8 9
| try: if delimiter in response: final_response = response.split(delimiter)[-1].strip() else: final_response = response.split(":")[-1].strip() except Exception as e: final_response = "对不起,我现在有点问题,请尝试问另外一个问题" print(final_response)
|
langchain
```python from langchain.prompts import ChatPromptTemplate
template_string = """"