第16章 LangChain入门:用代码构建可定制的智能体应用
AI智能体实战训练营 · 章节 16/33 · 45 学时
LangChain入门:用代码构建可定制的智能体应用
LangChain是目前最流行、生态最丰富的AI应用开发框架。与Coze、Dify等低代码平台不同,LangChain是一个代码级框架——你用Python或JavaScript编写代码来构建智能体应用。它的优势是灵活度极高,可以实现任何你能想到的功能;劣势是有一定的学习门槛,需要编程能力。
本章将带你从零开始学习LangChain的核心概念和基本用法,通过实战案例掌握用代码构建智能体应用的方法。
一、LangChain概览
1.1 什么是LangChain?
LangChain是一个用于开发基于大语言模型(LLM)应用的框架,由Harrison Chase于2022年10月创建。它的核心思想是:把大模型的能力与外部工具、数据源、业务逻辑结合起来,构建强大的AI应用。
LangChain提供了一系列可复用的组件和抽象,让开发者不需要从零开始实现每一个功能。它的生态非常丰富,集成了上百种大模型、向量数据库、工具、API。
1.2 LangChain的核心价值
- 组件化设计:把AI应用拆解成可复用的组件(模型、提示词、链、工具、记忆、检索器),像搭积木一样组合
- 丰富的集成:集成了上百种大模型、向量数据库、工具、API,开箱即用
- 灵活度高:代码级控制,可以实现任何自定义逻辑,不受平台功能限制
- 生产级能力:支持流式输出、异步、批处理、重试、回调、追踪等生产级特性
- 社区活跃:GitHub星标超90k,社区活跃,文档完善,更新迭代快
- 生态完整:除了核心框架,还有LangSmith(可观测性)、LangGraph(多智能体编排)、LangServe(部署)等配套工具
1.3 什么时候用LangChain?
| 适合用LangChain | 不适合用LangChain |
|---|---|
| 需要高度定制化的AI应用 | 简单的问答机器人(用Coze/Dify更快) |
| 需要与复杂业务系统深度集成 | 非技术人员(需要编程能力) |
| 需要实现平台不支持的特殊功能 | 快速验证想法(低代码平台更快) |
| 需要精细控制每一个环节 | 简单的RAG应用(Dify更方便) |
| 有Python/JS开发团队 | 预算有限且需求简单(用免费SaaS即可) |
| 需要研究和探索新的AI应用模式 |
1.4 LangChain的核心组件
| 组件 | 功能 | 说明 |
|---|---|---|
| Models(模型) | 调用大语言模型 | 支持OpenAI、Anthropic、Google、百度、阿里等上百种模型 |
| Prompts(提示词) | 管理和优化提示词 | 提示词模板、示例选择器、输出解析器 |
| Chains(链) | 组合多个组件形成流程 | 把模型、提示词、工具等串联起来 |
| Agents(智能体) | 自主决策和工具调用 | ReAct、Plan-and-Execute等Agent架构 |
| Memory(记忆) | 存储和管理对话历史 | 短期记忆、长期记忆、实体记忆、摘要记忆 |
| Retrievers(检索器) | 从知识库检索相关信息 | 向量检索、全文检索、混合检索 |
| Tools(工具) | 扩展智能体的能力 | 搜索、计算、代码执行、API调用等 |
| Callbacks(回调) | 监控和干预执行过程 | 日志、追踪、流式输出、自定义处理 |
二、环境搭建和第一个程序
2.1 安装LangChain
# 安装LangChain核心包
pip install langchain
# 安装OpenAI集成(如果用OpenAI模型)
pip install langchain-openai
# 安装社区集成包(包含大量第三方集成)
pip install langchain-community
# 安装向量数据库(示例用Chroma)
pip install chromadb
# 安装文档加载器(示例用PyPDF)
pip install pypdf
2.2 配置API Key
import os
os.environ["OPENAI_API_KEY"] = "你的OpenAI API Key"
# 如果用国内模型(如DeepSeek)
os.environ["DEEPSEEK_API_KEY"] = "你的DeepSeek API Key"
2.3 第一个LangChain程序:简单的对话
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 初始化模型
llm = ChatOpenAI(
model="gpt-4o", # 或用国内模型
temperature=0.7,
max_tokens=1000
)
# 构建消息
messages = [
SystemMessage(content="你是一位专业的制造业设备维修专家,回答要专业、准确、有条理。"),
HumanMessage(content="3号空压机异响,温度95度,可能是什么原因?")
]
# 调用模型
response = llm.invoke(messages)
print(response.content)
这就是最简单的LangChain程序——初始化模型、构建消息、调用模型、输出结果。
三、核心组件详解
3.1 提示词模板(Prompt Template)
提示词模板让你可以用变量动态生成提示词,而不是每次都写完整的提示词。
from langchain_core.prompts import ChatPromptTemplate
# 创建提示词模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的{role},回答要专业、准确、有条理。"),
("human", "请回答以下问题:{question}")
])
# 填充变量
formatted_prompt = prompt.format_messages(
role="设备维修专家",
question="3号空压机异响,温度95度,可能是什么原因?"
)
# 调用模型
response = llm.invoke(formatted_prompt)
print(response.content)
3.2 链(Chain):用LCEL组合组件
LCEL(LangChain Expression Language)是LangChain的声明式组合语言,用管道符(|)把组件串联起来,形成一条链。
from langchain_core.output_parsers import StrOutputParser
# 构建一条链:提示词模板 → 模型 → 输出解析器
chain = prompt | llm | StrOutputParser()
# 调用链
result = chain.invoke({
"role": "设备维修专家",
"question": "3号空压机异响,温度95度,可能是什么原因?"
})
print(result)
LCEL的优势:
- 流式输出:自动支持流式输出,用
chain.stream()即可 - 异步支持:用
chain.ainvoke()异步调用 - 批处理:用
chain.batch()批量处理多个输入 - 重试:可以配置重试策略
- 回调:可以注入回调函数,监控执行过程
3.3 输出解析器(Output Parser)
输出解析器把大模型的自然语言输出转换成结构化的数据(如JSON、字典、列表),方便后续处理。
from langchain_core.output_parsers import JsonOutputParser
from pydantic import BaseModel, Field
from typing import List
# 定义输出结构
class FaultAnalysis(BaseModel):
possible_causes: List[str] = Field(description="可能的故障原因列表")
probability: List[float] = Field(description="每个原因的可能性(0-1)")
repair_steps: List[str] = Field(description="维修步骤")
safety_notes: List[str] = Field(description="安全注意事项")
# 创建解析器
parser = JsonOutputParser(pydantic_object=FaultAnalysis)
# 创建提示词模板(包含格式要求)
prompt = ChatPromptTemplate.from_messages([
("system", "你是一位专业的设备维修专家。{format_instructions}"),
("human", "请分析以下故障:{fault_description}")
])
# 构建链
chain = prompt | llm | parser
# 调用
result = chain.invoke({
"format_instructions": parser.get_format_instructions(),
"fault_description": "3号空压机异响,温度95度"
})
print(result["possible_causes"])
print(result["repair_steps"])
3.4 记忆(Memory)
记忆让智能体能够记住之前的对话内容,实现多轮对话。
from langchain.memory import ConversationBufferMemory
from langchain.chains import ConversationChain
# 创建记忆
memory = ConversationBufferMemory()
# 创建对话链
conversation = ConversationChain(
llm=llm,
memory=memory,
verbose=True
)
# 多轮对话
print(conversation.predict(input="你好,我是工厂的维修工"))
print(conversation.predict(input="3号空压机异响,温度95度"))
print(conversation.predict(input="我刚才说的是哪台设备?"))
# 查看记忆内容
print(memory.load_memory_variables({}))
LangChain支持多种记忆类型:
- ConversationBufferMemory:保存完整对话历史(简单但占用上下文多)
- ConversationSummaryMemory:用大模型总结对话历史(节省上下文但可能丢失细节)
- ConversationBufferWindowMemory:只保存最近N轮对话(滑动窗口)
- ConversationEntityMemory:提取对话中的实体信息,单独存储
- ConversationKGMemory:用知识图谱存储对话中的关系
3.5 检索器(Retriever)和RAG
检索器从知识库中检索相关信息,实现RAG(检索增强生成)。
from langchain_community.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.runnables import RunnablePassthrough
# 第一步:加载文档
loader = PyPDFLoader("空压机维修手册.pdf")
documents = loader.load()
# 第二步:分段
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=500,
chunk_overlap=50
)
splits = text_splitter.split_documents(documents)
# 第三步:向量化并存储
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(
documents=splits,
embedding=embeddings,
persist_directory="./chroma_db"
)
# 第四步:创建检索器
retriever = vectorstore.as_retriever(
search_type="similarity", # 或 "mmr"(最大边际相关性)
search_kwargs={"k": 5} # 返回Top 5
)
# 第五步:构建RAG链
rag_prompt = ChatPromptTemplate.from_messages([
("system", "你是一位设备维修专家。请基于以下参考资料回答问题。如果参考资料中没有相关信息,请说明。\n\n参考资料:{context}"),
("human", "问题:{question}")
])
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
rag_chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| rag_prompt
| llm
| StrOutputParser()
)
# 第六步:调用
result = rag_chain.invoke("空压机异响,温度95度,可能是什么原因?")
print(result)
3.6 工具(Tool)和Agent
工具扩展智能体的能力,Agent自主决定调用什么工具。
from langchain_core.tools import tool
from langchain.agents import create_tool_calling_agent, AgentExecutor
import requests
# 定义工具
@tool
def get_weather(city: str) -> str:
"""查询指定城市的天气信息。参数:city(城市名称)"""
# 调用天气API(示例)
return f"{city}今天多云转晴,26-33度,湿度75%"
@tool
def calculate(expression: str) -> str:
"""计算数学表达式。参数:expression(数学表达式,如'2+3*4')"""
try:
result = eval(expression)
return f"计算结果:{result}"
except Exception as e:
return f"计算错误:{e}"
# 工具列表
tools = [get_weather, calculate]
# 创建Agent
agent_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个有用的助手,可以使用工具来回答问题。如果需要计算或查询天气,请使用对应的工具。"),
("human", "{input}"),
("placeholder", "{agent_scratchpad}")
])
agent = create_tool_calling_agent(llm, tools, agent_prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True)
# 调用Agent
result = agent_executor.invoke({
"input": "广州今天天气怎么样?如果温度超过30度,帮我算一下30*1.5等于多少"
})
print(result["output"])
LangChain支持多种Agent架构:
- create_tool_calling_agent:基于Function Calling的Agent(推荐,效率高)
- create_react_agent:基于ReAct(推理+行动)的Agent(兼容性好)
- create_openai_tools_agent:OpenAI专用的工具调用Agent
- Plan-and-Execute Agent:先规划再执行的Agent,适合复杂任务
四、实战:用LangChain构建设备故障诊断智能体
我们用LangChain构建一个完整的设备故障诊断智能体,集成以下功能:
1. 知识库RAG(基于维修手册)
2. 工具调用(查询设备档案、查询历史故障、创建工单)
3. 对话记忆(多轮对话)
4. 结构化输出(诊断报告JSON)
核心代码框架:
1. 初始化组件(模型、Embedding、向量数据库、记忆)
2. 定义工具(查询设备档案、查询历史故障、创建工单、发送通知)
3. 构建RAG检索器(维修手册知识库)
4. 创建Agent(集成工具、RAG、记忆)
5. 定义输出格式(诊断报告结构)
6. 运行Agent,输出诊断报告
这个案例展示了LangChain的强大灵活性——你可以自由组合各种组件,实现复杂的业务逻辑,而不受低代码平台的功能限制。
五、LangChain生态和进阶
5.1 LangSmith:可观测性平台
LangSmith是LangChain团队推出的可观测性平台,用于调试、测试、监控、评估LangChain应用。
- 调试:查看每一步的输入输出、执行时间、token消耗
- 测试:创建测试数据集,自动化测试应用��果
- 监控:监控生产环境的调用量、延迟、错误率、成本
- 评估:用大模型或人工评估回答质量
5.2 LangGraph:多智能体编排
LangGraph是LangChain团队推出的多智能体编排框架,基于"图"的概念定义智能体之间的状态流转和协作关系。支持复杂的状态管理、循环、条件分支,适合构建复杂的多智能体系统。
5.3 LangServe:部署
LangServe可以把LangChain链部署为REST API,支持流式输出、批量处理、异步调用。一行代码即可启动API服务。
5.4 学习资源
- 官方文档:https://python.langchain.com
- GitHub:https://github.com/langchain-ai/langchain
- LangSmith文档:https://docs.smith.langchain.com
- LangGraph文档:https://langchain-ai.github.io/langgraph
- 官方教程和示例:https://github.com/langchain-ai/langchain/tree/master/templates
• LangChain是最流行的AI应用开发框架,组件化设计,灵活度高,生态丰富,适合需要高度定制化的场景
• 核心组件:Models(模型)、Prompts(提示词)、Chains(链)、Agents(智能体)、Memory(记忆)、Retrievers(检索器)、Tools(工具)
• LCEL(LangChain Expression Language)用管道符(|)组合组件,支持流式、异步、批处理、重试
• RAG实现:文档加载→分段→向量化→存储→检索→组装上下文→生成回答
• Agent实现:定义工具→创建Agent→AgentExecutor执行,支持Function Calling和ReAct两种模式
• 生态:LangSmith(可观测性)、LangGraph(多智能体)、LangServe(部署)
• 学习曲线:需要Python/JS编程能力,但灵活度和可控性远超低代码平台
下一章,我们将深入LangChain的实战应用——自定义Agent、工具链开发、记忆系统设计、复杂工作流编排等,掌握用LangChain构建生产级智能体应用的能力。
📝 本章练习(5题)
答案与解析请在 互动学习看板 中作答查看。
📚 AI智能体实战训练营 课程目录(33 章)
- 第1章 什么是AI智能体:从聊天机器人到自主决策系统
- 第2章 智能体的四大核心能力:感知·思考·行动·记忆
- 第3章 范式转移:智能体与传统软件的本质区别
- 第4章 2025年主流智能体平台全景对比与选型
- 第5章 智能体应用场景地图:从个人效率到企业级落地
- 第6章 编排思维:如何把大模型变成可执行的业务流程
- 第7章 Prompt工程实战:写出让智能体精准执行的指令
- 第8章 工作流编排入门:节点、连线、条件分支与循环
- 第9章 知识库RAG实战:让智能体拥有你的专业数据
- 第10章 工具调用实战:搜索·计算·API·数据库全掌握
- 第11章 多智能体协作:角色分工、任务分发与结果汇总
- 第12章 Coze/扣子入门:30分钟搭建你的第一个智能体
- 第13章 Coze进阶:插件开发、工作流深度编排与知识库优化
- 第14章 Dify入门:开源可私有化部署的智能体平台搭建
- 第15章 Dify进阶:RAG管道优化、Agent模式与工作流编排
- 第16章 LangChain入门:用代码构建可定制的智能体应用
- 第17章 LangChain实战:自定义Agent、工具链与记忆系统
- 第18章 Agent Harness与新一代框架:2025年智能体开发趋势
- 第19章 平台选型决策树:不同业务场景下的最优平台选择
- 第20章 任务拆解方法论:把复杂问题变成智能体可执行的步骤
- 第21章 提示词编排艺术:System·User·Function的三层协同
- 第22章 记忆系统设计:短期记忆、长期记忆与向量数据库选型
- 第23章 错误处理与容错:智能体执行失败时的兜底策略
- 第24章 评估与优化体系:如何量化衡量智能体的效果并持续改进
- 第25章 安全与合规:智能体应用的数据安全、隐私保护与风险防控
- 第26章 实战项目一:企业知识库智能问答助手(全流程实操)
- 第27章 实战项目二:制造业设备故障诊断智能体
- 第28章 实战项目三:供应链采购智能分析与比价助手
- 第29章 实战项目四:多智能体协同的项目管理办公室(PMO)
- 第30章 实战项目五:智能体与MES/ERP系统的深度集成
- 第31章 智能体落地路线图:从POC验证到规模化应用的完整路径
- 第32章 AI智能体工程师/产品经理的能力模型与成长路径
- 第33章 作品集打造与面试准备:如何拿到AI智能体岗位Offer
