什么是 Chain of Thought(CoT)? CoT这个概念源于学术界,由谷歌大脑的Jason Wei等人在2022年的论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(自我一致性提升了语言模型中的思维链推理能力)》中提出。论文指出,通过生成一系列的中间推理步骤,可以显著提高大型语言模型进行复杂推理的能力。
Few-Shot CoT Few-Shot CoT简单地在提示中提供了一些链式思考示例(Chain-of-Thought Prompting),从而增强大型语言模型的推理能力。简单来说,就是给出一两个示例,并在示例中清晰地展示推导过程。
论文中给出了一个大模型通过思维链做数学题的示例。实验中,大模型在读入了OneShot示例后,仅给出答案的模型推理错误,而给出解题思路的模型则生成了正确的答案。这一结果表明,通过CoT指导,大模型在算术、常识和符号推理任务中的性能都得到了提高。
在实际应用中,CoT不仅概念上容易理解,操作上也十分简便。例如,在开发一个AI花店助手时,我们可以使用CoT来引导AI的推理过程。通过设定问题理解、信息搜索、决策制定和生成销售列表等步骤,并给出相应的思维链示例,AI可以更加清晰地理解问题,生成更符合用户需求的销售列表。
整体指导:你需要跟着下面的步骤一步步的推理。
问题理解:首先,AI需要理解用户的需求。例如,用户可能会说:“今天要参加朋友的生日Party,想送束花祝福她。”我们可以给AI一个提示模板,里面包含示例:“遇到XX问题,我先看自己有没有相关知识,有的话,就提供答案;没有,就调用工具搜索,有了知识后再试图解决。”—— 这就是给了AI一个思维链的示例。
信息搜索:接下来,AI需要搜索相关信息。例如,它可能需要查找哪些花最适合生日派对。
决策制定:基于收集到的信息,AI需要制定一个决策。我们可以通过思维链让他详细思考决策的流程,先做什么后做什么。例如,我们可以给它一个示例:“遇到生日派对送花的情况,我先考虑用户的需求,然后查看鲜花的库存,最后决定推荐一些玫瑰和百合,因为这些花通常适合生日派对。”—— 那么有了生日派对这个场景做示例,大模型就能把类似的思维流程运用到其它场景。
生成销售列表:最后,AI使用OutputParser生成一个销售列表,包括推荐的花和价格。
在这个过程中,整体上,思维链引导AI从理解问题,到搜索信息,再到制定决策,最后生成销售列表。这种方法不仅使AI的推理过程更加清晰,也使得生成的销售列表更加符合用户的需求。具体到每一个步骤,也可以通过思维链来设计更为详细的提示模板,来引导模型每一步的思考都遵循清晰准确的逻辑。
其实LangChain的核心组件Agent的本质就是进行好的提示工程,并大量地使用预置的FewShot和CoT模板。这个在之后的课程学习中我们会理解得越来越透彻。
Zero-Shot CoT 除了Few-Shot CoT外,还有Zero-Shot CoT。在Zero-Shot CoT中,只需简单地告诉模型“让我们一步步地思考(Let's think step by step)”,模型就能够给出更好的答案。这一发现来自于Google Research和东京大学的论文《大语言模型是零样本推理者》。图中的(d)示例非常非常有意思,在Zero-Shot CoT中,你只要简单地告诉模型“让我们一步步的思考(Let's think step by step)”,模型就能够给出更好的答案!
这种方法的神奇之处在于,它不需要提供具体的示例,只需引导模型进行逐步思考。这不由得让人联想到最简单的提示工程——角色设定。在模型回答之前,先告诉它“你是一个很有经验的XX专家”,模型在开始胡说八道之前就会三思。
Chain of Thought 实战 接下来,我将带大家完成一次Chain of Thought的LangChain应用开发实战。在这个示例中,我们将展示AI如何根据用户的需求推理和生成答案。
项目需求:开发一个AI运营助手,展示AI如何根据用户的需求推理和生成答案。
CoT模板设计: 作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。 我会按部就班的思考,先理解客户的需求,然后考虑各种鲜花的涵义,最后根据这个需求给出我的推荐。 同时,我也会向客户解释我这样推荐的原因。 示例:
人类:我想找一种象征爱情的花。
AI:首先,我理解你正在寻找一种可以象征爱情的花。在许多文化中,红玫瑰被视为爱情的象征。因此,考虑到这一点,我会推荐红玫瑰。红玫瑰不仅能够象征爱情,同时也可以传达出强烈的感情。
人类:我想要一些独特和奇特的花。
AI:从你的需求中,我理解你想要的是独一无二和引人注目的花朵。兰花是一种非常独特且颜色鲜艳的花。因此,我建议你考虑兰花。选择兰花可以满足你对独特和奇特的要求。
程序完整框架:
设置环境变量OpenAI的API密钥。 创建聊天模型,设置temperature=0以生成更确定性的回答。 定义AI的角色和目标,以及CoT模板。 使用PromptTemplate的from_template方法生成询问模板。 使用ChatPromptTemplate.from_messages方法整合角色、CoT模板和用户询问,生成聊天提示。 将生成的聊天提示输入模型中,获得模型的回答并打印出来。 程序的完整代码如下:
设置环境变量和API密钥
import os os.environ["OPENAI_API_KEY"] = '你的OpenAI API Key'
创建聊天模型
from langchain.chat_models import ChatOpenAI llm = ChatOpenAI(temperature=0)
设定 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)
在Few-Shot CoT提示的指引下,模型针对问题从具体需求出发,返回了不错的建议。
现在,根据你的需求:你正在寻找你的女朋友喜欢的粉色和紫色的花。
首先,我从理解你的需求出发,只会推荐粉色或紫色,或者两者的组合的花。这些可能包括粉色的玫瑰,紫色的兰花,或者是粉色和紫色的花的混合花束。玫瑰是象征爱情和亲情的经典符号,而兰花象征着美丽和力量。这两种花都蕴含很棒的内涵。当然了,无论你选择哪种花卉,重要的是表达出你对她的爱和关心。记得附上一张温馨的贺卡,写下你的真挚祝福。
Tree of Thoughts(ToT) Yao和Long等人几乎在同一时间在论文《思维之树:使用大型语言模型进行深思熟虑的问题解决》和《大型语言模型指导的思维之树》中,提出了思维树(Tree of Thoughts,ToT)框架。
ToT是一种解决复杂问题的框架,它在需要多步骤推理的任务中引导语言模型搜索一棵由连贯的语言序列(解决问题的中间步骤)组成的思维树。ToT框架的核心思想是:让模型生成和评估其思维的能力,并将其与搜索算法(如广度优先搜索和深度优先搜索)结合起来进行系统性地探索和验证。
通过应用ToT的思想,我们可以更好地解决复杂问题。例如,在鲜花运营方面,当顾客询问应该选择哪种鲜花时,AI可以使用ToT框架进行逐步思考,最终给出符合顾客需求的建议。下面我们应用ToT的思想,给出一个鲜花运营方面的示例:
假设一个顾客在鲜花网站上询问:“我想为我的妻子购买一束鲜花,但我不确定应该选择哪种鲜花。她喜欢淡雅的颜色和花香。”
AI(使用ToT框架):
思维步骤1:理解顾客的需求。
顾客想为妻子购买鲜花。
顾客的妻子喜欢淡雅的颜色和花香。
思维步骤2:考虑可能的鲜花选择。
候选1:百合,因为它有淡雅的颜色和花香。
候选2:玫瑰,选择淡粉色或白色,它们通常有花香。
候选3:紫罗兰,它有淡雅的颜色和花香。
候选4:桔梗,它的颜色淡雅但不一定有花香。
候选5:康乃馨,选择淡色系列,它们有淡雅的花香。
思维步骤3:根据顾客的需求筛选最佳选择。
百合和紫罗兰都符合顾客的需求,因为它们都有淡雅的颜色和花香。
淡粉色或白色的玫瑰也是一个不错的选择。
桔梗可能不是最佳选择,因为它可能没有花香。
康乃馨是一个可考虑的选择。
思维步骤4:给出建议。
“考虑到您妻子喜欢淡雅的颜色和花香,我建议您可以选择百合或紫罗兰。淡粉色或白色的玫瑰也是一个很好的选择。希望这些建议能帮助您做出决策!”
这个例子,可以作为FewShot示例之一,传递给模型,让他学着实现ToT。
通过在具体的步骤中产生多条思考路径,ToT 框架为解决复杂问题提供了一种新的方法,这种方法结合了语言模型的生成能力、搜索算法以及强化学习,以达到更好的效果。
总结 本节课我们介绍了Chain of Thought(CoT)和Tree of Thoughts(ToT)这两个有趣的概念,并探讨了如何利用它们引导大型语言模型进行更深入的推理。通过实践应用,我们发现CoT和ToT在提高模型推理能力和解决复杂问题方面具有显著优势。希望这些内容对大家有所帮助!小北有朋友在GitHub上开了一个 Repo,专门给大家介绍ToT的应用方法和实例,他们还给出了几个非常简单的通用ToT提示语,就像下面这样: ————————————————