LangChain快速入门与Agent开发实战2
课程说明:
- 体验课内容节选自《2025大模型Agent智能体开发实战》(夏季班) 完整版付费课程
体验课时间有限,若想深度学习大模型技术,欢迎大家报名由我主讲的《2025大模型Agent智能体开发实战》(夏季班)
《2025大模型Agent智能体开发实战》(夏季班) 为【100+小时】体系大课,总共20大模块精讲精析,零基础直达大模型企业级应用!
部分项目成果演示
from IPython.display import Video
- MateGen项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/4.MateGen%20Pro%20%E9%A1%B9%E7%9B%AE%E5%8A%9F%E8%83%BD%E6%BC%94%E7%A4%BA.mp4", width=800, height=400)
- 智能客服项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/%E6%99%BA%E8%83%BD%E5%AE%A2%E6%9C%8D%E6%A1%88%E4%BE%8B%E6%BC%94%E7%A4%BA.mp4", width=800, height=400)
- Dify项目演示
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/2f1b47f42c65fd59e8d3a83e6cb9f13b_raw.mp4", width=800, height=400)
- LangChain&LangGraph搭建Multi-Agnet
Video("https://ml2022.oss-cn-hangzhou.aliyuncs.com/%E5%8F%AF%E8%A7%86%E5%8C%96%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90Multi-Agent%E6%95%88%E6%9E%9C%E6%BC%94%E7%A4%BA%E6%95%88%E6%9E%9C.mp4", width=800, height=400)
此外,若是对大模型底层原理感兴趣,也欢迎报名由我和菜菜老师共同主讲的《2025大模型原理与实战课程》(夏季班)
两门大模型课程夏季班目前上新特惠+618年中钜惠双惠叠加,合购还有更多优惠哦~详细信息扫码添加助教,回复“大模型”,即可领取课程大纲&查看课程详情👇
《大模型Agent智能体开发实战(夏季班)》体验课
LangChain快速入门与Agent开发实战-Part 2
- LangChain项目回顾
LangChain可以称之为自2022年底大模型技术爆火以来的第一个真正意义上的大模型开发框架。
大模型本质上无法直接解决实际的问题,仅仅是一个能够分析、推理和生成文本的黑盒。直到现在,所有的开发者们仍然在不断探索如何把大模型的强大能力与实际应用场景结合起来,而当时LangChain的出现,直接让大模型开发变得简单起来,它将大模型开发过程中常用的功能、工具、流程等等全部封装成一个个的组件,使开发者可以像搭乐高积木一样,快速的组合出适用于不同场景需求的大模型应用。
LangChain的首个版本于2022年10月开源,直到现在仍然再以一个飞快的速度不断进行迭代升级。从一个开源 Python/TS 框架逐渐发展,形成包括“链”和“代理”等核心组件,现在已走向企业级阶段,发展成了LangChain AI,其拥有目前Agent技术领域最大的开源生态,衍生出了多个开源项目框架,各自都在大模型的技术领域承担着不同的开发任务角色。
其官方Github地址为:https://github.com/langchain-ai

这里我们可以梳理出在LangChain AI中最受关注的项目发展态势,如下图所示:

其中最活跃的项目当属langchain,排在前二的分别是langChain的Python版本和JavaScript版本。作为LangChain AI发展的基石,langchain主要用来支持构建大模型应用的一切,包括链式编排、检索增强生成 (RAG)、嵌入、文档处理、对话系统、代码分析等。而随着业务需求的越来越复杂,LangChain AI也推出了langgraph,作为一个基于图结构的 Agent 编排框架,可构建有状态、多步骤、多 Agent 的工作流,从而进一步扩展了LangChain AI自家生态的适用范围。而至于local‑deep‑researcher和opengpts,则完全是给开发者提供了基于LangChain定制开发出的特定热门应用,也一定程度上能印证LangChain AI的生态繁荣和可实现应用场景的广度。
- LangChain AI 热门开源项目功能介绍
| 项目 | 技术栈 | 核心用途 |
|---|---|---|
| langchain | Python/TS | 构建 LLM 应用基础组件 |
| langchainjs | JS/TS | 前端/Node 环境中构造 LLM 应用 |
| langgraph | Python | 用图编排复杂 agent 流程 |
| local‑deep‑researcher | Python | 自动化、多轮本地 Web 研究工具 |
| opengpts | Python + Go + 前端 | 可定制化 GPT 平台,支持 RAG 和 agent 开发 |
对外,LangChain 也是目前大模型技术领域所有AI Agent框架中最热门、最通用的,相较于AutoGen、CrewAI、OpenAI Agents SDK和Google ADK,拥有最多的收藏量和活跃的开发者数量。

因此这里大家可以感受到,langChain AI生态的学习,其实最最核心的就是LangChain这个项目。而langChain是一个非常全面的开发框架,集成了Agent和RAG两个关键的热门落地方向,通过灵活的模块化组合可以快速的构建适用于私有业务场景的大模型应用,在目前的应用开发中是企业中使用最多的Agent开发框架。其核心架构如下图所示:

从本质上分析,LangChain从大模型角度出发,通过开发人员在实践过程中对大模型能力的深入理解及其在不同场景下的涌现潜力,使用模块化的方式进行高级抽象,设计出统一接口以适配各种大模型。LangChain抽象出最重要的核心模块如下:
Model I/O:标准化各个大模型的输入和输出,包含输入模版,模型本身和格式化输出;Retrieval:检索外部数据,然后在执行生成步骤时将其传递到 LLM,包括文档加载、切割、Embedding等;Chains:链,LangChain框架中最重要的模块,链接多个模块协同构建应用,是实际运作很多功能的高级抽象;Memory: 记忆模块,以各种方式构建历史信息,维护有关实体及其关系的信息;Agents: 目前最热门的Agents开发实践,未来能够真正实现通用人工智能的落地方案;Callbacks:回调系统,允许连接到 大模型 应用程序的各个阶段。用于日志记录、监控、流传输和其他任务;
从上图中可以看到,LangChain框架涵盖了模型输入输出的标准化、外部工具接入的规范、上下文记忆功能,以及对数据库、SQL、CSV等多种数据源的连接标准。通过核心的"Chain"高级抽象,定义了不同形式下标准的链接方法,这就能够允许开发者根据实际的应用需求和数据流向快速构建出一套完整的应用程序。这个过程类似于搭建积木,可以灵活适应不同的任务需求。
因此本节公开课,我们就围绕LangChain展开详细的讲解,我们会涉及到LangChain框架的整体概览,如何用LangChain搭建智能体和本地知识库问答的完整流程,同时对于比较热门的MCP工具如何接入LangChain框架,会做一个重点的说明。
需要说明的,这里我们选择使用Python作为开发语言,同时使用目前最新的LangChain 0.3版本,具体的版本说明如下:
- Python==3.12
- LangChain>=0.3.25
- langchain-deepseek>=0.1.3
一、LangChain快速入门
1. LangChain接入大模型流程
- LangChain安装流程
如果使用LangChain进行大模型应用开发,需要安装LangChain的依赖包,安装命令如下:
! pip install langchain
不同的依赖包版本在使用方式上可能存在一些差异,所以建议大家选择和课程一直的依赖包版本进行学习。这里我们采用的是目前最新的LangChain 0.3版本,可以通过如下命令进行查看:
! pip show langchain
- 尝试调用DeepSeek
在进行LangChain开发之前,首先需要准备一个可以进行调用的大模型,这里我们选择使用DeepSeek的大模型,并使用DeepSeek官方的API_KEK进行调用。如果初次使用,需要现在DeepSeek官网上进行注册并创建一个新的API_Key,其官方地址为:https://platform.deepseek.com/usage

注册好DeepSeek的API_KEY后,首先在项目同级目录下创建一个env文件,用于存储DeepSeek的API_KEY,如下所示:
接下来通过python-dotenv库读取env文件中的API_KEY,使其加载到当前的运行环境中,代码如下:
! pip install python-dotenv
import os
from dotenv import load_dotenv
load_dotenv(override=True)
DeepSeek_API_KEY = os.getenv("DEEPSEEK_API_KEY")
# print(DeepSeek_API_KEY) # 可以通过打印查看
我们在当前的运行环境下不使用LangChain,直接使用DeepSeek的API进行网络连通性测试,测试代码如下:
! pip install openai
from openai import OpenAI
# 初始化DeepSeek的API客户端
client = OpenAI(api_key=DeepSeek_API_KEY, base_url="https://api.deepseek.com")
# 调用DeepSeek的API,生成回答
response = client.chat.completions.create(
model="deepseek-chat",
messages=[
{"role": "system", "content": "你是乐于助人的助手,请根据用户的问题给出回答"},
{"role": "user", "content": "你好,请你介绍一下你自己。"},
],
)
# 打印模型最终的响应结果
print(response.choices[0].message.content)
如果可以正常收到DeepSeek模型的响应,则说明DeepSeek的API已经可以正常使用且网络连通性正常。
- DeepSeek接入LangChain流程
接下来我们要考虑的是,对于这样一个DeepSeek官方的API,如何接入到LangChain中呢?其实非常简单,我们只需要使用LangChain中的一个DeepSeek组件即可向像述代码一样,直接使用相同的DeepSeek API KEY与大模型进行交互。因此,我们首先需要安装LangChain的DeepSeek组件,安装命令如下:
! pip install langchain-deepseek
安装好LangChain集成DeepSeek模型的依赖包后,需要通过一个init_chat_model函数来初始化大模型,代码如下:
from langchain.chat_models import init_chat_model
model = init_chat_model(model="deepseek-chat", model_provider="deepseek")
其中model用来指定要使用的模型名称,而model_provider用来指定模型提供者,当写入deepseek时,会自动加载langchain-deepseek的依赖包,并使用在model中指定的模型名称用来进行交互。
question = "你好,请你介绍一下你自己。"
result = model.invoke(question)
print(result.content)
result
model = init_chat_model(model="deepseek-reasoner", model_provider="deepseek")
result = model.invoke(question)
print(result.content)
result.additional_kwargs
result.additional_kwargs['reasoning_content']
这里可以看到,仅仅通过两行代码,我们便可以在LangChain中顺利调用DeepSeek模型,并得到模型的响应结果。相较于使用DeepSeek的API,使用LangChain调用模型无疑是更加简单的。同时,不仅仅是DeepSeek模型,LangChain还支持其他很多大模型,如OpenAI、Qwen、Gemini等,我们只需要在init_chat_model函数中指定不同的模型名称,就可以调用不同的模型。其工作的原理是这样的:

理解了这个基本原理,如果大家想在用LangChain进行开发时使用其他大模型如Qwen3系列,则只需要先获取到Qwen3模型的API_KEY,然后安装Tongyi Qwen的第三方依赖包,即可同样通过init_chat_model函数来初始化模型,并调用invoke方法来得到模型的响应结果。关于LangChain都支持哪些大模型以及每个模型对应的是哪个第三方依赖包,大家可以在LangChain的官方文档中找到,访问链接为:https://python.langchain.com/docs/integrations/chat/

当然,除了在线大模型的接入,langChain也只是使用Ollama、vLLM等框架启动的本地大模型。
2. LangChian核心功能:链式调用实现方法
顾名思义,LangChain之所以被称为LangChain,其核心概念就是Chain。 Chain翻译成中文就是“链”。一个链,指的是可以按照某一种逻辑,按顺序组合成一个流水线的方式。比如我们刚刚实现的问答流程: 用户输入一个问题 --> 发送给大模型 --> 大模型进行推理 --> 将推理结果返回给用户。这个流程就是一个链。
- 尝试搭建一个简单的链
例如,我们这里可以先尝试着搭建一个简单的链,将模型输出结果“过滤”为一个纯字符串格式:
from langchain_core.output_parsers import StrOutputParser
from langchain.chat_models import init_chat_model
# 使用 DeepSeek 模型
model = init_chat_model(model="deepseek-chat", model_provider="deepseek")
# 直接使用模型 + 输出解析器搭建一个链
basic_qa_chain = model | StrOutputParser()
# 查看输出结果
question = "你好,请你介绍一下你自己。"
result = basic_qa_chain.invoke(question)
result
此时result就不再是包含各种模型调用信息的结果,而是纯粹的模型响应的字符串结果。而这里用到的StrOutputParser()实际上就是用于构成LangChain中一个链条的一个对象,其核心功能是用于处理模型输出结果。同时我们也能发现,只需要使用Model | OutputParser,即可高效搭建一个链。
类似这种结果解析器还有很多,稍后我们会继续进行介绍。
- 加入提示词模板创建链
接下来我们尝试为当前的执行流程添加一个提示词模板,我们可以借助ChatPromptTemplate非常便捷的将一个提示词模板,同样以链的形式加入到当前任务中:
from langchain.output_parsers.boolean import BooleanOutputParser
from langchain.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate([
("system", "你是一个乐意助人的助手,请根据用户的问题给出回答"),
("user", "这是用户的问题: {topic}, 请用 yes 或 no 来回答")
])
# 直接使用模型 + 输出解析器
bool_qa_chain = prompt_template | model | StrOutputParser()
# 测试
question = "请问 1 + 1 是否 大于 2?"
result = bool_qa_chain.invoke(question)
result
一个最基本的Chain结构,是由Model和OutputParser两个组件构成的,其中Model是用来调用大模型的,OutputParser是用来解析大模型的响应结果的。所以一个最简单的LLMChain结构,其数据流向正如下图所示:

当我们调用指令跟随能力较强的大模型的时候,借助提示词模板即可实现结构化输出的结果。
- 借助提示词模板和结果解析器实现功能更加复杂的链
至此,我们就搭建了一个非常基础的链。在LangChain中,一个基础的链主要由三部分构成,分别是提示词模板、大模型和结果解析器(结构化解析器):
而相比之下,结构化解析器功能最多,一些核心的结构化解析器功能如下:
| 解析器名称 | 功能描述 | 类型 |
|---|---|---|
| BooleanOutputParser | 将LLM输出解析为布尔值 | 基础类型解析 |
| DatetimeOutputParser | 将LLM输出解析为日期时间 | 基础类型解析 |
| EnumOutputParser | 解析输出为预定义枚举值之一 | 基础类型解析 |
| RegexParser | 使用正则表达式解析LLM输出 | 模式匹配解析 |
| RegexDictParser | 使用正则表达式将输出解析为字典 | 模式匹配解析 |
| StructuredOutputParser | 将LLM输出解析为结构化格式 | 结构化解析 |
| YamlOutputParser | 使用Pydantic模型解析YAML输出 | 结构化解析 |
| PandasDataFrameOutputParser | 使用Pandas DataFrame格式解析输出 | 数据处理解析 |
| CombiningOutputParser | 将多个输出解析器组合为一个 | 组合解析器 |
| OutputFixingParser | 包装解析器并尝试修复解析错误 | 错误处理解析 |
| RetryOutputParser | 包装解析器并尝试修复解析错误 | 错误处理解析 |
| RetryWithErrorOutputParser | 包装解析器并尝试修复解析错误 | 错误处理解析 |
| ResponseSchema | 结构化输出解析器的响应模式 | 辅助类 |
一些功能实现如下,例如借助结构化解析器可以将yes or no转化为True or Fasle:
prompt_template = ChatPromptTemplate([
("system", "你是一个乐意助人的助手,请根据用户的问题给出回答"),
("user", "这是用户的问题: {topic}, 请用 yes 或 no 来回答")
])
# 直接使用模型 + 输出解析器
bool_qa_chain = prompt_template | model | BooleanOutputParser()
# 测试
question = "请问 1 + 1 是否 大于 2?"
result = bool_qa_chain.invoke(question)
result
# 测试
question = "请问 4 + 1 是否 大于 2?"
result = bool_qa_chain.invoke(question)
print(result)
而StructuredOutputParser则可以在文档中提取指定的结构化信息:
from langchain_core.prompts import PromptTemplate
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
schemas = [
ResponseSchema(name="name", description="用户的姓名"),
ResponseSchema(name="age", description="用户的年龄")
]
parser = StructuredOutputParser.from_response_schemas(schemas)
prompt = PromptTemplate.from_template(
"请根据以下内容提取用户信息,并返回 JSON 格式:\n{input}\n\n{format_instructions}"
)
chain = (
prompt.partial(format_instructions=parser.get_format_instructions())
| model
| parser
)
result = chain.invoke({"input": "用户叫李雷,今年25岁,是一名工程师。"})
print(result)
- 创建复合链
from langchain_core.prompts import PromptTemplate
from langchain_core.runnables import RunnableSequence
from langchain.output_parsers import ResponseSchema, StructuredOutputParser
# 第一步:根据标题生成新闻正文
news_gen_prompt = PromptTemplate.from_template(
"请根据以下新闻标题撰写一段简短的新闻内容(100字以内):\n\n标题:{title}"
)
# 第一个子链:生成新闻内容
news_chain = news_gen_prompt | model
# 第二步:从正文中提取结构化字段
schemas = [
ResponseSchema(name="time", description="事件发生的时间"),
ResponseSchema(name="location", description="事件发生的地点"),
ResponseSchema(name="event", description="发生的具体事件"),
]
parser = StructuredOutputParser.from_response_schemas(schemas)
summary_prompt = PromptTemplate.from_template(
"请从下面这段新闻内容中提取关键信息,并返回结构化JSON格式:\n\n{news}\n\n{format_instructions}"
)
# 第二个子链:生成新闻摘要
summary_chain = (
summary_prompt.partial(format_instructions=parser.get_format_instructions())
| model
| parser
)
# 组合成一个复合 Chain
full_chain = news_chain | summary_chain
# 调用复合链
result = full_chain.invoke({"title": "苹果公司在加州发布新款AI芯片"})
print(result)
- 借助LangChain适配器设置自定义可运行的节点
from langchain_core.runnables import RunnableLambda
# 一个简单的打印函数,调试用
def debug_print(x):
print("中间结果(新闻正文):", x)
return x
debug_node = RunnableLambda(debug_print)
# 插入 debug 节点
full_chain = news_chain | debug_node | summary_chain
# 调用复合链
result = full_chain.invoke({"title": "苹果公司在加州发布新款AI芯片"})
print(result)
通过上述不同的尝试,我们就已经理解了在langChain中,如何使用Model、OutputParser、ChatPromptTemplate来构建一个简单的Chain。其中:
ChatPromptTemplate是用来构建提示模板的,将输入的问题转化为消息列表,可以设置系统指令,也可以添加一些变量;Model是用来调用大模型的,可以指定使用不同的模型;OutputParser是用来解析大模型的响应结果的,可以指定使用不同的解析器。
了解到这里,我们就可以基于LangChain来快速开发出一个智能问答机器人。
3. 构建流式智能问答系统
在langChain中构建一个基本的问答机器人仅需要使用一个Chain便可以快速实现,如下所示:
from langchain_core.output_parsers import StrOutputParser
from langchain.chat_models import init_chat_model
from langchain.prompts import ChatPromptTemplate
chatbot_prompt = ChatPromptTemplate.from_messages([
("system", "你叫小智,是一名乐于助人的助手。"),
("user", "{input}")
])
# 使用 DeepSeek 模型
model = init_chat_model(model="deepseek-chat", model_provider="deepseek")
# 直接使用模型 + 输出解析器
basic_qa_chain = chatbot_prompt | model | StrOutputParser()
# 测试
question = "你好,请你介绍一下你自己。"
result = basic_qa_chain.invoke(question)
print(result)
这其实有一个问题,就是大家经常看到的问答机器人其实都是采用流式传输模式。用户输入问题,等待模型直接返回回答,然后用户再输入问题,模型再返回回答,这样循环下去,用户输入问题和模型返回回答之间的时间间隔太长,导致用户感觉机器人反应很慢。所以LangChain提供了一个astream方法,可以实现流式输出,即一旦模型有输出,就立即返回,这样用户就可以看到模型正在思考,而不是等待模型思考完再返回。
实现的方法也非常简单,只需要在调用模型时将invoke方法替换为astream方法,然后使用async for循环来获取模型的输出即可。代码如下:
from langchain_core.output_parsers import StrOutputParser
from langchain.chat_models import init_chat_model
from langchain.prompts import ChatPromptTemplate
chatbot_prompt = ChatPromptTemplate.from_messages([
("system", "你叫小智,是一名乐于助人的助手。"),
("user", "{input}")
])
# 使用 DeepSeek 模型
model = init_chat_model(model="deepseek-chat", model_provider="deepseek")
# 直接使用提示模版 +模型 + 输出解析器
qa_chain_with_system = chatbot_prompt | model | StrOutputParser()
# 异步实现流式输出
async for chunk in qa_chain_with_system.astream({"input": "你好,请你介绍一下你自己"}):
print(chunk, end="", flush=True)
如上所示展示的问答效果就是我们在构建大模型应用时需要实现的流式输出效果。接下来我们就进一步地,使用gradio来开发一个支持在网页上进行交互的问答机器人。
首先需要安装一下gradio的第三方依赖包,
# 安装 Gradio
! pip install gradio
完整实现的代码如下:
import gradio as gr
from langchain.chat_models import init_chat_model
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
# 初始化模型
model = init_chat_model("deepseek-chat", model_provider="deepseek")
# 创建问答链
system_prompt = ChatPromptTemplate.from_messages([
("system", "你叫小智,是一名乐于助人的助手。"),
("human", "{input}")
])
qa_chain = system_prompt | model | StrOutputParser()
# 流式回应函数
async def chat_response(message, history):
"""流式生成AI回应"""
partial_message = ""
async for chunk in qa_chain.astream({"input": message}):
partial_message += chunk
yield partial_message
# 创建 Gradio 界面
def create_chatbot():
# 自定义CSS样式 - 居中显示
css = """
.main-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.header-text {
text-align: center;
margin-bottom: 20px;
}
"""
with gr.Blocks(title="DeepSeek Chat", css=css) as demo:
with gr.Column(elem_classes=["main-container"]):
# 居中显示标题
gr.Markdown(
"# 🤖 LangChain B站公开课 By九天Hector ",
elem_classes=["header-text"]
)
gr.Markdown(
"基于 LangChain LCEL 构建的流式对话机器人",
elem_classes=["header-text"]
)
chatbot = gr.Chatbot(
height=500,
show_copy_button=True,
avatar_images=(
"https://cdn.jsdelivr.net/gh/twitter/twemoji@v14.0.2/assets/72x72/1f464.png",
"https://cdn.jsdelivr.net/gh/twitter/twemoji@v14.0.2/assets/72x72/1f916.png"
),
)
with gr.Row():
msg = gr.Textbox(
placeholder="请输入您的问题...",
container=False,
scale=7
)
submit = gr.Button("发送", scale=1, variant="primary")
clear = gr.Button("清空", scale=1)
# 处理消息发送
async def respond(message, chat_history):
if not message.strip():
yield "", chat_history
return
# 1. 添加用户消息到历史并立即显示
chat_history = chat_history + [(message, None)]
yield "", chat_history # 立即显示用户消息
# 2. 流式生成AI回应
async for response in chat_response(message, chat_history):
# 更新最后一条消息的AI回应
chat_history[-1] = (message, response)
yield "", chat_history
# 清空对话历史的函数
def clear_history():
return [], ""
# 绑定事件
msg.submit(respond, [msg, chatbot], [msg, chatbot])
submit.click(respond, [msg, chatbot], [msg, chatbot])
clear.click(clear_history, outputs=[chatbot, msg])
return demo
# 启动界面
demo = create_chatbot()
demo.launch(
server_name="0.0.0.0",
server_port=7860,
share=False,
debug=True
)
运行后,在浏览器访问http://127.0.0.1:7860即可进行问答交互。
这只是最简单的问答机器人实现形式,实际上企业应用的问答机器人往往需要更加复杂的逻辑,比如用户权限管理、上下文记忆等,更多内容详见《大模型与Agent开发》课程讲解。