LangChain 核心组件全览
LangChain 是目前最主流的 LLM 应用开发框架,核心定位是**"连接大模型与外部资源/工具的桥梁"**,其"家族组件"围绕 LLM Agent 全生命周期设计,可拆解为 **9大核心模块**(按使用逻辑排序)。以下是各组件的功能、核心类/API、使用场景及实操示例,覆盖从基础到进阶的全维度:
一、核心组件总览(按执行链路)
```mermaid
graph LR
A[模型层<br>Models] --> B[提示层<br>Prompts]
B --> C[链层<br>Chains]
C --> D[智能体层<br>Agents]
C --> E[记忆层<br>Memory]
D --> F[工具层<br>Tools]
G[数据连接层<br>Document Loaders+Indexes] --> C
H[输出解析层<br>Output Parsers] --> C
I[回调/日志层<br>Callbacks] --> 所有模块
```
二、逐模块详解(功能+场景+示例)
1. Models(模型层)
**核心作用**:对接各类大模型(闭源/开源),统一调用接口,屏蔽不同模型的API差异。
-
**核心组件**:
-
`ChatModel`:对接对话型模型(如GPT-3.5/4、通义千问、文心一言、Llama 3);
-
`LLM`:对接文本生成型模型(如GPT-3、Claude);
-
`Embeddings`:对接嵌入模型(如text-embedding-ada-002、BGE、m3e),用于文本向量化。
-
**使用场景**:所有需要调用大模型的基础场景(生成、嵌入、对话)。
-
**极简示例**:
```Python
1. 调用OpenAI对话模型
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(model="gpt-3.5-turbo", temperature=0, api_key="你的密钥")
response = chat_model.invoke("介绍下LangChain")
print(response.content)
2. 调用嵌入模型
from langchain_openai import OpenAIEmbeddings
embeddings = OpenAIEmbeddings()
vector = embeddings.embed_query("LangChain组件") # 输出768维向量
```
2. Prompts(提示层)
**核心作用**:管理Prompt模板,支持动态填充变量、模板复用、提示优化(如Few-shot)。
-
**核心组件**:
-
`PromptTemplate`:基础模板(支持变量替换);
-
`ChatPromptTemplate`:对话场景模板(区分system/user/assistant角色);
-
`FewShotPromptTemplate`:少样本提示(注入示例提升模型效果)。
-
**使用场景**:需要标准化Prompt、动态传参的场景(如客服话术、工具调用引导)。
-
**示例**:
```Python
from langchain_core.prompts import ChatPromptTemplate
定义对话模板(system设定角色,user为动态输入)
prompt = ChatPromptTemplate.from_messages([
("system", "你是{role},回答要简洁,不超过50字"),
("user", "{question}")
])
填充变量并生成Prompt
formatted_prompt = prompt.format_messages(role="Python编程助手", question="什么是装饰器")
print(formatted_prompt) # 输出标准化的Prompt消息列表
```
3. Output Parsers(输出解析层)
**核心作用**:将LLM的非结构化输出(文本)转为结构化数据(JSON、列表、自定义类),解决"模型输出不可控"问题。
-
**核心组件**:
-
`JsonOutputParser`:解析为JSON;
-
`PydanticOutputParser`:解析为自定义Python类(强类型);
-
`ListOutputParser`:解析为列表。
-
**使用场景**:工具调用(需解析JSON格式的工具指令)、数据提取(如从文本中提取订单信息)。
-
**示例(解析为JSON)**:
```Python
from langchain_core.output_parsers import JsonOutputParser
from langchain_core.prompts import PromptTemplate
定义解析器
parser = JsonOutputParser()
Prompt中引导模型输出JSON
prompt = PromptTemplate(
template="提取以下文本的关键信息,输出JSON格式:{text}\n{format_instructions}",
input_variables=["text"],
partial_variables={"format_instructions": parser.get_format_instructions()}
)
调用模型+解析
chain = prompt | chat_model | parser
result = chain.invoke({"text": "用户张三,年龄25,手机号13800138000"})
print(result) # 输出:{"姓名":"张三","年龄":25,"手机号":"13800138000"}
```
4. Chains(链层)
**核心作用**:将"Prompt→Model→Output Parser"等步骤串联成可复用的流水线,支持多步骤任务(如"向量化→检索→生成")。
-
**核心组件**:
-
`LLMChain`:基础链(Prompt+Model);
-
`SequentialChain`:串行链(多链按顺序执行,前一个输出作为后一个输入);
-
`RetrievalQAChain`:检索增强生成(RAG)链(检索+生成);
-
`RouterChain`:路由链(根据输入选择不同链执行)。
-
**使用场景**:所有多步骤任务(如RAG、多轮对话、数据处理+生成)。
-
**示例(RAG基础链)**:
```Python
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import FAISS
1. 构建向量库(模拟文档)
texts = ["LangChain是LLM应用开发框架", "LangChain支持RAG、Agent等功能"]
vectors = embeddings.embed_documents(texts)
db = FAISS.from_texts(texts, embeddings)
2. 构建RAG链(检索+生成)
rag_chain = RetrievalQA.from_chain_type(
llm=chat_model,
chain_type="stuff", # 简单拼接检索结果到Prompt
retriever=db.as_retriever()
)
3. 执行
result = rag_chain.invoke({"query": "LangChain能做什么"})
print(result["result"]) # 输出包含检索信息的回答
```
5. Memory(记忆层)
**核心作用**:管理对话/任务的上下文记忆,解决LLM"无状态"问题(默认不记得历史对话)。
-
**核心组件**:
-
`ConversationBufferMemory`:简单缓存所有对话(适合短对话);
-
`ConversationSummaryMemory`:总结对话内容(适合长对话,减少Token消耗);
-
`VectorStoreRetrieverMemory`:向量库记忆(检索相关历史,适合超长对话);
-
`EntityMemory`:实体记忆(跟踪实体信息,如"用户张三的地址是北京")。
-
**使用场景**:多轮对话(客服、智能助手)、长任务执行(如连续的数据分析)。
-
**示例(对话缓存记忆)**:
```Python
from langchain.chains import ConversationChain
from langchain.memory import ConversationBufferMemory
构建带记忆的对话链
memory = ConversationBufferMemory()
conversation_chain = ConversationChain(
llm=chat_model,
memory=memory,
verbose=True
)
多轮对话
conversation_chain.invoke({"input": "我叫张三"})
conversation_chain.invoke({"input": "记住我的名字了吗"}) # 模型能回答"记住了,你是张三"
```
6. Tools & Toolkits(工具层)
**核心作用**:扩展LLM的能力边界(如调用搜索引擎、计算器、API、数据库),是Agent的核心依赖。
-
**核心组件**:
-
`Tool`:自定义工具(封装函数+描述);
-
`BaseToolkit`:工具集(如SQLDatabaseToolkit、PythonREPLToolkit);
-
内置工具:`SerpAPIWrapper`(搜索引擎)、`PythonREPLTool`(代码执行)、`CalculatorTool`(计算器)。
-
**使用场景**:Agent工具调用、需要外部能力的任务(如查天气、算数据、查数据库)。
-
**示例(自定义工具)**:
```Python
from langchain_core.tools import Tool
定义自定义工具(查天气)
def get_weather(city):
模拟接口返回
return f"{city}今天天气:晴,温度20℃"
tools = [
Tool(
name="WeatherTool", # 工具名(LLM识别用)
func=get_weather, # 执行函数
description="查询指定城市的天气,输入参数为城市名(如北京、上海)" # 关键:描述要清晰
)
]
```
7. Agents(智能体层)
**核心作用**:让LLM具备"自主决策+调用工具+执行任务"的能力,是LangChain的核心高阶组件。
-
**核心组件**:
-
`AgentExecutor`:Agent执行器(核心驱动);
-
`create_openai_functions_agent`:OpenAI函数调用型Agent(最常用);
-
`create_react_agent`:ReAct范式Agent(思考+行动);
-
`MultiAgentExecutor`:多Agent执行器(多智能体协作)。
-
**使用场景**:复杂自主任务(如"订机票""调研行业报告""数据分析+生成报告")。
-
**示例(基础工具调用Agent)**:
```Python
from langchain.agents import create_openai_functions_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate
1. 定义Prompt(引导Agent思考+调用工具)
prompt = ChatPromptTemplate.from_messages([
("system", "你是智能助手,根据需求调用合适的工具,不需要工具时直接回答"),
("user", "{input}"),
("placeholder", "{agent_scratchpad}") # 存放Agent的思考/工具调用记录
])
2. 创建Agent
agent = create_openai_functions_agent(chat_model, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
3. 执行(调用天气工具)
result = agent_executor.invoke({"input": "查下上海今天的天气"})
print(result["output"]) # 输出:上海今天天气:晴,温度20℃
```
8. Document Loaders & Indexes(数据连接层)
**核心作用**:加载/处理外部文档(PDF、Word、数据库、网页),并构建检索索引(向量库),是RAG的基础。
-
**核心组件**:
-
**Loaders**:`PyPDFLoader`(PDF)、`TextLoader`(文本)、`WebBaseLoader`(网页)、`SQLDatabase`(数据库);
-
**Splitters**:`RecursiveCharacterTextSplitter`(文本分块,解决Token限制);
-
**Indexes**:`FAISS`(本地向量库)、`Pinecone`(云端向量库)、`Chroma`(轻量向量库)。
-
**使用场景**:RAG(检索增强生成)、私有知识库问答、文档分析。
-
**示例(加载PDF并构建向量库)**:
```Python
from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
1. 加载PDF
loader = PyPDFLoader("langchain_doc.pdf")
documents = loader.load()
2. 文本分块
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
chunks = splitter.split_documents(documents)
3. 构建向量库
db = FAISS.from_documents(chunks, embeddings)
```
9. Callbacks(回调/日志层)
**核心作用**:监控/记录LLM/Chain/Agent的执行过程(如Token消耗、执行时间、中间输出),支持自定义回调(如日志、监控、存储)。
-
**核心组件**:
-
`CallbackHandler`:自定义回调类;
-
`LangChainTracer`:LangSmith(LangChain监控平台)回调;
-
`StdOutCallbackHandler`:控制台输出回调(调试用)。
-
**使用场景**:调试、监控、计费(按Token统计)、日志存储。
-
**示例(控制台调试回调)**:
```Python
from langchain_core.callbacks import StdOutCallbackHandler
执行Chain时添加回调(打印中间过程)
handler = StdOutCallbackHandler()
result = conversation_chain.invoke(
{"input": "介绍下自己"},
callbacks=[handler]
)
```
三、组件组合使用场景(实战落地)
|业务场景|核心组件组合|
|---|---|
|私有知识库问答(RAG)|Loaders + Splitters + Indexes + RetrievalQAChain|
|智能客服(多轮对话)|ChatPromptTemplate + ConversationBufferMemory + LLMChain|
|数据分析Agent|PythonREPLTool + AgentExecutor + Memory|
|电商订单查询助手|SQLDatabaseToolkit + Agent + OutputParser|
|多Agent协作写报告|CrewAI/LangChain MultiAgent + Tools + Memory|
四、总结
-
**核心逻辑**:LangChain组件围绕"LLM+外部能力"展开,底层是Models/Prompts,中层是Chains/Memory,高层是Agents/Tools,数据层是Loaders/Indexes,解析/监控是Output Parsers/Callbacks;
-
**使用原则**:简单任务用"Prompt+LLMChain",需要记忆用Memory,需要外部能力用Tools+Agent,需要私有数据用RAG(Loaders+Indexes+RetrievalQAChain);
-
**落地建议**:新手从"单轮生成→多轮对话→简单RAG→工具调用Agent"逐步进阶,优先用内置组件,复杂场景再自定义。
如果需要某一具体场景(如"基于LangChain+国产LLM的企业知识库问答系统")的完整可运行代码,我可以针对性编写并注释。
> (注:文档部分内容可能由 AI 生成)