大模型I/O的实现过程及原理(1)青训营X豆包MarsCode 技术训练营AI| 豆包MarsCode AI 刷题

151 阅读7分钟

大模型I/O的实现过程及原理(1)

stateDiagram-v2
[*] --> Still
Still --> [*]

Still --> Moving
Moving --> Still
Moving --> Crash
Crash --> [*]

image.png

一、提示工程的原理及重要性

提示工程旨在通过精心设计的提示来引导大语言模型生成更准确、更有用的输出。吴恩达老师和 Open AI 的官方文档都给出了相关原则和策略,这些原则不仅适用于大语言模型,也能指导人类的思维过程。一个实用的提示框架包括指令、上下文、提示输入和输出指示器等部分,通过明确任务要求、提供额外知识、具体问题输入和标记输出开始等方式,引导模型更好地完成任务。///不过也有时候:当少样本提示的效果不佳时,这可能表示模型在任务上的学习不足。在这种情况下,我们建议对模型进行微调或尝试更高级的提示技术。

二、LangChain 提示模板的类型及用法
1. PromptTemplate:可从模板字符串自动提取变量名称,也可在创建模板时手工指定输入变量。用于生成适用于不同场景的提示,如为销售特定产品的电商公司起名。
1. chatPromptTemplate:针对聊天模型设计,跟随 OpenAI 聊天模型中的各种消息角色。通过构建系统消息模板和用户消息模板,生成格式化的提示消息,传递给聊天模型以获取响应。
1. FewShotPromptTemplate:
-   Few-Shot 的思想起源:Few-Shot、One-Shot 和 Zero-Shot 的概念起源于机器学习,旨在让机器学习模型在极少量甚至没有示例的情况下学习新的概念或类别。在提示工程中,Few-Shot 学习设置为模型提供几个示例,帮助模型理解任务并生成正确响应;Zero-Shot 学习设置则只根据任务描述生成响应,不需要任何示例。

-   使用 FewShotPromptTemplate:

    -   创建示例样本:以字典形式创建一些示例,每个字典代表一种情况,包含输入变量和对应的输出。
    -   创建提示模板:配置一个 PromptTemplate 对象,将示例格式化为字符串,以便形成具体可用的提示。
    -   创建 FewShotPromptTemplate 对象:使用示例和提示模板创建更复杂的提示对象,可生成包含多个示例和一个提示的模板,用于指导模型生成输出。
    -   调用大模型创建新文案:将提示对象传递给大模型,获取所需的文案。
    -   使用示例选择器:当示例很多时,使用示例选择器(如 SemanticSimilarityExampleSelector)根据语义相似性选择最合适的样本,避免传递过多无关模板给大模型,节省 Token 用量。        
    

引入以下概念(包括提示工程的逐渐演变进化过程)

一、Chain of Thought(CoT)
  1. 概念来源:由谷歌大脑的 Jason Wei 等人于 2022 年在论文中提出。如果生成一系列中间推理步骤,能显著提高大型语言模型进行复杂推理的能力。

  2. Few-Shot CoT:在提示中提供一些链式思考示例,增强语言模型的推理能力。例如给出解题思路的示例能让模型在数学问题等任务中生成正确答案。在实际应用中,如开发 AI 花店助手时,可通过思维链引导 AI 从理解问题、搜索信息到制定决策、生成销售列表的整个过程,每一步都可以用思维链设计详细的提示模板。

  3. Zero-Shot CoT:直接告诉模型要一步一步地思考,慢慢推理。例如在提示中简单地说 “让我们一步步地思考(Let's think step by step)”,模型就能给出更好的答案。

二、Chain of Thought 实战

通过开发一个 AI 运营助手展示了 CoT 的实际应用。程序设计了思维链模板,先阐述 AI 的角色和目标,然后给出对话示例展示如何根据思维链进行思考。程序中设置环境变量和 API 密钥,创建聊天模型,定义角色和目标、CoT 模板、用户询问模板,整合生成聊天提示并输入模型获得回答。在 Few-Shot CoT 提示下,模型能针对用户需求给出不错的建议。

三、Tree of Thoughts(ToT)

image.png

  1. 概念提出:基于 CoT 的思想,Yao 和 Long 等人提出了 Tree of Thoughts 框架。该框架引导语言模型探索把思维作为中间步骤来解决通用问题,在需要多步骤推理的任务中,搜索一棵由连贯的语言序列组成的思维树。
  2. 应用方法:为每个任务定义具体的思维步骤和每个步骤的候选项数量,通过观察和评估自身思维过程更好地解决问题。例如在鲜花运营的例子中,通过多个思维步骤为顾客选择适合妻子的鲜花,包括理解需求、考虑可能选择、筛选最佳选择和给出建议。

LangChain 调用大语言模型做应用开发的优势

  1. 模板管理:在大型项目中,可有效管理众多不同的提示模板,使代码清晰整洁。例如,只需定义一次模板,就能多次复用,方便生成各种不同的提示,提高了代码的可维护性。

  2. 变量提取和检查:能够自动提取模板中的变量并进行检查,避免开发者忘记填充变量,减少错误发生的可能性。

  3. 模型切换便捷:当需要尝试不同的模型时,只需更改模型的名称,无需修改大量的代码。这使得开发者可以轻松地在不同模型之间进行切换,以找到最适合特定任务的模型。

  4. 输出解析:提示模板可以嵌入对输出格式的定义,通过输出解析器,能将模型输出的非结构化文本转换为程序可处理的结构化数据,大大加快了基于语言模型进行应用开发的效率。

二、关于输出格式的构建和传递过程

- 构建过程:首先定义想要接收的响应模式,即通过创建一个包含多个ResponseSchema对象的列表,每个对象对应输出中的一个特定部分,如鲜花的描述文案和撰写文案的原因。然后,使用StructuredOutputParser.from_response_schemas方法根据这个列表创建输出解析器。接着,通过输出解析器对象的get_format_instructions()方法获取输出的格式说明,即format_instructions
- 传递过程:根据原始的字符串模板和获取到的输出解析器格式说明,使用PromptTemplate.from_template创建新的提示模板,在这个过程中,将format_instructions作为partial_variables的一部分传递到提示模板中。这样,新的提示模板就整合了输出解析结构信息。

三、加入输出解析器后模型生成结构化输出的原因

加入了partial_variables(输出解析器指定的format_instructions)之后的提示能够让模型生成结构化的输出,主要是因为在提示模板中明确告知了模型期望的输出格式。模型在接收提示时,会根据这些格式说明进行思考和生成回答。例如,提示中明确指出需要生成鲜花的描述文案和撰写这个文案的原因,并且给出了具体的格式要求,这就引导模型尽可能地按照这个结构来组织输出内容,从而使得输出更具结构化。可以打印出这个提示查看,会发现其中包含了对输出格式的详细说明,为模型提供了明确的指导。

总结:这是对大模型i/o工程的介绍和提示工程的学习,熟练运用还要自己多敲每种引用模板的代码(p:也要理解),下章介绍调用模型和输入解析。