LangChain核心组件全解析

2 阅读11分钟

LangChain 核心组件全景解析:从零到一构建 LLM 应用

作者注:本文基于 LangChain 系列教程(共 9 集,总时长约 5 小时)系统整理而成。逐帧分析了视频中的幻灯片、代码演示和架构图示,并结合 LangChain 最新 API 进行了校验和适配。适合有 Python 基础的开发者系统学习。


目录

  1. 开篇:为什么要学 LangChain
  2. 第一集:LangChain 入门与 LLM 生态概览
  3. 第二集:Hello World 与 ConversationChain
  4. 第三集:Model I/O —— Prompt 工程化
  5. 第四集:Data Connection —— 让 LLM 读懂你的数据
  6. 第五集:Chains —— 编排的艺术
  7. 第六集:Agents —— 会思考的 LLM
  8. 第七集:实战 PDF 问答系统
  9. 第八集:实战 搜索 Agent 进阶
  10. 第九集:回顾总结与最佳实践
  11. 附录:API 迁移指南与常见问题

1. 开篇:为什么要学 LangChain

1.1 背景:LLM 时代的挑战

2022 年 11 月,OpenAI 发布了 GPT-3.5 API(text-davinci-003),开发者的世界从此改变。紧接着,GPT-4 以 MoE(Mixture of Experts)架构横空出世,Meta 开源了 LLaMA 系列,智谱推出了 ChatGLM。

但直接调用 API 做应用开发,会立刻撞上四面墙:

第一面墙:上下文有限。GPT-3.5 的 token 上限是 4096,一份 20 页的 PDF 根本塞不进去。

第二面墙:能力受限。LLM 不能搜索网页、不能执行代码、不能读取本地文件——它只是”一本百科全书”,而不是”一个能干活的助手”。

第三面墙:没有记忆。每次 API 调用都是崭新的对话,你问”我之前叫什么”它永远回答不上来。

第四面墙:Prompt 管理混乱。项目里散落着上百行硬编码的 prompt 字符串,改一个字要搜遍整个代码仓库。

LangChain 就是为了推倒这四面墙而生的。

1.2 LangChain 是什么

LangChain 不是一个新的 LLM,而是一个 LLM 应用编排框架

User Input → [Prompt Template] → [LLM Call] → [Output Parser] → Result
↑                ↑
[Memory]        [Tools / APIs]

六层架构:

层级模块解决的问题
L1Model I/O如何统一调用不同厂商的 LLM
L2Data Connection如何让 LLM 读取外部文档
L3Chains如何串联多个 LLM 调用
L4Memory如何让 LLM 记住对话
L5Agents如何让 LLM 自主使用工具
L6Callbacks如何监控和调试 LLM 调用链

image

1.3 主流 LLM 生态速览

模型厂商架构特点适用场景
GPT-4OpenAIMoE 混合专家,8×220B 参数复杂推理,成本高
GPT-3.5OpenAI175B Dense性价比首选
LLaMA 2Meta7B/13B/70B 开源本地部署、垂直微调
ChatGLM智谱 AI中英双语优化中文场景

关于 MoE(Mixture of Experts):GPT-4 不是一个大模型,而是多个”专家”子模型的组合。每次推理时,只有部分专家被激活——理解为:一个问题来了,系统自动把它派给最擅长这个领域的那几个”专家”回答。


2. 第一集:LangChain 入门与 LLM 生态概览

视频源:1.mp4(约 30 分钟)

2.1 本集要点

  1. 什么是 LLM / 大语言模型? —— 从 GPT-3(2020 年 6 月 11 日发布)到 GPT-3.5 API(2022 年 11 月)再到 GPT-4。
  2. 什么是 LangChain? —— 一个 Python 框架,让开发者用”搭积木”的方式组合 LLM 调用。
  3. 为什么要用 LangChain? —— 直接调 API 能做 demo,但做产品需要工程化。

2.2 直接调 API 的局限

const response = await createCompletion({
model: "text-davinci-003",
prompt: "你是谁?",
temperature: 0.8,
max_tokens: 100,
});

缺少:prompt 管理、上下文注入、结果处理、错误处理、可观测性。

2.3 LangChain 的解法

LangChain is a framework for developing applications powered by language models.

它在 LLM 之上构建了标准化的抽象层,让你只关心”业务逻辑”,不用管底层细节。

image


3. 第二集:Hello World 与 ConversationChain

视频源:2.mp4(约 48 分钟)

3.1 环境搭建

pip install langchain langchain-openai langchain-community python-dotenv

创建 .env 文件:

DEEPSEEK_API_KEY=sk-your-key-here
OPENAI_API_KEY=sk-your-backup-key-here

3.2 第一个调用

import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage

load_dotenv()

llm = ChatOpenAI(
model="deepseek-chat",
temperature=0.7,
api_key=os.getenv("DEEPSEEK_API_KEY"),
base_url="https://api.deepseek.com/v1"
)

result = llm.invoke([HumanMessage(content="你好,请用一句话介绍 LangChain")])
print(result.content)

关键点:base_url 参数让你可以对接任何兼容 OpenAI API 的服务,实现模型层的”热插拔”。

3.3 Temperature 参数

temperature = 0.0  →  确定模式:数学计算、代码生成、事实问答
temperature = 0.7  →  平衡模式:日常对话、内容总结
temperature = 1.0  →  创造模式:创意写作、头脑风暴

底层原理:LLM 本质是在做”下一个 token 的概率预测”。temperature 越低,越倾向于选最高概率;temperature 越高,低概率 token 被选中的机会越大。

3.4 Jupyter Notebook 交互式开发

视频中演示了在 Jupyter Notebook 中进行 LangChain 开发的全流程。Cell 机制非常适合 LLM 开发——逐步构建 prompt、观察输出、调整参数。

image

3.5 ConversationChain:有记忆的对话

from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain

conversation = ConversationChain(
llm=llm,
memory=ConversationBufferMemory(),
verbose=True
)

conversation.predict(input="我叫小明,今年 25 岁")
conversation.predict(input="我叫什么名字?多大?")
# AI: 你叫小明,今年 25 岁。

3.6 Prompt 向 LLM 传递信息的方式

  • System Message:设定 AI 的行为边界和角色
  • Human Message:用户的直接输入
  • AI Message:LLM 的返回结果——在多轮对话中作为历史消息附加到后续请求

4. 第三集:Model I/O —— Prompt 工程化

视频源:3.mp4(约 31 分钟)

4.1 为什么需要 Prompt 模板?

# ❌ 反模式:硬编码字符串拼接
prompt = "请将以下文本翻译成英文:" + text

问题:维护困难、复用不了。Prompt Template 将 prompt 参数化,把”模板”和”数据”解耦。

4.2 PromptTemplate 基础用法

from langchain_core.prompts import PromptTemplate

template = PromptTemplate.from_template(
"你是一个{role}。请将以下文本翻译成{target_lang}:\n{text}"
)

prompt_str = template.format(role="专业翻译", target_lang="英文", text="人工智能")

4.3 Few-Shot Prompting:用示例教会 LLM

from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate

examples = [
{"input": "今天天气真好", "output": "正向"},
{"input": "我太难了",     "output": "负向"},
{"input": "随便吧",       "output": "中性"},
]

few_shot = FewShotPromptTemplate(
examples=examples,
example_prompt=PromptTemplate.from_template("输入: {input}\n情感: {output}"),
prefix="分析以下文本的情感倾向,只输出'正向'、'负向'或'中性':",
suffix="输入: {input}\n情感:",
input_variables=["input"],
)

Few-Shot vs Fine-tuning

维度Few-ShotFine-tuning
成本零训练成本,Token 消耗需要训练数据和 GPU
灵活性随时改示例,立即生效修改需要重新训练
效果适合格式控制适合领域知识注入
持久性每次推理消耗 token训练后模型自带能力

视频中的建议:先用 Few-Shot 验证需求,确实需要再考虑 Fine-tuning

image

4.4 Example Selector:示例太多怎么办?

from langchain_core.example_selectors import SemanticSimilarityExampleSelector
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma

selector = SemanticSimilarityExampleSelector.from_examples(
examples=all_examples,
embeddings=OpenAIEmbeddings(),
vectorstore_cls=Chroma,
k=3,
)

工作原理:1) 将所有示例的 input 转换为向量 → 2) 用户输入也转换为向量 → 3) 计算余弦相似度,选取 Top-K → 4) 注入 Few-Shot Prompt

4.5 其他输出解析器

  • CommaSeparatedListOutputParser:逗号分隔列表输出
  • StructuredOutputParser:要求 JSON Schema 输出
  • PydanticOutputParser:直接解析为 Pydantic 模型对象

5. 第四集:Data Connection —— 让 LLM 读懂你的数据

视频源:4.mp4(约 35 分钟)

这是 LangChain 最重要的模块,也是 RAG(Retrieval-Augmented Generation)的基础设施。

5.1 数据连接层全景

核心问题:LLM 的训练数据截止到某个时间点,且不包含你的私有数据。如何让 LLM 回答关于你私有文档的问题?

Step 1: Load → Step 2: Split → Step 3: Embed → Step 4: Store

5.2 Document Loaders:万事皆可 Load

from langchain_community.document_loaders import (
PyPDFLoader,           # PDF 文档
WebBaseLoader,         # 网页 URL
YoutubeLoader,         # YouTube 视频字幕
UnstructuredPowerPointLoader,  # PowerPoint
TextLoader,            # 纯文本
CSVLoader,             # CSV 数据
)

loader = PyPDFLoader("annual_report.pdf")
pages = loader.load()
# pages[0].page_content → 文字内容
# pages[0].metadata → {"source": "...", "page": 1}

每个 Loader 返回的 Document 包含 page_content + metadata,metadata 在后续检索中至关重要。

5.3 Text Splitters:切得聪明

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50,
separators=["\n\n", "\n", "。", ",", " ", ""]
)
splits = splitter.split_documents(pages)

为什么需要 overlap?防止把一句话拦腰截断。

5.4 Word Embedding:文字的”身份证”

LLM 不理解文字,只理解数字。Embedding 将文字转为高维向量。关键性质:语义相近的文字,向量也相近。

"猫" → [0.12, -0.34, 0.56, 0.78, ...]
"狗" → [0.14, -0.31, 0.58, 0.75, ...]  ← 离"猫"很近
"汽车" → [-0.78, 0.45, -0.12, ...]  ← 离"猫"很远
from langchain_openai import OpenAIEmbeddings

embeddings = OpenAIEmbeddings(model="text-embedding-3-small")
vec = embeddings.embed_query("什么是 RAG?")

模型选择:text-embedding-3-small(1536 维,性价比最优),text-embedding-3-large(3072 维,精度更高)

5.5 Vector Store:语义搜索引擎

from langchain_community.vectorstores import FAISS

vectorstore = FAISS.from_documents(splits, OpenAIEmbeddings())
results = vectorstore.similarity_search("MoE 架构的优缺点?", k=4)

数据库选型:FAISS(开发测试)、Chroma(中小项目)、Pinecone(生产环境)、Weaviate/Qdrant(企业级)


6. 第五集:Chains —— 编排的艺术

视频源:5.mp4(约 25 分钟)

6.1 Chain 是什么?

# 没有 Chain:手动管理
prompt = template.format(input=user_input)
response = llm.invoke(prompt)
parsed = parser.parse(response)

# 有了 Chain + LCEL:
chain = prompt | llm | parser
result = chain.invoke({"input": user_input})

| 是 LangChain 的管道操作符,像 Unix 管道一样串联组件。

6.2 Chain 家族

LLMChain:最基础,Prompt → LLM → 输出。

RouterChain:根据输入内容自动选择处理策略。

用户输入 → Router → 数学问题? → MathChain
→ 编程问题? → CodeChain
→ 一般问题? → GeneralChain

SequentialChain:多步骤串联,上一步的输出是下一步的输入。

生成大纲 → 扩展段落 → 润色校对 → 输出

TransformationChain:对 LLM 输出做后处理(翻译、摘要、格式化等)。

6.3 Document Chains:RAG 的核心

Stuff:把所有文档塞进一个 prompt。简单,受上下文限制。

Map Reduce:先分别处理每份文档,再汇总。可并行,适合大量文档。

Refine:逐步优化答案。质量高,延迟也高(串行)。

Map Rerank:先分别处理,再按置信度排序选最优。


7. 第六集:Agents —— 会思考的 LLM

视频源:6.mp4(约 25 分钟)

7.1 Chain vs Agent

Chain 是被动的——你定义了流程,LLM 照做。Agent 是主动的——你给了工具箱,LLM 自己决定用哪个、用几次、按什么顺序。

7.2 ReAct 模式

Q: Leo DiCaprio 的女友是谁?她年龄的 0.43 次方是多少?

Thought: 先查女朋友是谁
Action: Search("Leo DiCaprio girlfriend")
Observation: 模特 Vittoria Ceretti

Thought: 查她的年龄
Action: Search("Vittoria Ceretti age")
Observation: 26 岁

Thought: 计算 26^0.43
Action: Calculator("26^0.43")
Observation: ~4.06

Final Answer: Vittoria Ceretti,26岁。26^0.43 ≈ 4.06

7.3 Agent 代码实现

from langchain.agents import load_tools, initialize_agent, AgentType
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="deepseek-chat", temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(
tools, llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True, max_iterations=5,
)
agent.run("Who is Leo DiCaprio's girlfriend? Her age ^ 0.43?")

7.4 Agent 类型

类型模式适用
Zero-shot ReAct每步即时决策简单任务
Structured Chat多参数工具调用复杂工具
OpenAI FunctionsFunction CallingGPT 专属
Plan-and-Execute先规划再执行多步骤复杂任务

7.5 Agent 调优

  • max_iterations:限制最大轮数,防止死循环
  • handle_parsing_errors:LLM 输出格式错误时重试
  • early_stopping_method:”force”强制输出 / “generate”生成最佳猜测

8. 第七集:实战 PDF 问答系统

视频源:7.mp4(约 38 分钟)

from langchain_community.document_loaders import PyPDFLoader
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain.chains import RetrievalQA
from langchain_openai import ChatOpenAI

loader = PyPDFLoader("report.pdf")
splits = RecursiveCharacterTextSplitter(chunk_size=800, chunk_overlap=100).split_documents(loader.load())
vectorstore = FAISS.from_documents(splits, OpenAIEmbeddings(model="text-embedding-3-small"))
qa = RetrievalQA.from_chain_type(
llm=ChatOpenAI(model="deepseek-chat", temperature=0),
chain_type="stuff",
retriever=vectorstore.as_retriever(search_kwargs={"k": 4}),
return_source_documents=True,
)
result = qa.invoke({"query": "这份报告的核心结论是什么?"})
print(result["result"])

chain_typestuff( chunks)、map_reduce(大量文档)、refine(高质量,串行)、map_rerank(打分排序)


9. 第八集:实战 搜索 Agent 进阶

视频源:8.mp4(约 53 分钟)

from langchain.agents import tool, initialize_agent, AgentType

@tool
def get_stock_price(symbol: str) -> str:
"""获取指定股票代码的当前价格。输入为股票代码,如 AAPL、TSLA。"""
prices = {"AAPL": "189.30", "TSLA": "242.84"}
return prices.get(symbol.upper(), f"未找到股票代码 {symbol}")

agent = initialize_agent([get_stock_price], llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("苹果股票现在多少钱?")

关键:tool 的 docstring 就是 Agent 判断何时使用该工具的依据——务必清晰准确。


10. 第九集:回顾总结与最佳实践

视频源:9.mp4(约 20 分钟)

技术选型决策树

  • 简单问答 → LLMChain
  • 私有文档问答 → RAG 流水线
  • 固定多步骤 → SequentialChain
  • 需自主决策 → Agent(ReAct)
  • 外部 API → 封装为 Tool,交给 Agent

生产环境注意事项

安全:永远不要在 prompt 中暴露 API Key。Agent 的工具调用需要沙箱隔离。

性能:Embedding 结果缓存。向量库选持久化的(Chroma/Pinecone)。map_reduce 链可并行。

成本控制:先用便宜模型验证,再换强模型。temperature=0 的任务用缓存。限制 max_iterations。

可观测性:LangSmith 追踪完整调用链。记录每个 Step 的 token 消耗。

API 迁移(两年变化)

旧 API新 API
from langchain.llms import OpenAIfrom langchain_openai import ChatOpenAI
llm.predict("text")llm.invoke([HumanMessage("text")])
Chain.run(input)Chain.invoke({"key": value})
from langchain.vectorstores import FAISSfrom langchain_community.vectorstores import FAISS

11. 附录:常见问题排查

错误原因解决
ModuleNotFoundError: langchain.llms旧版 API 已移除改用 langchain-openai
jupyter-lab 找不到Scripts 不在 PATH添加到 PATH
DeepSeek 401API Key 错误检查 .env
Agent 陷入循环工具返回不明确优化 docstring
FAISS 内存溢出数据太大换 Chroma/Pinecone

推荐学习路径

第 1 周:跑通 Hello World → 第 2 周:掌握 Prompt 工程 → 第 3 周:RAG 应用 → 第 4 周:Agent + 自定义工具 → 持续:关注官方文档


后记

这套视频虽然是两年前录制的,但 LangChain 的核心设计思想——模块化、可组合、工程化——没有变。变的只是包名和 API 签名,理解底层原理后,迁移只是改几行 import 的事。


声明:本文代码示例已适配 LangChain 最新 API(2025-2026)。图片来自原教程视频截图,仅供学习参考。