Langchain 的 SimpleSequentialChain 和 SequentialChain

Langchain 的 SimpleSequentialChain 和 SequentialChain

  • [1. SimpleSequentialChain](#1. SimpleSequentialChain)
  • [2. SequentialChain](#2. SequentialChain)
  • [3. Memory in Sequential Chains](#3. Memory in Sequential Chains)

1. SimpleSequentialChain

调用语言模型后的下一步是对语言模型进行一系列调用。当您想要获取一个调用的输出并将其用作另一个调用的输入时,这特别有用。

在本笔记本中,我们将通过一些示例来说明如何使用顺序链来执行此操作。顺序链允许您连接多个链并将它们组成执行某些特定场景的管道。顺序链有两种类型:

  • SimpleSequentialChain :顺序链的最简单形式,其中每个步骤都有一个单一的输入/输出,并且一个步骤的输出是下一步的输入。
  • SequentialChain :更通用的顺序链形式,允许多个输入/输出。

示例代码,

import os
import openai

from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file
os.environ['OPENAI_API_KEY'] = os.environ['OPENAI_API_KEY']
os.environ['OPENAI_API_BASE'] = os.environ['OPENAI_API_BASE']
openai.api_key = os.environ['OPENAI_API_KEY']
openai.api_base = os.environ['OPENAI_API_BASE']

import warnings
warnings.filterwarnings('ignore')

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# 这是一个为一个剧本写大纲的 LLMChain
llm = OpenAI(temperature=.7)
template = """您是一位剧作家。给定剧本的标题后,您的任务是为该剧本写一个大纲。

标题: {标题}
剧作家: 这是上述剧本的大纲:"""
prompt_template = PromptTemplate(input_variables=["标题"], template=template)
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template)

# 这是一个 LLMChain,用于给定剧本大纲撰写剧评。
llm = OpenAI(temperature=.7)
template = """您是《纽约时报》的剧评人。给定剧本大纲后,您的任务是为该剧本写一篇评论。

剧本大纲:
{剧本大纲}
《纽约时报》剧评人对上述剧本的评论:"""
prompt_template = PromptTemplate(input_variables=["剧本大纲"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template)

# 这是我们依次运行这两条链的整体链。
from langchain.chains import SimpleSequentialChain
overall_chain = SimpleSequentialChain(chains=[synopsis_chain, review_chain], verbose=True)

review = overall_chain.run("夕阳下的海滩悲剧")

输出结果,

> Entering new SimpleSequentialChain chain...
 好的,我来尝试为标题"夕阳下的海滩悲剧"写一个大纲:

第一幕:
故事开场在一个阳光明媚的海滩上。主人公Tom是一个年轻的游客,他独自一人来到这个海滩休闲度假。在游览的时候,他遇到了一个名叫Lily的女孩,两人一见钟情,开始惺惺相惜。 

第二幕:
Tom和Lily在一起渡过了快乐的一天,两人坠入爱河。当太阳慢慢落山,天空变成一片火红时,他们依偎在一起说着甜蜜的情话。这时,一个不速之客Jack出现了,原来他是Lily的前男友,还对她念念不忘。

第三幕:  
Jack强行向Lily表白,要求复合。Lily拒绝了他,但Jack变得暴躁起来。他用刀威胁Lily,如果她不跟他走,就会伤害Tom。Lily为了保护Tom,只能含泪和Jack离开。Tom痛苦欲绝,他失魂落魄地留在海滩上,夕阳西下,映衬得他的身影无比落寞。

结局:
这个惊天动地的悲剧,就这样在夕阳下的海滩上落幕。爱成憾,人生如戏,Tom和Lily的命运让人唏嘘不已。
 亲爱的读者,

我刚读完了这出题为《夕阳下的海滩悲剧》的剧本大纲,不得不说,这是一出情感强烈、结构紧凑的悲剧。作者通过三段简单的剧情,勾勒出了人生跌宕起伏的无奈。

开场海滩的明媚阳光,预示着一段美好爱情的萌芽。Tom和Lily的邂逅恰如春日里两颗心的相遇。然而好景不长,Jack的出现无疑是这个温馨爱情的伏笔。他的暴力与恐吓,让Lily作出了牺牲小我、完成大我的抉择。虽然生命没有受到伤害,但爱情已如霜打的茄子般落了色。Tom的绝望与无助,成为这个悲剧最触目惊心之处。

在结尾处,作者用朦胧的夕阳与落寞的身影,传达出别离的悲凉。这种浪漫主义手法使人动容。尽管剧情略显夸张,但它折射出的东西却异常真实:在黑暗面前,爱情是多么脆弱,人生是多么无常。

总体而言,这是一出略显老套但出色把控情感的悲剧。它以简练的笔触勾勒人性光明与阴暗的对峙,让人思索人生的意义。我给予这个剧本高度评价,它值得被搬上舞台演绎。如果国内有制作者对此感兴趣,我很期待能看到它以完整的戏剧形式呈现。

> Finished chain.

示例代码,

print(review)

输出结果,

 亲爱的读者,

我刚读完了这出题为《夕阳下的海滩悲剧》的剧本大纲,不得不说,这是一出情感强烈、结构紧凑的悲剧。作者通过三段简单的剧情,勾勒出了人生跌宕起伏的无奈。

开场海滩的明媚阳光,预示着一段美好爱情的萌芽。Tom和Lily的邂逅恰如春日里两颗心的相遇。然而好景不长,Jack的出现无疑是这个温馨爱情的伏笔。他的暴力与恐吓,让Lily作出了牺牲小我、完成大我的抉择。虽然生命没有受到伤害,但爱情已如霜打的茄子般落了色。Tom的绝望与无助,成为这个悲剧最触目惊心之处。

在结尾处,作者用朦胧的夕阳与落寞的身影,传达出别离的悲凉。这种浪漫主义手法使人动容。尽管剧情略显夸张,但它折射出的东西却异常真实:在黑暗面前,爱情是多么脆弱,人生是多么无常。

总体而言,这是一出略显老套但出色把控情感的悲剧。它以简练的笔触勾勒人性光明与阴暗的对峙,让人思索人生的意义。我给予这个剧本高度评价,它值得被搬上舞台演绎。如果国内有制作者对此感兴趣,我很期待能看到它以完整的戏剧形式呈现。

2. SequentialChain

当然,并非所有顺序链都像传递单个字符串作为参数并获取单个字符串作为链中所有步骤的输出一样简单。在下一个示例中,我们将尝试更复杂的链,其中涉及多个输入,并且还有多个最终输出。

特别重要的是我们如何命名输入/输出变量名称。在上面的示例中,我们不必考虑这一点,因为我们只是将一个链的输出直接作为下一个链的输入传递,但在这里我们确实需要担心这一点,因为我们有多个输入。

示例代码,

# This is an LLMChain to write a synopsis given a title of a play and the era it is set in.
llm = OpenAI(temperature=.7)
template = """您是一位剧作家。给定一个剧本的标题和其设置的时代背景,您的任务是为该标题编写一个剧本大纲。

标题: {标题}
时代背景: {时代背景}
剧作家: 以下是对上述剧本的剧本大纲:"""
prompt_template = PromptTemplate(input_variables=["标题", "时代背景"], template=template)
synopsis_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="剧本大纲")

# This is an LLMChain to write a review of a play given a synopsis.
llm = OpenAI(temperature=.7)
template = """您是来自《纽约时报》的剧评人。给定一个剧本的剧本大纲,您的任务是为该剧本写一篇评论。

剧本大纲:
{剧本大纲}
来自《纽约时报》剧评人对上述剧本的评论:"""
prompt_template = PromptTemplate(input_variables=["剧本大纲"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="评论")

# This is the overall chain where we run these two chains in sequence.
from langchain.chains import SequentialChain
overall_chain = SequentialChain(
    chains=[synopsis_chain, review_chain],
    input_variables=["时代背景", "标题"],
    # Here we return multiple variables
    output_variables=["剧本大纲", "评论"],
    verbose=True)

overall_chain({"标题":"夕阳海滩的悲剧", "时代背景": "维多利亚时代的英格兰"})

输出结果,

> Entering new SequentialChain chain...

> Finished chain.
{'标题': '夕阳海滩的悲剧',
 '时代背景': '维多利亚时代的英格兰',
 '剧本大纲': ' 好的,我会尽力为您编写一个充满想象力和戏剧性的大纲。\n\n标题:夕阳海滩的悲剧  \n\n时代背景:维多利亚时代的英格兰\n\n大纲:\n\n第一幕:\n故事开端在一个繁华的英格兰海滨小镇。这里是上流社会夏天度假的胜地。富家少女艾米丽与一个渔夫的儿子查理相爱,但艾米丽的父母强烈反对这段关系。 \n\n第二幕:\n艾米丽与查理计划私奔,但不幸被艾米丽的父亲发现。他禁止艾米丽再见查理,并计划把她许配给一个贵族。艾米丽与查理激烈争吵后分手。\n\n第三幕:\n心碎的查理在海边饮酒。醉酒的他不小心从悬崖落入海中溺亡。艾米丽与贵族的婚礼当天,人们在海边发现了查理的尸体。艾米丽伤心欲绝。\n\n第四幕:\n艾米丽在海滩上哀悼她逝去的爱人,她的父母想拉她离开,但她拒绝。在夕阳下,她最终跳下悬崖,束手就擒了与查理相同的命运。\n\n最后一幕: \n艾米丽的父母抱着女儿的遗体痛哭。夕阳下,大海吞噬了这对天造地设的情侣,留下了一个悲惨的教训。',
 '评论': ' 亲爱的读者们,今天我要为大家讲述一个发生在维多利亚时代英格兰海滨小镇的悲伤爱情故事。\n\n本剧以富家少女艾米丽和渔夫儿子查理的禁忌之爱为主线,描述了跨越阶级壁垒的爱情,因社会偏见和门第观念而破碎的悲剧。作者通过简练的笔触勾勒出了主人公波澜壮阔的命运,引人入胜。\n\n尤其是在海滩这个自然背景的衬托下,爱侣的生与死交织成一个动人的故事。作者将自然与人生巧妙结合,海浪声仿佛预示着主人公们即将遭遇的命运。夕阳映衬着他们生命的终点,同时又象征着爱情永不疲惫。\n\n人物刻画 incisive, 对白富于表现力,结构严谨。作者通过有限的篇幅成功创造了一个微型的社会舞台,讽刺了维多利亚时代英国阶级森严的现实。这是一个警世的寓言,也是对自由爱情的赞颂。\n\n综上所述,本剧剧本构思新颖,情节跌宕起伏,值得一看。希望大家能从这个爱情悲剧中感受到作者对真爱的坚持与讴歌。这是一个优秀的剧本,我衷心推荐。期待这出剧能够搬上舞台,重现维多利亚时代的辉煌与冲突。'}

3. Memory in Sequential Chains

有时,您可能希望传递一些上下文以在链的每个步骤或链的后续部分中使用,但是维护输入/输出变量并将其链接在一起可能很快就会变得混乱。使用 SimpleMemory 是管理此问题并清理链的便捷方法。

例如,使用之前的剧作家 SequentialChain,假设您想要包含一些有关戏剧的日期、时间和地点的上下文,并使用生成的概要和评论创建一些社交媒体帖子文本。您可以将这些新的上下文变量添加为 input_variables ,或者我们可以将 SimpleMemory 添加到链中来管理此上下文:

示例代码,

from langchain.chains import SequentialChain
from langchain.memory import SimpleMemory

llm = OpenAI(temperature=.7)
template = """您是一家剧院公司的社交媒体經理。给定剧本的标题、时代背景、日期、时间、地点、剧本大纲以及评论,您的任务是为该剧本撰写一条社交媒体推文。

关于该剧本的上演时间和地点:
日期和时间: {时间}
地点: {地点}

剧本大纲:
{剧本大纲}
《纽约时报》对该剧本的评论:
{评论}

社交媒体推文:
"""
prompt_template = PromptTemplate(input_variables=["剧本大纲", "评论", "时间", "地点"], template=template)
social_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="社交媒体推文")

overall_chain = SequentialChain(
    memory=SimpleMemory(memories={"时间": "December 25th, 8pm PST", "地点": "公园剧场"}),
    chains=[synopsis_chain, review_chain, social_chain],
    input_variables=["时代背景", "标题"],
    # Here we return multiple variables
    output_variables=["社交媒体推文"],
    verbose=True)

overall_chain({"标题":"夕阳海滩的悲剧", "时代背景": "维多利亚时代的英格兰"})

输出结果,

> Entering new SequentialChain chain...

> Finished chain.
{'标题': '夕阳海滩的悲剧',
 '时代背景': '维多利亚时代的英格兰',
 '时间': 'December 25th, 8pm PST',
 '地点': '公园剧场',
 '社交媒体推文': ' 亲爱的戏迷们,圣诞节即将到来,公园剧场呈献一出动人心弦的悲剧 - 《夕阳海滩的悲剧》。\n\n这是一出典型的维多利亚时代爱情悲剧,背景设定在英格兰海滨小镇。渔夫约翰与旅店老板的女儿玛丽禁忌地相爱,却因阶级界限和悲剧失去彼此。 \n\n日复一日,约翰归来海滩边追思爱人,哀莫大于心死。玛丽在海水中不慎溺毙的悲剧一幕更会令你痛彻心扉。\n\n维多利亚时代的社会桎梏禁锢了他们的爱情,戏剧性的情节转折和扣人心弦的结局必将打动每一位观众。\n\n震撼人心的视听体验,更有催人泪下的剧情,观看《夕阳海滩的悲剧》震撼你的心!12月25日晚8点,公园剧场全新上演,千万别错过!'}

完结!

相关推荐
糖豆豆今天也要努力鸭13 分钟前
torch.__version__的torch版本和conda list的torch版本不一致
linux·pytorch·python·深度学习·conda·torch
烦躁的大鼻嘎22 分钟前
【Linux】深入理解GCC/G++编译流程及库文件管理
linux·运维·服务器
ac.char29 分钟前
在 Ubuntu 上安装 Yarn 环境
linux·运维·服务器·ubuntu
敲上瘾29 分钟前
操作系统的理解
linux·运维·服务器·c++·大模型·操作系统·aigc
长弓聊编程1 小时前
Linux系统使用valgrind分析C++程序内存资源使用情况
linux·c++
cherub.1 小时前
深入解析信号量:定义与环形队列生产消费模型剖析
linux·c++
梅见十柒1 小时前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热1 小时前
路由基础(全)
linux·网络·网络协议·安全
传而习乎2 小时前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
我们的五年2 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习