掌握高效大模型任务流搭建术(二):链式流程如何赋能 AI 处理能力提升
前言:
在上一篇文章中,我们初步探索了 LangChain 的基础链式操作——LLMChain。它巧妙地将大语言模型(LLM)与提示模板(Prompt Template)相结合,为模型交互逻辑的封装提供了一种简洁而高效的方式。
然而,LangChain 的强大之处远不止于此。在 LLMChain 的基础上,LangChain 还提供了众多实用的 Chain 工具,其中 Sequential Chain 尤为引人注目。Sequential Chain 可以被视为一种高级的工作流工具,它专为那些需要多步骤连续处理的大语言模型任务量身定制。
在现实的工作场景中,我们常常会遇到这样的情况:任务的完成并非仅仅依靠简单的问答就能达成,而是需要经过一系列复杂的逻辑推理和信息处理步骤。Sequential Chain 正是为解决这一难题而生。它能够将这些分散的步骤有序地串联起来,使得每一步的输出无缝地成为下一步的输入,从而实现整个任务的连贯处理。无论是对复杂问题进行逐步拆解、逐层提取关键信息,还是进行多阶段的推理分析,Sequential Chain 都能大显身手,极大地提高工作效率,为完成多步骤任务提供坚实有力的支撑。
在 LangChain 的 Sequential Chain 设计中,主要存在两种类型:
SimpleSequentialChain :它适用于单一输入和输出的场景,每个链仅处理一个输入,并基于此生成一个输出。
SequentialChain:这种类型能够处理多个输入和多个输出,从而可以胜任更复杂的任务逻辑和数据流情况。
借助这两种链类型,LangChain 有能力灵活地应对从简单到复杂的多步骤任务,为开发者构建基于大语言模型的工作流提供高效的工具支持。
1:Simple Sequential Chain
Simple Sequential Chain 是 LangChain 中一种较为基础的链式结构,主要用于将多个链依次串联起来。其工作流程是,第一个链接收输入,经过处理后生成输出,这个输出随即作为第二个链的输入,以此类推,直至最后一个链生成最终的结果。
从图中可以看出,整个流程是线性和连续的,非常适合处理单一输入和单一输出的简单任务场景。通过这种方式,任务被分解为多个独立的步骤,易于管理和调试,同时保持逻辑的清晰性和处理的高效性。
接下来我们尝试调用这个链-还是要先导入必要的库
import os
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain.memory import ConversationBufferMemory
from langchain.chains import SimpleSequentialChain
# 设置 API 密钥
os.environ["DASHSCOPE_API_KEY"] = 'sk-63f00f6776fd4f64beb06ed5edf197eb'
# 初始化通义千问模型
llm = ChatTongyi()
# 第一个提示模板,用于生成公司名称
first_prompt = ChatPromptTemplate.from_template(
"用一句话描述一个制作 {product} 的公司最合适的名称是什么?"
)
# 链 1:根据产品生成公司名称
chain_one = LLMChain(llm=llm, prompt=first_prompt)
# 第二个提示模板,用于生成公司描述
second_prompt = ChatPromptTemplate.from_template(
"为以下公司写一段 20 个词的描述:{company_name}"
)
# 链 2:根据公司名称生成公司描述
chain_two = LLMChain(llm=llm, prompt=second_prompt)
# 第三个提示模板,用于生成广告语
third_prompt = ChatPromptTemplate.from_template(
"根据以下公司描述生成一句创意广告语:{company_description}"
)
# 链 3:根据公司描述生成广告语
chain_three = LLMChain(llm=llm, prompt=third_prompt)
# 构建包含三个链的 SimpleSequentialChain
overall_simple_chain = SimpleSequentialChain(
chains=[chain_one, chain_two, chain_three], # 将新链加入到链的顺序中
verbose=True# 输出详细日志
)
# 输入产品信息,运行整个链
prodcut = '裤子'
print(overall_simple_chain.run(product))
从这里我们可以看出,利用这个SimpleSequentialChain链可以轻松构建出完整的工作流程。以总结一篇论文为例,我们的目标并不是简单地让大模型直接总结整篇文章,而是将任务拆解成更细的步骤:先让模型分别总结第一段、第二段和第三段的内容,然后再对这些部分的总结进行汇总。通过这种将复杂问题逐步拆解的方式,可以显著提升模型的回复质量和能力,确保结果更加精准和全面。
2: Sequential Chain
SequentialChain 是 LangChain 中一种功能强大的链式结构,相较于 SimpleSequentialChain,它提供了更高的灵活性和复杂性。SequentialChain 允许多个链并行处理不同的输入,并且能够将多个输出进行合并或分别传递到后续的链中。从流程设计的角度来看,SimpleSequentialChain 只支持单一的线性顺序,而 SequentialChain 则支持更复杂的流程设计,可以满足更广泛的业务需求。这种设计使得 SequentialChain 在处理复杂的多步骤任务时更加高效和灵活,能够更好地适应各种复杂的场景和任务需求。
具体来说,SequentialChain 比 SimpleSequentialChain 的优势在于:
输入灵活性 :SequentialChain 支持用户同时传递多个输入,这些输入可以分别进入不同的链条。例如,用户可以将不同的数据集或参数分别传递给 Chain 1 和 Chain 3。
输出管理 :每个链的输出不仅可以作为下一个链的输入,还可以分发到多个后续链。例如,Chain 2 和 Chain 3 的输出都可以传递给 Chain 4。
多路合并:最后的链(如 Chain 4)可以整合来自多个链条的结果,生成最终输出。这种设计使得 SequentialChain 在处理复杂的多步骤任务时更加灵活和强大,能够更好地适应各种复杂的场景和任务需求。
假如我们希望按着图片上的模式来进行定制Sequential Chain的话,第一步其实还是要先把SequentialChain导入
以下是一个完整示例:
import os
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain.chains import LLMChain
from langchain.prompts import ChatPromptTemplate, SystemMessagePromptTemplate, HumanMessagePromptTemplate
from langchain.chains import SequentialChain
# 设置 API 密钥
os.environ["DASHSCOPE_API_KEY"] = 'sk-63f00f6776f197ea'
# 初始化通义千问模型
llm = ChatTongyi()
# 提示模板 1:将评论翻译成中文
first_prompt = ChatPromptTemplate.from_template(
"将以下评论翻译成中文:"
"\n\n{Review}"
)
# 链 1:输入= Review,输出= Chinese_Review
chain_one = LLMChain(
llm=llm,
prompt=first_prompt,
output_key="Chinese_Review"# 定义输出变量的名称
)
# 提示模板 2:总结中文评论
second_prompt = ChatPromptTemplate.from_template(
"请用一句话总结以下评论:"
"\n\n{Chinese_Review}"
)
# 链 2:输入= Chinese_Review,输出= summary
chain_two = LLMChain(
llm=llm,
prompt=second_prompt,
output_key="summary"# 定义输出变量的名称
)
# 提示模板 3:检测评论的语言
third_prompt = ChatPromptTemplate.from_template(
"以下评论是用什么语言写的:\n\n{Review}"
)
# 链 3:输入= Review,输出= language
chain_three = LLMChain(
llm=llm,
prompt=third_prompt,
output_key="language"# 定义输出变量的名称
)
# 提示模板 4:根据总结和语言生成回复
fourth_prompt = ChatPromptTemplate.from_template(
"根据以下总结和指定语言,以一个商家的视角,写一条对应语言的后续回复(最终只需要输出一条即可):"
"\n\n总结: {summary}\n\n语言: {language}"
)
# 链 4:输入= summary, language,输出= followup_message
chain_four = LLMChain(
llm=llm,
prompt=fourth_prompt,
output_key="followup_message"# 定义输出变量的名称
)
# 创建 SequentialChain,将所有链条整合为一个流程
# 输入= Review,输出= Chinese_Review, summary, followup_message
overall_chain = SequentialChain(
chains=[chain_one, chain_two, chain_three, chain_four], # 定义链条的顺序
input_variables=["Review"], # 定义输入变量
output_variables=["Chinese_Review", "summary", "followup_message"], # 定义输出变量
)
# 提取评论并运行链条
review = 'I love this product!'
print(overall_chain(review))
通过这个例子,我们可以清晰地看到,由于这种链式结构允许自定义内部的输入和输出,它非常适合处理复杂的任务场景,例如:
1. 整合来自不同渠道的信息(如数据分析和用户行为总结)。
2. 将任务分解为多个步骤进行处理,然后汇总结果。
3. 创建复杂的工作流程,例如多步骤问答、多段落文本生成和多维度分析等。
这种链式结构的灵活性和可定制性使其成为处理复杂任务的理想选择,能够有效地支持各种高级应用场景。
小结
SimpleSequentialChain 适合于那些需要单一输入和单一输出的场景,任务按照顺序一步步处理,每一步的输出直接成为下一步的输入。这种结构简单直观,非常适合那些逻辑线性、步骤明确且清晰的工作流程。
而 SequentialChain 则是对 SimpleSequentialChain 的扩展,它支持多输入和多输出,提供了更大的灵活性。这种结构能够将复杂的任务分解成多个部分,并通过明确的输入输出变量将它们连接起来,从而实现更复杂的流程设计和任务整合。
通过这两种链结构,我们不仅可以清晰地定义任务逻辑,还可以灵活地适应不同的场景需求。例如,在多语言客户服务场景中,SequentialChain 可以轻松地完成从评论翻译、总结、语言检测到个性化回复生成的整个工作流程。
总的来说,无论是处理单一线性任务,还是需要多路并行和输出合并的复杂流程,LangChain 提供的链式工具都能显著提高大语言模型任务的执行效率和可扩展性,为开发者构建智能化工作流提供了强有力的支持。