从零吃透LangChain:原理、核心模块与实战代码(适配DeepSeek大模型)
前言
如今大模型开发已经从单纯调用ChatGPT、DeepSeek接口,进阶到定制化LLM应用开发阶段。很多开发者想要实现知识库问答、自动工具调用、多轮智能对话、自主任务编排等功能,如果从零手写代码,会面临代码冗余、逻辑混乱、无法复用、难以落地的问题。
而 LangChain 就是解决这一痛点的开源框架,它为大模型应用开发提供了标准化组件、流程编排方案和全生命周期能力。本文将通俗易懂地讲解LangChain的核心原理、核心模块,搭配可直接运行的Python实战代码,全程适配DeepSeek大模型,新手也能一键上手。
一、什么是LangChain?核心定位详解
很多新手会混淆LangChain是框架还是工具库,这里给出精准定义:
LangChain 是一款基于大语言模型(LLM)的开源开发框架,同时集成了海量开箱即用的工具库,核心定位是标准化、模块化构建复杂LLM应用。
它和普通Python工具库(Requests、Pandas)有本质区别:普通工具库只能解决单一问题,而LangChain可以整合各类模型、工具、数据源,搭建完整的AI应用流水线,覆盖从数据处理、模型调用、流程编排到部署监控的全流程。
1.1 核心价值:告别造轮子,积木式开发AI应用
LangChain的核心作用是标准化RAG及各类LLM应用的全流程,将复杂的AI开发拆解为可复用的标准模块,完整流程如下:
-
数据准备:通过各类文档加载器(Loader)解析PDF、TXT、网页、Word等多格式文件
-
数据处理:通过文本分割器(Splitter)智能切分长文本,适配大模型上下文限制
-
数据向量化:调用嵌入模型将文本转为向量数据
-
数据存储:对接FAISS、Milvus、Pinecone等向量数据库持久化存储
-
智能检索:通过检索器实现语义检索、关键词检索、混合检索
-
模型交互:整合各类大模型、提示词模板、对话记忆模块
-
流程编排:通过Chain、LCEL编排完整业务流程,实现自动化任务处理
简单来说:LangChain就是AI应用的“装配蓝图+标准零件库”,让开发者无需关注底层逻辑,快速搭建生产级AI问答、智能体、知识库系统。
1.2 三大核心优势
-
模块化可插拔:所有组件独立可替换,按需组合,适配不同业务场景
-
全生命周期支持:覆盖原型开发、测试、部署、监控全流程
-
开源生态强大:MIT开源协议、支持Python/JS双语言、兼容千余款模型与工具
1.3 LangChain与LangGraph分工(V1.0版本)
-
LangChain:快速构建通用AI智能体,上手简单、开发效率高,适合绝大多数常规LLM应用
-
LangGraph:底层运行时框架,专为长期运行、高定制化、可控性强的生产级智能体设计
二、LangChain十大核心模块(零基础必懂)
LangChain所有复杂应用,都是由以下核心模块组合而成,掌握这些模块就掌握了LangChain的核心精髓。
2.1 LLM与Prompt提示词模块
统一各类大模型的调用API(兼容OpenAI、DeepSeek等),同时提供标准化提示词模板,实现提示逻辑与业务数据分离,让代码更简洁、可复用性更强。
主流模板类型:
-
PromptTemplate:基础字符串模板,适用于简单文本生成
-
ChatPromptTemplate:对话式模板,支持系统、用户、AI多角色交互(最常用)
-
FewShotChatMessagePromptTemplate:少量示例模板,引导模型精准输出复杂格式内容
2.2 Message消息模块
大模型对话的基础单元,共四种核心消息对象,适配所有对话场景:
-
SystemMessage:系统角色,用于定义AI身份、行为规则
-
HumanMessage:用户提问消息
-
AIMessage:AI回复消息
-
ToolMessage:工具调用返回结果消息
2.3 输出解析器(Output Parsers)
核心作用:将大模型返回的非结构化文本,转换为程序可直接调用的结构化数据(字典、列表、对象、时间等),是工业级开发的必备模块。
|
解析器 |
输出类型 |
适用场景 |
|---|---|---|
|
StrOutputParser |
字符串 |
文本摘要、续写、翻译等简单场景 |
|
JsonOutputParser |
Python字典 |
API参数生成、实体信息提取 |
|
PydanticOutputParser |
自定义实体对象 |
高可靠性数据校验、数据库入库 |
|
CommaSeparatedListParser |
列表 |
关键词标签生成、多选项提取 |
2.4 文档加载器(Document Loaders)
统一解析各类文件和数据源,将不同格式内容转换为LangChain标准的Document对象(包含page_content文本内容+metadata元数据),是RAG系统的数据入口。
支持TXT、PDF、Word、Markdown、网页、CSV、JSON等几乎所有主流格式。
2.5 文本分割器(Text Splitters)
针对大模型Token限制,将长文本智能切分为适配输入的短片段,同时尽可能保留语义完整性,是RAG检索精准度的关键。
常用:递归字符分割器、Markdown结构化分割器、代码分割器、句子分割器等。
2.6 Chain链式编排模块
LangChain的核心精髓,用于将多个模块串联成完整的业务流水线,实现自动化任务执行。分为传统固定Chain和LCEL灵活编排两种模式。
2.7 LCEL表达式语言
LangChain新版主推的编排方式,彻底替代老旧固定Chain。通过 | 管道符 自由组合各类组件,支持串行、并行、分支、透传、自定义函数接入,灵活性拉满。
2.8 RAG检索增强生成
解决大模型“知识滞后、幻觉问题”的核心方案,通过加载私有文档、实时数据,让大模型基于外部知识库回答问题,是目前企业级AI应用最主流的场景。
2.9 工具(Tools)模块
赋予大模型与外部世界交互的能力,让LLM不再局限于文本生成,可自主调用计算器、天气接口、数据库、代码解释器等外部工具,解决计算、查询、数据分析等复杂问题。
2.10 记忆(Memory)模块
大模型默认无状态、无记忆,Memory模块可存储对话历史,实现多轮连贯对话,支持完整历史存储、窗口式历史存储等多种模式。
2.11 Agent智能代理
高阶核心模块,区别于固定流程的Chain,Agent可以自主思考、自主规划任务、自主选择工具、自主编排执行顺序,适配不确定、多步骤的复杂场景。
三、核心概念辨析:Chain vs LCEL
很多新手容易混淆这两个概念,用大白话彻底讲清:
3.1 传统Chain(老版本)
相当于固定的乐高说明书,流程写死,只能按预设步骤执行,修改流程需要重构代码。优点是开箱即用,适合简单固定的单一场景。
3.2 LCEL(新版本主推)
相当于通用乐高拼接规则,没有固定流程,开发者可以用 | 管道符自由拼接模型、提示词、解析器、自定义函数,支持并行、分支、条件判断,灵活度极高,适配所有复杂场景。
3.3 核心区别总结
|
维度 |
Chain(老方法) |
LCEL(新方法) |
|---|---|---|
|
本质 |
固定流程模板 |
灵活积木拼接语法 |
|
灵活性 |
低,改流程需改代码 |
极高,自由增删改流程 |
|
学习成本 |
高,需记忆各类Chain类型 |
低,一套语法通用所有场景 |
|
适用场景 |
简单固定单步骤任务 |
复杂多步骤、动态任务 |
四、环境安装(前置准备)
安装LangChain核心依赖,本文所有代码基于Python环境,适配DeepSeek大模型:
# 安装核心库
pip install langchain langchain-core langchain-community
# 适配OpenAI兼容接口(DeepSeek)
pip install langchain-openai
# 查看版本
pip show langchain
五、全套实战代码(可直接运行)
所有代码均适配DeepSeek大模型API,兼容OpenAI接口格式,复制替换自己的API密钥即可运行。
5.1 基础大模型调用(单文本生成)
from openai import OpenAI
# 初始化DeepSeek API客户端
client = OpenAI(
api_key = "你的DeepSeek_API_KEY",
base_url="https://api.deepseek.com/v1"
)
# 调用模型生成回答
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system","content":"你是专业的大模型开发工程师,回答简洁专业"},
{"role": "user","content":"一句话介绍LangChain"}
]
)
print(response.choices[0].message.content)
5.2 LCEL四大核心链式实战
5.2.1 串行链(Sequential Chain)
按顺序执行多步骤任务,最常用的基础流程:
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
# 初始化DeepSeek模型
llm = ChatOpenAI(
model="deepseek-chat",
api_key="你的DeepSeek_API_KEY",
base_url="https://api.deepseek.com/v1",
temperature=0.7,
max_tokens=150
)
# 构建串行流水线:提示词→模型→解析器
prompt = ChatPromptTemplate.from_template("写一句关于“{topic}”的七言绝句")
serial_chain = prompt | llm | StrOutputParser()
# 执行调用
result = serial_chain.invoke({"topic": "月色"})
print("串行链输出:", result)
5.2.2 并行链(Parallel Chain)
同时执行多个独立任务,提升处理效率:
import json
from langchain_core.runnables import RunnableParallel
# 定义两条独立子链
poem_chain = ChatPromptTemplate.from_template("写一首关于{topic}的短诗") | llm | StrOutputParser()
joke_chain = ChatPromptTemplate.from_template("讲一个关于{topic}的俏皮话") | llm | StrOutputParser()
# 构建并行链
parallel_chain = RunnableParallel({
"poem": poem_chain,
"joke": joke_chain
})
# 执行
result = parallel_chain.invoke({"topic": "程序员"})
print(json.dumps(result, ensure_ascii=False, indent=2))
5.2.3 分支透传(RunnablePassthrough)
保留原始输入数据,同时执行分支任务,常用于RAG问答:
from langchain_core.runnables import RunnablePassthrough
# 模拟检索器
def fake_retriever(query: str) -> str:
return f"【{query}】是构建LLM应用的模块化开发框架,支持流程灵活编排"
# 构建RAG问答链
rag_prompt = ChatPromptTemplate.from_template("根据上下文回答问题:\n上下文:{context}\n问题:{question}")
chain = {
"context": fake_retriever,
"question": RunnablePassthrough()
} | rag_prompt | llm | StrOutputParser()
# 执行
result = chain.invoke("LCEL是什么")
print("分支链输出:", result)
5.2.4 自定义函数接入(RunnableLambda)
将普通Python函数接入LCEL流水线,高度自定义业务逻辑:
from langchain_core.runnables import RunnableLambda
# 自定义后置处理函数
def add_tip(text: str) -> str:
return text + "\n\n更多大模型开发技巧,关注LangChain生态!"
# 包装为标准组件
custom_func = RunnableLambda(add_tip)
# 构建完整流水线
chain = (
ChatPromptTemplate.from_template("简单解释{concept},100字以内")
| llm
| StrOutputParser()
| custom_func
)
result = chain.invoke({"concept": "RAG"})
print(result)
5.3 输出解析器实战(JSON结构化输出)
from langchain_core.output_parsers import JsonOutputParser
# 初始化JSON解析器
json_parser = JsonOutputParser()
# 构建提示词
prompt = ChatPromptTemplate.from_template(
"从文本中提取姓名和城市信息,输出JSON格式\n{format_instructions}\n文本:{text}"
)
# 构建链
chain = prompt | llm | json_parser
# 执行解析
result = chain.invoke({
"format_instructions": json_parser.get_format_instructions(),
"text": "张伟是居住在北京的软件工程师"
})
print("结构化解析结果:", result)
print("数据类型:", type(result))
5.4 工具调用实战(计算器+天气查询)
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
# 1. 定义自定义工具
@tool
def multiply(a: int, b: int) -> int:
"""计算两个整数的乘积"""
return a * b
@tool
def search_weather(city: str) -> str:
"""查询指定城市天气"""
weather_map = {"北京":"晴天25℃","上海":"小雨22℃","广州":"多云28℃"}
return weather_map.get(city, f"暂无{city}天气数据")
# 2. 绑定工具到模型
tools = [multiply, search_weather]
llm_with_tools = llm.bind_tools(tools)
# 3. 执行工具调用
query = "查询北京天气,计算35*3的结果"
ai_msg = llm_with_tools.invoke(query)
# 4. 解析并执行工具
tool_results = []
for tool_call in ai_msg.tool_calls:
t_name = tool_call["name"]
t_args = tool_call["args"]
selected_tool = [t for t in tools if t.name == t_name][0]
res = selected_tool.invoke(t_args)
tool_results.append({t_name: res})
print("工具执行结果:", tool_results)
5.5 Agent智能代理实战(自动多任务处理)
from langchain.agents import create_tool_calling_agent, AgentExecutor
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
# 构建Agent提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "你是智能助手,根据用户需求调用对应工具完成任务"),
("human", "{input}"),
MessagesPlaceholder(variable_name="agent_scratchpad")
])
# 创建Agent和执行器
agent = create_tool_calling_agent(llm, tools, prompt)
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
# 执行复杂多步骤任务
result = agent_executor.invoke({"input": "查询广州天气,计算23*4,再查询深圳天气"})
print("Agent最终回答:", result["output"])
更多推荐


所有评论(0)