LangChain入门和应用#8 | 豆包MarsCode AI刷题

134 阅读13分钟

提示工程-下

CoT这个概念来源于学术界,是谷歌大脑的Jason Wei等人于2022年在论文《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models(自我一致性提升了语言模型中的思维链推理能力)》中提出来的概念。它提出,如果生成一系列的中间推理步骤,就能够显著提高大型语言模型进行复杂推理的能力。

Few-Shot CoT

Few-Shot CoT 简单的在提示中提供了一些链式思考示例(Chain-of-Thought Prompting),足够大的语言模型的推理能力就能够被增强。简单说,就是给出一两个示例,然后在示例中写清楚推导的过程。

Few-Shot(FS) 是指模型在推理时给予少量样本,但不允许进行权重更新。对于一个典型数据集,Few-shot 有上下文和样例(例如英语句子和它的法语翻译)。Few-shot 的工作方式是提供 K 个样本,然后期望模型生成对应的结果。通常将 K 设置在 10 到 100 的范围内,因为这是可以适应模型上下文窗口的示例数量(nctx = 2048)。Few-shot 的主要优点是大幅度降低了对特定任务数据的需求,并减少了从微调数据集中学习过度狭窄分布。主要缺点是该方法的结果迄今为止远不如最先进的微调模型。此外,仍需要一小部分特定任务的数据。强大的逻辑推理是大语言模型“智能涌现”出的核心能力之一,好像AI有了人的意识一样。而推理能力的关键,在于一个技术——思维链(Chain of Thought,CoT)。

CoT 方法极其简单。CoT 提示过程是一种最近开发的提示方法,它鼓励大语言模型解释其推理过程。思维链的主要思想是通过向大语言模型展示一些少量的 exapmles,在样例中解释推理过程,大语言模型在回答提示时也会显示推理过程。这种推理的解释往往会引导出更准确的结果。

image.png

思维链提示,就是把一个多步骤推理问题,分解成很多个中间步骤,分配给更多的计算量,生成更多的 token,再把这些答案拼接在一起进行求解。

要深入理解这个流程,我们可以从几个关键步骤入手,拆解它的工作原理和背后的技术细节。通过这种方式,我们不仅能清晰地看出如何设计AI的推理流程,还能体会到“思维链”(Chain of Thought,CoT)在引导AI决策中的强大作用。

  1. 问题理解:构建初步框架

当AI接收到用户的需求时,首先要做的是理解问题本身。假设用户告诉我们:“今天要参加朋友的生日派对,想送束花祝福她。”这个信息中包含了几个核心要素:

  • 生日派对的场景
  • 送花这一行为的意图
  • 对花卉的某些要求(如祝福、喜庆等)

为了使AI能够有效地理解并回答类似问题,我们可以设计一个提示模板(prompt),为AI提供思维框架。比如,模板可以是:

遇到XX问题,我先看自己有没有相关知识,有的话,就提供答案;没有,就调用工具搜索,有了知识后再试图解决。

这种模板的作用在于:当AI遇到问题时,它首先判断自己是否有足够的信息来做出回答。如果有,直接回答;如果没有,才会通过信息搜索来填补空白。通过这种方式,AI能更高效地进行问题处理。

  1. 信息搜索:获取相关信息

在理解了问题后,AI会进入到信息收集阶段。对于用户要求送花的情况,AI首先需要判断哪些花卉适合用于生日派对。

例如,AI可以使用搜索工具查询:

  • 哪些花卉在生日派对中常见?
  • 什么花有特别的象征意义(如玫瑰象征爱情,百合象征纯洁与祝福等)?
  • 各种花卉的季节性与时令性(以保证鲜花的新鲜度和可得性)?

AI在这一阶段会广泛地搜索各种花卉相关的知识,从色彩、花语到花卉的适用场景等多方面,获取足够的信息来支持后续的决策。

  1. 决策制定:制定推荐方案

有了足够的信息后,AI需要做出决策。这时,“思维链”就发挥了至关重要的作用。通过思维链的引导,AI会清晰地梳理出推荐方案的步骤。我们可以为AI提供一个决策模板,示例如下:

遇到生日派对送花的情况,我先考虑用户的需求(例如,送祝福、庆祝生日),然后查看鲜花的库存,最后根据花卉的寓意和场景适配性,推荐一些玫瑰、百合、向日葵等花卉,因为这些花通常适合生日派对。

这个思维链的过程确保了AI的推理是一步步、有逻辑的。AI会根据用户的需求来筛选出合适的花卉,再考虑花卉的象征意义和适用场合,最后确保它们在库存中可用,从而作出一个符合用户需求的推荐。

  1. 生成销售列表:生成最终推荐

当AI完成决策后,它就可以生成具体的销售列表。这份列表包含了推荐的花卉种类、每种花的价格,以及购买链接等信息。为了确保生成的销售列表贴近用户需求,AI可以通过精心设计的OutputParser模板,按照以下步骤生成:

  • 按照推荐的顺序列出花卉的名称
  • 提供每种花卉的单价和花束组合
  • 可能还会根据不同花卉的预算需求进行不同的分类推荐(例如高端花束、中等价位、经济型花束等)

这种输出格式不仅能够清晰地展现信息,还能让用户轻松做出购买决策。

Chain of Thought 实战

项目需求:在这个示例中,你正在开发一个AI运营助手,我们要展示AI如何根据用户的需求推理和生成答案。然后,AI根据当前的用户请求进行推理,提供了具体的花卉建议并解释了为什么选择这些建议。

在这个过程中,AI需要理解客户的需求之后,按部就班的思考,然后给出最符合逻辑的回答。

CoT的模板设计

针对这个聊天机器人的需求,我设计了下面这样的思维链模板。

作为一个花店电商助手,我的目标是帮助你根据个人喜好和场景需求做出明智的决策。我会按步骤进行思考:  
​
1. 首先理解你的需求,明确你希望传达的情感或主题。  
2. 然后,我会根据花卉的象征意义、花语、时令等因素进行推荐。  
3. 最后,我将为你提供推荐的花卉,并详细解释每种选择背后的理由。  
​
示例 1:  
人类:我想找一种象征爱情的花。  
AI:我理解你希望找到一束能够传达爱情的花卉。通常,红玫瑰被视为最经典的象征爱情的花,因为它的深红色代表着热烈与激情。与此同时,白玫瑰也常常代表纯洁的爱,而紫罗兰则象征着永恒的爱。如果你特别注重浪漫和激情,我会推荐红玫瑰,它是表达浓烈爱情的完美选择。
​
示例 2:  
人类:我想要一些独特和奇特的花。  
AI:你的需求是希望得到一些不常见且引人注目的花卉。兰花就是一个很好的选择,它不仅有独特的外形和艳丽的色彩,还被认为是奢华与优雅的象征,广泛地被用作高端场合的装饰。如果你喜欢富有异国情调的花卉,兰花无疑会是一个理想选择。
​
示例 3:  
人类:我想送一束春天的花。  
AI:春天通常与生机、希望和新生联系在一起,因此我推荐你选择郁金香、风信子或樱花。郁金香有着丰富的色彩,象征着春天的生机与热情,风信子则代表着春天的清新与愉悦,而樱花则是春天的经典代表,象征着短暂而美丽的生命。根据你的喜好,任何一束都能完美传达春天的气息。

程序的完整代码如下:

# 设置环境变量和API密钥
import os
​
​
def set_api_key():
    os.environ["ZHIPUAI_API_KEY"] = "your api key"
    """Set the ZhipuAI API key from environment variable or prompt the user."""
    if not os.getenv("ZHIPUAI_API_KEY"):
        os.environ["ZHIPUAI_API_KEY"] = input("Enter your ZhipuAI API key: ")
​
​
# 创建聊天模型
from langchain_community.chat_models import ChatZhipuAI
set_api_key()
llm = ChatZhipuAI(model="glm-4", temperature=0.5)
​
# 设定 AI 的角色和目标
role_template = "你是一个为花店电商公司工作的AI助手, 你的目标是帮助客户根据他们的喜好做出明智的决定"# CoT 的关键部分,AI 解释推理过程,并加入一些先前的对话示例(Few-Shot Learning)
cot_template = """
作为一个花店电商助手,我的目标是帮助你根据个人喜好和场景需求做出明智的决策。我会按步骤进行思考:  
​
1. 首先理解你的需求,明确你希望传达的情感或主题。  
2. 然后,我会根据花卉的象征意义、花语、时令等因素进行推荐。  
3. 最后,我将为你提供推荐的花卉,并详细解释每种选择背后的理由。  
​
示例 1:  
人类:我想找一种象征爱情的花。  
AI:我理解你希望找到一束能够传达爱情的花卉。通常,红玫瑰被视为最经典的象征爱情的花,因为它的深红色代表着热烈与激情。与此同时,白玫瑰也常常代表纯洁的爱,而紫罗兰则象征着永恒的爱。如果你特别注重浪漫和激情,我会推荐红玫瑰,它是表达浓烈爱情的完美选择。
​
示例 2:  
人类:我想要一些独特和奇特的花。  
AI:你的需求是希望得到一些不常见且引人注目的花卉。兰花就是一个很好的选择,它不仅有独特的外形和艳丽的色彩,还被认为是奢华与优雅的象征,广泛地被用作高端场合的装饰。如果你喜欢富有异国情调的花卉,兰花无疑会是一个理想选择。
​
示例 3:  
人类:我想送一束春天的花。  
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()
​
# 接收用户的询问,返回回答结果
print("输入的提示为:", prompt)
response = llm.invoke(prompt)
print("模型的回答:", response)

输出为

image.png

Tree of Thought (ToT)

挺喜感的一个框架

思维之树(Tree of Thoughts,简称ToT)框架是一种创新的解决方案,旨在利用大型语言模型进行复杂问题的系统化推理和解决。以下是对您提供的文案的专业回答:

一、ToT框架的提出与发展

ToT框架由Yao和Long等学者在相关论文中提出,其灵感来源于CoT(Chain of Thought)思想。CoT为大模型提供了一种生成更优答案的途径,但在处理需要战略探索或预判的复杂任务时,传统的提示技巧显得力不从心。ToT框架在此基础上进行了扩展,通过引导语言模型构建一棵由连贯语言序列组成的思维树,从而实现问题的逐步解决。

二、ToT框架的核心原理与应用

ToT框架的核心在于让模型具备生成和评估思维的能力,并将其与搜索算法(如广度优先搜索、深度优先搜索)相结合,进行系统性的探索和验证。这种方法在多步骤推理任务中尤为有效。

  1. 定义思维步骤:ToT框架为每个任务定义具体的思维步骤。
  2. 生成候选方案:在每个思维步骤中,提出多个方案,并保留最优的候选方案。
  3. 搜索最优路径:在多条思维路径中搜寻最优的解决方案。

三、ToT框架的优势

  1. 提升问题解决能力:通过观察和评估思维过程,模型能更好地解决问题。
  2. 适用于复杂任务:对于需要深度推理的任务,ToT框架表现出较好的适用性。
  3. 结合先进技术:引入强化学习、集束搜索等技术,提高搜索策略的性能。

四、实例分析

以鲜花运营为例,ToT框架的应用过程如下:

  1. 理解顾客需求:分析顾客购买鲜花的目的及其妻子的喜好。
  2. 考虑鲜花选择:列出符合需求的候选鲜花。
  3. 筛选最佳选择:根据顾客需求,从候选鲜花中筛选出最佳选项。
  4. 给出建议:向顾客提供符合其需求的鲜花建议。

五、总结

ToT框架为解决复杂问题提供了一种新的方法,结合了语言模型的生成能力、搜索算法以及强化学习。通过在具体步骤中产生多条思考路径,ToT框架有助于模型更好地应对新问题或未知情况。此外,将此类实例作为FewShot示例传递给模型,有助于模型学习和实现ToT框架。

本次的分享就进行到这里,下一节我将分享调用模型的相关内容