mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4mobile wallpaper 5mobile wallpaper 6
1201 字
3 分钟
langchainV1教程
2026-02-14

这是一份 LangChain 教程,重点聚焦于 v1.0 版本的核心特性——Agent 构建与中间件机制,同时涵盖了基础的链式调用和 RAG 应用开发。


LangChain 完全指南:从入门到生产级应用#

简介#

LangChain 是一个用于构建和部署基于大语言模型(LLM)应用的强大框架。它的核心理念是可组合性——通过将各种组件(模型、提示模板、检索器、工具等)像“积木”一样组合起来,构建复杂的 AI 工作流。

v1.0 重要更新(2025年10月发布):LangChain v1.0 将重心完全放在了 Agent(智能体) 构建上,引入了更简洁的 create_agent 接口和灵活的中间件机制,同时对包结构进行了简化,旧版功能迁移至 @langchain/classic


目录#

  1. 环境搭建与基础配置
  2. 核心概念与组件
  3. LangChain v1.0 新特性:Agent与中间件
  4. RAG 应用实战:智能文档问答系统
  5. LCEL:LangChain 表达式语言
  6. 生产环境最佳实践
  7. 总结与扩展资源

1. 环境搭建与基础配置#

1.1 安装#

# 安装 LangChain v1.0 核心包
pip install langchain langchain-core langchain-openai
# 安装其他常用包
pip install langchain-community langchain-chroma faiss-cpu tiktoken

1.2 模型接入配置#

LangChain 支持通过统一的接口调用多种大模型。

OpenAI 接入#

import os
from langchain_openai import ChatOpenAI
# 设置 API Key(推荐使用环境变量)
os.environ["OPENAI_API_KEY"] = "your-api-key"
# 初始化模型
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7)
response = llm.invoke("你好,请介绍一下自己")
print(response.content)

Ollama 本地模型接入#

from langchain_ollama import ChatOllama
# 确保已通过 ollama pull qwen3:4b 下载模型
llm = ChatOllama(model="qwen3:4b", base_url="http://localhost:11434")
response = llm.invoke("用一句话解释什么是大语言模型")
print(response.content)

阿里云百炼平台#

from langchain_openai import ChatOpenAI
llm = ChatOpenAI(
model="qwen3-max",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
api_key="your-dashscope-api-key"
)

2. 核心概念与组件#

LangChain 的核心组件构成了应用开发的基础:

组件描述示例
Models与大语言模型交互的统一接口ChatOpenAI, ChatOllama
Prompts管理和动态生成提示词PromptTemplate, ChatPromptTemplate
Chains将多个组件串联成工作流LLMChain, LCEL 组合
Memory在对话中保存和加载上下文ConversationBufferMemory
Retrievers从数据源检索相关信息VectorStoreRetriever
Tools赋予模型调用外部能力搜索、计算器、API 调用
Agents自主决策并选择执行工具create_agent

2.1 提示模板示例#

from langchain_core.prompts import ChatPromptTemplate, PromptTemplate
# 基础提示模板
prompt = PromptTemplate.from_template("用一句话解释什么是{topic}?")
formatted = prompt.format(topic="量子计算")
print(formatted)
# 聊天提示模板(支持多角色)
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{role}专家,回答要简洁专业。"),
("human", "{question}")
])
messages = chat_prompt.format_messages(
role="Python编程",
question="如何快速入门LangChain?"
)

2.2 简单的链(Chain)#

from langchain_core.output_parsers import StrOutputParser
# 使用 LCEL 创建简单链
chain = chat_prompt | llm | StrOutputParser()
result = chain.invoke({
"role": "AI技术",
"question": "LangChain v1.0 有哪些主要变化?"
})
print(result)

3. LangChain v1.0 新特性:Agent与中间件#

v1.0 最大的变化是引入了 create_agent中间件机制,让 Agent 构建变得前所未有的简单和可定制。

3.1 基础 Agent#

from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
from langchain.tools import tool
# 定义工具
@tool
def get_weather(city: str) -> str:
"""获取指定城市的天气(模拟)"""
weather_data = {
"北京": "晴朗,25°C",
"上海": "多云,22°C",
"广州": "阵雨,28°C"
}
return weather_data.get(city, f"{city}:天气数据暂无")
@tool
def calculate(expression: str) -> float:
"""执行数学计算"""
return eval(expression)
# 创建 Agent
model = ChatOpenAI(model="gpt-4o-mini")
agent = create_agent(
model=model,
tools=[get_weather, calculate],
system_prompt="你是一个有用的助手,可以使用工具回答问题。"
)
# 调用 Agent
result = agent.invoke({
"messages": [{"role": "user", "content": "北京天气怎么样?25+15等于多少?"}]
})
print(result["content"])

3.2 中间件:上下文工程的核心#

中间件让你能够在 Agent 执行的生命周期中插入自定义逻辑,实现输入预处理、敏感信息过滤、工具权限控制等功能。

生命周期钩子#

钩子运行时机典型用途
before_agent调用 Agent 之前加载记忆、验证输入
before_model每次 LLM 调用之前更新提示、修剪消息
wrap_model_call包裹 LLM 调用拦截和修改请求/响应
wrap_tool_call包裹工具调用权限控制、参数验证
after_modelLLM 响应之后输出验证、安全检查
after_agentAgent 完成之后保存结果、清理

预构建中间件#

from langchain.agents import create_agent
from langchain.agents.middleware import (
PIIMiddleware,
SummarizationMiddleware,
HumanInTheLoopMiddleware
)
agent = create_agent(
model="claude-sonnet-4-5-20250929",
tools=[read_email, send_email],
middleware=[
# 自动脱敏个人敏感信息
PIIMiddleware("email", strategy="redact"),
# 长对话自动摘要
SummarizationMiddleware(
model="claude-sonnet-4-5-20250929",
max_tokens_before_summary=500
),
# 敏感操作人工审核
HumanInTheLoopMiddleware(
interrupt_on={
"send_email": {
"allowed_decisions": ["approve", "edit", "reject"]
}
}
),
]
)

自定义中间件#

from langchain.agents.middleware import AgentMiddleware
from langchain_openai import ChatOpenAI
from typing import Callable
from dataclasses import dataclass
@dataclass
class Context:
user_expertise: str = "beginner"
class ExpertiseBasedToolMiddleware(AgentMiddleware):
def wrap_model_call(
self,
request,
handler: Callable
):
user_level = request.runtime.context.user_expertise
if user_level == "expert":
request.model = ChatOpenAI(model="gpt-4o")
request.tools = [advanced_search, data_analysis]
else:
request.model = ChatOpenAI(model="gpt-4o-mini")
request.tools = [simple_search, basic_calculator]
return handler(request)
# 使用自定义中间件
agent = create_agent(
model="gpt-4o-mini",
tools=[simple_search, advanced_search],
middleware=[ExpertiseBasedToolMiddleware()],
context_schema=Context
)

3.3 结构化输出#

v1.0 改进了结构化输出生成,可以在主循环中直接生成 Pydantic 模型,无需额外 LLM 调用。

from pydantic import BaseModel, Field
from langchain.agents import create_agent
from langchain_openai import ChatOpenAI
class WeatherReport(BaseModel):
city: str = Field(description="城市名称")
temperature: float = Field(description="温度(摄氏度)")
condition: str = Field(description="天气状况")
humidity: int = Field(description="湿度百分比")
agent = create_agent(
model=ChatOpenAI(model="gpt-4o-mini"),
tools=[get_weather],
response_format=WeatherReport,
)
result = agent.invoke({
"messages": [{"role": "user", "content": "北京的天气如何?"}]
})
print(result.structured_response)
# WeatherReport(city='北京', temperature=25.0, condition='晴朗', humidity=45)

4. RAG 应用实战:智能文档问答系统#

RAG(检索增强生成)是目前最流行的 LLM 应用模式之一,让模型能够基于私有知识库回答问题。

4.1 系统架构#

用户问题 → 查询向量化 → 向量检索 → 上下文增强 → LLM 生成 → 答案
向量数据库(存储文档块)

4.2 完整实现代码#

import os
from langchain.document_loaders import PyPDFLoader, TextLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings, ChatOpenAI
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA
from langchain_core.prompts import ChatPromptTemplate
# 1. 加载文档
def load_documents(file_paths):
documents = []
for path in file_paths:
if path.endswith('.pdf'):
loader = PyPDFLoader(path)
else:
loader = TextLoader(path, encoding='utf-8')
documents.extend(loader.load())
return documents
# 2. 分割文本
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=1000,
chunk_overlap=200,
separators=["\n\n", "\n", "。", "!", "?", ";", ",", " ", ""]
)
docs = load_documents(["./data/technical_manual.pdf", "./data/faq.txt"])
split_docs = text_splitter.split_documents(docs)
print(f"文档已分割为 {len(split_docs)} 个文本块")
# 3. 创建向量存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=split_docs,
embedding=embeddings,
persist_directory="./chroma_db" # 持久化存储
)
# 4. 创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity", # 相似度检索
search_kwargs={"k": 4} # 返回 top-4
)
# 5. 构建 RAG 链
prompt_template = ChatPromptTemplate.from_messages([
("system", """你是一个专业的技术助手。基于以下上下文信息回答问题。
如果无法从上下文中找到答案,请如实告知用户,不要编造信息。
上下文信息:
{context}"""),
("human", "{question}")
])
llm = ChatOpenAI(model="gpt-4o-mini", temperature=0)
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
chain_type="stuff",
retriever=retriever,
chain_type_kwargs={"prompt": prompt_template},
return_source_documents=True # 返回来源文档
)
# 6. 问答测试
def ask_question(question):
result = qa_chain.invoke({"query": question})
print(f"问题: {question}")
print(f"答案: {result['result']}")
print(f"来源: {[doc.metadata.get('source', '未知') for doc in result['source_documents']]}")
print("-" * 50)
return result
ask_question("系统的默认管理员密码是什么?")
ask_question("如何配置日志输出级别?")
ask_question("系统支持哪些数据库?")

4.3 检索优化策略#

# 混合检索(BM25 + 向量检索)
from langchain.retrievers import EnsembleRetriever
from langchain.retrievers import BM25Retriever
bm25_retriever = BM25Retriever.from_documents(split_docs)
bm25_retriever.k = 4
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, vectorstore.as_retriever()],
weights=[0.4, 0.6] # BM25 权重 0.4,向量检索权重 0.6
)
# 查询重写
from langchain.retrievers import MultiQueryRetriever
multi_query_retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(),
llm=llm
)
# 上下文压缩
from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import LLMChainExtractor
compressor = LLMChainExtractor.from_llm(llm)
compression_retriever = ContextualCompressionRetriever(
base_compressor=compressor,
base_retriever=vectorstore.as_retriever()
)

5. LCEL:LangChain 表达式语言#

LCEL 是 LangChain 的核心语法,让你能够用 | 管道符优雅地组合组件。

5.1 基础组合#

from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template("用一句话解释{topic}")
model = ChatOpenAI(model="gpt-4o-mini")
output_parser = StrOutputParser()
# 管道组合:prompt → model → parser
chain = prompt | model | output_parser
result = chain.invoke({"topic": "LangChain 表达式语言"})
print(result)

5.2 并行执行#

from langchain_core.runnables import RunnableParallel, RunnablePassthrough
# 并行执行多个任务
parallel_chain = RunnableParallel(
summary=prompt_template | model | output_parser,
keywords=keyword_prompt | model | output_parser,
sentiment=sentiment_prompt | model | output_parser
)
results = parallel_chain.invoke({"text": long_article})

5.3 分支与条件#

from langchain_core.runnables import RunnableBranch
branch = RunnableBranch(
(lambda x: "天气" in x["question"], weather_chain),
(lambda x: "计算" in x["question"], calculator_chain),
default_chain
)
result = branch.invoke({"question": "北京天气怎么样?"})

6. 生产环境最佳实践#

6.1 可观测性:LangSmith#

# 设置环境变量启用 LangSmith
export LANGCHAIN_TRACING_V2=true
export LANGCHAIN_API_KEY=your_langsmith_key
export LANGCHAIN_PROJECT=my-production-app
# 自动追踪所有调用
from langsmith import traceable
@traceable(run_type="tool")
def fetch_customer_data(customer_id: str):
# 业务逻辑
pass

6.2 持久化与检查点#

from langgraph.checkpoint.sqlite import SqliteSaver
# 使用 SQLite 保存对话状态
checkpointer = SqliteSaver.from_conn_string("sqlite:///./conversations.db")
agent = create_agent(
model=model,
tools=tools,
checkpointer=checkpointer # 自动持久化
)
# 使用 thread_id 恢复对话
result = agent.invoke(
{"messages": [{"role": "user", "content": "你好"}]},
config={"configurable": {"thread_id": "user-123"}}
)
# 后续可以通过相同的 thread_id 继续对话

6.3 错误处理与重试#

from langchain_core.runnables import RunnableRetry
# 自动重试(最多 3 次,指数退避)
retry_chain = chain.with_retry(
stop_after_attempt=3,
wait_exponential_jitter=True
)
# 自定义错误处理
try:
result = agent.invoke(input_data)
except Exception as e:
print(f"Agent 调用失败: {e}")
fallback_result = fallback_chain.invoke(input_data)

6.4 生产部署 Checklist#

  • 使用 create_agent 而非手动循环
  • 为敏感操作添加 HumanInTheLoopMiddleware
  • 使用 PII 中间件过滤个人敏感信息
  • 开启 LangSmith 监控 token 消耗和延迟
  • 为关键流程添加结构化输出(Pydantic)
  • 使用 LangGraph 检查点实现持久化
  • 容器化部署(Docker + Kubernetes)

7. 总结与扩展资源#

关键要点#

  1. v1.0 的 Agent 优先create_agent 是构建 AI 应用的标准方式
  2. 中间件是核心:通过组合中间件实现生产级功能(安全、记忆、审批)
  3. RAG 是基础:向量检索 + LLM 是知识问答的标配
  4. LCEL 是语法:用管道符 | 优雅组合组件
  5. 可观测性必备:LangSmith 让你不再“盲人摸象”

扩展资源#

资源说明
LangChain 官方文档最权威的参考资料
LangSmithLLM 应用调试和监控平台
LangGraph状态化 Agent 编排框架
Awesome LangChain社区精选项目和工具

本教程基于 LangChain v1.0 编写。如果你正在维护旧项目,可通过 pip install @langchain/classic 获取迁移后的遗留功能。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

langchainV1教程
https://30790842.xyz/posts/langchainv1教程/
作者
岚崒
发布于
2026-02-14
许可协议
CC BY-NC-SA 4.0

目录