第 17 章 · 编排 AI 流程:StateGraph 节点、条件边与意图路由

LangGraph StateGraph实战:状态传递、多Agent编排与中断恢复 在AI Agent开发中,流程编排是关键难题。传统链式调用难以处理分支、循环、人工确认等复杂逻辑,而基于状态机的图编排思想应运而生。StateGraph作为LangGraph的核心构建工具,通过显式定义状态、节点和边,将Agent执行过程建模为有向图,实现可控、可恢复的复杂工作流。其核心价值在于以全局共享状态(State)驱动节点流转,配合条件边实现智能分支、循环重试,结合checkpoint机制支持中断与恢复,为人机协作和多Agent协同提供统一解决方案。从RAG流程增强到多Agent团队协作,从自动重试 阅读详情

版本:LangGraph4j 1.8.25

目标:在 StateGraph 上加节点、普通边、条件边,跑通一张意图三路分支图。

本章不接模型;classify 用规则写死,只练拓扑。

StateGraph 是可变蓝图:挂 schema、节点、边,再 compile() 得到可执行的 CompiledGraph。START / END 是虚拟锚点,业务逻辑只写在节点里。


17.1 直线图:节点 + 普通边

addNode 接收的是异步节点。同步逻辑写成 NodeAction,再用 AsyncNodeAction.node_async 包一层(和第 15 章一样)。

import static org.bsc.langgraph4j.StateGraph.END;
import static org.bsc.langgraph4j.StateGraph.START;
import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;
​
NodeAction<MyState> retrieve = state ->
        Map.of("docs", search(state.<String>value("query").orElse("")));
​
NodeAction<MyState> generate = state ->
        Map.of("answer", "ok");
​
var graph = new StateGraph<>(schema, MyState::new)
        .addNode("retrieve", node_async(retrieve))
        .addNode("generate", node_async(generate))
        .addEdge(START, "retrieve")
        .addEdge("retrieve", "generate")
        .addEdge("generate", END);

普通边是固定下一跳:source → target。

同一 source 挂多条无条件边,编译后会扇出成并行,不是二选一。 互斥分支必须用条件边。


17.2 条件边:返回映射表的 key

EdgeAction 根据状态返回一个 String。这个字符串是映射表里的 key,框架再用映射翻成真正的节点 id。

import static org.bsc.langgraph4j.action.AsyncEdgeAction.edge_async;
​
EdgeAction<MyState> byIntent = state ->
        state.<String>value("intent").orElse("unknown");
​
graph.addConditionalEdges("classify", edge_async(byIntent), Map.of(
        "faq", "faq",           // key → 节点 id
        "order", "order",
        "unknown", "fallback"
));

本例里 key 和节点 id 同名,读起来方便;也可以写成 "faq" → "faq_handler",只要 EdgeAction 返回的 key 能在表里查到。

常用挂法对照:

API用途
addNode(id, AsyncNodeAction)普通节点(同步用 node_async 包)
addNode(id, AsyncNodeActionWithConfig)节点里要读 RunnableConfig
addEdge(source, target)固定下一跳
addConditionalEdges(source, edge, mappings)按状态选下一跳

Command 可以同时指定「下一跳 + 状态更新」:

new Command("fallback", Map.of("reason", "unrecognized"));

条件边若用 AsyncCommandAction,返回的是 Command;用 EdgeAction / AsyncEdgeAction 时只负责选路,状态仍由节点返回的 partial Map 更新。


17.3 意图路由:一整张能跑的图

上图就是下面这份代码:classify 写出 intent,条件边按 faq / order / unknown 三路,各自接到 END。

import static org.bsc.langgraph4j.StateGraph.END;
import static org.bsc.langgraph4j.StateGraph.START;
import static org.bsc.langgraph4j.action.AsyncEdgeAction.edge_async;
import static org.bsc.langgraph4j.action.AsyncNodeAction.node_async;
​
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
​
import org.bsc.langgraph4j.CompiledGraph;
import org.bsc.langgraph4j.StateGraph;
import org.bsc.langgraph4j.action.EdgeAction;
import org.bsc.langgraph4j.action.NodeAction;
import org.bsc.langgraph4j.state.AgentState;
import org.bsc.langgraph4j.state.Channel;
import org.bsc.langgraph4j.state.Channels;
​
public class IntentRoutingGraph {
​
    public static class RouteState extends AgentState {
        public static final String INTENT = "intent";
        public static final String REPLY = "reply";
        public static final String LOGS = "logs";
​
        public static final Map<String, Channel<?>> SCHEMA = Map.of(
                INTENT, Channels.base(() -> ""),
                REPLY, Channels.base(() -> ""),
                LOGS, Channels.appenderWithDuplicate(ArrayList::new)
        );
​
        public RouteState(Map<String, Object> initData) {
            super(initData);
        }
    }
​
    public static void main(String[] args) throws Exception {
        NodeAction<RouteState> classify = state -> {
            String text = state.<String>value("text").orElse("");
            String intent;
            if (text.contains("订单") || text.contains("物流")) {
                intent = "order";
            } else if (text.contains("怎么") || text.contains("什么")) {
                intent = "faq";
            } else {
                intent = "unknown";
            }
            return Map.of(
                    RouteState.INTENT, intent,
                    RouteState.LOGS, List.of("classify:" + intent)
            );
        };
​
        NodeAction<RouteState> faq = state -> Map.of(
                RouteState.REPLY, "这是 FAQ 答复",
                RouteState.LOGS, List.of("faq")
        );
        NodeAction<RouteState> order = state -> Map.of(
                RouteState.REPLY, "这是订单答复",
                RouteState.LOGS, List.of("order")
        );
        NodeAction<RouteState> fallback = state -> Map.of(
                RouteState.REPLY, "没听清意图,请换种说法",
                RouteState.LOGS, List.of("fallback")
        );
​
        EdgeAction<RouteState> byIntent = state ->
                state.<String>value(RouteState.INTENT).orElse("unknown");
​
        CompiledGraph<RouteState> compiled = new StateGraph<>(RouteState.SCHEMA, RouteState::new)
                .addNode("classify", node_async(classify))
                .addNode("faq", node_async(faq))
                .addNode("order", node_async(order))
                .addNode("fallback", node_async(fallback))
                .addEdge(START, "classify")
                .addConditionalEdges("classify", edge_async(byIntent), Map.of(
                        "faq", "faq",
                        "order", "order",
                        "unknown", "fallback"))
                .addEdge("faq", END)
                .addEdge("order", END)
                .addEdge("fallback", END)
                .compile();
​
        compiled.invoke(Map.of("text", "我的订单到哪了"))
                .ifPresent(s -> {
                    System.out.println(s.value(RouteState.INTENT).orElse(""));
                    System.out.println(s.value(RouteState.REPLY).orElse(""));
                    System.out.println(s.value(RouteState.LOGS).orElse(List.of()));
                });
        // → order
        // → 这是订单答复
        // → [classify:order, order]
    }
}

读代码时对照上图核对三件事:

  1. classify 只负责写出 intent,不自己跳转。

  2. byIntent 读 intent,返回的字符串必须能在映射表里找到。

  3. 三条业务边各自 addEdge(..., END),图不会悬空。

需要核对拓扑时:

System.out.println(compiled.getGraph(
        org.bsc.langgraph4j.GraphRepresentation.Type.MERMAID,
        "Intent Routing").content());

17.4 常见错误

现象原因与处理
本想二选一,却两个分支都跑了互斥写成了多条 addEdge;改成 addConditionalEdges
路由报错或走不到目标节点映射漏了 key,或 EdgeAction 返回值与 key 对不上
图悬空、编译失败某条分支没接到后续节点或 END
条件边返回了节点 id,却不在映射表里返回的应是 key;把该 id 配进映射,或让返回值等于已有 key

直线图先 compile 跑通,再改成条件三路;每步导出 Mermaid,看边有没有接错。

深度解析LangGraph:从入门到动态工作流,彻底搞懂它与LangChain的爱恨情仇(含节点/边/状态管理/条件路由核心源码) 本文将带你深入剖析 LangChain与LangGraph的血缘关系与本质区别,揭秘LangGraph如何通过StateGraph和Message Passing机制,实现对复杂业务流程的精准控制。我们将重点解析条件边(Conditional Edges)、状态聚合(Reducers)以及动态节点调度(Send API)等核心机制,并结合文档中的Pydantic Schema与TypedDict实战代码,手把手教你构建一个工业级的动态智能体。 阅读详情

相关推荐

LLM - 基于 Spring AI Alibaba Graph 构建智能客服工作流:从意图识别到多节点协同的实战解析

本文详细解析了如何利用Spring AI Alibaba Graph框架构建智能客服工作流。通过将复杂的客服流程拆解为意图识别、多节点协同等独立模块,并以图工作流的形式进行编排,有效解决了传统单体Agent架构的维护难题,实现了业务逻辑的清晰解耦与灵活扩展。

hadoop5ranger的博客 918

LangGraph 图与 StateGraph 实战:用节点和边构建有状态 LLM 应用的蓝图

本篇技术指南围绕 LangGraph 最核心的抽象——`Graph` 与 `StateGraph` 展开,讲解如何把"调用一次 LLM"升级为"由多个步骤(Nodes)与流转关系(Edges)编排而成的有状态工作流"。作为 [LangGraph 教程](https://link.gitcode.com/i/76392959a02f0b37d2b097a76772a0b0)的第一章,你将在读完本文后

gitblog_01140的博客 1057

LangGraph实战:用图式状态机编排复杂AI Agent流程

在AI Agent开发中,流程编排是核心挑战。当多个工具调用、条件分支和多轮记忆交织在一起,传统的链式调用往往难以应对复杂的执行逻辑。LangGraph作为一种图式状态机框架,将Agent流程抽象为有向图,节点负责具体执行,边控制流转顺序,条件路由则按需决定分支走向。这种设计让开发者能够以直观、可维护的方式构建复杂的Agent工作流,并借助状态持久化与Checkpointer机制,实现跨轮对话记忆与流程恢复。LangGraph可广泛应用于智能客服、自动化运维、多工具协同等场景,从根源上解决智能体开发中流程控

aoe41606的博客 454

万字长文吃透 LangGraph 核心用法:边、节点、路由与流程控制全解析前言

LangGraph 作为 LangChain 生态中用于构建有状态、多节点工作流的核心库,凭借其灵活的节点编排、动态路由和状态管理能力,成为构建复杂 AI Agent 的首选工具。本文基于实战代码,系统拆解 LangGraph 的核心概念与用法,涵盖普通边、条件边、入口点、Command、RuntimeContext、Send(Map-Reduce)等关键特性,从基础到进阶,手把手带你掌握 LangGraph 的核心玩法。特性核心用途关键 API / 语法适用场景普通边固定流程路径。

实战怎么玩,你就怎么学 851

LangGraph与MCP集成:构建可控的AI Agent编排工作流

在AI Agent开发中,工作流编排与工具接入是两大核心挑战。LangGraph通过状态图建模,将Agent的每一步抽象为节点和边,实现循环、条件分支与状态管理;而MCP(模型上下文协议)则标准化了外部工具、数据源的接入方式。理解LangGraph的状态流转机制与MCP协议交互原理,有助于构建复杂、可维护的Agent应用。本文结合LangGraph与MCP,探讨如何利用LangChain生态构建ReAct Agent,实现多轮工具调用、动态路由和持久化会话记忆,并针对循环检测、人类审批、状态快照等生产场景给

weixin_33755557的博客 397

PacketTacer烟雾传感器读数为0的解决方法

PacketTacer烟雾传感器读数为0的解决方法

ChloeMax_的博客 1905

别只会画流程图!彻底搞懂 Spring AI Alibaba Graph 的节点、边与 State

摘要:Spring AI Alibaba Graph 工作流编排的核心概念解析 本文深入讲解了 Spring AI Alibaba Graph 工作流引擎的三个核心组件: 节点(Node):执行单元,负责处理业务逻辑或调用AI服务,接收并返回状态数据。节点应遵循单一职责原则,推荐使用NodeAction接口实现。 边(Edge):控制流导向,分为固定边和条件边。条件边通过路由函数动态决定下一节点,是复杂流程编排的关键。 状态(State):节点间传递数据的共享Map结构,建议每次返回新Map而非修改入参以避

分享 AI Agent、大模型与后端开发实战; 空门技术栈。 350

告别配置烦恼!保姆级教程:在Windows 10/11上为QT5.14.2配置MSVC2017编译器(附VS2022组件避坑指南)

本文提供了一份详细的保姆级教程,指导如何在Windows 10/11上为QT5.14.2配置MSVC2017编译器,包括VS2022组件避坑指南。从环境准备到关键配置,再到调试工具验证和Qt Creator中的编译器设置,一步步解决常见问题,帮助开发者快速搭建稳定可靠的开发环境。

weixin_30615767的博客 502

SpringAiAlibaba学习笔记:StateGraph

摘要:StateGraph是一个有状态的流程图执行引擎,用于处理复杂业务流程(如审批流程、多数据源RAG等),支持条件分支、循环和数据传递。其核心三要素为节点(处理单元)、边(连接通道)和状态(共享数据黑板)。StateGraph通过条件边实现动态路由,支持子图嵌套,并能完整实现ReactAgent的循环逻辑。适用场景取决于流程复杂性:简单流程用FlowAgent,含条件分支/循环/嵌套时需用StateGraph。注意避免状态冲突、未定义节点等常见陷阱。(149字)

ouyangyifei1991的博客 231

Windows本地部署Ollama+qwen本地大语言模型Web交互界面并实现公网访问

本文主要介绍如何在Windows系统快速部署Ollama开源大语言模型运行工具,并安装Open WebUI结合cpolar内网穿透软件,实现在公网环境也能访问你在本地内网搭建的大语言模型运行环境。近些年来随着ChatGPT的兴起,大语言模型 LLM(Large Language Model)也成为了人工智能AI领域的热门话题,很多大厂也都推出了自己的大语言模型,并或多或少的开源了自己的大语言模型,今天就来分享一个最近很火,且对于小白来说比较好上手本地部署的运行本地LLM的工具Ollama。

迪之的博客 1652

一文掌握DrissionPage的详细使用

是一个基于 Python 的网页自动化工具,主要用于网页数据的抓取、自动化操作和测试。它结合了 Selenium 和 Requests 的优点,提供了更简洁、高效的 API,适用于各种网页自动化任务。DrissionPage 是一个功能强大且易于使用的网页自动化工具,适用于各种网页自动化任务。希望本文的 DrissionPage 的基本使用方法和一些高级功能能够帮助到你。

数据知道的博客 1万+

LangGraph实战:从StateGraph到中断恢复与多Agent编排

从有限状态机与图计算的基础概念谈起,理解Agent工作流本质上是一种可控的状态迁移。LangGraph通过节点、边与共享状态将流程定义成图,天然支持条件路由、动态循环与并行执行,解决了传统链式调用难以处理的分支与状态一致性问题。其Checkpointer机制和中断恢复能力让生产环境的人机协同成为可能,而Supervisor与Handoff模式为多Agent协作提供了清晰的编排范式。本文从实际项目出发,剖析StateGraph的核心心智模型,并给出条件边设计、状态污染规避、持久化选型等工程实践建议,帮助开发者

weixin_27244795的博客 262

知识蒸馏⚗️ | YOLOv5知识蒸馏实战篇

YOLOv5知识蒸馏教程

Coding... 9361

LangGraph实战:从StateGraph到条件路由,打造自主Agent循环

在AI Agent开发中,如何有效编排大模型与外部工具的交互循环,是工程实践的核心挑战。LangGraph作为新一代图编排框架,通过有向图与共享状态机制,为复杂Agent流程提供了更清晰的结构化方案。其核心理念是将流程抽象为节点与边,利用StateGraph维护全局状态,并通过条件路由实现动态分支。相比传统线性链式调用,LangGraph能自然表达工具调用、结果回传、再推理的循环逻辑,并支持异常恢复与状态持久化。这类技术广泛应用于需要多轮工具调用、自主决策和错误自愈的智能体场景,例如客服助手、数据分析Age

weixin_32377497的博客 265

AUTOSAR从入门到精通-复杂设备驱动(CDD)

CDD是复杂设备驱动的首字母缩写主要为驱动程序或复杂驱动程序,但不限于驱动程序。复杂驱动程序是一种未被AUTOSAR标准化的软件实体,可以通过AUTOSAR接口和/或基本软件模块api访问。 CDD是位于基础软件复杂驱动层的特定模块,与标准BSW模块或Rte交互。 CDD可能需要与分层软件体系结构的模块连接 分层软件架构的模块可能需要连接到CDD CDD可能需要通过Rte连接swc。

getusushu的博客 4193

170、电机控制中的温升测试

本文以一次IGBT炸管事故为切入点,深入剖析电机控制中温升测试的实质:不仅是温度测量,更是对铜损、铁损、散热效率等热管理问题的系统验证。作者强调测试前热电偶布置、环境记录、预运行的重要性,提出实时监控电流谐波、绕组电阻、散热梯度等关键参数,并通过损耗分离与冷却系统实测,揭示真实热源。结合温升曲线异常分析与经验建议,强调留余量、仿真结合实测、关注瞬态工况等实践要点,警示温升测试是保障可靠性与安全性的核心环节。

2401_88858637的博客 48

LangGraph:基于图的 AI Agent 编排框架深度解析

LangGraph 作为 LangChain 生态的重要组成部分,通过引入图(Graph)的概念,为 AI Agent 的编排提供了更加灵活和强大的解决方案。本文将从图论基础开始,深入探讨 LangGraph 的核心概念、应用场景和最佳实践,并结合实际项目案例,帮助读者全面理解这一强大的工具。:构建一个 Hub + Sub Agent 架构,Hub Agent 负责意图识别和路由,Sub Agent 负责具体任务执行。,因为 AI Agent 的工作流通常是单向的,从一个状态流转到下一个状态。

程序员成长指北 707

高通开发系列 - Bootloader之lk匹配dtb和dtbo中msm-id和board-id的知识

lk匹配dtb和dtbo中的msm-id和board-id等知识

fulinux的博客 4246

LangGraph StateGraph 实战:从 Chain 到状态机编排多 Agent 流程

在复杂业务系统开发中,工作流编排决定了应用能否灵活应对动态分支与人工介入。传统线性管道模型在处理需要循环迭代、条件跳转和人机协同的流程时力不从心,而状态机架构以状态为中心,通过节点、边和全局状态显式管理执行路径,天然支持循环、分支和暂停恢复。LangGraph 作为新一代编排引擎,将图计算模型引入 Agent 应用开发,使多 Agent 协作、子图嵌套、断点续跑等复杂场景成为可落地的工程实践。其核心 StateGraph 机制不仅解决了 LangChain Chain 在循环控制上的缺陷,还通过 Check

weixin_29039773的博客 244

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LangGraph多智能体实战:从状态图到条件路由与并行分发

在大模型应用开发中,AI Agent 的编排能力决定了复杂任务能否高效落地。LangGraph 作为 LangChain 团队开源的 Agent 编排框架,以图结构管理状态流转,通过 StateGraph 定义节点和条件边,将业务流程显式建模为可执行的有向图。相比传统链式调用,它天然支持循环、分支、记忆检查点和多智能体协作,能有效应对客服分流、任务分解、审批流等场景。借助 Supervisor 模式与 Send API,开发者可以实现主管调度与动态并行分发,批量任务也能获得可控的并发能力。本文从环境准备开始

cuibinmo3519的博客 445

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Spring AI Alibaba StateGraph 工作流引擎详解

Spring AI Alibaba Graph框架通过StateGraph工作流引擎实现复杂AI任务的可视化编排。核心设计采用"节点+边"结构,节点处理原子任务,边控制流程流转。框架提供三层架构(Agent Framework、Graph工作流、Augmented LLM)和三种状态管理策略(覆盖/追加/合并),支持条件分支、并行执行等高级特性。开发者通过定义状态工厂、实现节点逻辑、构建工作流图即可完成复杂AI应用的开发,适用于客户服务自动化、内容生成等工作场景。该框架为Java开发者提

才这么点的博客 1087

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

LangGraph实战:从StateGraph到多Agent编排,告别if-else代码泥潭

在AI应用开发中,流程编排常因复杂的分支与循环陷入代码泥潭。LangGraph作为低层编排框架,将LLM应用建模为有向图,通过节点、边与状态管理实现灵活控制流。它支持条件路由、循环迭代、中断恢复及人工审批,并可与LangChain生态无缝协作。从单Agent到多Agent协作,LangGraph提供了可观测、可恢复的工程化方案。本文以实战视角介绍StateGraph基础、条件边、Checkpointer与Supervisor模式,帮助开发者摆脱硬编码逻辑,构建健壮的Agent工作流。

weixin_29081703的博客 244

从零构建LangGraph智能体:基于状态与图的工作流编排实战

在构建复杂的大模型应用时,任务编排与状态管理是核心挑战。传统的单次API调用难以处理多步骤、带条件的决策流程,这催生了对智能体(Agent)框架的需求。其原理在于将业务逻辑抽象为有向图,通过节点(执行单元)和边(流转条件)来定义工作流,状态(State)则作为贯穿始终的上下文容器,记录对话历史、中间结果等信息。这种架构的技术价值在于实现了清晰的关注点分离,使复杂逻辑的构建和维护变得模块化、可视化。它广泛应用于需要多轮交互、工具调用和记忆能力的场景,如对话助手、自动化流程和复杂决策系统。本文聚焦的LangGr

weixin_34378969的博客 679

LangGraph入门:状态图与条件路由

摘要:LangGraph状态图StateGraph与条件路由conditional_edges解决LangChain链条无状态无循环的短板,是Agent可编排的地基。用State定义状态、Node承载逻辑、add_node/add_edge构图、compile编译执行,本专栏限时¥59.90(原价¥99)先说清楚一个本质问题,为什么LangChain那么流行,却还是要换成图这种形态。链条适合"输入固定、步骤固定、顺序固定"的流水线,一步只通向下一步,没有分支也没有循环。

白话机器学习 134

LangGraph实战指南:构建可控AI Agent与RAG应用的图编排框架

在AI大模型应用开发中,Agent的复杂行为往往需要可控、可恢复的流程编排。LangGraph正是基于图结构的状态机框架,它将Agent执行过程拆分为节点与条件边,让多步工具调用、上下文记忆和人工审核变得可管理。相较于传统LangChain的线性链,LangGraph通过全局状态和checkpoint机制解决了链路中断恢复难、调试不透明等痛点,为RAG问答、多智能体协作和企业级工作流提供了标准化方案。本文从图的核心概念出发,结合LangChain生态对比,深入解析状态归并、条件路由、持久化等关键机制,并给出

weixin_33491377的博客 278

LangGraph 实战:用状态机与 StateGraph 构建可控可恢复的 AI Agent 工作流

在 AI Agent 开发中,状态机是一种将 LLM 行为约束进可控流程的建模范式,其原理是通过显式定义状态、节点与边,实现分支、循环与中断恢复。这种图结构的技术价值在于让工作流可推理、可调试、可持久化,尤其适用于需要人工审核、多轮工具调用或并行分支的生产级场景。LangGraph 的 StateGraph 正是这一思路的工程实现,它用共享状态贯穿全图,配合检查点机制,解决了链式调用中流程脆弱、状态难追踪的痛点,为构建可靠 Agent 提供了底层骨架。

weixin_29047919的博客 333
上一篇: 第 16 章 · AI Agent 共享状态:AgentState 与 Channels
下一篇: 第 18 章 · 跑通 AI 图:CompiledGraph 的 compile、invoke、stream
AI深栈
博客等级 码龄14年 1粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值