PAGE 07 · PHASE 3

🔗 LangChain 框架

构建 LLM 应用的全栈开发框架——从 Chain 到 Agent,从 Memory 到 Tool,用模块化组件编排复杂的 AI 工作流

中级 核心框架
01

🌐LangChain 概览

什么是 LangChain?

LangChain 是由 Harrison Chase 于 2022 年 10 月发起的开源框架,旨在为 LLM 应用开发提供标准化的抽象层和工具链。它解决了一个核心问题:如何将 LLM 的能力与外部数据源、API、记忆系统和工具无缝集成

截至 2026 年初,LangChain 已成为 LLM 应用开发领域最流行的框架之一,GitHub Stars 超过 100K,npm/PyPI 月下载量数百万。

发展历程

  • 2022.10 — Harrison Chase 发布 LangChain 首个版本(Python)
  • 2023.01 — 获得 Benchmark 领投的 1000 万美元种子轮融资
  • 2023.04 — LangChain.js 发布,正式支持 TypeScript/JavaScript 生态
  • 2023.07 — LangSmith(调试与监控平台)发布
  • 2024.01 — LangGraph 发布,引入基于图的 Agent 编排
  • 2024.06 — v0.2 重大重构,模块化拆分为 langchain-core + 独立包
  • 2025.02 — v0.3 发布,LCEL(LangChain Expression Language)成为一等公民
💡
LangChain 生态系统已拆分为三层:langchain-core(核心抽象)、langchain(高级组件)、langchain-community(社区集成)。选择性安装可以减小包体积。
02

🏗️核心架构

六大核心模块

LangChain 架构全景
Model I/O
LLM / Chat / Embedding
Chains
LCEL 编排
Memory
对话记忆
Tools
搜索 / 计算 / API
Agents
自主决策
Retrievers
RAG 检索
🤖

Model I/O

统一接口调用 OpenAI、Anthropic、本地模型等 50+ 提供商

⛓️

Chains

通过 LCEL 将多个组件用管道符 | 串联成工作流

🧠

Memory

Buffer、Summary、Vector Store 等多种对话记忆策略

🔧

Tools

封装外部 API、数据库、搜索引擎为可调用工具

🕵️

Agents

让 LLM 自主选择工具和执行路径,实现动态推理

🔍

Retrievers

对接向量数据库,实现 RAG 检索增强生成

LCEL — LangChain Expression Language

LCEL 是 LangChain v0.2+ 引入的声明式编排语法,使用管道符 | 将组件串联:

# LCEL 基本语法:用 | 管道符组合组件
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser

prompt = ChatPromptTemplate.from_template("用一句话解释 {topic}")
model = ChatOpenAI(model="gpt-4o")
parser = StrOutputParser()

# 管道编排:Prompt → Model → Parser
chain = prompt | model | parser

# 调用
result = chain.invoke({"topic": "量子计算"})
print(result)  # "量子计算利用量子力学原理..."
📝
LCEL 的所有组件都实现了 Runnable 接口,自动获得 .invoke().stream().batch().ainvoke() 等方法,支持同步/异步/流式/批量调用。
03

🤖Model I/O

三层模型抽象

类型接口输入输出示例
LLMBaseLLMstringstringtext-davinci-003
Chat ModelBaseChatModelList[Message]AIMessageGPT-4o, Claude-3
EmbeddingEmbeddingsstring / listfloat[]text-embedding-3-small

Prompt Templates

LangChain 提供类型安全的提示词模板系统:

from langchain_core.prompts import (
    ChatPromptTemplate,
    MessagesPlaceholder,
    HumanMessagePromptTemplate,
    SystemMessagePromptTemplate,
)

prompt = ChatPromptTemplate.from_messages([
    SystemMessagePromptTemplate.from_template(
        "你是 {role},说话风格 {style}"
    ),
    MessagesPlaceholder(variable_name="history"),
    HumanMessagePromptTemplate.from_template("{input}"),
])

# 支持部分填充
partial_prompt = prompt.partial(role="AI 导师", style="简洁幽默")

Output Parsers

将 LLM 非结构化输出解析为结构化数据:

from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field

class Movie(BaseModel):
    title: str = Field(description="电影名称")
    year: int = Field(description="上映年份")
    genre: str = Field(description="类型")

parser = JsonOutputParser(pydantic_object=Movie)

# 自动将 format_instructions 注入提示词
chain = prompt | model | parser
movie = chain.invoke({"query": "推荐一部科幻电影"})
# {"title": "银翼杀手2049", "year": 2017, "genre": "科幻"}
04

⛓️Chain 编排

什么是 Chain?

Chain 是 LangChain 的核心编排单元——将多个操作步骤串联成一个可复用的工作流。在 LCEL 之前,LangChain 使用 LLMChainSequentialChain 等类;LCEL 之后,所有编排统一为 Runnable 管道。

常用 Chain 模式

1. 顺序 Chain(Sequential)

# 先翻译,再总结
translate = ChatPromptTemplate.from_template(
    "将以下内容翻译成英文:\n{text}"
) | model | StrOutputParser()

summarize = ChatPromptTemplate.from_template(
    "Summarize in 2 sentences:\n{english}"
) | model | StrOutputParser()

# 用 RunnablePassthrough 传递中间结果
from langchain_core.runnables import RunnablePassthrough
chain = (
    {"english": translate}
    | summarize
)

2. 并行 Chain(Parallel)

from langchain_core.runnables import RunnableParallel

chain = RunnableParallel(
    summary=summarize_chain,
    sentiment=sentiment_chain,
    keywords=keyword_chain,
)

# 三个子链并行执行,返回 dict
result = chain.invoke({"text": article})

3. 路由 Chain(Router)

from langchain_core.runnables import RunnableBranch

branch = RunnableBranch(
    (lambda x: "代码" in x["topic"], code_chain),
    (lambda x: "数学" in x["topic"], math_chain),
    default_chain,  # 兜底
)
💡
LCEL vs 旧版 Chain:旧版 LLMChain / SequentialChain 已被标记为 Legacy。新项目建议全部使用 LCEL 语法(| 管道),获得更好的流式、异步和批量支持。
05

🧠Memory 记忆系统

为什么需要 Memory?

LLM 本身是无状态的——每次调用都是独立的。Memory 组件让对话系统具备"记忆"能力,能在多轮对话中保持上下文连贯。

四种主要 Memory 策略

策略原理优点缺点
ConversationBufferMemory 保留全部对话历史 信息完整,实现简单 长对话时 Token 爆炸
ConversationBufferWindowMemory 只保留最近 K 轮 Token 开销可控 会丢失早期上下文
ConversationSummaryMemory 用 LLM 压缩历史为摘要 节省 Token 保留要点 压缩有信息损失
VectorStoreMemory 将历史存入向量库语义检索 适合超长对话/知识召回 需要向量数据库

代码示例:Summary Memory

from langchain.memory import ConversationSummaryMemory
from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-4o-mini")
memory = ConversationSummaryMemory(
    llm=llm,
    return_messages=True
)

# 添加对话记录
memory.save_context(
    {"input": "我想学 AI,从哪里开始?"},
    {"output": "建议从 Python 和线性代数开始..."}
)

# 获取压缩摘要
messages = memory.load_memory_variables({})
# → "用户想学AI,助手建议从Python和数学基础开始"
⚠️
LangChain v0.3+ 推荐使用 LangGraph 的 State 管理替代独立 Memory 组件,因为它提供更精细的状态控制和持久化能力。独立 Memory 类仍可用但标记为 legacy。
06

🕵️Agent 智能体

Agent 的核心思想

Agent 是 LangChain 最强大的特性之一。与 Chain 的预设路径不同,Agent 让 LLM 自主决定执行哪些步骤、调用哪些工具。LLM 充当"大脑",通过推理循环动态规划行动。

Agent 执行流程

📥 接收用户输入
🧠 LLM 推理:选择 Tool or 直接回答
🔧 调用 Tool,获取结果
🧠 LLM 观察结果,决定下一步
📤 输出最终答案

创建 Agent 的两种方式

方式一:使用 create_tool_calling_agent(推荐)

from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

tools = [search_tool, calculator_tool]

prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个有用的助手。"),
    MessagesPlaceholder("chat_history", optional=True),
    ("human", "{input}"),
    MessagesPlaceholder("agent_scratchpad"),
])

agent = create_tool_calling_agent(
    llm=ChatOpenAI(model="gpt-4o"),
    tools=tools,
    prompt=prompt
)

executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
result = executor.invoke({"input": "今天北京天气怎么样?"})

方式二:使用 LangGraph(更灵活)

from langgraph.prebuilt import create_react_agent

agent = create_react_agent(
    model=ChatOpenAI(model="gpt-4o"),
    tools=tools,
)

# LangGraph Agent 支持流式输出
for chunk in agent.stream(
    {"messages": [("human", "帮我搜索 LangChain 最新版本")]}
):
    print(chunk)
07

🔧Tools 工具生态

内置工具示例

🌐

TavilySearch

AI 优化的网络搜索,支持实时信息检索

📊

PythonREPL

执行 Python 代码,用于数据分析和计算

🔗

RequestsToolkit

发送 HTTP 请求,对接任意 REST API

🗂️

FileManagement

文件读写、目录操作、文件搜索

🗄️

SQLDatabase

自然语言查询 SQL 数据库(Text-to-SQL)

🔌

MCP 集成

通过 MCP 协议接入外部工具生态

自定义 Tool

from langchain_core.tools import tool

@tool
def get_stock_price(symbol: str) -> str:
    """查询股票实时价格。
    
    Args:
        symbol: 股票代码,例如 AAPL、TSLA
    """
    # 调用股票 API...
    return f"{symbol} 当前价格: $150.00"

# 方式二:使用 StructuredTool
from langchain_core.tools import StructuredTool
from pydantic import BaseModel, Field

class WeatherInput(BaseModel):
    city: str = Field(description="城市名称")
    unit: str = Field(default="celsius", description="温度单位")

weather_tool = StructuredTool.from_function(
    func=get_weather,
    name="get_weather",
    description="获取指定城市天气",
    args_schema=WeatherInput,
)

Toolkits — 预打包工具集

Toolkit包含工具用途
SQLDatabaseToolkitquery_sql_db, info_sql_db, list_sql_db自然语言查数据库
GmailToolkitsend_email, search_emails, get_email邮件操作
GitHubToolkitcreate_issue, search_code, list_reposGitHub 操作
FileManagementToolkitread_file, write_file, list_directory文件管理
08

🚀实战项目:智能客服 Bot

项目目标

构建一个具有以下能力的智能客服系统:

  • 基于产品文档的 RAG 知识库问答
  • 多轮对话记忆
  • 查询订单工具调用
  • 流式输出与打字机效果

完整代码

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import RunnablePassthrough
from langchain_community.vectorstores import FAISS
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_core.tools import tool

# 1. 初始化模型和 Embedding
llm = ChatOpenAI(model="gpt-4o", streaming=True)
embeddings = OpenAIEmbeddings(model="text-embedding-3-small")

# 2. 构建知识库
docs = load_product_docs()  # 加载产品文档
splitter = RecursiveCharacterTextSplitter(
    chunk_size=500, chunk_overlap=50
)
chunks = splitter.split_documents(docs)
vectorstore = FAISS.from_documents(chunks, embeddings)
retriever = vectorstore.as_retriever(search_kwargs={"k": 3})

# 3. 定义工具
@tool
def query_order(order_id: str) -> str:
    """查询订单状态。Args: order_id: 订单编号"""
    return db.get_order(order_id)

# 4. RAG + Agent 融合
prompt = ChatPromptTemplate.from_messages([
    ("system", """你是产品客服。优先用以下知识库回答:
{context}
如需查询订单,使用 query_order 工具。"""),
    MessagesPlaceholder("history", optional=True),
    ("human", "{input}"),
])

# 5. 组装 Chain
chain = (
    {
        "context": retriever | format_docs,
        "input": RunnablePassthrough(),
        "history": lambda x: get_history(x["session_id"])
    }
    | prompt
    | llm
    | StrOutputParser()
)

# 6. 流式输出
for chunk in chain.stream({"input": "我的订单 #12345 到哪了?"}):
    print(chunk, end="")
生产部署建议:使用 LangServe 将 Chain 一键部署为 REST API,或用 LangSmith 监控线上 LLM 调用的延迟、Token 消耗和质量评估。

📚 参考资料与出处

  1. LangChain 官方文档 — python.langchain.com/docs
  2. LangChain GitHub — github.com/langchain-ai/langchain
  3. LCEL Conceptual Guide — python.langchain.com/docs/concepts/lcel
  4. LangChain.js — js.langchain.com/docs
  5. LangSmith 文档 — docs.smith.langchain.com
  6. Harrison Chase, "LangChain: Building applications with LLMs through composability" (2022)
  7. LangChain Blog — blog.langchain.dev