LangChain 的核心优势在于其模块化的组件设计,它有一系列基础组件共同支撑起从“输入→处理→输出”的完整流程。下面我会按数据流转逻辑分类讲解这些核心组件,并用新手友好的示例说明用法,帮你快速理解它们的定位和作用。
一、核心基础组件分类(按功能场景)
1. 输入层:Prompt 相关组件(提示词模板)
PromptTemplate/ChatPromptTemplate 是构建“结构化提示词”的核心,解决手动拼接字符串易出错、格式不统一的问题,是连接用户输入和模型的桥梁。
核心作用:定义提示词的固定模板 + 动态填充变量(比如用户问题、上下文)。
from langchain_core.prompts import PromptTemplate, ChatPromptTemplate
# 1. 基础文本提示词模板(适用于普通LLM)
prompt_template = PromptTemplate(
input_variables=["question"], # 声明需要填充的变量
template="请用简洁的语言回答:{question}" # 模板字符串
)
# 填充变量生成提示词
prompt = prompt_template.format(question="什么是LangChain?")
print(prompt) # 输出:请用简洁的语言回答:什么是LangChain?
# 2. 对话型提示词模板(适用于Chat模型,区分角色)
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个编程助手,回答简洁明了"), # 系统角色
("user", "{question}") # 用户输入变量
])
# 生成对话格式的提示词
messages = chat_prompt.format_messages(question="Python怎么学?")
print(messages) # 输出:[SystemMessage(content='你是一个编程助手...'), HumanMessage(content='Python怎么学?')]
2. 执行层:LLM/ChatModel(模型调用)
这是 LangChain 对接大模型的核心组件,分为两类:
-
LLM:对接文本输出型模型(如 GPT-3、Claude 文本版),输出纯字符串; -
ChatModel:对接对话型模型(如 GPT-3.5/4、Claude 3),输出结构化的对话消息。
核心作用:发送提示词给大模型,获取模型返回结果。
from langchain_openai import OpenAI, ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "你的API Key"
# 1. 基础LLM(文本输出)
llm = OpenAI(model="gpt-3.5-turbo-instruct")
result = llm.invoke("请解释什么是LLM?")
print(result) # 输出纯文本回答
# 2. ChatModel(对话输出)
chat_model = ChatOpenAI(model="gpt-3.5-turbo")
result = chat_model.invoke("请解释什么是ChatModel?")
print(result.content) # 提取对话消息的内容字段
3. 处理层:Runnable(链/组合器)
Runnable 是 LangChain 中所有组件的“通用接口”,核心是支持 invoke()(同步调用)、stream()(流式输出)等统一方法,常见实现包括:
-
RunnableSequence:按顺序执行多个组件(用|运算符简化); -
RunnableParallel:并行执行多个组件(合并结果); - 你熟悉的
RunnablePassthrough也属于 Runnable 体系。
核心作用:把 Prompt、Model、Passthrough 等组件组合成复杂的执行流程。
from langchain_core.runnables import RunnableSequence, RunnableParallel
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 顺序链(最常用,用|简化)
prompt = ChatPromptTemplate.from_messages([("user", "{question}")])
model = ChatOpenAI()
chain = prompt | model # 等价于 RunnableSequence([prompt, model])
result = chain.invoke({"question": "LangChain的核心组件有哪些?"})
print(result.content)
# 2. 并行链(同时执行多个任务)
parallel_chain = RunnableParallel({
"short_answer": prompt | model, # 生成简短回答
"original_question": RunnablePassthrough() # 透传原始问题
})
result = parallel_chain.invoke({"question": "Python怎么学?"})
print(result) # 输出:{"short_answer": 模型回答, "original_question": {"question": "Python怎么学?"}}
4. 输出层:OutputParser(输出解析器)
大模型返回的是文本/对话消息,OutputParser 可以把非结构化输出转换成结构化数据(如 JSON、列表、自定义类),解决“解析模型输出”的痛点。
核心作用:标准化模型输出格式,方便后续处理。
from langchain_core.output_parsers import (
StrOutputParser, # 转字符串
JsonOutputParser, # 转JSON
ListOutputParser # 转列表
)
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 1. 字符串解析器(最基础)
model = ChatOpenAI()
str_parser = StrOutputParser()
chain = prompt | model | str_parser
result = chain.invoke({"question": "Python怎么学?"})
print(type(result)) # 输出:<class 'str'>
# 2. JSON解析器(指定格式让模型输出JSON)
json_parser = JsonOutputParser()
# 提示词中明确要求输出JSON格式
prompt = ChatPromptTemplate.from_messages([
("user", "请列出3个Python学习网站,输出JSON格式,字段为name和url")
])
chain = prompt | model | json_parser
result = chain.invoke({})
print(result) # 输出:[{"name": "菜鸟教程", "url": "https://www.runoob.com/"}, ...]
print(type(result)) # 输出:<class 'list'>
5. 数据层:Document/TextSplitter(文档处理)
如果需要处理长文本(如PDF、文章),这两类组件是基础:
-
Document:标准化文本数据结构(包含page_content内容字段 +metadata元数据字段); -
TextSplitter:把长文本分割成小片段(适配模型上下文窗口限制)。
核心作用:处理外部文本数据,为“检索增强生成(RAG)”打基础。
from langchain_core.documents import Document
from langchain_text_splitters import CharacterTextSplitter
# 1. 定义Document
doc = Document(
page_content="LangChain是一个大模型应用开发框架,支持RAG、Agent等场景。它的核心是模块化组件。",
metadata={"source": "官方文档", "type": "introduction"}
)
# 2. 分割长文本
text_splitter = CharacterTextSplitter(
chunk_size=50, # 每个片段最大字符数
chunk_overlap=10 # 片段间重叠字符数(保证上下文连续)
)
splits = text_splitter.split_documents([doc])
print(len(splits)) # 输出:2(分割成2个片段)
print(splits[0].page_content) # 输出第一个片段内容
二、其他常用基础组件
| 组件类型 | 代表组件 | 核心作用 |
|---|---|---|
| 检索组件 |
VectorStore/Retriever
|
存储文本向量、检索相关上下文(RAG核心) |
| 记忆组件 | ChatMessageHistory |
保存对话历史,实现多轮对话 |
| 工具调用组件 |
Tool/Toolkit
|
让模型调用外部工具(如搜索、计算器) |
| 异常处理组件 | RunnableRetry |
失败重试(如模型调用超时/报错时重试) |
总结
-
核心流转逻辑:
PromptTemplate(构造提示词)→ChatModel/LLM(调用模型)→OutputParser(解析输出),通过Runnable组合流程,RunnablePassthrough负责数据透传/加工; -
扩展能力:
Document/TextSplitter处理外部文本,VectorStore实现检索增强,ChatMessageHistory实现多轮对话; -
统一接口:所有组件都实现
Runnable接口,支持invoke()/stream()等统一调用方式,降低组合复杂度。
这些组件的核心设计思想是“模块化+可组合”,你可以像搭积木一样,用基础组件组合出复杂的大模型应用(如RAG、智能体Agent)。