LangChain中的Chain(链)| 豆包MarsCode AI 刷题

152 阅读4分钟

LangChain中的Chain(链)

什么是Chain?

在 LangChain 中,Chain(链) 是一种模块化设计,用于将多个任务或步骤串联起来,完成特定的复杂任务。Chain 提供了一个灵活的框架,可以将多个组件(如语言模型、提示模板、工具等)组合在一起,形成一个任务处理流程。

主要特点

  1. 模块化:每个任务以独立的模块实现,通过链连接,方便维护和扩展。
  2. 灵活性:支持从简单到复杂的多种链类型,适配不同任务需求。
  3. 可组合性:链可以嵌套或组合,构建复杂的任务逻辑。

通过 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 中,链可以通过两种方式调用:

  1. run 方法:用于处理单个输入。
  2. 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,不同链类型满足了从单步处理到多步骤、多任务处理的各种需求。在实际应用中,合理选择和组合链类型,可以显著提升任务处理的效率与扩展性。

关键点

  1. 模块化设计:简化开发,提高可维护性。
  2. 灵活组合:从单一任务到复杂工作流都能轻松实现。
  3. 动态扩展:支持根据任务动态适配处理逻辑。

通过 Chain 的使用,LangChain 将大语言模型的应用从单一任务扩展到复杂的多任务、多步骤场景,让开发者更高效地实现各种智能化应用。