LangChain 10思维链Chain of Thought一步一步的思考 think step by step

LangChain系列文章

  1. LangChain 实现给动物取名字,
  2. LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
  3. LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
  4. LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  5. LangChain 5易速鲜花内部问答系统
  6. LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
  7. LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
  8. LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
  9. LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt

1. “思维链”(Chain of Thought)

是一种解决复杂问题的方法,特别是在使用人工智能(AI)和大型语言模型如GPT-3或GPT-4时。这种方法涉及将问题的解决过程拆分为一系列逻辑步骤或“思维链条”,使得AI模型能够更有效地处理和解答复杂的问题。

思维链的关键要素

  1. 逐步解析:将复杂问题分解为更易处理的小步骤。
  2. 透明的逻辑:明确每一步的推理过程,以便于理解和验证。
  3. 连贯性:确保每一步的推理都基于前一步的结论,保持思维的连贯性。
    在这里插入图片描述
    代码实现 chat_lang_chain_of_thought.py (代码参考了黄佳老师的课程Demo,如需要知道代码细节请读原文)
# 导入Langchain库中的OpenAI模块,该模块提供了与OpenAI语言模型交互的功能
from langchain.llms import OpenAI  # 导入Langchain库中的PromptTemplate模块,用于创建和管理提示模板
from langchain.prompts import PromptTemplate  # 导入Langchain库中的LLMChain模块,它允许构建基于大型语言模型的处理链
from langchain.chains import LLMChain  # 导入dotenv库,用于从.env文件加载环境变量,这对于管理敏感数据如API密钥很有用
from dotenv import load_dotenv  # 导入Langchain库中的ChatOpenAI类,用于创建和管理OpenAI聊天模型的实例。
from langchain.chat_models import ChatOpenAI# 调用dotenv库的load_dotenv函数来加载.env文件中的环境变量。
# 这通常用于管理敏感数据,如API密钥。
load_dotenv()  # 创建一个ChatOpenAI实例,配置它使用gpt-3.5-turbo模型,
# 设定温度参数为0.7(控制创造性的随机性)和最大令牌数为60(限制响应长度)。
llm = ChatOpenAI(model="gpt-3.5-turbo",temperature=0.7,max_tokens=500
)# 从langchain库导入所需的类。
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate# 定义一个固定模板,描述AI作为水果电商公司助手的角色。
# 这是对AI预期功能的直接描述。
rote_template = "你是一个为水果电商公司工作的AI助手, 你的目标是帮助客户根据他们的喜好做出明智的决定"# 使用固定模板创建一个SystemMessagePromptTemplate对象。
system_prompt_role = SystemMessagePromptTemplate.from_template(rote_template)# 定义一个思维链(COT)模板。此模板提供了更详细的处理方法,
# 包括AI如何处理和响应请求的示例。
cot_template = """
作为一个为水果电商公司工作的AI助手,我的目标是帮助客户根据他们的喜好做出明智的决定。 我会按部就班的思考,先理解客户的需求,然后考虑各种水果的涵义,最后根据这个需求,给出我的推荐。
同时,我也会向客户解释我这样推荐的原因。示例 1:人类:我想找一种象征爱情的水果。AI:象征爱情的水果之一是草莓。草莓以其鲜艳的红色和心形外观,成为爱情的象征,通常与浪漫和情感联系在一起。因此,考虑到这一点,我会推荐草莓。草莓心形外观:草莓的心形轮廓与爱情的传统符号——心形——相吻合,使其成为爱情的自然象征。鲜艳的红色:草莓的红色在许多文化中与激情和爱情联系在一起,象征着热情和浓烈的感情。甜美的味道:草莓的甜味象征着爱情的甜蜜和愉悦。这是你在寻找的。示例 2:人类:我想要一些独特和奇特的水果。AI:从你的需求中,一种独特和奇特的水果是“火龙果”。这种水果以其独特的外观和口感而闻名,通常具有明亮的粉红色皮肤和点缀着黑色种子的白色或红色果肉。因此,我建议你考虑火龙果。火龙果独特性:火龙果的外形和味道与众不同,为寻求新奇体验的水果爱好者提供了完美选择。而且,火龙果视觉吸引力:其鲜艳的颜色和特殊的形状在视觉上吸引人,常常成为餐桌上的焦点。也可能会吸引你。
"""# 使用COT模板创建一个SystemMessagePromptTemplate对象。
system_prompt_cot = SystemMessagePromptTemplate.from_template(cot_template)# 定义一个人类输入的模板。
human_template = "{human_input}"
# 使用人类输入模板创建一个HumanMessagePromptTemplate对象。
human_prompt = HumanMessagePromptTemplate.from_template(human_template)# 将系统角色、COT和人类输入模板组合成一个聊天提示模板。
chat_prompt = ChatPromptTemplate.from_messages([system_prompt_role, system_prompt_cot, human_prompt])# 用特定的人类输入格式化聊天提示,关于为喜欢不甜、浪漫水果的女朋友购买水果。
prompt = chat_prompt.format_prompt(human_input="我想要为我的女朋友购买水果。她喜欢不是很甜的,并且浪漫的水果。你有什么建议吗?").to_messages()# 使用格式化的提示从语言模型(llm)生成响应。
response = llm(prompt)
# 打印语言模型生成的响应。
print(response)

执行结果:

zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/textAndChat) ✗ ❯ python chat_lang_chain_of_thought.py
content='根据你的描述,我会推荐给你的女朋友购买蓝莓。蓝莓具有浪漫的紫色外观和淡淡的甜味,适合喜欢不太甜的人。蓝莓富含抗氧化剂和维生素C,对健康有益。此外,蓝莓还被视为象征着智慧和神秘感的水果,可能会增加一些浪漫氛围。你可以考虑购买一些新鲜的蓝莓来给你的女朋友一个惊喜。'
zgpeaces-MBP at ~/Workspace/LLM/langchain-llm-app ±(feature/textAndChat) ✗ ❯ python chat_lang_chain_of_thought.py
content='根据您的描述,您的女朋友喜欢不是很甜的水果,并且希望选择浪漫的水果。基于这些偏好,我建议您考虑购买葡萄和柚子。\n\n葡萄是一种不是很甜的水果,尤其是红葡萄。它们通常具有一定的酸度,同时也有一种浪漫的氛围。您可以选择有着鲜艳颜色和丰富口感的红葡萄。\n\n柚子也是一种不是很甜的水果,有些品种甚至具有一定的酸度。柚子的外观呈现出典雅的黄色和橙色,与浪漫的氛围相得益彰。\n\n这两种水果既满足了她喜欢不是很甜的需求,又具备一些浪漫的元素。最重要的是,您可以选择新鲜的、高质量的葡萄和柚子,以确保她能够享受到最好的水果体验。'

Zero-shot Chain of Thought

Zero-Shot Chain of Thought 中,你只要简单地告诉模型“让我们一步一步的思考(Let’s think step by step)”, 或者“请一步一步思考 step by step”,模型就能够给出更好的答案!

「Zero-shot Chain of Thought」指的是AI在面对一个全新的任务时,不仅能尝试解决它,而且还能展示其解题的思考过程。这种能力特别重要,因为它意味着AI可以处理它从未特别训练过的问题,并以一种易于理解和跟踪的方式展示其推理过程。

举个例子
假设你问AI:“一辆公交车在早上8点出发,速度为40公里/小时,目的地距离100公里,它什么时候到达?”在「Zero-shot Chain of Thought」的情况下,AI会直接开始解决这个问题,即使它以前没有特别针对这类问题进行训练。它不仅会告诉你答案是“早上10点”,还会展示它的计算过程,比如解释公交车需要2.5小时才能到达目的地。

为什么重要
这种方法对于提高AI的通用性和可解释性非常重要。它使得AI能够更自然地模拟人类的思考过程,并向用户清晰地展示如何得出特定的结论,这在教育、解释复杂问题或需要透明决策过程的场景中尤其有价值。

在这里插入图片描述

思维树Tree of Thoughts

在通常的CoT(思维链)方法中,LLMs倾向于在解决问题时线性地思考,如果出现错误,它们倾向于沿着错误的标准继续前进。

相比之下,在ToT(思维树)方法中,LLMs在每个思维阶段评估自己,并及早停止低效的方法,转而采用替代方法。
在这里插入图片描述
在这里插入图片描述

代码

  • https://github.com/zgpeace/pets-name-langchain/tree/feature/textAndChat
  • https://github.com/huangjia2019/langchain/tree/main/03_%E6%A8%A1%E5%9E%8BIO

参考

https://python.langchain.com/docs/modules/model_io/

参考

  • https://platform.openai.com/docs/guides/prompt-engineering

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/218806.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

brat文本标注工具——安装

目录 一、Linux系统安装 1. centOS系统 2. Ubuntu系统 3. macOS系统 4.说明 二、Google Chrome安装 1. 打开命令行,切换到管理者权限 2. 安装依赖 3. 下载Google浏览器的安装包 4. 安装Google Chrome 三、yum更新 四、Apache安装 安装Apache 启动Apac…

Linux操作系统之apt常用命令记录

文章目录 apt 命令apt 语法apt 常用命令列出所有可更新的软件清单命令升级软件包列出可更新的软件包及版本信息升级软件包,升级前先删除需要更新软件包安装指定的软件命令:安装多个软件包:更新指定的软件命令显示软件包具体信息,例如&#xf…

突破技术障碍:软件工程师如何应对项目中的难题?

在软件开发项目中,工程师常常会遇到各种技术难题。这些难题可能涉及到复杂的算法、不兼容的系统、难以预见的软件行为,或者其他许多方面。 以下是一些策略和方法,可以帮助软件工程师有效地应对这些挑战: 1、理解问题:…

MATLAB在信号系统中的应用

1.产生一个幅度为1, 基频为2Hz,占空比为50%的周期方波.要求画出图形。 在MATLAB中,函数square(w0*t, DUTY)产生基本频率为w0 (周期T2*pi/w0)、占空比DUTY (τ/T)*100的周期矩形波(方波),默认情况下占空比DUTY50。占空…

第十九章 解读利用pytorch可视化特征图以及卷积核参数(工具)

介绍一种可视化feaature maps以及kernel weights的方法 推荐可视化工具TensorBoard:可以查看整个计算图的数据流向,保存再训练过程中的损失信息,准确率信息等 学习视频: 使用pytorch查看中间层特征矩阵以及卷积核参数_哔哩哔哩…

二进制数据转换成十六进制表示 binascii.hexlify()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 二进制数据转换成十六进制表示 binascii.hexlify() 选择题 binascii.hexlify()参数的数据类型可以是? import binascii number 11 byte_data number.to_bytes() hex_data bin…

【如何学习Python自动化测试】—— Python 的 unittest 框架

10 、Python 的 unittest 框架 10.1 Unittest 框架介绍 Unittest是Python语言中的一种测试框架,是Python标准库中的一个模块。它可以帮助开发者编写自动化测试,可以进行单元测试、集成测试、功能测试等各种类型的测试。 Unittest的特点是简单易学&#…

使用Pytorch从零开始构建Conditional PixelCNN

条件 PixelCNN PixelCNN 是 PixelRNN 的卷积版本,它将图像中的像素视为一个序列,并在看到前面的像素后预测每个像素(定义如上和左,尽管这是任意的)。PixelRNN 是图像联合先验分布的自回归模型: p ( x ) …

【UCAS自然语言处理作业二】训练FFN, RNN, Attention机制的语言模型,并计算测试集上的PPL

文章目录 前言前馈神经网络数据组织Dataset网络结构训练超参设置 RNN数据组织&Dataset网络结构训练超参设置 注意力网络数据组织&Dataset网络结构Attention部分完整模型 训练部分超参设置 结果与分析训练集Loss测试集PPL 前言 本次实验主要针对前馈神经网络&#xff0…

C++类与对象(中)

🎉个人名片: 🐼作者简介:一名乐于分享在学习道路上收获的大二在校生🐻‍❄个人主页🎉:GOTXX🐼个人WeChat:ILXOXVJE🐼本文由GOTXX原创,首发CSDN&am…

使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步

背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能,就像大数据领域里有离线计算和实时计算, ETLCloud 还提供了基于 CDC (Change Data Capture)的实时数据集成功能:实时数据集成是指通过变化数据捕获技术&#…

Nginx反向代理实现负载均衡webshell

目录 本实验所用的环境: 问题一:由于nginx采用的反向代理是轮询的方式,所以上传文件必须在两台后端服务器的相同位置上传相同的文件 问题二:我们在执行命令时,无法知道下次的请求交给哪台机器去执行我们在执行hostn…