探索LangChain的SequentialChain:编写完美的鲜花推文的实践选题(下) | 豆包MarsCode AI刷题

13 阅读12分钟

深入解读LangChain的SequentialChain:链接组件实现完美鲜花推文

在这篇笔记中,我们将详细解析如何使用LangChain的SequentialChain组件,链接不同的LLMChain,生成一篇完美的鲜花推文。通过对代码的逐步解读,理解每个步骤的作用和意义,深入掌握该功能的独特价值和对学习的帮助。

代码解读概览

我们将分两部分详细解释代码:

  1. 第一部分代码:演示了如何使用PromptTemplateLLMChain以及链的各种方法(如runpredictapplygenerate)来生成关于鲜花花语的信息。

  2. 第二部分代码:展示了如何使用SequentialChain将多个LLMChain串联起来,依次生成鲜花的介绍、评论和社交媒体帖子。


第一部分代码详细解读

代码概览

这部分代码演示了如何使用LangChain的LLMChainPromptTemplate,以及链的各种方法,生成关于鲜花在特定季节的花语信息。

# 设置OpenAI API密钥
import os

# 导入所需库
from langchain import PromptTemplate, LLMChain
from langchain_openai import ChatOpenAI

# 设置提示模板
prompt = PromptTemplate(
    input_variables=["flower", "season"], template="{flower}在{season}的花语是?"
)

# 初始化大模型
llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0)

# 初始化链
llm_chain = LLMChain(llm=llm, prompt=prompt)

# 调用链
response = llm_chain({"flower": "玫瑰", "season": "夏季"})
print(response)

# run方法
llm_chain.run({"flower": "玫瑰", "season": "夏季"})

# predict方法
result = llm_chain.predict(flower="玫瑰", season="夏季")
print(result)

# apply方法
input_list = [
    {"flower": "玫瑰", "season": "夏季"},
    {"flower": "百合", "season": "春季"},
    {"flower": "郁金香", "season": "秋季"},
]
result = llm_chain.apply(input_list)
print(result)

# generate方法
result = llm_chain.generate(input_list)
print(result)

步骤解析

1. 导入必要的库
import os
from langchain import PromptTemplate, LLMChain
from langchain_openai import ChatOpenAI
  • import os:导入操作系统接口模块,用于获取环境变量。
  • from langchain import PromptTemplate, LLMChain:从LangChain库中导入PromptTemplateLLMChain类。
    • PromptTemplate:用于创建提示模板,可以包含占位符,在运行时动态填充。
    • LLMChain:用于将提示模板和语言模型(LLM)链接在一起,形成一个可调用的链。
  • from langchain_openai import ChatOpenAI:从LangChain的OpenAI接口中导入ChatOpenAI类,用于与OpenAI的聊天模型进行交互。
2. 设置提示模板
prompt = PromptTemplate(
    input_variables=["flower", "season"],
    template="{flower}在{season}的花语是?"
)
  • PromptTemplate:创建一个提示模板实例。
    • input_variables:定义模板中的占位符变量,这里是"flower""season"
    • template:定义模板字符串,包含占位符。这里的模板是"{flower}在{season}的花语是?"
  • 作用:这个模板允许我们动态地填入不同的花名和季节,生成相应的提问。
3. 初始化语言模型
llm = ChatOpenAI(model=os.environ.get("LLM_MODELEND"), temperature=0)
  • ChatOpenAI:创建一个与OpenAI聊天模型交互的实例。
    • model:指定使用的模型名称,从环境变量LLM_MODELEND中获取。
    • temperature:设置生成的随机性,0表示输出更确定,更一致。
  • 作用:初始化语言模型,以便后续生成回答。
4. 初始化链
llm_chain = LLMChain(llm=llm, prompt=prompt)
  • LLMChain:将提示模板prompt和语言模型llm链接成一个链。
    • llm:传入之前初始化的语言模型。
    • prompt:传入之前创建的提示模板。
  • 作用:创建一个可调用的链,输入变量后,自动生成提示并调用模型获取结果。
5. 调用链并获取结果
response = llm_chain({"flower": "玫瑰", "season": "夏季"})
print(response)
  • llm_chain({"flower": "玫瑰", "season": "夏季"}):调用链,传入flowerseason的具体值。
  • print(response):打印链的返回结果。
  • 解释:链会使用传入的参数生成提示,例如"玫瑰在夏季的花语是?",然后调用模型获取回答,最终返回结果。
6. 使用run方法
llm_chain.run({"flower": "玫瑰", "season": "夏季"})
  • llm_chain.run()run方法是链的快捷调用方式,直接返回模型生成的文本。
  • 作用:与之前的调用方式类似,但只返回模型的输出文本。
7. 使用predict方法
result = llm_chain.predict(flower="玫瑰", season="夏季")
print(result)
  • llm_chain.predict()predict方法也是链的快捷调用方式,使用关键字参数传入输入变量。
  • 作用:方便地调用链,获取模型的输出。
8. 使用apply方法
input_list = [
    {"flower": "玫瑰", "season": "夏季"},
    {"flower": "百合", "season": "春季"},
    {"flower": "郁金香", "season": "秋季"},
]
result = llm_chain.apply(input_list)
print(result)
  • input_list:定义一个输入列表,每个元素是一个字典,包含flowerseason
  • llm_chain.apply(input_list):对输入列表中的每个元素运行链,返回结果列表。
  • 作用:批量处理多个输入,方便进行大规模的预测。
9. 使用generate方法
result = llm_chain.generate(input_list)
print(result)
  • llm_chain.generate(input_list):与apply方法类似,但返回更详细的生成信息,包括生成的中间过程和元数据。
  • 作用:获取关于模型生成的更详细信息,便于调试和分析。

运行结果示例

  • 单次调用结果
{'flower': '玫瑰', 'season': '夏季', 'text': '玫瑰在夏季的花语与其他季节基本相同,常见的花语包括:爱情、美丽、热情、浪漫等。'}
  • 批量处理结果
[{'text': '玫瑰在夏季的花语包括爱情、热情、浪漫和美丽等。'},
 {'text': '百合在春季的花语是纯洁、庄严、心想事成和百年好合。'},
 {'text': '郁金香在秋季的花语是博爱、体贴、高雅和富贵。'}]

总结

通过这个代码示例,我们学习了:

  • 如何使用PromptTemplate创建动态提示模板。
  • 如何初始化ChatOpenAI模型,并设置参数。
  • 如何使用LLMChain将提示模板和模型链接起来。
  • 如何使用runpredictapplygenerate等方法调用链,处理单个或多个输入。

第二部分代码详细解读

代码概览

这部分代码展示了如何使用SequentialChain将多个LLMChain串联起来,依次生成鲜花的介绍、评论和社交媒体帖子,实现一个完整的内容生成流程。

# 设置OpenAI API密钥
import os

# 导入所需要的库
from langchain.chains import LLMChain, SequentialChain
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI

# 第一个LLMChain:生成鲜花的介绍
llm = ChatOpenAI(
    temperature=0.7,
    model=os.environ.get("LLM_MODELEND"),
)
template = """
你是一个植物学家。给定花的名称和颜色,你需要为这种花写一个200字左右的介绍。
花名: {name}
颜色: {color}
植物学家: 这是关于上述花的介绍:"""
prompt_template = PromptTemplate(input_variables=["name", "color"], template=template)
introduction_chain = LLMChain(
    llm=llm, prompt=prompt_template, output_key="introduction"
)

# 第二个LLMChain:根据鲜花的介绍写出评论
template = """
你是一位鲜花评论家。给定一种花的介绍,你需要为这种花写一篇200字左右的评论。
鲜花介绍:
{introduction}
花评人对上述花的评论:"""
prompt_template = PromptTemplate(input_variables=["introduction"], template=template)
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")

# 第三个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"
)

# 总的链:按顺序运行三个链
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)

步骤解析

1. 导入必要的库
import os
from langchain.chains import LLMChain, SequentialChain
from langchain.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
  • from langchain.chains import LLMChain, SequentialChain:从LangChain的chains模块中导入LLMChainSequentialChain类。
  • from langchain.prompts import PromptTemplate:从LangChain的prompts模块中导入PromptTemplate类。
  • 其他导入与之前相同。
2. 初始化语言模型
llm = ChatOpenAI(
    temperature=0.7,
    model=os.environ.get("LLM_MODELEND"),
)
  • temperature=0.7:设置生成的随机性,值越高,生成内容越具有多样性和创造性。
  • 作用:为后续的链使用同一个语言模型。
3. 创建第一个LLMChain:生成鲜花的介绍
a. 定义提示模板
template = """
你是一个植物学家。给定花的名称和颜色,你需要为这种花写一个200字左右的介绍。
花名: {name}
颜色: {color}
植物学家: 这是关于上述花的介绍:"""
prompt_template = PromptTemplate(input_variables=["name", "color"], template=template)
  • template:定义了一个多行字符串,包含了提示信息和占位符{name}{color}
  • PromptTemplate:创建提示模板实例,指定了输入变量。
b. 创建LLMChain实例
introduction_chain = LLMChain(
    llm=llm, prompt=prompt_template, output_key="introduction"
)
  • LLMChain:将语言模型llm和提示模板prompt_template链接起来。
  • output_key="introduction":指定输出的键名,用于后续在链中引用。
4. 创建第二个LLMChain:根据鲜花的介绍写出评论
a. 定义提示模板
template = """
你是一位鲜花评论家。给定一种花的介绍,你需要为这种花写一篇200字左右的评论。
鲜花介绍:
{introduction}
花评人对上述花的评论:"""
prompt_template = PromptTemplate(input_variables=["introduction"], template=template)
  • {introduction}:占位符,用于接收前一个链的输出。
b. 创建LLMChain实例
review_chain = LLMChain(llm=llm, prompt=prompt_template, output_key="review")
  • output_key="review":指定输出的键名。
5. 创建第三个LLMChain:根据介绍和评论写出社交媒体的文案
a. 定义提示模板
template = """
你是一家花店的社交媒体经理。给定一种花的介绍和评论,你需要为这种花写一篇社交媒体的帖子,300字左右。
鲜花介绍:
{introduction}
花评人对上述花的评论:
{review}
社交媒体帖子:
"""
prompt_template = PromptTemplate(
    input_variables=["introduction", "review"], template=template
)
  • {introduction}{review}:占位符,分别接收前两个链的输出。
b. 创建LLMChain实例
social_post_chain = LLMChain(
    llm=llm, prompt=prompt_template, output_key="social_post_text"
)
  • output_key="social_post_text":指定输出的键名。
6. 创建SequentialChain:将三个LLMChain串联起来
overall_chain = SequentialChain(
    chains=[introduction_chain, review_chain, social_post_chain],
    input_variables=["name", "color"],
    output_variables=["introduction", "review", "social_post_text"],
    verbose=True,
)
  • chains:按顺序传入之前创建的三个链。
  • input_variables:整个链的输入变量,这里是"name""color"
  • output_variables:整个链的输出变量,包括每个链的输出键。
  • verbose=True:启用详细模式,运行时会打印链的执行信息。
  • 作用:将各个链串联起来,自动将前一个链的输出作为下一个链的输入。
7. 运行SequentialChain并打印结果
result = overall_chain({"name": "玫瑰", "color": "黑色"})
print(result)
  • overall_chain({"name": "玫瑰", "color": "黑色"}):调用整个链,传入花的名称和颜色。
  • print(result):打印最终的结果,包括每个链的输出。

运行流程解析

  1. 第一步(introduction_chain)

    • 输入"name": "玫瑰", "color": "黑色"

    • 生成提示

      你是一个植物学家。给定花的名称和颜色,你需要为这种花写一个200字左右的介绍。
      花名: 玫瑰
      颜色: 黑色
      植物学家: 这是关于上述花的介绍:
      
    • 模型生成:根据提示,输出关于黑色玫瑰的介绍。

    • 输出"introduction": "..."

  2. 第二步(review_chain)

    • 输入"introduction": "..."(来自第一步的输出)

    • 生成提示

      你是一位鲜花评论家。给定一种花的介绍,你需要为这种花写一篇200字左右的评论。
      鲜花介绍:
      ...
      花评人对上述花的评论:
      
    • 模型生成:根据介绍,输出对黑色玫瑰的评论。

    • 输出"review": "..."

  3. 第三步(social_post_chain)

    • 输入"introduction": "...", "review": "..."(来自前两步的输出)

    • 生成提示

      你是一家花店的社交媒体经理。给定一种花的介绍和评论,你需要为这种花写一篇社交媒体的帖子,300字左右。
      鲜花介绍:
      ...
      花评人对上述花的评论:
      ...
      社交媒体帖子:
      
    • 模型生成:根据介绍和评论,输出一篇社交媒体帖子。

    • 输出"social_post_text": "..."

最终输出结果

{
    'name': '玫瑰',
    'color': '黑色',
    'introduction': '...',  # 第一部分输出:黑色玫瑰的介绍
    'review': '...',        # 第二部分输出:对黑色玫瑰的评论
    'social_post_text': '...'  # 第三部分输出:社交媒体帖子
}

总结

通过这个代码示例,我们学习了:

  • 如何使用LLMChain创建单个任务链。
  • 如何使用SequentialChain将多个LLMChain串联起来,形成一个复杂的任务流程。
  • 如何设计提示模板,引导模型生成预期的内容。
  • 如何在链中传递变量,将前一个链的输出作为下一个链的输入。

个人思考与收获

通过对上述代码的详细解析,我深刻体会到LangChain提供的强大功能。在实践中,我学到了以下几点:

  1. 模块化思维:将复杂任务拆解为多个独立的步骤,每个步骤由一个LLMChain完成,这样的设计便于调试和维护。

  2. 提示工程:精心设计提示模板,可以有效引导模型生成符合预期的内容。这需要对语言模型的理解和对提示的把握。

  3. 链式结构SequentialChain的使用,使得数据在链中自动传递,减少了手动传递的繁琐步骤,提高了代码的清晰度。

  4. 模型参数调整:通过调整模型的temperature等参数,可以控制生成内容的随机性和创造性,满足不同的需求。

  5. 实践应用:这种链式生成内容的方式,可以应用于实际的项目中,如自动化内容生成、智能问答等,具有广阔的应用前景。


结论

通过详细解读每个步骤的代码,我们深入了解了LangChain的PromptTemplateLLMChainSequentialChain的使用方法和原理。实践证明,这些工具能够大大提高我们的开发效率,帮助我们更好地利用AI模型解决实际问题。

希望这篇笔记能够帮助你更好地理解这些工具的使用,并在实践中加以应用。未来,我将继续探索AI工具的更多可能性,提升自己的学习和实践能力。