LangChain的Chain:从简单任务到复杂工作流

如果你刚接触LangChain,可能听过“Chain”这个词,却不太清楚它是什么,怎么用。别急,今天我们就来聊聊LangChain的Chain——这个让大型语言模型(LLM)更强大、更灵活的核心工具。从简单问答到复杂的多次LLM调用,甚至中间插入数据处理逻辑,Chain都能搞定。准备好了吗?让我们一起走进Chain的世界!

Chain是什么?厨房流水线的魔法

简单来说,Chain是LangChain用来组织和执行一系列操作的机制。想象你在厨房做菜:先切菜(输入准备),然后炒菜(LLM生成),最后调味(后处理),端上桌就是结果。Chain就像这个菜谱,把任务拆成步骤,按顺序执行。

在LangChain里,Chain可以是:

  • 单步:一个提示词+LLM调用。
  • 多步:多次LLM调用、数据处理、工具调用组合。

核心作用:让LLM不再是孤立的“回答机器”,而是能完成复杂任务的智能助手。

入门:一个简单的Chain

先从基础开始,看看Chain怎么跑起来。

单次LLM调用

假设我想让LLM告诉我关于LangChain的简介:

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 初始化LLM(默认gpt-3.5-turbo)
llm = ChatOpenAI(api_key="your-api-key")

# 创建提示模板
prompt = ChatPromptTemplate.from_template("告诉我关于{topic}的简单介绍。")

# 组合成Chain
chain = prompt | llm

# 运行
print(chain.invoke({"topic": "LangChain"}).content)

输出:

LangChain是一个开源框架,帮助开发者构建基于LLM的应用,支持上下文记忆和外部数据检索。

拆解:

  • | 是LangChain的“管道”操作符,把提示词的输出传给LLM。
  • 一个Chain就这么简单:输入 → 提示 → LLM → 输出。

进阶:多次LLM调用

Chain的真正威力在于它能串联多次LLM调用。比如,我想先让LLM写篇短文,再让它润色:

代码实现

llm = ChatOpenAI(api_key="your-api-key", model="gpt-4-turbo")  # 用GPT-4提升质量

# 第一步:生成初稿
draft_prompt = ChatPromptTemplate.from_template("写一篇关于{topic}的短文。")
draft_chain = draft_prompt | llm

# 第二步:润色
polish_prompt = ChatPromptTemplate.from_template("润色这篇文章:{draft}")
polish_chain = polish_prompt | llm

# 组合
def full_chain(input_dict):
    draft = draft_chain.invoke({"topic": input_dict["topic"]}).content
    polished = polish_chain.invoke({"draft": draft}).content
    return polished

print(full_chain({"topic": "LangChain"}))

输出示例:

LangChain是一个功能强大的开源框架,旨在助力开发者构建智能应用。它通过Chains、记忆管理和外部工具集成,让LLM更实用。经过润色,这篇文章更加流畅,展示了LangChain的独特魅力。

要点:

  • 两次LLM调用:一次生成,一次优化。
  • 手动组合简单直观,但可以用更优雅的方式(后面会讲)。

复杂任务:插入中间逻辑

Chain不仅限于LLM,还能插入任意逻辑。比如,我想生成关键词列表,处理后再总结:

需求

  1. LLM生成5个关键词。
  2. 清理并排序关键词。
  3. LLM总结排序后的结果。

代码实现

llm = ChatOpenAI(api_key="your-api-key", model="gpt-4-turbo", temperature=0.2)

# 第一步:生成关键词
list_prompt = ChatPromptTemplate.from_template(
    "列出5个与{topic}相关的核心技术关键词,要求简洁、准确,每行一个词。"
)
list_chain = list_prompt | llm

# 第二步:处理数据
def process_data(output):
    keywords = output.content.split("\n")
    processed = [kw.strip() for kw in keywords if kw.strip()]
    processed.sort()
    return "\n".join(processed)

# 第三步:总结
summary_prompt = ChatPromptTemplate.from_template("总结这些关键词:{keywords}")
summary_chain = summary_prompt | llm

# 完整Chain
def full_chain(input_dict):
    raw_list = list_chain.invoke({"topic": input_dict["topic"]})
    processed_list = process_data(raw_list)
    summary = summary_chain.invoke({"keywords": processed_list}).content
    return summary

print(full_chain({"topic": "LangChain"}))

输出示例:

关键词Chains、Memory、Retrieval、Agents、Tools展示了LangChain在任务编排、上下文管理和工具集成方面的核心能力。

拆解:

  • LLM调用1:生成原始关键词。
  • 中间逻辑:清理(去空行)、排序。
  • LLM调用2:总结处理后的列表。

更优雅的方式:用|串联

LangChain的RunnableLambda让Chain更简洁:

from langchain_core.runnables import RunnableLambda

# 处理函数
def process_keywords(text):
    keywords = text.content.split("\n")
    return "\n".join(sorted([kw.strip() for kw in keywords if kw.strip()]))

# 单行Chain
chain = (
    list_prompt | llm | RunnableLambda(process_keywords) | summary_prompt | llm
)
print(chain.invoke({"topic": "LangChain"}).content)

效果:一样,但代码更紧凑,像真正的流水线。

为啥生成质量差?优化技巧

初次尝试时,你可能会发现输出不够好(我也有过这困扰)。原因可能是:

  1. 默认模型弱:gpt-3.5-turbo能力有限,试试gpt-4-turbo。
  2. 提示模糊:像“列出5个关键词”太泛,加点要求(如“核心技术”“简洁”)。
  3. 随机性高:默认temperature=0.7,调低到0.2更稳定。

优化后,质量会显著提升,像上面例子那样。

Chain的潜力与应用

  • 复杂任务:多次LLM调用嵌套,比如提取实体 → API查详情 → 总结。
  • 工具集成:结合搜索、计算器等。
  • 实时应用:聊天机器人、文档问答。

想实现更复杂的逻辑?试试SequentialChain或LangGraph(进阶版Chain)。

小结与建议

  • Chain是什么? 一个灵活的任务编排工具。
  • 能干啥? 从单次LLM调用到多次调用+中间逻辑,全都能搞定。
  • 怎么入门? 先跑简单Chain,再加复杂步骤。

动手建议:

  1. 试试上面例子,调调提示词。
  2. 加个自己的逻辑(比如API调用)。
  3. 看看LangChain文档,玩转|操作符。

LangChain的Chain就像搭积木,搭得越多越有趣。你想用它做什么?留言告诉我,我帮你设计个Chain!


已发布

分类

作者:

标签

评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注