LangChain中的Chain(链)
什么是Chain?
在 LangChain 中,Chain(链) 是一种模块化设计,用于将多个任务或步骤串联起来,完成特定的复杂任务。Chain 提供了一个灵活的框架,可以将多个组件(如语言模型、提示模板、工具等)组合在一起,形成一个任务处理流程。
主要特点:
- 模块化:每个任务以独立的模块实现,通过链连接,方便维护和扩展。
- 灵活性:支持从简单到复杂的多种链类型,适配不同任务需求。
- 可组合性:链可以嵌套或组合,构建复杂的任务逻辑。
通过 Chain,开发者可以轻松完成任务分解和逻辑组织,从而让大语言模型的应用更加直观和高效。
LLMChain:最简单的链
LLMChain 是 LangChain 提供的最基本链类型,它将提示模板(PromptTemplate) 和语言模型(LLM) 结合,用于完成单步任务。
LLMChain 的结构
- PromptTemplate:定义任务提示的结构,将输入动态嵌入模板。
- LLM:负责生成基于提示的结果。
示例代码
python
复制代码
from langchain import PromptTemplate, LLMChain
from langchain.chat_models import ChatOpenAI
# 定义提示模板
template = "Translate the following text to French: {text}"
prompt = PromptTemplate(template=template, input_variables=["text"])
# 定义语言模型
llm = ChatOpenAI(temperature=0)
# 构建 LLMChain
llm_chain = LLMChain(prompt=prompt, llm=llm)
# 调用链
result = llm_chain.run({"text": "Hello, how are you?"})
print(result) # 输出:Bonjour, comment allez-vous ?
适用场景
- 翻译任务
- 简单问答
- 文本生成
链的调用方式
在 LangChain 中,链可以通过两种方式调用:
- run 方法:用于处理单个输入。
- apply 方法:支持批量处理多个输入。
示例
python
复制代码
# 调用链(单个输入)
result = llm_chain.run("This is a test.")
print(result)
# 批量调用链(多个输入)
inputs = [{"text": "Good morning"}, {"text": "See you later"}]
results = llm_chain.apply(inputs)
print(results) # 输出每条输入的结果
小结
run更适合快速调用,结构简单。apply更适合批量任务,效率更高。
Sequential Chain:顺序链
Sequential Chain 是一种将多个任务按顺序串联的链类型,前一个步骤的输出会自动作为下一个步骤的输入。适合多步骤任务或需要中间结果的场景。
示例代码
python
复制代码
from langchain.chains import SimpleSequentialChain
# 定义两个独立的 LLMChain
first_chain = LLMChain(
llm=llm,
prompt=PromptTemplate(template="Translate to French: {text}", input_variables=["text"])
)
second_chain = LLMChain(
llm=llm,
prompt=PromptTemplate(template="Summarize in French: {text}", input_variables=["text"])
)
# 构建 Sequential Chain
sequential_chain = SimpleSequentialChain(chains=[first_chain, second_chain])
# 调用链
result = sequential_chain.run("LangChain is a framework for developing LLM-powered applications.")
print(result)
适用场景
- 多步骤翻译
- 逐步问题分解
- 上下文关联任务
特点:
- 自动传递中间结果。
- 简化复杂任务的实现。
RouterChain:路由链
RouterChain 是一种动态链,它根据输入内容路由到适当的子链。适用于需要根据输入类型选择不同处理方式的场景。
RouterChain 的结构
- Router Logic:决定路由到哪个子链。
- 子链集合:每个子链处理特定任务。
示例代码
python
复制代码
from langchain.chains.router import MultiPromptChain, RouterChain
from langchain.prompts import PromptTemplate
# 定义子链
french_chain = LLMChain(llm=llm, prompt=PromptTemplate(template="Translate to French: {text}", input_variables=["text"]))
spanish_chain = LLMChain(llm=llm, prompt=PromptTemplate(template="Translate to Spanish: {text}", input_variables=["text"]))
# 定义路由逻辑
router_prompt = PromptTemplate(
input_variables=["language"],
template="Route to the appropriate chain based on the language: {language}"
)
# 构建 RouterChain
router_chain = RouterChain(
router_prompt=router_prompt,
destination_chains={"French": french_chain, "Spanish": spanish_chain}
)
# 调用链
result = router_chain.run({"text": "Hello!", "language": "French"})
print(result) # 输出:Bonjour !
适用场景
- 多语言翻译
- 动态任务选择
- 自适应问答系统
总结
LangChain 提供了强大的 Chain 模块,帮助开发者灵活地组织任务逻辑。从简单的 LLMChain 到复杂的 SequentialChain 和动态的 RouterChain,不同链类型满足了从单步处理到多步骤、多任务处理的各种需求。在实际应用中,合理选择和组合链类型,可以显著提升任务处理的效率与扩展性。
关键点:
- 模块化设计:简化开发,提高可维护性。
- 灵活组合:从单一任务到复杂工作流都能轻松实现。
- 动态扩展:支持根据任务动态适配处理逻辑。
通过 Chain 的使用,LangChain 将大语言模型的应用从单一任务扩展到复杂的多任务、多步骤场景,让开发者更高效地实现各种智能化应用。