1. 理解LangChain中的Runnable接口
在LangChain框架中,Runnable接口是整个架构设计的核心基础。它就像是一个万能插座,让各种不同的组件能够无缝连接在一起工作。想象一下,如果你家里的电器都需要不同的插座,那会是多么混乱的场景。Runnable接口就是LangChain中的"标准插座",让提示词模板、语言模型、输出解析器等组件能够以统一的方式相互连接。
1.1 Runnable接口的核心作用
Runnable接口主要解决了以下几个关键问题:
-
统一执行接口:所有实现了Runnable的组件都遵循相同的调用规范,无论是同步调用(invoke)还是异步调用(ainvoke),开发者不需要关心内部实现细节。
-
组件可组合性:通过重载Python的
|运算符,不同组件可以像拼积木一样自由组合,形成处理流水线。 -
类型安全保证:RunnableSerializable作为Runnable的子接口,进一步确保了组件在序列化和类型检查方面的安全性。
在实际代码中,我们可以看到ChatTongyi(通义千问的聊天模型)和ChatPromptTemplate(聊天提示词模板)都继承自RunnableSerializable:
python复制from langchain_core.runnables import Runnable, RunnableSerializable
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_core.prompts import ChatPromptTemplate
# 初始化组件
chat = ChatTongyi(model="qwen3-max")
prompt = ChatPromptTemplate.from_messages([...])
# 检查继承关系
print(isinstance(chat, Runnable)) # 输出: True
print(isinstance(prompt, RunnableSerializable)) # 输出: True
1.2 方法解析顺序(MRO)的奥秘
Python通过MRO(Method Resolution Order,方法解析顺序)来确定类继承关系中方法的调用顺序。当我们查看ChatTongyi的MRO时,可以清晰地看到它的继承链条:
python复制print(ChatTongyi.__mro__)
# 输出大致为:
# (<class 'langchain_community.chat_models.tongyi.ChatTongyi'>,
# <class 'langchain_core.language_models.chat_models.BaseChatModel'>,
# <class 'langchain_core.language_models.base.BaseLanguageModel'>,
# <class 'langchain_core.runnables.
