第六届字节跳动青训营第四课(ai_提示工程_&_调用模型) | 豆包MarsCode AI 刷题

122 阅读6分钟

LangChain 实战课: 03_FewShotPrompt.py - MarsCode

提示工程

LangChain 提示模板的类型

image.png

前两种比较常见,FewShot、ZeroShot的概念在深度学习中也有,没啥说的。

使用 FewShotPromptTemplate

代码比较容易理解,没啥说的。

prompt_sample = PromptTemplate(
    input_variables=["flower_type", "occasion", "ad_copy"],
    template="鲜花类型: {flower_type}\n场合: {occasion}\n文案: {ad_copy}",
)
prompt = FewShotPromptTemplate(
    examples=samples,
    example_prompt=prompt_sample,
    suffix="鲜花类型: {flower_type}\n场合: {occasion}",
    input_variables=["flower_type", "occasion"],
)

使用示例选择器

示例较多的情况一次性把所有示例发送给模型是不现实而且低效的。另外,每次都包含太多的Token也会浪费流量(OpenAI是按照Token数来收取费用)

LangChain提供了示例选择器,来选择最合适的样本,示例选择器需要对向量相似度进行比较,需要安装向量数据库

example_selector = SemanticSimilarityExampleSelector.from_examples(
    示例样本,
    嵌入模型,
    向量数据库,
    k=1,
)

CoT

CoT,即Chain of Thought,指思维链,它指出如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力

  • Few-Shot CoT
    • 简单的在提示中提供了一些链式思考示例,足够大的语言模型的推理能力就能够被增强。简单说,就是给出一两个示例,然后在示例中写清楚推导的过程
  • Zero-Shot CoT
    • 在Zero-Shot CoT中,你只要简单地告诉模型“让我们一步步的思考(Let's think step by step)”,模型就能够给出更好的答案。
    • 最简单的提示工程,角色设定——模型回答之前,先告诉它“你是一个很有经验的XX专家”,模型应该就会在开始胡说八道之前三思。

Few-Shot CoT,指的就是在带有示例的提示过程中,加入思考的步骤,从而引导模型给出更好的结果。

Zero-Shot CoT,就是直接告诉模型要一步一步地思考,慢慢地推理。

system_prompt_role = SystemMessagePromptTemplate.from_template(role_template)
system_prompt_cot = SystemMessagePromptTemplate.from_template(cot_template)

human_template = "{human_input}"
human_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages(
    [system_prompt_role, system_prompt_cot, human_prompt]
)

ToT

ToT,即Tree of Thoughts,ToT是一种解决复杂问题的框架,它在需要多步骤推理的任务中,引导语言模型搜索一棵由连贯的语言序列(解决问题的中间步骤)组成的思维树,而不是简单地生成一个答案。ToT框架的核心思想是:让模型生成和评估其思维的能力,并将其与搜索算法(如广度优先搜索和深度优先搜索)结合起来,进行系统性地探索和验证。

ToT 框架为每个任务定义具体的思维步骤和每个步骤的候选项数量。例如,要解决一个数学推理任务,先把它分解为3个思维步骤,并为每个步骤提出多个方案,并保留最优的5个候选方案。然后在多条思维路径中搜寻最优的解决方案。

这种方法的优势在于,模型可以通过观察和评估其自身的思维过程,更好地解决问题,而不仅仅是基于输入生成输出。这对于需要深度推理的复杂任务非常有用。此外,通过引入强化学习、集束搜索等技术,可以进一步提高搜索策略的性能,并让模型在解决新问题或面临未知情况时有更好的表现。

AIA

  • CoT的核心思想是通过生成一系列中间推理步骤来增强模型的推理能力。在Few-Shot CoT和Zero-Shot CoT两种应用方法中,前者通过提供链式思考示例传递给模型,后者则直接告诉模型进行要按部就班的推理。
  • ToT进一步扩展了CoT的思想,通过搜索由连贯的语言序列组成的思维树来解决复杂问题。我通过一个鲜花选择的实例,展示了如何在实际应用中使用ToT框架。

调用模型

推荐HF。

预训练+微调的经典模式

  • 预训练:在大规模无标注文本数据上进行模型的训练,目标是让模型学习自然语言的基础表达、上下文信息和语义知识,为后续任务提供一个通用的、丰富的语言表示基础。  
  • 微调:在预训练模型的基础上,可以根据特定的下游任务对模型进行微调。现在你经常会听到各行各业的人说:我们的优势就是领域知识嘛!我们比不过国内外大模型,我们可以拿开源模型做垂直领域嘛!做垂类模型! —— 啥叫垂类?指的其实就是根据领域数据微调开源模型这件事儿。

首先,预训练模型能够将大量的通用语言知识迁移到各种下游任务上,作为应用人员,我们不需要自己寻找语料库,从头开始训练大模型,这减少了训练时间和数据需求;其次,微调过程可以快速地根据特定任务进行优化,简化了模型部署的难度;最后,预训练+微调的架构具有很强的可扩展性,可以方便地应用于各种自然语言处理任务,大大提高了NLP技术在实际应用中的可用性和普及程度。

自定义语言模型

如果我很牛逼,我自己训练/微调了一个大模型,但我不开源,欸我就是玩。

我需要创建一个LLM的衍生类,并实现*_call方法(用于接收输入字符串并返回响应字符串),也可以选择你是否实现_identifying_params*方法(用于帮助打印此类的属性)。

佬的推荐:

  • PyTorch是一个流行的深度学习框架,常用于模型的训练和微调。
  • HuggingFace是一个开源社区,提供了大量预训练模型和微调工具,尤其是NLP任务。
  • LangChain则擅长于利用大语言模型的推理功能,开发新的工具或应用,完成特定的任务。

部分代码解析

skip_special_tokens=True

特殊令牌是指在自然语言处理中用于特定目的的令牌,例如 [CLS][SEP][PAD] 等。这些令牌通常用于标记句子的开始和结束,或者用于填充输入序列以使其具有相同的长度。在某些情况下,我们可能不希望这些特殊令牌出现在最终的文本输出中,因为它们可能没有实际的语义含义,或者可能会干扰文本的可读性。

因此,当设置 skip_special_tokens=True 时,tokenizer.decode() 方法会在解码过程中忽略这些特殊令牌,只输出模型生成的实际文本内容。这可以使得输出的文本更加自然和易于理解。