本Task目标:了解大模型,明确Baseline中各模块的作用,并学会通过修改prompt提升大模型的性能,达到提高分数的目的。
参考文档:Datawhale
本文所使用的代码可在上一篇Task1的文章中下载
何为大模型
大模型的能力和特点
大模型的能力
大语言模型(LLM)与以前的预训练语言模型(PLM)的主要区别在于其涌现能力。这种能力在小型模型中不明显,但在大型模型中显著。例如:
-
上下文学习:首次由GPT-3引入,允许模型在提供自然语言指令或多个任务示例的情况下,通过理解上下文并生成相应输出来执行任务。
-
指令遵循:通过指令微调,LLM可以根据任务指令执行未见过的任务,展示出强大的泛化能力。
-
逐步推理:通过"思维链(Chain of Thought, CoT)"策略,LLM能够解决多步推理任务,例如数学问题。
大模型的特点
-
巨大的规模:参数规模达数十亿甚至数千亿,使其能捕捉更多语言知识和复杂语法结构。
-
预训练和微调:在大规模无标签文本数据上预训练,然后通过有标签数据微调,适应特定任务。
-
上下文感知:具备强大的上下文感知能力,能够理解和生成依赖前文的文本内容。
-
多语言支持:支持多种语言,促进跨文化和跨语言的应用。
-
多模态支持:一些LLM支持文本、图像和语音的多模态数据。
-
涌现能力:在大规模模型中表现出明显的性能提升,能处理更复杂的任务。
-
多领域应用:广泛应用于文本生成、自动翻译、信息检索、摘要生成、聊天机器人等多个领域。
-
伦理和风险问题:需要谨慎处理生成有害内容、隐私问题和认知偏差等伦理和风险问题。
大模型推理实现最常用方法——提示工程(Prompt Engineering)
什么是提示工程?
提示工程(Prompt Engineering)是一门较新的学科,关注提示词开发和优化,帮助用户将大语言模型(Large Language Model, LLM)用于各场景和研究领域。 掌握了提示工程相关技能将有助于用户更好地了解大型语言模型的能力和局限性。
研究人员可利用提示工程来提升大语言模型处理复杂任务场景的能力,如问答和算术推理能力。开发人员可通过提示工程设计、研发强大的工程技术,实现和大语言模型或其他生态工具的高效接轨。
提示工程不仅仅是关于设计和研发提示词。它包含了与大语言模型交互和研发的各种技能和技术。提示工程在实现和大语言模型交互、对接,以及理解大语言模型能力方面都起着重要作用。用户可以通过提示工程来提高大语言模型的安全性,也可以赋能大语言模型,比如借助专业领域知识和外部工具来增强大语言模型能力。
关键概念
- Prompt:向语言模型输入的文本,用于引导模型生成响应。
- Pre-trained Language Model:已经在大量文本数据上进行预训练的语言模型,如GPT-3、BERT等。这些模型可以根据提供的提示生成文本。
- Few-shot, One-shot, Zero-shot Learning:根据提示中是否包含示例以及示例的多少来分类。
- Zero-shot:无示例,模型根据提示生成答案。
- One-shot:一个示例,模型根据提示和示例生成答案。
- Few-shot:多个示例,模型根据提示和多个示例生成答案。
如何修改prompt?
优化策略
- 明确任务:明确地告诉模型它应该做什么。
- 提供示例:通过提供示例,模型能更好地理解任务。
- 结构化信息:使用清晰的结构来组织提示信息,帮助模型更好地理解。
- 控制输出格式:明确指出输出格式,减少模型的猜测空间。
修改Baseline中的prompt
首先查看baseline中定义get_prompt部分代码:
def get_prompt(problem, question, options):
options = '\n'.join(f"{'ABCDEFG'[i]}. {o}" for i, o in enumerate(options))
prompt = f"""你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。题目如下:
### 题目:
{problem}
### 问题:
{question}
{options}
"""
# print(prompt)
return prompt
不难看出,最佳的优化方式是增加示例,让大模型更好地理解自己所需要做的工作。如下是修改后的get_prompt函数:
def get_prompt(problem, question, options):
# 将选项格式化为字符串
options = '\n'.join(f"{'ABCDEFG'[i]}. {o}" for i, o in enumerate(options))
# 提供更明确的提示
prompt = f"""你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。所有的问题都是(close-world assumption)闭世界假设,即未观测事实都为假。请逐步分析问题并在最后一行输出答案,最后一行的格式为"答案是:A"。请详尽解释每一步分析过程,并在结论部分明确指出答案。
### 示例:
题目: 有三个箱子,每个箱子里都有不同颜色的球。箱子A有红色的球,箱子B有蓝色的球,箱子C有绿色的球。每个箱子中只有一种颜色的球。
问题: 如果你从箱子A里拿出一个球,它会是什么颜色?
A. 红色
B. 蓝色
C. 绿色
分析: 根据题目描述,箱子A里有红色的球,箱子B里有蓝色的球,箱子C里有绿色的球。如果从箱子A中拿出一个球,它一定是红色的;从箱子B中拿出一个球,它一定是蓝色的;从箱子C中拿出一个球,它一定是绿色的。因此,答案是:A。
### 题目:
{problem}
### 问题:
{question}
{options}
分析:"""
return prompt