青训营学习收获7
学习实践:完美鲜花推文的艺术:用SequentialChain链接不同组件
1、什么是 Chain?
Chain 是 LangChain 中用来链接多个组件和功能的概念。通过链,我们可以将模型之间、模型与其他组件之间的功能相互链接。链的核心思想是 模块化与组合。这一机制的关键优势包括:
- 简化复杂应用的实现:通过将不同功能封装到链中,可以更轻松地开发复杂应用。
- 提高代码的可维护性:链的模块化设计使得调试、维护和优化变得更加容易。
- 灵活组合:链本身可以作为一个基本功能单元,通过不同组合满足更多场景需求。
LangChain 提供了多种预置链,帮助开发者快速实现各种任务。例如,LLMChain 是一种封装了提示模板、语言模型和输出解析器的链,能够简化模型的输入与输出处理。
2、LLMChain:最简单的链
LLMChain 是一种核心链,用于整合提示模板(PromptTemplate)、语言模型(LLM 或聊天模型)以及输出解析器(Output Parser)。它可以将以下流程封装在一个链中:
- 格式化输入:使用 PromptTemplate 格式化用户输入。
- 调用模型:将格式化后的输入传递给 LLM。
- 返回输出:返回模型生成的结果。
使用链的好处:
- 简洁性:将提示模板的构建和模型调用封装在一起,使代码结构更简洁。
- 模块化:提高了代码的可读性和可维护性。
学习实践
想让大模型告诉我某种花的花语,如果不使用链,代码如下
# 创建提示,导入LangChain的提示模板
from langchain import PromptTemplate
# 原始字符串模板
template = "{flower}的花语是?"
# 创建LangChain模板
prompt_temp = PromptTemplate.from_template(template)
# 根据模板创建提示
prompt = prompt_temp.format(flower='玫瑰')
print(prompt)
# 创建并调用模型,导入LangChain的OpenAI模型接口
from langchain import OpenAI
# 创建模型实例
model = OpenAI(temperature=0)
# 传入提示,调用模型,返回结果
result = model(prompt)
print(result)
此时Model I/O的实现分为两部分,提示模板的构建和模型的调用独立处理。
在代码中,使用LangChain库来生成和处理提示。首先导入PromptTemplate类,并定义一个模板字符串“{flower}的花语是?”。通过PromptTemplate.from_template方法创建一个模板实例,然后使用format方法将“玫瑰”传入模板中,生成具体的提示“玫瑰的花语是?”。接着导入OpenAI接口,创建一个模型实例,设置temperature参数为0(表示生成结果的确定性较高)。最后,将生成的提示传入模型,获取并打印出结果如下。
如果使用链,代码结构则更简洁:
# 导入所需的库
from langchain import PromptTemplate, OpenAI, LLMChain
# 原始字符串模板
template = "{flower}的花语是?"
# 创建模型实例
llm = OpenAI(temperature=0)
# 创建LLMChain
llm_chain = LLMChain(
llm=llm,
prompt=PromptTemplate.from_template(template))
# 调用LLMChain,返回结果
result = llm_chain("玫瑰")
print(result)
代码中,使用LangChain库来简化提示生成和模型调用的过程。首先导入了PromptTemplate、OpenAI和LLMChain类。定义了一个模板字符串“{flower}的花语是?”。然后创建一个OpenAI模型实例,设置temperature为0。接着,使用LLMChain类,将模型实例和提示模板结合起来,创建一个链式调用对象。最后,通过调用llm_chain("玫瑰"),直接传入参数“玫瑰”,自动生成并执行提示,返回并打印结果。这种方法将生成提示和调用模型的步骤整合在一起,提高了代码的简洁性和可读性。
3、链的调用方式
链有多种调用方式:
- 直接调用:将链对象作为函数直接调用。
prompt = PromptTemplate(
input_variables=["flower", "season"],
template="{flower}在{season}的花语是?",
)
llm_chain = LLMChain(llm=llm, prompt=prompt)
print(llm_chain({
'flower': "玫瑰",
'season': "夏季" }))
2. 通过run方法:等价于直接调用_call_函数,但适用于简单输入。
llm_chain("玫瑰")
等价于:llm_chain.run("玫瑰")
3. 通过predict方法:predict方法类似于run,只是输入键被指定为关键字参数而不是 Python 字典。
result = llm_chain.predict(flower="玫瑰")
print(result)
4. 通过apply方法:apply方法允许我们针对输入列表运行链,一次性处理多个输入(列表)。
# apply允许您针对输入列表运行链
input_list = [
{"flower": "玫瑰",'season': "夏季"},
{"flower": "百合",'season': "春季"},
{"flower": "郁金香",'season': "秋季"}
]
result = llm_chain.apply(input_list)
print(result)
5. 通过generate方法:generate方法类似于apply,只不过它返回一个LLMResult对象,而不是字符串。LLMResult通常包含模型生成文本过程中的一些相关信息,例如令牌数量、模型名称等,即返回更丰富的模型输出。
result = llm_chain.generate(input_list)
print(result)
4、SequentialChain:顺序链
SequentialChain 是一种高级链,用于将多个 LLMChain 按顺序链接,形成复杂的逻辑流。以下是学习的一个三步实现的示例:
目标
- 第一步:假设大模型是一个植物学家,他能生成鲜花的知识性说明,即给出某种特定鲜花的知识和介绍(植物学家角色)。
- 第二步:假设大模型是一个鲜花评论者,他能生成针对知识说明的评论,即参考上面植物学家的文字输出,对鲜花进行评论(评论家角色)。
- 第三步:假设大模型是易速鲜花的社交媒体运营经理,他能参考上面植物学家和鲜花评论者的文字输出,来撰写鲜花推文文案(社交媒体运营经理角色)。
实现步骤
- 导入库:
import os
os.environ["OPENAI_API_KEY"] = 'OpenAI API Key'
from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
from langchain.chains import SequentialChain
- 添加第一个LLMChain,生成鲜花的知识性说明:
# 第一个LLMChain,生成鲜花的介绍,输入为花的名称和种类
llm = OpenAI(temperature=.7)
template = """
你是一个植物学家。给定花的名称和类型,你需要为这种花写一个200字左右的介绍。
花名: {name}
颜色: {color}
植物学家: 这是关于上述花的介绍:"""
prompt_template = PromptTemplate(input_variables=["name", "color"], template=template)
introduction_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="introduction")
代码创建了一个名为 introduction_chain 的 LLMChain,用于生成关于鲜花的介绍。首先实例化了一个 OpenAI 模型,设置了参数为 0.7,以控制生成文本的随机性。接着定义了一个模板 template,其中包含占位符 {name} 和 {color},用于插入花的名称和颜色。PromptTemplate 使用这个模板和输入变量创建了一个提示模板 prompt_template。最后,LLMChain 将语言模型和提示模板结合,用于生成描述特定花朵的文本,输出结果存储在 introduction 键中。
- 添加第二个LLMChain,根据鲜花的知识性说明生成评论:
# 第二个LLMChain,用于根据鲜花的介绍写出鲜花的评论
llm = OpenAI(temperature=.7)
template = """
你是一位鲜花评论家。给定一种花的介绍,你需要为这种花写一篇200字左右的评论。
鲜花介绍:
{introduction}
花评人对上述花的评论:"""
prompt_template = PromptTemplate(input_variables=["introduction"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")
代码定义了一个用于生成鲜花评论的链条。首先,创建了一个OpenAI的大语言模型实例 llm,并设置了生成文本时的随机性参数为 0.7,以平衡创造性和一致性。然后,代码定义了一个模板 template,用于指导模型生成评论。这个模板包括一个占位符 {introduction},用于插入鲜花的介绍信息。接着,PromptTemplate 使用该模板和输入变量 introduction 来创建一个提示模板。最后,LLMChain 使用这个语言模型和提示模板,将输入的鲜花介绍转换为一篇大约200字的评论,并将结果存储在 review 中。
- 添加第三个LLMChain,根据鲜花的介绍和评论写出一篇自媒体的文案:
# 第三个LLMChain,用于根据鲜花的介绍和评论写出一篇自媒体的文案
template = """
你是一家花店的社交媒体经理。给定一种花的介绍和评论,你需要为这种花写一篇社交媒体的帖子,300字左右。
鲜花介绍:
{introduction}
花评人对上述花的评论:
{review}
社交媒体帖子:
"""
prompt_template = PromptTemplate(input_variables=["introduction", "review"], template=template)
social_post_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="social_post_text")
这段代码定义了一个用于生成社交媒体帖子的链(LLMChain)。首先创建了模板字符串,用于指导生成的内容。模板中包含了两个占位符:{introduction}和{review},分别用于插入花的介绍和评论。这个模板要求生成一篇约300字的社交媒体帖子。
接着使用PromptTemplate类创建了一个提示模板对象prompt_template,指定输入变量为“introduction”和“review”。然后,使用LLMChain类实例化一个链对象social_post_chain,该对象将调用一个语言模型(llm)来生成内容,并将结果存储在social_post_text中。这个链的目的是根据给定的花的介绍和评论,自动生成适合发布在社交媒体上的文案。
- 添加SequentialChain,将前面三个链串起来:
# 这是总的链,按顺序运行这三个链
overall_chain = SequentialChain(
chains=[introduction_chain, review_chain, social_post_chain],
input_variables=["name", "color"],
output_variables=["introduction","review","social_post_text"],
verbose=True)
# 运行链
result = overall_chain({"name":"玫瑰", "color": "粉色"})
print(result)
运行名为 overall_chain 的顺序链(SequentialChain)。该链由三个子链组成:introduction_chain、review_chain 和 social_post_chain,它们按顺序依次执行。输入变量为“name”和“color”,输出变量为“introduction”、“review”和“social_post_text”。在运行时,提供具体的输入(如“玫瑰”和“粉色”),链会生成相应的输出,并打印结果,设置 verbose=True 使得在执行过程中会输出详细的运行信息。
总结思考
LangChain 中的 Chain 是模块化开发的利器,提供了灵活的设计方式,LangChain提供了好用的“链”,帮助把多个组件像链条一样连接起来。这个“链条”其实就是一系列组件的调用顺序,这个顺序里还可以包括其他的“链条”。
- 模块化与封装:通过链封装不同功能组件,提升了代码的可维护性与可读性。模块化的设计思想使得开发者可以专注于每个组件的功能,而不必担心整体架构的复杂性。
- 多种调用方式:适配多样化的使用场景,从单个输入到批量处理。通过提供多样的调用方式,LangChain 使得不同规模和复杂度的项目都能够灵活应用链式结构。
- 链的多样性:如 LLMChain 和 SequentialChain,可以帮助快速构建复杂应用。不同类型的链为开发者提供了丰富的工具集,可以根据具体需求自由组合,创造出高效且创新的解决方案。
- 提高开发效率:通过链式结构,我们可以更灵活地设计应用程序的流程。它不仅提高了代码的可读性和可维护性,还能让开发者更专注于业务逻辑的实现,而不必担心底层的复杂性。这种设计模式在复杂系统中尤为重要,值得在实际项目中广泛应用。
- 促进创新:LangChain 的灵活性和强大的组合能力为开发者提供了创新的空间。通过将不同的模型和功能模块按需组合,可以快速测试和迭代新想法,为产品开发提供了更多可能性。
- 生态系统的潜力:随着 LangChain 的不断发展,未来可能会有更多的预置链和功能模块加入,进一步丰富其生态系统。这将为开发者提供更多的选择和更强大的工具支持。
通过学习对 LangChain 深入理解,利用 LangChain 提供的链、通过链式结构,我们可以更灵活地设计应用程序的流程。它不仅提高了代码的可读性和可维护性,还能让开发者更专注于业务逻辑的实现,而不必担心底层的复杂性。这种设计模式在复杂系统中尤为重要,值得在实际项目中应用。