LangChain 中的 Chain 运行方式及其区别| 豆包MarsCode AI刷题

666 阅读5分钟

LangChain中,Chain 是核心概念之一。它是将多个操作、步骤或任务链接在一起的基础组件。LangChain 提供了多种方式来执行链条操作,每种方式适用于不同的场景。本文将深入探讨 LangChain 中 Chain 的几种运行方式,介绍它们的使用方法、适用场景和特点,并对它们之间的区别进行详细对比。

LangChain 中的 Chain 运行方式

LangChain 提供了几种不同的执行链条操作的方法,包括 invoke()call()run()apply()stream()predict() 等。每种方法都有其独特的使用场景和优缺点。下面,我们将依次分析它们的特点、适用场景及其区别。


1. invoke() 方法

invoke() 方法是 LangChain 中最常见的调用方式,它会接收输入并执行链条的整个处理过程,最终返回处理结果。

  • 用法invoke() 接受一个字典类型的输入,执行链条中的所有步骤,并返回最终的输出。它适用于简单、直接的输入输出处理。

    result = chain.invoke(inputs)
    
  • 适用场景

    • 当你需要执行一个链条并返回最终结果时,invoke() 是最直接的选择。例如,生成文本、进行任务执行等场景。
  • 特点

    • 简洁直接invoke() 是最常用的调用方法,适用于标准的输入输出任务。
    • 链条完整执行:它会自动运行链条中的所有步骤,并返回最终的处理结果。
  • 示例

    假设我们需要为某个产品生成公司名称,invoke() 会帮助我们执行整个生成流程:

    from langchain.prompts import PromptTemplate
    from langchain.llms import OpenAI
    from langchain.chains import LLMChain
    
    llm = OpenAI(temperature=0)
    prompt = PromptTemplate(template="What is a good name for a company that makes {product}?", input_variables=["product"])
    chain = LLMChain(llm=llm, prompt=prompt)
    
    inputs = {"product": "artificial intelligence tools"}
    result = chain.invoke(inputs)
    print(result)
    

2. call() 方法

call()Chain 的底层方法,它允许更细粒度的控制,适用于自定义链条或在链条中插入额外的操作。虽然 invoke() 内部可能会调用 call(),但通常用户更少直接使用它。

  • 用法call() 是用来调用链条的低级方法,允许用户在不同链条步骤之间进行更多的定制化操作。

    result = chain.call(inputs)
    
  • 适用场景

    • 适用于开发自定义链条或需要在执行过程中插入更多控制逻辑的场景。
  • 特点

    • 灵活性强:可以在执行过程中进行更多自定义控制。
    • 底层方法:适用于复杂的链条实现,用户可以自行决定如何处理每个步骤。
  • 示例call() 允许你在链条执行时插入自定义步骤或行为。


3. run() 方法

run() 方法是对 invoke()call() 的高阶封装,旨在简化输入和输出的管理。它的使用场景通常是快速、简洁的任务执行,不需要额外的定制化控制。

  • 用法run() 接受输入并返回最终结果,适用于不需要复杂逻辑的场景。

    result = chain.run(inputs)
    
  • 适用场景

    • 如果你只是想快速执行任务,获取结果而不需要额外的定制,run() 是最简便的选择。
  • 特点

    • 高阶封装:简化了输入输出流程,适合简单的任务执行。
    • 快速执行:适合不需要复杂操作的场景。
  • 示例

    如果你只是需要快速执行一个模板并获取返回结果,run() 是最便捷的方式:

    result = chain.run("AI product")
    print(result)
    

4. apply() 方法

apply() 方法适用于批量处理输入数据。它可以同时处理多个输入项并返回每个输入项的处理结果。apply() 适合在数据量较大、需要并行处理的场景下使用。

  • 用法apply() 接受一个输入列表,逐一处理并返回每个输入项的结果。

    results = chain.apply([input1, input2, input3])
    
  • 适用场景

    • 用于批量处理任务。例如,需要处理多个文本或进行多个预测时,apply() 能有效提高效率。
  • 特点

    • 批量处理:适合并行处理多个任务或输入项。
    • 提高效率:当你有多个类似任务时,apply() 可以显著减少重复的代码。
  • 示例

    假设你需要生成多个公司名称,可以使用 apply() 方法批量处理多个任务:

    results = chain.apply(["AI product", "Healthcare app", "Finance tool"])
    print(results)
    

5. stream() 方法

stream() 方法用于流式处理任务,适用于长时间运行或需要逐步返回结果的场景。与其他方法一次性返回结果不同,stream() 会实时返回处理结果。

  • 用法stream() 会逐步返回处理结果,适合需要实时反馈的场景。

    for result in chain.stream(input_data):
        process(result)
    
  • 适用场景

    • 用于长时间运行或需要实时反馈的任务。比如日志分析、实时推荐等应用。
  • 特点

    • 实时反馈:逐步返回结果,适合流式数据处理。
    • 长时间运行:适合处理需要较长时间才能完成的任务。
  • 示例

    在处理需要逐步返回结果的任务时,stream() 可以实时处理并反馈结果。


6. predict() 方法

predict() 方法专门用于模型的预测任务,通常用于从模型中获取预测结果。与 run() 相似,但更专注于生成预测。

  • 用法predict() 用于生成模型的预测结果。

    result = chain.predict(input_data)
    
  • 适用场景

    • 适用于机器学习或其他模型推理任务。
  • 特点

    • 专为预测设计:适用于生成模型预测结果。
    • 定制化输入:根据需要,predict() 可能为某些模型提供额外的输入格式化。

总结:各方法之间的区别

方法适用场景特点
invoke()标准任务执行,适用于简单输入输出的场景最常用,直接执行链条并返回最终结果
call()复杂链条执行,自定义控制流的场景底层方法,适合自定义控制,灵活性高
run()简单任务执行,快速获取结果高阶封装,简化输入输出流程,快速执行
apply()批量处理多个输入数据批量处理输入,适合并行任务处理
stream()实时返回处理结果,适合长时间运行的任务流式处理,逐步返回结果,适合流式数据处理
predict()专为模型预测任务设计生成预测结果,适用于机器学习和模型任务