文章目录[隐藏]
如果你刚接触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,还能插入任意逻辑。比如,我想生成关键词列表,处理后再总结:
需求
- LLM生成5个关键词。
- 清理并排序关键词。
- 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)
效果:一样,但代码更紧凑,像真正的流水线。
为啥生成质量差?优化技巧
初次尝试时,你可能会发现输出不够好(我也有过这困扰)。原因可能是:
- 默认模型弱:gpt-3.5-turbo能力有限,试试gpt-4-turbo。
- 提示模糊:像“列出5个关键词”太泛,加点要求(如“核心技术”“简洁”)。
- 随机性高:默认temperature=0.7,调低到0.2更稳定。
优化后,质量会显著提升,像上面例子那样。
Chain的潜力与应用
- 复杂任务:多次LLM调用嵌套,比如提取实体 → API查详情 → 总结。
- 工具集成:结合搜索、计算器等。
- 实时应用:聊天机器人、文档问答。
想实现更复杂的逻辑?试试SequentialChain或LangGraph(进阶版Chain)。
小结与建议
- Chain是什么? 一个灵活的任务编排工具。
- 能干啥? 从单次LLM调用到多次调用+中间逻辑,全都能搞定。
- 怎么入门? 先跑简单Chain,再加复杂步骤。
动手建议:
- 试试上面例子,调调提示词。
- 加个自己的逻辑(比如API调用)。
- 看看LangChain文档,玩转|操作符。
LangChain的Chain就像搭积木,搭得越多越有趣。你想用它做什么?留言告诉我,我帮你设计个Chain!
发表回复