LangChain的核心基础组件

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 失败重试(如模型调用超时/报错时重试)

总结

  1. 核心流转逻辑PromptTemplate(构造提示词)→ ChatModel/LLM(调用模型)→ OutputParser(解析输出),通过 Runnable 组合流程,RunnablePassthrough 负责数据透传/加工;
  2. 扩展能力Document/TextSplitter 处理外部文本,VectorStore 实现检索增强,ChatMessageHistory 实现多轮对话;
  3. 统一接口:所有组件都实现 Runnable 接口,支持 invoke()/stream() 等统一调用方式,降低组合复杂度。

这些组件的核心设计思想是“模块化+可组合”,你可以像搭积木一样,用基础组件组合出复杂的大模型应用(如RAG、智能体Agent)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容