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
- LangChain 10思维链Chain of Thought一步一步的思考 think step by step
- LangChain 11实现思维树Implementing the Tree of Thoughts in LangChain’s Chain
- LangChain 12调用模型HuggingFace中的Llama2和Google Flan t5
- LangChain 13输出解析Output Parsers 自动修复解析器
Chain 链
单独使用LLM对于简单的应用程序来说是可以的,但更复杂的应用程序需要将LLM链接在一起 - 要么彼此链接,要么与其他组件链接。
LangChain提供了两个高级框架用于“链接”组件。传统方法是使用Chain接口。更新的方法是使用LangChain表达语言 LangChain Expression Language(LCEL)。在构建新应用程序时,我们建议使用LCEL进行链条组合。但我们继续支持一些有用的内置Chain,因此我们在这里记录了两个框架。正如我们将在下面提到的,Chain也可以自身在LCEL中使用,因此两者并不是互斥的。
Sequential Chain 顺序链
在调用语言模型之后的下一步是对语言模型进行一系列的调用。当您希望将一个调用的输出作为另一个调用的输入时,这将特别有用。
推荐的方法是使用LangChain表达语言。传统的方法是使用SequentialChain,我们在这里继续为了向后兼容性而记录。
举个玩具例子,假设我们想创建一个链,首先创建一个剧情梗概,然后根据梗概生成一篇剧评。
这段代码使用了 Langchain 库来创建一个复杂的处理链(chain),用于生成剧作家的剧本梗概和对该剧本的评论。它结合了多个提示模板、ChatOpenAI(OpenAI的聊天模型)和输出解析器。以下是对每一行代码的注释解释:
代码文件 Chain/chat_sequential.py
# 导入 ChatOpenAI 类,用于与 OpenAI 聊天模型进行交互。
from langchain.chat_models import ChatOpenAI # 导入 PromptTemplate 模块,用于创建和管理提示模板。
from langchain.prompts import PromptTemplate # 导入 PydanticOutputParser,用于将输出解析为 Pydantic 模型。
from langchain.output_parsers import PydanticOutputParser# 导入 Pydantic 的 BaseModel 类和 Field 函数,用于定义数据模型。
from langchain.pydantic_v1 import BaseModel, Field
from typing import List# 导入 dotenv 库,用于从 .env 文件加载环境变量,管理敏感数据如 API 密钥。
from dotenv import load_dotenv # 调用 load_dotenv 函数来加载 .env 文件中的环境变量。
load_dotenv() # 创建剧本梗概的提示模板。
synopsis_prompt = PromptTemplate.from_template("""你是一位剧作家。根据剧名,你的工作是为该剧写一个梗概。
剧名:{title}
剧作家:这是上面剧的一个梗概:
"""
)# 创建剧评的提示模板。
review_prompt = PromptTemplate.from_template("""您是《纽约时报》的一位戏剧评论家。根据该剧的剧情简介,您的工作是为该剧撰写评论。
剧情简介:
{synopsis}
来自纽约时报戏剧评论家的评论:
"""
)# 导入 StrOutputParser,用于解析字符串输出。
from langchain.schema import StrOutputParser# 创建一个 ChatOpenAI 实例。
llm = ChatOpenAI()# 创建处理链的两个部分:一个生成剧本梗概,另一个生成剧评。
# 使用 `|` 运算符将提示、模型和输出解析器连接起来。
from langchain.schema.runnable import RunnablePassthrough# 创建生成剧本梗概的处理链。
synopsis_chain = synopsis_prompt | llm | StrOutputParser()# 创建生成剧评的处理链。
review_chain = review_prompt | llm | StrOutputParser()# 将两个处理链组合起来。
chain = {"synopsis": synopsis_chain} | RunnablePassthrough.assign(review=review_chain)# 使用处理链生成对特定剧本标题的梗概和评论。
response = chain.invoke({"title": "海滩上日落时的悲剧"})# 打印出生成的响应。
print(response)
运行结果
zgpeace at zgpeaces-MBP in ~/Workspace/LLM/langchain-llm-app (develop●) (.venv)
$ python Chain/chat_sequential.py
{'synopsis': '《海滩上日落时的悲剧》是一个关于爱、失去和悲伤的故事。故事发生在一个风景如画的海滩上,当夕阳渐渐西沉时,一段悲剧也随之展开。\n\n主人公是一个年轻而富有活力的女孩,名叫莉莉。她是一个心怀梦想的艺术家,热爱描绘大自然的美丽。每天黄昏时分,她来到海滩上观赏日落,用画笔记录下这些壮丽的景色。\n\n在一天的黄昏,莉莉邂逅了一个神秘而迷人的男子,名叫亚历克斯。他是一个沉默寡言的人,但他的眼神中透露出深深的痛苦和孤独。莉莉被他的神秘感所吸引,两人开始渐渐接近。\n\n然而,就在他们彼此倾心之际,亚历克斯的过去被揭示出来。原来,他曾经是一名成功的艺术家,但在创作巅峰期突然失去了灵感。失落和绝望使他逐渐放弃了自己的才华和梦想,变得沉默寡言。\n\n亚历克斯的过去逐渐侵蚀了他们之间的美好,莉莉感到越来越无助和困惑。她试图帮助亚历克斯重新找回自己的激情,但一切都显得无济于事。\n\n最终,在海滩上日落时,亚历克斯离开了莉莉,他深深地爱着她,但他觉得自己不再配得上她的爱。莉莉痛苦地看着他离去,泪水止不住地流淌。\n\n《海滩上日落时的悲剧》讲述了一个关于爱和艺术的故事,探讨了梦想的失去和追求的意义。它让观众思考,当遇到挫折和痛苦时,我们是否能够重新点燃内心的火焰,继续追逐梦想。', 'review': '《海滩上日落时的悲剧》通过讲述一个关于爱和艺术的故事,探讨了梦想的失去和追求的意义。剧中的角色们都面临着挫折和痛苦,他们的故事引发观众对于自己的生活和梦想的思考。当遇到困难时,我们是否能够重新点燃内心的火焰,继续追逐梦想呢?\n\n该剧的剧情简单而引人入胜,情感的描写令人动容。演员们的表演准确传达了角色们内心的痛苦和希望,使观众们可以更好地理解他们的情感。此外,剧中的舞美设计和音乐也将观众带入了一个富有诗意和梦幻的海滩世界。\n\n总的来说,《海滩上日落时的悲剧》是一部令人难以忘怀的戏剧作品,它引发了观众对于爱、失去和梦想的思考。无论是艺术爱好者还是普通观众,都能从中获得深刻的共鸣和启发。'}
代码
https://github.com/zgpeace/pets-name-langchain/tree/develop
参考
https://python.langchain.com/docs/modules/chains/foundational/sequential_chains