首页 > 其他分享 >Langchain-提示工程

Langchain-提示工程

时间:2024-11-08 19:14:56浏览次数:3  
标签:思维 CoT 工程 示例 提示 模型 Langchain AI 推理

今天我们来尝试用思维链也就是CoT(Chain of Thought)的概念来引导模型的推理,让模型生成更详实、更完备的文案

什么是 Chain of Thought

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示例,但是图左只给出了答案,而图右则在OneShot示例中给出了解题的具体思路。结果,只给出了答案的模型推理错误,而给出解题思路后,同一个模型生成了正确的答案。

在三种大型语言模型的实验中,CoT在一系列的算术、常识和符号推理任务中都提高了性能。在GSM8K数学问题基准测试中,通过CoT指导后,大模型的表现可以达到当时最先进的准确性。

CoT从概念上非常容易理解,从应用上非常容易操作。虽然简单,但这种思想可以给我们的开发过程带来很多启发。

比如,假设我们正在开发一个AI花店助手,它的任务是帮助用户选择他们想要的花,并生成一个销售列表。在这个过程中,我们可以使用CoT来引导AI的推理过程。

? 整体指导:你需要跟着下面的步骤一步步的推理。

  1. 问题理解:首先,AI需要理解用户的需求。例如,用户可能会说:“今天要参加朋友的生日Party,想送束花祝福她。”我们可以给AI一个提示模板,里面包含示例:“遇到XX问题,我先看自己有没有相关知识,有的话,就提供答案;没有,就调用工具搜索,有了知识后再试图解决。”—— 这就是给了AI一个思维链的示例。  
  2. 信息搜索:接下来,AI需要搜索相关信息。例如,它可能需要查找哪些花最适合生日派对。  
  3. 决策制定:基于收集到的信息,AI需要制定一个决策。我们可以通过思维链让他详细思考决策的流程,先做什么后做什么。例如,我们可以给它一个示例:“遇到生日派对送花的情况,我先考虑用户的需求,然后查看鲜花的库存,最后决定推荐一些玫瑰和百合,因为这些花通常适合生日派对。”—— 那么有了生日派对这个场景做示例,大模型就能把类似的思维流程运用到其它场景。  
  4. 生成销售列表:最后,AI使用OutputParser生成一个销售列表,包括推荐的花和价格。

在这个过程中,整体上,思维链引导AI从理解问题,到搜索信息,再到制定决策,最后生成销售列表。这种方法不仅使AI的推理过程更加清晰,也使得生成的销售列表更加符合用户的需求。具体到每一个步骤,也可以通过思维链来设计更为详细的提示模板,来引导模型每一步的思考都遵循清晰准确的逻辑。

其实LangChain的核心组件Agent的本质就是进行好的提示工程,并大量地使用预置的FewShot和CoT模板。这个在之后的课程学习中我们会理解得越来越透彻。

Zero-Shot CoT

下面的这两个CoT提示模板的例子,来自于Google Research和东京大学的论文《大语言模型是零样本推理者》。

图中的(d)示例非常非常有意思,在Zero-Shot CoT中,你只要简单地告诉模型“让我们一步步的思考(Let's think step by step)”,模型就能够给出更好的答案!

这不由得让我联想起最简单的提示工程,角色设定——模型回答之前,先告诉它“你是一个很有经验的XX专家”,模型应该就会在开始胡说八道之前三思。

简单总结一下:Few-Shot CoT,指的就是在带有示例的提示过程中,加入思考的步骤,从而引导模型给出更好的结果。而Zero-Shot CoT,就是直接告诉模型要一步一步地思考,慢慢地推理。

Chain of Thought 实战 

 

现在,就让我带着你完成一次Chain of Thought的LangChain应用开发实战。

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

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

CoT的模板设计

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

 

作为一个为花店电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。  

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

同时,我也会向客户解释我这样推荐的原因。  

示例 1:

人类:我想找一种象征爱情的花。

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

示例 2:

人类:我想要一些独特和奇特的花。

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

 

AI的模板开始于对其角色的阐述,并给出了一些先前的对话示例(Few-Shot Learning)来帮助AI理解如何处理这种类型的请求。这些示例展示了AI如何根据思维链进行思考,给出深思熟虑之后的答案。

程序的完整框架 

完整代码如下:

# 设置环境变量和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)

程序中,首先设置环境变量OpenAI的API密钥,以便能够使用OpenAI的GPT-4模型。然后创建聊天模型:通过调用 ChatOpenAI 类,创建了一个聊天模型。设置 temperature=0 可以让模型生成更确定性的回答,即输出更倾向于最可能的结果。

接着定义了AI的角色和目标,该AI为花店电商公司的助手,其目标是根据客户的喜好来提供购买建议。紧接着,定义 CoT 模板,其中包括了AI的角色和目标描述、思考链条以及遵循思考链条的一些示例,显示了AI如何理解问题,并给出建议。

之后,我使用了PromptTemplate的from_template方法,来生成相应的询问模板。其中包括用于指导模型的SystemMessagePromptTemplate和用于传递人类问题的HumanMessagePromptTemplate。

然后,我使用了ChatPromptTemplate.from_messages方法,整合上述定义的角色,CoT模板和用户询问,生成聊天提示。

最后,将生成的聊天提示输入模型中,获得模型的回答,并打印出来。

在Few-Shot CoT提示的指引之下,模型针对我们的问题,从问题中的具体需求出发,返回了不错的建议。

现在,根据你的需求:你正在寻找你的女朋友喜欢的粉色和紫色的花。

首先,我从理解你的需求出发,只会推荐粉色或紫色,或者两者的组合的花。这些可能包括粉色的玫瑰,紫色的兰花,或者是粉色和紫色的花的混合花束。玫瑰是象征爱情和亲情的经典符号,而兰花象征着美丽和力量。这两种花都蕴含很棒的内涵。当然了,无论你选择哪种花卉,重要的是表达出你对她的爱和关心。记得附上一张温馨的贺卡,写下你的真挚祝福。

Tree of Thought 

 

CoT这种思想,为大模型带来了更好的答案,然而,对于需要探索或预判战略的复杂任务来说,传统或简单的提示技巧是不够的。基于CoT的思想,Yao和Long等人几乎在同一时间在论文《思维之树:使用大型语言模型进行深思熟虑的问题解决》和《大型语言模型指导的思维之树》中,进一步提出了思维树(Tree of Thoughts,ToT)框架,该框架基于思维链提示进行了总结,引导语言模型探索把思维作为中间步骤来解决通用问题。

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

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

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

下面我们应用ToT的思想,给出一个鲜花运营方面的示例。

假设一个顾客在鲜花网站上询问:“我想为我的妻子购买一束鲜花,但我不确定应该选择哪种鲜花。她喜欢淡雅的颜色和花香。”  

AI(使用ToT框架):  

思维步骤1:理解顾客的需求。

顾客想为妻子购买鲜花。

顾客的妻子喜欢淡雅的颜色和花香。  

思维步骤2:考虑可能的鲜花选择。

候选1:百合,因为它有淡雅的颜色和花香。

候选2:玫瑰,选择淡粉色或白色,它们通常有花香。

候选3:紫罗兰,它有淡雅的颜色和花香。

候选4:桔梗,它的颜色淡雅但不一定有花香。

候选5:康乃馨,选择淡色系列,它们有淡雅的花香。  

思维步骤3:根据顾客的需求筛选最佳选择。

百合和紫罗兰都符合顾客的需求,因为它们都有淡雅的颜色和花香。

淡粉色或白色的玫瑰也是一个不错的选择。

桔梗可能不是最佳选择,因为它可能没有花香。

康乃馨是一个可考虑的选择。  

思维步骤4:给出建议。

“考虑到您妻子喜欢淡雅的颜色和花香,我建议您可以选择百合或紫罗兰。淡粉色或白色的玫瑰也是一个很好的选择。希望这些建议能帮助您做出决策!”

 

这个例子,可以作为FewShot示例之一,传递给模型,让他学着实现ToT。

通过在具体的步骤中产生多条思考路径,ToT 框架为解决复杂问题提供了一种新的方法,这种方法结合了语言模型的生成能力、搜索算法以及强化学习,以达到更好的效果。

 

 

 

标签:思维,CoT,工程,示例,提示,模型,Langchain,AI,推理
From: https://blog.csdn.net/m0_73302939/article/details/143633463

相关文章

  • 访问浪潮带外BMC界面的远程控制台重定向(KVM)无法访问,提示JViewer未签名,mac电脑安装JD
    报错截图:安装JDK8下载JDK1.8的安装包JavaDownloads|Oracle下载的安装包双击按提示流程安装:按照完成以后、我们可以查看JDK的安装路径、在资源库/Library下面会出现一个Java的文件夹、目录层级如下:/Library/Java/JavaVirtualMachines/jdk-1.8.jdk打开终端窗口按快......
  • 人工智能岩土工程+PFC离散元仿真模拟应用(入门+案例实操)
    在深度学习与岩土工程融合的背景下,科研的边界持续扩展,创新成果不断涌现。从基本物理模型的构建到岩土工程问题的复杂模拟,从数据驱动的分析到工程问题的智能解决,深度学习正以前所未有的动力推动岩土工程领域的革新。据调查,目前在岩土工程领域内,深度学习的应用主要集中在以下几个......
  • 如何从Java工程师成长为架构师?
    程序员进阶关于普通程序员的进阶之路,网上的学习路线与理论说辞一抓一大把。在小编看来优秀工程师的成长之路就是一条不断打怪升级之路,Java入行容易精通难,需要能力也需要运气。相信很多的Java程序员在自己的进阶之路上都有遇到以下几个方面的问题却不知道如何解决,也没有一个好......
  • 软件工程中的创建型设计模式:工厂方法模式与抽象工厂模式
    目录1.工厂方法模式(FactoryMethodPattern)1.1核心概念1.2应用场景1.3优点2.抽象工厂模式(AbstractFactoryPattern)2.1核心概念2.2应用场景2.3优点3.联系与区别4.拓展知识5.结语        在软件工程领域,我们经常探讨如何通过设计模式来提高代码......
  • RTT_t2 提示Expected to be given a valid DLL
    软件:RTT_t2 V2.60环境:WIN1064bit安装好RTT_t2后,运行软件出现以下错误:Traceback(mostrecentcalllast):File"rtt_t2.py",line1304,in<module>File"rtt_t2.py",line1041,inmainFile"bds\bds_jlink.py",line15,in__init__......
  • 电脑提示d3dcompiler_47.dll缺失怎么解决?五种方法快速修复存在问题!
    d3dcompiler_47.dll是微软DirectX软件组件套件中的一个动态链接库(DLL)文件,扮演着至关重要的角色。DirectX是微软开发的一套用于多媒体应用,特别是游戏和高级图形处理的应用程序接口(API)。d3dcompiler_47.dll特别与Direct3D子系统相关,负责编译和优化用于Direct3D的着色器......
  • spring6初体验(一、新建spring framework工程)
     初学spring6,最重要的是新建一个项目。本次工程使用IDEA2024编译器软件,同过maven进行构建。此博客可以创建多个spring项目(重复三过程),是多项目的创建方式一、准备一个空项目。二、为项目设置SDK点击文件选择项目设置,设置你的SDK 三、正式创建spring61.选择新建......
  • 从菜鸟到专家,网络安全工程师必备证书,如何报考?
    网络空间的竞争,归根结底是人才的竞争。在2022年网络安全周上,《网络安全人才实战能力白皮书》正式发布。数据显示,到2027年,我国网络安全人员缺口将达327万,而高校人才培养规模仅为3万/年。那么,如果你想要进入人才稀缺的网络安全行业,从一名菜鸟成长为一位“老司机”,都要考哪些......
  • 网站出现不安全提示怎么解除
    当您的网站出现风险提示时,这通常意味着网站的安全设置存在问题,或者未满足浏览器的安全标准。为了解除这些风险提示,您需要按照以下步骤进行,并了解SSL证书的申请流程。一、解除网站风险提示的步骤检查SSL证书首先,您需要确认网站是否已安装SSL证书。如果已安装,请检查证书的有效性......
  • 基于springboot+vue.js+uniapp小程序的湖南交通工程学院学生就业信息系统附带文章源码
    文章目录前言详细视频演示具体实现截图核心技术介绍后端框架SpringBoot前端框架Vue持久层框架MyBaits为什么选择我代码参考数据库参考测试用例参考源码获取前言......