提示工程下 | 豆包MarsCode AI刷题

199 阅读21分钟

什么是 Chain of Thought

  1. 定义

    • Chain of Thought(思维链)是一种在自然语言处理,特别是大型语言模型应用中使用的技术。它是一系列中间的推理步骤,用于引导语言模型生成高质量的回答。简单来说,它不是直接让模型给出答案,而是让模型展示其 “思考” 过程来得到答案。
  2. 背景和原理

    • 传统的语言模型在回答一些复杂问题时,可能只是基于训练时学到的模式直接输出一个结果。而思维链通过让模型生成中间的推理步骤,更像是模拟人类的思考过程。例如,在解决数学问题时,人类会逐步推导,如先分析题目中的已知条件,再根据相关公式进行计算,最后得出答案。思维链就是让语言模型也按照类似的步骤来回答问题。
  3. 示例

    • 假设问题是 “如果一个商店里,苹果每个 3 元,香蕉每个 2 元,小明买了 4 个苹果和 3 个香蕉,一共花了多少钱?”

    • 没有思维链的回答可能只是直接输出一个数字,如 18。

    • 有思维链的回答可能是这样的:

      • 首先,计算买苹果花的钱。每个苹果 3 元,小明买了 4 个苹果,所以买苹果花的钱是 3×4 = 12 元。
      • 其次,计算买香蕉花的钱。每个香蕉 2 元,小明买了 3 个香蕉,所以买香蕉花的钱是 2×3 = 6 元。
      • 最后,把买苹果和香蕉花的钱加起来,12+6 = 18 元。所以一共花了 18 元。
  4. 在实际应用中的优势

    • 提高回答质量:对于复杂的逻辑问题、多步骤问题或者需要解释的问题,思维链可以显著提高回答的准确性和质量。因为它促使模型更深入地思考问题,而不是简单地猜测答案。
    • 增强可解释性:在一些需要解释推理过程的场景中,如教育、科学研究等,思维链可以让模型的回答更具可解释性。人们可以看到模型是如何一步步得出答案的,这有助于验证答案的正确性和理解模型的行为。
    • 促进知识推理:它可以帮助模型更好地利用已有的知识进行推理。在回答问题时,模型通过思维链可以整合不同的知识片段来解决复杂问题,就像人类从不同的知识点中推导解决方案一样。

Few-Shot CoT

  1. 定义

    • Few - Shot CoT(Few - Shot Chain of Thought,少样本思维链)是在思维链(Chain of Thought)基础上发展而来的一种技术。它是指在模型推理过程中,通过提供少量的带有思维链的示例(通常是问题 - 思维链 - 答案的三元组)来引导模型生成更好的回答。这意味着除了问题本身,还向模型展示了几个如何通过逐步推理(思维链)来得到答案的范例。
  2. 工作原理

    • 假设我们有一个语言模型,当使用 Few - Shot CoT 时,我们会给模型提供几个类似问题的例子,这些例子包括详细的思维链过程和最终答案。例如,对于数学问题,会给出问题如 “如果一个班级里男生有 15 人,女生人数是男生的 2/3,班级总人数是多少?”,然后思维链可能是 “首先,计算女生人数,男生有 15 人,女生人数是男生的 2/3,所以女生人数为 15×(2/3)=10 人。然后,计算班级总人数,即男生人数加女生人数,15 + 10 = 25 人”,最后是答案 25。当我们给模型提供几个这样的例子后,再提出一个新的问题,模型就会参考这些例子中的思维链方式来尝试回答新问题。
  3. 与普通 CoT 的区别

    • 数据量不同:普通的 CoT 主要强调推理步骤,但不一定会提供多个示例。Few - Shot CoT 重点在于提供少量的完整示例,这些示例包括问题、思维链和答案。例如,普通 CoT 可能只是对一个问题阐述推理步骤,而 Few - Shot CoT 会提供 3 - 5 个这样完整的问题 - 推理 - 答案示例。
    • 对模型的引导方式不同:普通 CoT 更多的是让模型知道要进行推理步骤,而 Few - Shot CoT 是通过具体的示例告诉模型 “像这样去推理”。模型可以学习这些示例中的思维模式和推理结构,从而在新问题上应用类似的方法。
  4. 应用场景和优势

    • 在小数据场景下提升性能:在数据有限的情况下,Few - Shot CoT 可以有效利用少量的优质示例来提升模型的推理能力。比如在一些特定的专业领域,可能只有少量带注释(包含思维链和答案)的问题样本,利用 Few - Shot CoT 可以让模型在这些少量样本的引导下,更好地回答该领域的其他问题。
    • 提高模型的泛化能力:模型通过学习少量的示例中的思维链,可以将这种推理方式应用到其他类似的问题中,从而提高对不同问题的回答能力。例如,在数学应用题中,模型学习了几个行程问题的 Few - Shot CoT 示例后,对于新的行程问题也能更好地进行推理回答。
    • 便于人类理解和干预:由于提供了具体的示例,人类可以更直观地看到模型是如何被引导的,也可以更容易地调整示例内容来优化模型的回答。比如教育领域,教师可以通过精心设计的 Few - Shot CoT 示例来帮助学生(模型类比学生)更好地理解知识和推理过程。

Zero-Shot CoT

  1. 定义

    • Zero - Shot CoT(Zero - Shot Chain of Thought,零样本思维链)是一种自然语言处理技术,它允许语言模型在没有提供具体示例(与 Few - Shot CoT 相对)的情况下,通过某种引导方式产生思维链来回答问题。也就是说,不需要预先给模型提供带有思维链的问题 - 答案示例,模型就能自行生成推理步骤来解决问题。
  2. 工作原理

    • 通常会通过在问题中添加一个特殊的指令或提示来触发模型的思维链生成。例如,在问题前添加 “请逐步思考并回答” 这样的指令。模型在接收到这个指令后,会尝试分解问题,并生成一系列中间的推理步骤来得到答案。比如对于问题 “如何计算一个正方体的表面积,已知其棱长为 3 厘米”,通过添加零样本思维链指令后,模型可能会这样回答:“首先,正方体的表面积公式是 6 乘以棱长的平方。然后,已知棱长为 3 厘米,将棱长代入公式,得到 6×3²。接着计算 3² = 9,再计算 6×9 = 54 平方厘米。所以这个正方体的表面积是 54 平方厘米。”
  3. 与 Few - Shot CoT 的比较

    • 数据要求不同:Few - Shot CoT 需要提供少量的带有思维链的示例来引导模型,而 Zero - Shot CoT 不需要这些额外的示例,仅依靠特殊的指令提示来让模型产生思维链。
    • 泛化性差异:Zero - Shot CoT 更强调模型自身的能力,希望模型能够基于其预训练知识和对指令的理解,在各种不同类型的问题上生成思维链。而 Few - Shot CoT 的泛化性可能受到所提供示例的类型和数量的限制,模型可能会过度依赖这些示例的模式来回答问题。不过,在实际应用中,Few - Shot CoT 可能在某些复杂问题上更有效,因为它有具体示例可供参考。
    • 应用灵活性:Zero - Shot CoT 在应用时更为灵活,不需要准备和筛选合适的示例。只要模型能够理解指令,就可以尝试在不同的问题上生成思维链。而 Few - Shot CoT 需要花费时间挑选和整理有代表性的示例,并且如果问题类型超出了示例的范围,可能效果就会大打折扣。
  4. 优势和挑战

    • 优势

      • 便捷性:由于不需要额外的示例,使用起来更加方便。在面对各种各样的问题时,只要模型能够正确理解指令,就可以尝试生成思维链来回答问题,这在实际应用场景多样且难以提前准备示例的情况下非常有用。
      • 模型自主性:更能体现模型自身的推理能力,能够挖掘模型在没有外部示例引导下的潜力,有助于推动模型自身推理机制的研究。
    • 挑战

      • 指令理解难度:模型需要准确理解特殊指令的含义才能有效地生成思维链。如果指令不够清晰或者模型对指令的理解存在偏差,可能会导致生成的思维链不合理或者无法生成思维链。
      • 性能稳定性:相较于 Few - Shot CoT,其性能可能不太稳定。因为没有示例作为支撑,模型在不同类型问题上生成思维链的质量可能会有较大波动,对于一些复杂、抽象的问题可能较难生成有效的思维链。

Chain of Thought 实战

# 设置环境变量和API密钥
import os

# os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'

# 创建聊天模型
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(
    model=os.environ.get("LLM_MODELEND"),
)

# 设定 AI 的角色和目标
role_template = (
    "你是一个为花店电商公司工作的AI助手, 你的目标是帮助客户根据他们的喜好做出明智的决定"
)

# CoT 的关键部分,AI 解释推理过程,并加入一些先前的对话示例(Few-Shot Learning)
cot_template = """
作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。 

我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求,给出我的推荐。
同时,我也会向客户解释我这样推荐的原因。

示例 1:
  人类:我想找一种象征爱情的花。
  AI:首先,我理解你正在寻找一种可以象征爱情的花。在许多文化中,红玫瑰被视为爱情的象征,这是因为它们的红色通常与热情和浓烈的感情联系在一起。因此,考虑到这一点,我会推荐红玫瑰。红玫瑰不仅能够象征爱情,同时也可以传达出强烈的感情,这是你在寻找的。

示例 2:
  人类:我想要一些独特和奇特的花。
  AI:从你的需求中,我理解你想要的是独一无二和引人注目的花朵。兰花是一种非常独特并且颜色鲜艳的花,它们在世界上的许多地方都被视为奢侈品和美的象征。因此,我建议你考虑兰花。选择兰花可以满足你对独特和奇特的要求,而且,兰花的美丽和它们所代表的力量和奢侈也可能会吸引你。
"""
from langchain.prompts import (
    ChatPromptTemplate,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
)

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]
)

prompt = chat_prompt.format_prompt(
    human_input="我想为我的女朋友购买一些花。她喜欢粉色和紫色。你有什么建议吗?"
).to_messages()

# 接收用户的询问,返回回答结果
response = llm(prompt)
print(response)

代码解释:

# CoT 的关键部分,AI解释推理过程,并加入一些先前的对话示例(Few-Shot Learning) cot_template = """ 作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的希望喜好做出明智的决定。 我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求,给出我的推荐。 同时,我也会向客户解释我这样推荐的原因。 示例 1: 人类:我想找一种象征爱情的花。 AI:首先,我理解你正在寻找一种可以象征爱情的花。在许多文化中,红玫瑰被视为爱情的象征,这是因为它们的红色通常与热情和浓烈的感情联系在一起。因此,考虑到这一点,我会推荐红玫瑰。红玫瑰不仅能够象征爱情,同时也可以传达出强烈的感情,这是你在寻找的。 示例 2: 人类:我想要一些独特和奇特的花。 AI:从你的需求中,我理解你想要的是独一无二和引人注目的花朵。兰花是一种非常独特并且颜色鲜艳的花,它们在世界上的许多地方都被视为奢侈品和美的象征。因此,我建议你考虑兰花。选择兰花可以满足你对独特和奇特的要求,而且,兰花的美丽和它们所代表的力量和奢侈也可能会吸引你。 """

这是一个关键的模板定义部分,即 cot_template。它详细阐述了AI作为花店电商助手在面对客户需求时的思考过程和推理方式(这就是Chain of Thought,思维链的体现),并且提供了两个具体的示例(Few-Shot Learning),展示了针对不同客户需求(寻找象征爱情的花、想要独特奇特的花)时,AI是如何理解需求、考虑鲜花涵义并给出推荐及解释原因的。

from langchain.prompts import ( ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate, ) system_prompt_role = SystemMessagePromptTemplate.from_template(role_template) system_pprompt_cot = SystemMessagePromptTemplate.from_template(cot_template)

这里从 langchain.prompts 模块中导入了几个用于创建提示模板的类。然后分别使用 role_template 和 cot_template 通过对应的 from_template 方法创建了两个系统消息提示模板:system_prompt_role 和 system_prompt_cot。这些系统消息提示模板将用于后续构建完整的聊天提示。

# 用户的询问 human_template = "{human_input}" human_prompt = HumanMessagePromptTemplate.from_template(human_template)

定义了一个用户询问的模板 human_template,它只包含一个占位符 {human_input},用于后续填充具体的用户询问内容。然后通过 HumanMessagePromptTemplate.from_template 方法基于这个模板创建了一个用户消息提示模板 human_prompt,用于在聊天提示中表示用户的询问部分。

# 将以上所有信息结合为一个聊天提示 chat_prompt = ChatPromptTemplate.from_messages( [system_prompt_role, system_prompt_cot, human_prompt] )

这行代码将之前创建的系统消息提示模板(包括角色设定的和包含思维链及示例的)以及用户消息提示模板结合在一起,通过 ChatPromptTemplate.from_messages 方法创建了一个完整的聊天提示模板 chat_prompt。这个模板包含了系统设定、思维链及示例以及用户询问等所有必要信息,以便为后续与聊天模型的交互提供完整的输入提示。

prompt = chat_prompt.format_prompt( human_input="我想为我的女朋友购买一些花。她喜欢粉色和紫色。你有什么建议吗?" ).to_messages()

这里使用 chat_prompt 这个聊天提示模板,通过 format_prompt 方法并传入具体的用户询问内容("我想为我的女朋友购买一些花。她喜欢粉色和紫色。你有什么建议吗?")对模板进行格式化,将用户询问内容填充到相应的占位符中,然后通过 to_messages 方法将其转换为适合聊天模型接收的消息格式,得到最终的提示 prompt

Tree of Thought

  1. 定义

    • Tree of Thought(思维树)是一种在自然语言处理领域,特别是针对复杂问题解决和推理任务中所采用的技术或策略。它类似于思维链(Chain of Thought),但结构上更像一棵树,通过探索多种思考路径和分支来寻找问题的最优解。
  2. 结构与原理

    • 树状结构呈现:它以问题作为树根,从树根开始生成不同的思考分支,每个分支代表一种可能的思考方向或推理步骤。这些分支可以继续衍生出更多的子分支,形成一个类似树状的结构。例如,对于一个 “如何规划一次完美的旅行” 的问题,最初的分支可能包括 “选择目的地”“确定旅行时间”“考虑预算” 等,而 “选择目的地” 这个分支又可能进一步细分出 “国内热门景点”“国外热门景点”“小众特色景点” 等子分支。
    • 探索与评估:在生成了这样的树状结构后,会沿着各个分支及其子分支进行深入思考和推理,不断拓展思路。同时,会对每个分支上所得到的结果或中间状态进行评估,判断其是否有可能导向一个合理的、高质量的最终答案。比如在上述旅行规划的例子中,在考虑 “国内热门景点” 这个子分支时,会进一步分析各个热门景点的特点、当前季节的适宜性、人流量等因素,以此来评估这个分支是否是一个好的选择方向。
    • 回溯与优化:如果在某个分支上发现无法得到满意的结果,或者经过评估发现该分支不太可能导向最优解,就会回溯到上一层分支,重新选择其他分支进行探索,或者对已有的分支进行调整和优化。继续以旅行规划为例,如果发现 “国内热门景点” 中的某个具体景点由于季节原因不太适宜游玩,就可能回溯到 “国内热门景点” 这一层,重新考虑其他国内热门景点,或者调整旅行时间等条件来使这个景点变得适宜游玩。
  3. 与思维链的区别

    • 结构复杂度:思维链通常呈现为一条线性的推理链,是一步一步地推导得出答案;而思维树具有树状结构,有多个分支和子分支,能够同时探索多种不同的思考路径,更适合处理复杂、多维度的问题。例如,对于简单的数学计算问题,思维链可能就足够了,通过逐步的运算步骤得出答案;但对于像 “如何制定一个城市的交通改善方案” 这样复杂的问题,思维树可以从不同方面如交通设施建设、交通管理政策、公共交通优化等多个分支去探索解决方案。
    • 探索全面性:思维链主要是沿着单一的推理路径进行,相对局限于一种思考方式;而思维树通过展开多个分支,可以更全面地探索问题的各种可能解决方案。在思维树中,即使某一个分支最终没有得出理想答案,但在探索过程中所获得的信息也可能对其他分支或整体问题的解决有帮助。比如在制定交通改善方案时,探索 “交通设施建设” 分支可能发现某些区域存在道路瓶颈问题,虽然这个分支本身可能没有直接得出完整的改善方案,但这个信息可以为其他分支如 “交通管理政策”(比如是否可以通过限行政策来缓解该区域的交通压力)提供参考。
  4. 应用场景和优势

    • 复杂决策问题:在需要做出复杂决策的场景中,如企业战略规划、项目投资决策等,思维树可以帮助决策者从多个角度、多个层面去思考问题,全面评估各种可能的选择及其后果。例如,在企业战略规划中,可以从市场拓展、产品研发、成本控制等多个分支去探讨不同的战略方向,对每个分支下的具体举措进行分析评估,从而制定出更合理的战略规划。
    • 创意生成与创新:对于创意生成、创新设计等需要开拓思维、探索多种可能性的任务,思维树非常有用。它可以促使人们从不同的维度去思考问题,打破常规思维的局限。比如在广告创意设计中,可以从目标受众、广告形式、宣传渠道等多个分支去探索不同的创意方案,每个分支下又可以衍生出更多的子分支,从而激发出更多新颖独特的广告创意。
    • 故障诊断与问题解决:在故障诊断领域,思维树可以帮助技术人员从不同的系统组件、运行环节等多个分支去排查故障原因。例如,在计算机系统故障诊断中,可以从硬件、软件、网络等多个分支去检查,每个分支下又可以细分出不同的子分支,如硬件分支下可以有 CPU、内存、硬盘等子分支,通过这样全面的排查,可以更准确地找到故障原因并解决问题。

思考题

  1. 请你设计一个你工作场景中的任务需求,然后用ToT让大语言模型帮你解决问题。

答:

一、设计工作场景中的任务需求

假设你在一家电商公司工作,负责产品的库存管理。你的任务需求是:

任务需求:优化电商产品的库存管理系统

  1. 背景

    • 公司的电商业务发展迅速,产品种类和数量不断增加。目前的库存管理系统在处理大量产品数据时出现了一些问题,如库存数据不准确、补货不及时等。
  2. 具体问题

    • 库存数据不准确:由于销售数据和进货数据的不同步,库存系统中的产品数量与实际数量存在偏差。
    • 补货不及时:缺乏对产品销售趋势的有效分析,导致一些畅销产品缺货,而一些滞销产品积压库存。
    • 仓库空间利用不充分:没有合理规划仓库空间,导致部分产品存放混乱,影响了仓库操作效率。

二、用 Tree of Thought (思维树) 让大语言模型解决问题

  1. 树根(问题)

    • 如何优化电商产品的库存管理系统?
  2. 第一层分支(主要思考方向)

    • 数据同步与准确性

      • 子分支:

        • 建立实时数据同步机制,连接销售平台和库存系统,确保每一笔销售和进货数据能即时更新到库存系统中。
        • 定期进行库存盘点,通过人工和系统自动盘点相结合的方式,核实库存数据的准确性。
    • 补货策略

      • 子分支:

        • 分析历史销售数据,建立销售预测模型,根据预测结果制定补货计划。
        • 设定库存预警阈值,当产品库存低于预警值时,自动触发补货流程。
    • 仓库空间管理

      • 子分支:

        • 根据产品的销售频率和体积,重新规划仓库布局,将畅销产品放置在便于存取的位置。
        • 采用仓库管理软件,对仓库空间进行数字化管理,实时监控仓库空间利用情况。
  3. 评估与优化

    • 对于每个分支和子分支进行评估:

      • 数据同步与准确性:实时数据同步机制可能需要一定的技术投入,但从长远来看可以有效解决库存数据不准确的问题;定期盘点可以作为补充手段,确保数据的可靠性。

      • 补货策略:销售预测模型需要不断优化和调整,但可以提高补货的及时性和准确性;库存预警阈值需要根据产品的特性和销售情况进行合理设置。

      • 仓库空间管理:重新规划仓库布局可能会涉及到一定的人力和物力成本,但可以提高仓库操作效率;仓库管理软件可以提供数据支持,便于进行空间管理和优化。

通过这样的思维树结构,可以全面地分析和解决电商产品库存管理系统优化的问题。