01 Chain 核心原理
1.1 设计演进
▋ 概念锚定
Chain (链式组件) 为多模块复合型AI应用核心架构模式:
- 实现组件间管道式数据流(Pipeline Pattern)
- 支持上下文感知的链式调用
- 允许模块间输入输出绑定
▋ 版本差异比较表
特征维度 | 0.1.0之前版本 | 0.1.0+版本 |
---|---|---|
基类继承 | BaseModel |
RunnableSerializable |
构建规范 | 类继承模式 | LCEL表达式模式 |
运行兼容性 | 独立运行方法 | 兼容Runnable协议 |
代码痛点数 | 5种运行方式 | 统一invoke 接口 |
# 继承结构对比示例(抽象层级)
class Chain_v0(BaseModel, ABC): # 传统实现
def __call__(self, inputs): ...
class Chain_v1(RunnableSerializable): # 现代实现
def invoke(self, inputs): ...
1.2 链路构建模式
▋ LLMChain 基础架构
from langchain.chains.llm import LLMChain
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 组件装配
llm = ChatOpenAI(model="gpt-3.5-turbo-16k")
prompt = ChatPromptTemplate.from_template("生成关于{subject}的趣味段子")
# 链式封装
chain = LLMChain(llm=llm, prompt=prompt)
# 多形态调用(遗留问题)
chain.run("程序员") # 字符串输入
chain.invoke({"subject": "程序员"}) # 规范化调用
⚠️ 兼容性告警
传统 Chain 支持多种调用方式导致的技术债:
- 参数类型不统一(字符串/Dict混合)
- 返回值格式多样化
- 上下文管理困难
02 组件生态分类
2.1 LCEL Chains (推荐)
▋ 函数式构建模式
from langchain.chains.combine_documents import create_stuff_documents_chain
doc_chain = create_stuff_documents_chain(
llm=ChatOpenAI(),
prompt=ChatPromptTemplate.from_messages(...)
)
# 上下文注入示例
documents = [Document(content="...")]
response = doc_chain.invoke({
"query": "分析用户偏好",
"context": documents
})
▋ Chain 特性对比矩阵
特性维度 | 传统 Chain | LCEL Chain |
---|---|---|
构建速度 | 慢(基于类继承体系) | 快(函数式声明化构建) |
调试能力 | 低(黑盒式执行) | 高(支持可视化链路追踪) |
跨链组合 | ❌ 不支持 | ✅ 原生组合式设计 |
热更新能力 | 差(需重启服务) | 优秀(运行时动态更新) |
关键指标说明
▋ 构建速度
- 传统方案需通过继承体系定义完整类结构
- LCEL 采用声明式编程范式(类似Kotlin DSL)
▋ 调试能力
- LCEL 内置执行轨迹记录器(LangSmith集成)
- 支持断点调试与中间态快照导出
▋ 热更新
- 传统链需重新实例化对象
- LCEL 支持通过 update_runtime_config() 方法动态调整流水线
▋ 中转API推荐
2.2 Legacy Chains (传统链)
▋ 典型实现案例
from langchain.chains.conversation.base import ConversationChain
legacy_chain = ConversationChain(llm=ChatOpenAI(model="gpt-4o"))
# 继承式调用缺陷展示
output = legacy_chain.invoke({
"input": "请解析我的运动喜好",
"history": "用户:喜欢足球\nAI:了解..."
})
# 输出结构不透明
print(output) # {'input':..., 'history':..., 'response':...}
▋ 淘汰路线图
最佳实践指南
✅ 架构决策建议
- 新项目强制使用LCEL表达式
- 存量项目逐步迁移至Runnable接口
- 禁用以下方法:
chain.run()
chain.apply()
chain.predict()