1201 字
3 分钟
langchainV1教程
这是一份 LangChain 教程,重点聚焦于 v1.0 版本的核心特性——Agent 构建与中间件机制,同时涵盖了基础的链式调用和 RAG 应用开发。
LangChain 完全指南:从入门到生产级应用
简介
LangChain 是一个用于构建和部署基于大语言模型(LLM)应用的强大框架。它的核心理念是可组合性——通过将各种组件(模型、提示模板、检索器、工具等)像“积木”一样组合起来,构建复杂的 AI 工作流。
v1.0 重要更新(2025年10月发布):LangChain v1.0 将重心完全放在了 Agent(智能体) 构建上,引入了更简洁的 create_agent 接口和灵活的中间件机制,同时对包结构进行了简化,旧版功能迁移至 @langchain/classic 。
目录
- 环境搭建与基础配置
- 核心概念与组件
- LangChain v1.0 新特性:Agent与中间件
- RAG 应用实战:智能文档问答系统
- LCEL:LangChain 表达式语言
- 生产环境最佳实践
- 总结与扩展资源
1. 环境搭建与基础配置
1.1 安装
# 安装 LangChain v1.0 核心包pip install langchain langchain-core langchain-openai
# 安装其他常用包pip install langchain-community langchain-chroma faiss-cpu tiktoken1.2 模型接入配置
LangChain 支持通过统一的接口调用多种大模型。
OpenAI 接入
import osfrom 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_agentfrom langchain_openai import ChatOpenAIfrom langchain.tools import tool
# 定义工具@tooldef get_weather(city: str) -> str: """获取指定城市的天气(模拟)""" weather_data = { "北京": "晴朗,25°C", "上海": "多云,22°C", "广州": "阵雨,28°C" } return weather_data.get(city, f"{city}:天气数据暂无")
@tooldef calculate(expression: str) -> float: """执行数学计算""" return eval(expression)
# 创建 Agentmodel = ChatOpenAI(model="gpt-4o-mini")agent = create_agent( model=model, tools=[get_weather, calculate], system_prompt="你是一个有用的助手,可以使用工具回答问题。")
# 调用 Agentresult = 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_model | LLM 响应之后 | 输出验证、安全检查 |
after_agent | Agent 完成之后 | 保存结果、清理 |
预构建中间件
from langchain.agents import create_agentfrom 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 AgentMiddlewarefrom langchain_openai import ChatOpenAIfrom typing import Callablefrom dataclasses import dataclass
@dataclassclass 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, Fieldfrom langchain.agents import create_agentfrom 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 osfrom langchain.document_loaders import PyPDFLoader, TextLoaderfrom langchain.text_splitter import RecursiveCharacterTextSplitterfrom langchain_openai import OpenAIEmbeddings, ChatOpenAIfrom langchain.vectorstores import Chromafrom langchain.chains import RetrievalQAfrom 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 EnsembleRetrieverfrom 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 ContextualCompressionRetrieverfrom 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 ChatPromptTemplatefrom langchain_core.output_parsers import StrOutputParserfrom langchain_openai import ChatOpenAI
prompt = ChatPromptTemplate.from_template("用一句话解释{topic}")model = ChatOpenAI(model="gpt-4o-mini")output_parser = StrOutputParser()
# 管道组合:prompt → model → parserchain = 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
# 设置环境变量启用 LangSmithexport LANGCHAIN_TRACING_V2=trueexport LANGCHAIN_API_KEY=your_langsmith_keyexport LANGCHAIN_PROJECT=my-production-app# 自动追踪所有调用from langsmith import traceable
@traceable(run_type="tool")def fetch_customer_data(customer_id: str): # 业务逻辑 pass6.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. 总结与扩展资源
关键要点
- v1.0 的 Agent 优先:
create_agent是构建 AI 应用的标准方式 - 中间件是核心:通过组合中间件实现生产级功能(安全、记忆、审批)
- RAG 是基础:向量检索 + LLM 是知识问答的标配
- LCEL 是语法:用管道符
|优雅组合组件 - 可观测性必备:LangSmith 让你不再“盲人摸象”
扩展资源
| 资源 | 说明 |
|---|---|
| LangChain 官方文档 | 最权威的参考资料 |
| LangSmith | LLM 应用调试和监控平台 |
| LangGraph | 状态化 Agent 编排框架 |
| Awesome LangChain | 社区精选项目和工具 |
本教程基于 LangChain v1.0 编写。如果你正在维护旧项目,可通过
pip install @langchain/classic获取迁移后的遗留功能。
分享
如果这篇文章对你有帮助,欢迎分享给更多人!
相关文章 智能推荐









