前言

提示工程(Prompt Engineering)不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。

如何让AI语言大模型输出的结果更符合预期,更好服务于AI解题业务场景,理解LLM的基本原理以及提示词设计很重要,下面主要关于写Prompt的一些技巧以及实践,以及一些模型参数的介绍说明。

通过此系列学习如何结合业务场景更好的设计提示词模板,旨在提高AI解题正确率。

参考:

  • https://learningprompt.wiki/zh-Hans/docs/chatgpt-learning-path
  • https://www.promptingguide.ai/zh

目录

  • PE基础知识
  • PE高级
    • 提示词元素框架
    • LLM基本原理、Zero-shot特性以及优化技巧
      • 链式思考、少量样本提示词规则
      • 零样本提示词规则
      • 生成知识提示词规则
      • 思维树提示词规则
      • 模型相关参数介绍
  • 实践
    • AI解题提示词模板优化实践
    • 模型参数调整实践

1、PE基础知识

Prompt基本原则

  • 使用新模型
  • 最好包含完整信息
  • 简洁易懂并减少歧义
  • 使用正确的语法、标点符号。

使用技巧

  • 优先告诉要干什么,然后才是不要干什么
  • 增加示例
  • 增加场景以及人物角色

2、PE高级

2.1、提示词元素框架

1、Basic Prompt Framework应该包含4个部分

  • Instruction(必须): 指令,即你希望模型执行的具体任务。
  • Context(选填): 背景信息,或者说是上下文信息,这可以引导模型做出更好的反应。
  • Input Data(选填): 输入数据,告知模型需要处理的数据。
  • Output Indicator(选填): 输出指示器,告知模型我们要输出的类型或格式。

在写Prompt的时候,并不一定要包含所有4个元素,可以根据情景进行元素排列组合

  • 推理:Instruction + Context + Input Data
  • 信息提取:Instruction + Context + Input Data + Output Indicator

2、CRISPE Prompt Framework应该包含6个部分,完备性更高

  • CR: Capacity and Role(能力与角色)。你希望 ChatGPT 扮演怎样的角色。
  • I: Insight(洞察力),背景信息和上下文(坦率说来我觉得用 Context 更好)。
  • S: Statement(指令),你希望 ChatGPT 做什么。
  • P: Personality(个性),你希望 ChatGPT 以什么风格或方式回答你。
  • E: Experiment(尝试),要求 ChatGPT 为你提供多个答案。

举例

Capacity and RoleAct as an expert on software development on the topic of machine learning frameworks, and an expert blog writer.把你想象成机器学习框架主题的软件开发专家,以及专业博客作者。
InsightThe audience for this blog is technical professionals who are interested in learning about the latest advancements in machine learning.这个博客的读者主要是有兴趣了解机器学习最新进展技术的专业人士。
StatementProvide a comprehensive overview of the most popular machine learning frameworks, including their strengths and weaknesses. Include real-life examples and case studies to illustrate how these frameworks have been successfully used in various industries.提供最流行的机器学习框架的全面概述,包括它们的优点和缺点。包括现实生活中的例子,和研究案例,以说明这些框架如何在各个行业中成功地被使用。
PersonalityWhen responding, use a mix of the writing styles of Andrej Karpathy, Francois Chollet, Jeremy Howard, and Yann LeCun.在回应时,混合使用 Andrej Karpathy、Francois Chollet、Jeremy Howard 和 Yann LeCun 的写作风格。
ExperimentGive me multiple different examples.给我多个不同的例子。

2.2、LLM模型的基本原理和Zero-shot特性以及优化规则

LLM技术原理参考:https://sspai.com/post/80316,简单理解就是大量的文本特征语义训练,只要数量级别足够大,就能具有一定上下文的规律。

通俗来讲就是一个大的Map,然后大模型训练就是给Map放数据的过程(实际上是个算法训练token选取概率的函数),训练的数据量直接影响大模型的效果,训练的成本很高,一方面是训练的配置,另一方面就是数据,自然语言还好,对于那些CLIP等多模态模型需要图片和文本,而且质量也影响模型最终的效果。

自监督学习,就是不需要固定的数据标注,生成回答是具有上下文含义的,每次回答的字都是根据概率选取的。

举个例子,比如 “我很” 后面可以很多种场景回答,“我很好”、“我很坏”、“我很高兴”、“我很难过” 等,具体的回答需要根据提问的场景来选择概率,比如问 “你心情怎摸样?” 那么选取 “我很高兴”、“我很难过” 作为回答结果的概率就会更大,至于具体回答哪个是有模型数据训练的规模以及上下文场景概率选取。

再举个例子,如多模态CLIP大模型就是采用社交网络上的海量数据进行大模型训练,相比之前给图片手动打标签模式,图片和文本联系的语义是真实的,也就是这个文本、图片联系是更有意义的,而不是靠着标签维护的。比如ins会有用户发的朋友圈,比如 “我这个猫真好看” 配了一个猫的照片,那么这个图片猫的特征就会和 自然语言特征产生语义联系,少量数据的时候这个联系不一定准确,但是当数据量足够大,这种联系性越来越强。区别之前的手动标注的文本、图片特征联系,CLIP大模型这种联系是具有上下文的。

因此能进行Zero-shot的原理就是基于此,我们问一个问题,就会根据问题进行回答,但是Zero-shot的效果还是跟训练的数据量、测试的数据等相关的。

如今,经过大量数据训练并调整指令的LLM能够执行零样本任务。即使有时我们没有向模型提供任何示例,模型对于简单的任务仍能处理——这就是零样本能力的作用。

Zero-shot有时在复杂性的任务上表现不佳,因此针对此特性需要优化提示词。当零样本提示和少样本提示(少量样本提示:格式、标签提示,上下文随机少样本提示)不足时,这可能意味着模型学到的东西不足以在任务上表现良好。从这里开始,建议开始考虑微调您的模型或尝试更高级的提示技术

链式思考、少量样本提示词规则

举例具体可以在上下文增加少量样本样例,并给出样例答案,进行一个链式的思考步骤说明

image.png
具体可以以用户消息进行配置
image.png
企业微信截图_5f8b603a-fcb2-48b6-b6d9-29ad345aebb2.png

 // 题型描述举例
if (StringUtils.isNotEmpty(questionTypeDesc) && JSON.isValid(questionTypeDesc)) {
    JSONObject questionTypeDescJson = JSON.parseObject(questionTypeDesc);
    messages.add(new ChatMessage(ChatMessageRole.USER.value(), questionTypeDescJson.getString("stem")));
    String answerExp = String.format("答案:%s。解析:%s", questionTypeDescJson.getString("answer"), questionTypeDescJson.getString("exp"));
    log.debug("题型管理配置的 answerExp 格式:{}",answerExp);
    messages.add(new ChatMessage(ChatMessageRole.ASSISTANT.value(), answerExp));
}
零样本提示词规则

Zero-Shot Chain of Thought意思是模型的输出结果是一步步链式形成的,这个技巧使用起来非常简单,只需要在问题的结尾里放一句** Let‘s think step by step (让我们一步步地思考)**,模型输出的答案会更加准确。

这个技巧来自于 Kojima 等人 2022 年的论文 Large Language Models are Zero-Shot Reasoners。在论文里提到,当我们向模型提一个逻辑推理问题时,模型返回了一个错误的答案,但如果我们在问题最后加入 Let‘s think step by step 这句话之后,模型就生成了正确的答案。

ling waAPE发现了一个比人工设计的“让我们一步一步地思考”提示更好的零样本CoT提示(Kojima等人,2022(opens in a new tab))。
提示“让我们一步一步地解决这个问题,以确保我们有正确的答案。”引发了思维链的推理,并提高了MultiArith和GSM8K基准测试的性能:

生成知识提示词规则

大致思路就是将问题首先进行拆分使LLM生成知识,然后根据知识再解答问题。
image.png

思维树提示词规则

LLM回答的过程是概率选取词条token的过程,对于需要探索预判战略复杂的业务,传统或者简单的提示词技巧是不够的。

最近,Yao et el. (2023)(opens in a new tab) 提出了思维树(Tree of Thoughts,ToT)框架,该框架基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。

ToT 维护着一棵思维树,思维由连贯的语言序列表示,这个序列就是解决问题的中间步骤。使用这种方法,LM 能够自己对严谨推理过程的中间思维进行评估。LM 将生成及评估思维的能力与搜索算法(如广度优先搜索和深度优先搜索)相结合,在系统性探索思维的时候可以向前验证和回溯

image.png

两种方法都是以多轮对话搜索树的形式来增强 LLM 解决复杂问题的能力。主要区别在于 Yao et el. (2023)(opens in a new tab) 采用了深度优先(DFS)/广度优先(BFS)/集束(beam)搜索,而 Long (2023)(opens in a new tab) 则提出由强化学习(Reinforcement Learning)训练出的 “ToT 控制器”(ToT Controller)来驱动树的搜索策略(宝库什么时候回退和搜索到哪一级回退等等)。

Hulbert (2023)(opens in a new tab) 提出了思维树(ToT)提示法,将 ToT 框架的主要概念概括成了一段简短的提示词,指导 LLM 在一次提示中对中间思维做出评估。ToT 提示词的例子如下:

假设三位不同的专家来回答这个问题。
所有专家都写下他们思考这个问题的第一个步骤,然后与大家分享。
然后,所有专家都写下他们思考的下一个步骤并分享。
以此类推,直到所有专家写完他们思考的所有步骤。
只要大家发现有专家的步骤出错了,就让这位专家离开。
请问...

2.3、模型其他相关参数

  1. Mode: 最近更新了第四种 Chat 模式,一般使用 Complete 就好,当然你可以用其他模式,其他模式能通过 GUI 的方式辅助你撰写 prompt。
  2. Model: 这里可以切换模型。不同的模型会擅长不同的东西,根据场景选对模型,能让你省很多成本:
    1. Ada:这是最便宜,但运算速度最快的模型。官方推荐的使用场景是解析文本,简单分类,地址更正等。
    2. Babbage:这个模型能处理比 Ada 复杂的场景。但稍微贵一些,速度也比较快。适合分类,语义搜索等。
    3. Curie:这个模型官方解释是「和 Davinci 一样能力很强,且更便宜的模型」。但实际上,这个模型非常擅长文字类的任务,比如写文章、语言翻译、撰写总结等。
    4. Davinci:这是 GPT-3 系列模型中能力最强的模型。可以输出更高的质量、更长的回答。每次请求可处理 4000 个 token。适合有复杂意图、因果关系的场景,还有创意生成、搜索、段落总结等。
  3. Temperature: 这个主要是控制模型生成结果的随机性。简而言之,温度越低,结果越确定,但也会越平凡或无趣。如果你想要得到一些出人意料的回答,不妨将这个参数调高一些。但如果你的场景是基于事实的场景,比如数据提取、FAQ 场景,此参数就最好调成 0。
  4. Maximum length: 设置单次生成内容的最大长度。
  5. Stop Sequence: 该选项设置停止生成文本的特定字符串序列。如果生成文本中包含此序列,则模型将停止生成更多文本。
  6. Top P: 该选项是用于 nucleus 采样的一种技术,它可以控制模型生成文本的概率分布,从而影响模型生成文本的多样性和确定性。如果你想要准确的答案,可以将它设定为较低的值。如果你想要更多样化的回复,可以将其设得高一些。
  7. Presence Penalty: 该选项控制模型生成文本时是否避免使用特定单词或短语,它可以用于生成文本的敏感话题或特定场景。
  8. Best of: 这个选项允许你设置生成多少个文本后,从中选择最优秀的文本作为输出。默认为 1,表示只生成一个文本输出。
  9. **Injection start text: **这个选项可以让你在输入文本的开头添加自定义文本,从而影响模型的生成结果。
  10. **Injection restart text: **这个选项可以让你在中间某个位置添加自定义文本,从而影响模型继续生成的结果。
  11. **Show probabilities: **这个选项可以让你查看模型生成每个单词的概率。打开此选项后,你可以看到每个生成的文本单词后面跟着一串数字,表示模型生成该单词的概率大小。

3、实践

3.1、提示词模板优化实践

如目前提示词模板,结合以上规则对其进行优化

作为 `%s` 学科的教师,你正在准备一道考试题目,你要做的是:理解并解答这到题,
将这道题的答案和解析正确的写出来,一定要保证答案正确性!
题目为:`%s`, 题型为:`%s`。
要求:
(1)回答请使用简洁的中文。
(2)答案和解析内容之间加一个分号保持格式整洁。
(3)如果是选择题请正确给出正确答案对应的选项。

参考CRISPE Prompt Framework

Capacity and Role把你想象成一位 %s 学科的教师以及义教育界知识储备丰富的学者。
Insight这个教师、学者的工作主要分析并理解在校学生提出的试题,然后给出该试题的答案与解析。
Statement根据试题场景正确解答试题 %s,让我们一步步思考,并给出解析论证答案的正确性质。
Personality在回应时,使用简洁的中文参照%s格式。
Experiment如果是试题是选择题需要给出正确的选项。
把你想象成一位 ${courseName} 学科的教师以及义教育界知识储备丰富的学者。
这个教师、学者的工作主要分析并理解在校学生提出的试题,让我们一步步思考然后给出该试题的答案与解析,
回应使用简洁的中文,根据试题场景正确解答题目类型为 ${questionTypeName}的试题 ${questionStem}

ps:历史提示词模板

1、角色:\"%s出题人\" %s 目的:\"%s 1. 直接写出题目答案;2.做题目进行解析,分析并写出解答思路,
请使用中文解析;3. 对难度进行预测,难度等级分为:easy、medium、difficult三个等级;4. 写出该题
目考查的知识点\" 要求:将以上四个目的,按照固定顺序以json格式的形式返回,尽量简洁



2、作为我K12的${courseName}的教师,你正在做一道考试题,请给出正确的答案和解析,不仅要告诉我们正
确答案,还要告诉我们其他选项为什么错了。下面是一道${questionType},请根据题意选择最合适的选项,
选择题往往会考察语法,单词释义。 ${questionStem}



3、作为 `%s` 学科的教师,你正在准备一道考试题目,你要做的是:理解并解答这到题,将这道题的答案和解
析正确的写出来,一定要保证答案正确性!题目为:`%s`, 题型为:`%s`。要求:(1)回答请使用简洁的中
文。(2)答案和解析内容之间加一个分号保持格式整洁。(3)如果是选择题请正确给出正确答案对应的选项。  


4、把你想象成一位 `%s` 学科的教师以及义教育界知识储备丰富的学者。这个教师、学者的工作主要分析并理
解在校学生提出的试题,然后给出该试题的答案与解析。根据试题场景正确解答试题 `%s`,让我们一步步思考
,并给出解析论证答案的正确性质。在回应时,使用简洁的中文参照 `%s` 格式。如果是试题是选择题需要给
出正确的选项。


5、把你想象成一位 `${courseName} `学科的教师以及义教育界知识储备丰富的学者。这个教师、学者的工
作主要分析并理解在校学生提出的试题,然后给出该试题的答案与解析,根据试题场景正确解答题目类型为 
`${questionTypeName}`的试题 `${questionStem}`,让我们一步步思考,在回应时,使用简洁的中文
,如果是试题是选择题需要给出正确的选项。

加上``有时会有干扰。


6、把你想象成一位 ${courseName} 学科的教师以及义教育界知识储备丰富的学者。这个教师、学者的工作
主要分析并理解在校学生提出的试题,让我们一步步思考然后给出该试题的答案与解析,回应使用简洁的中文,
根据试题场景正确解答题目类型为 ${questionTypeName}的试题 ${questionStem}7、假设现在有三位${courseName} 学科的不同的教师来解答在校学生提问的试题,所有教师都写下他们思考这个试题的第一个步骤,然后与大家分享, 
然后,所有教师都写下他们思考的下一个步骤并分享,以此类推,直到所有教师写完他们思考的所有步骤,只要大家发现有教师的步骤出错了,
就让这位教师离开 。下面请解答类型为`${questionTypeName} `的试题 `${questionStem}`  ,
确保答案正确,输出最终的答案与解析,输出格式按照"【答案】:xxx;【解析】:xxx",语言需要简洁


ps:题型描述,用于规定ChatGPT给出答案的格式以及一些样本提示词

{ "stem":"(1)_is your favourite teacher? ( ) 。A.Who B.What C.When D.Why(2)The driver stopped his car because he  ( ) 。A.didn’t know the timeB.saw his friendC.was very tired", "answer":"A;B;", "exp":"(1)最喜欢的老师是谁,因此正确答案Who,选项A正确。(2)司机停止了他的汽车是因为他_,结合文章上下文,因此正确答案为他看到了他朋友,选项B正确。" }

3.2、模型参数调整实践

OpenAI ChatGPT可调整的参数

  • Temperature:范围[0,1],值越大生成的答案约出人意料
  • Top P:范围[0,1],值越大生成的答案越多样化
  • Best of:默认为1,表示生成文本的数量,最终选取一个最优秀的作为输出结果

目前AI写答案解析具体的业务场景为例,目前的参数

.model(GPT_3_5_TURBO)
.topP(1.0)
.n(1)
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐