1.编写明确具体的指令
1.使用分隔符清楚地知识输入的不同部分,将特定的文本部分与prompt的其他部分分隔开。如``` 三个单引号。分隔符还可以避免指令冲突。
2.要求模型使用结构化输出,你可以在prompt中提供自定义的格式,或者直接要求模型以json或HTML格式输出
3.可以要求模型检查条件。比如,检查一段文本中是否存在步骤,如果存在,那么打印出步骤,如果不存在,简单打印出没有步骤。
4.少量训练提示。在user消息中给出问题和模型应做出的回答。
2.使模型在问题上花更多时间思考。
这通常意味着模型会花费更多算力,而你能得到更好的结果。
1.为模型指定完成任务的步骤。如 “依次执行以下步骤:”
2.在判断一个解析是否正确时,让模型自己做一遍,并令模型在做完之前不得判断答案的正确与否
3.避免幻觉:要求模型首先在知识库中找到任何相关的引用,并要求模型使用引用回答问题。
3.迭代提示词,直到对结果满意。
提示词需要不断迭代设计,直到你对模型的输出满意。
4.杂项
1.可以直接将prompt放入user message,事实上,如果不做聊天机器人等类似应用,不需要system消息和assistant消息。
system消息确定模型的行为,人设,作为高层指令用于对话,如同在assistant的耳边低语。
5.辅助函数
def get_completion(text, model="gpt-3.5-turbo"): prompt = f""" 我将给你一个数学题,这个数学题被我用两个&符号分隔开。请你分析这个数学题涉及的知识点。 你应当依次执行以下步骤: 1.解答这道数学题,但不要输出解答过程。 2.阅读上一步的解答过程,总结出所使用的数学知识点,但不要输出。这些知识点组成集合A。 3.判断集合A中的每个知识点是否在第1步的解答过程中出现,如果没有出现,将其从集合A丢弃。 4.解答这道数学题,但不要输出解答过程。 5.阅读上一步的解答过程,总结出所使用的数学知识点,但不要输出。这些知识点组成集合B。 6.判断集合B中的每个知识点是否在第4步的解答过程中出现,如果没有出现,将其从集合B丢弃。 7.解答这道数学题,但不要输出解答过程。 8.阅读上一步的解答过程,总结出所使用的数学知识点,但不要输出。这些知识点组成集合C。 9.判断集合A中的每个知识点是否在第7步的解答过程中出现,如果没有出现,将其从集合C丢弃。 输出格式为json格式,输出内容为A、B和C中的知识点,语言应当为中文。不要输出除了知识点以外的内容。 &{text}& """ messages = [{"role": "user", "content": prompt}] completion = openai.chat.completions.create( model=model, messages=messages, temperature=0, max_tokens=100 ) return completion.choices[0].message.content