LangChain系列文章
- LangChain 实现给动物取名字,
- LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字
- LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄
- LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
- LangChain 5易速鲜花内部问答系统
- LangChain 6根据图片生成推广文案HuggingFace中的image-caption模型
- LangChain 7 文本模型TextLangChain和聊天模型ChatLangChain
- LangChain 8 模型Model I/O:输入提示、调用模型、解析输出
- LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
1. “思维链”(Chain of Thought)
是一种解决复杂问题的方法,特别是在使用人工智能(AI)和大型语言模型如GPT-3或GPT-4时。这种方法涉及将问题的解决过程拆分为一系列逻辑步骤或“思维链条”,使得AI模型能够更有效地处理和解答复杂的问题。
思维链的关键要素
- 逐步解析:将复杂问题分解为更易处理的小步骤。
- 透明的逻辑:明确每一步的推理过程,以便于理解和验证。
- 连贯性:确保每一步的推理都基于前一步的结论,保持思维的连贯性。
代码实现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