链载Ai

标题: 从大数据到大模型:现代应用的数据范式 [打印本页]

作者: 链载Ai    时间: 昨天 11:51
标题: 从大数据到大模型:现代应用的数据范式

本文简介:在大数据和大模型的加持下,现代数据技术释放了巨大的技术红利,通过多种数据范式解除了数据的桎梏,使得应用程序达到了“心无桎梏,身无藩篱”的自在境界,那么现代应用有哪些数据范式呢?这正是本文尝试回答的问题。

背景
韦伯总结了现代社会的四个本质特征,其中很重要的一点,现代社会是一个祛魅社会,其本质就是科学性。科学性在于可证伪性,不可证伪的不能称为科学理论,从而用科学理论驱散了世界的神秘主义。类比于此,现代数据技术最大的特征也可以说是祛魅,通过数据范式解除了数据的桎梏,使得应用程序达到了“心无桎梏,身无藩篱”的自在境界。
本文将会介绍现代数据技术如何对数据祛魅,重点不会侧重于数据库技术的演进,而是侧重于从应用视角来审视数据库功能和数据架构的演进。借用时髦的观点,现代应用的数据范式是一个从大数据到大模型的数据范式。

现代应用的数据特征及其挑战
现代数据具有4V特性,规模性(Volume)、高速性(Velocity)、多样性(Variety)、价值低(Value)。规模性表示数据量的爆炸性增长,使得单机数据库达到性能瓶颈和容量瓶颈;高速性表示数据产生和处理的速度要快,本质是业务系统对数据实时性的诉求;多样性表示数据类型的多种多样,从结构化数据、到半结构化数据和非结构化数据,本质是业务系统对异构数据存储的诉求;价值低表示数据的总体价值大,但价值密度低,本质是业务系统对数据成本和数据分析提出的诉求。
数据4V特性对企业数据基础设施带来了很大的挑战,传统数据架构很难应对这些挑战。企业必须升级其数据基础设施以能够很好的存储、检索和分析现代数据,从而释放数据的商业价值。

现代应用对数据技术提出了如下挑战:

下面章节将尝试回答现代数据架构如何解决以上挑战,如果本次没讲清楚,且听下回补充。

数据存储的挑战:从信息化时代到大数据时代
ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;">传统关系型数据库
数据库作为应用程序存储和检索数据的核心工具,在信息化时代得到了蓬勃发展。关系模型由于其易理解性和完备的数学理论基础从层次模型和网状模型中脱颖而出,成为传统数据库的主流数据模型。关系模型将现实世界中的实体抽象为一张张表格,通过表格之间的关联关系来描绘实体间的联系。在 Codd 发表了《A Relational Model of Data for Large Shared Data Banks》论文后,诞生了一系列伟大的关系型数据库产品,例如 Oracle、MySQL、SQLServer 等。关系型数据库的最大价值在于将应用代码和数据库物理存储结构解耦,这种耦合在论文中被称为“Data Dependencies”。

关系型数据库是一项非常成功的数据管理技术,以行和列的方式组织数据,ACID 和 SQL 是其最显著的特性。ACID 提供了数据持久化、数据完整性、事务等特性。SQL 是基于关系代数的查询语言,具有复杂语义的表达能力,能够提供复杂的查询能力(例如 join、聚合、排序等),并为业界广泛接受和运用。


‍‍‍

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;">NoSQL 的兴起

随着应用数据量的爆炸式增长和应用模型的复杂化,传统关系型数据库遇到了诸多局限和限制:应用开发者需要为海量数据量进行架构升级,需要处理业务数据与数据库关系模型日益不匹配的问题。这些局限与限制引入了极大的架构升级成本和业务逻辑复杂度,应用开发者将大量精力消耗在业务逻辑以外的地方,这些额外消耗使得应用架构和数据库产品发生了转变。应用架构方面,由数据作为集成点,转变为将数据封装到应用程序中并以服务作为集成点,也就是从数据集成到服务集成的转变。数据库产品方面,促进了数据模型的转变,并产生了诸多不同于传统关系型数据库的 NoSQL 产品。

2010 年兴起的的 NoSQL 运动就是数据模型转变的过程,起源于两篇论文,分别是 Amazon's Dynamo 和 Google's BigTable。前者由 Amazon 创建,用于其内部的收藏夹场景,在数据中心故障情况下依然能够提供写入和读取服务,是一个分布式、内置容错能力的 KV 存储,适用于 OLTP 场景。后者由 Google 创建,用于网络爬虫场景,写入抓取到的海量网页数据,然后再由 MapReduce 创建索引,BigTable 提供了高效的 scan 能力,原生支持 MapReduce 计算框架,适用于大数据的实时查询和分析场景。

Dynamo 是一个内置容错能力的分布式KV存储系统,面向只需主键访问的业务场景,使用一致性 hash 将数据按主键分布和复制到多个节点上。通过数据版本和应用辅助的方式控制数据访问的一致性,从而提供了松散的一致性语义 — 最终一致性。综上,Dynamo 通过在某些容灾场景下(网络分区或服务器故障)牺牲数据一致性的方式提供了 “always writable” 的服务可靠性,这就是 Dynamo 要解决的 Amazon 电商业务遇到的大规模集群的可靠性挑战,从而可以服务于 mission-critical 的核心业务场景。

BigTable 是一个管理结构化数据的分布式存储系统,它维护了稀疏的、分布式的、持久化的、多维的、有序健值对,并提供了多种数据访问的模式(相比而言,Dynamo 只提供了主键访问的模式)。BigTable 支持单行事务,从而允许对单行数据执行原子的“读-修改-写”的序列操作和单行多列操作。BigTable 将各列数据排序存储,并按范围分布到多个节点上,通过 lsm-tree 提供极高的写入吞吐量,通过 COW 技术提高读写性能,通过自动分区分裂实现容量的水平伸缩性。综上,这就是 BigTable 要解决的大规模数据量场景下存储系统的扩展性挑战,从而可以可靠的在数千台机器上处理 PB 级的数据。

Dynamo 和 BigTable 都是为了解决各自业务场景所遇到的数据挑战而提出的,两者都有着丰富的设计思路和技术实现。这些设计和实现为后续的很多 NoSQL 产品所借鉴,并经常搭配使用,从而解决业务场景的各种挑战。例如 HBase 借鉴了 BigTable 的数据模型、Cassandra 借鉴了 BigTable 的数据模型和 Dynamo 的分布式设计。

主要的非关系模型有KV模型、宽表模型、文档模型、图模型、时序模型等:

‍‍‍‍
NoSQL 本质上舍弃了传统关系型数据库的一些功能,从而可以实现更加灵活的特性。这些丰富的灵活的特性简化了应用程序的数据操作,极大简化了业务逻辑。NoSQL 并不是某种特定的数据库产品,甚至没有一个明确的定义,而是一种区别于传统关系型数据库的数据模型和数据管理模式,社区赋予了其更包容和多样化的含义。借用《NoSQL Distilled》中总结的 NoSQL 的共同特征:

在以 Spanner、OceanBase 为代表的 NewSQL 出现后,关系型数据库也能提供非常好的水平扩展性,关系型数据库与 NoSQL 之间的水平扩展性差异大幅缩小。但灵活的数据模型依然是 NoSQL 的独特价值。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.578px;line-height: 1.6em;">从应用程序视角,NoSQL 等同于 “Non Relational” 或者 “Non Transactional”,意味着灵活的数据模型和访问接口、可定义的放松的数据一致性,从而提供了关系型数据库以外的另一种选择。且其运行于分布式集群之上,天然具备极好的水平扩展性,能够更好的适用于大数据场景。数据库产品面向 OLTP 业务需要提供的特性可以总结为三类:ACID、水平扩展性、数据模型灵活性,NoSQL 和 关系型数据库各有擅长:


ACID
水平扩展性
数据模型灵活性
传统关系型数据库


NoSQL

NewSQL

因此,关系型数据库与 NoSQL 具备非常好的特性互补,应用程序往往搭配使用并形成了标准的数据架构。关系型数据库提供 ACID 能力,保证数据持久性和数据完整性,用于 mission-critical 的关键业务场景。NoSQL 提供水平扩展性和灵活数据模型,用于创新场景和大数据场景。两者间的数据划分,可以由应用程序分别写入,也可以通过 event stream/change stream 的方式从关系型数据库流向 NoSQL。

NoSQL 对于应用程序的主要价值:
ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;">

ingFang SC", system-ui, -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.544px;">NoSQL 的数据范式

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.578px;min-height: 24px;line-height: 1.6em;margin-top: 16px;">NoSQL 的兴起使得业务数据的建模能力得到了加强,使得业务数据不再被其存储形式束缚。NoSQL 与关系数据库一起构建了更立体的数据架构,使得现代应用解除了传统关系模型的局限性,更好的专注于业务逻辑。


Polyglot Persistence
关系型数据库对应用程序提供了非常关键的 ACID 能力,使得数据可以安全的完整的持久化,可以安全的并发访问。但关系型数据库并不能适用于所有的企业数据和场景,因此应用程序往往同时使用 NoSQL 应对不同的数据存储需求。两者共同构建了企业在线业务的数据架构 —— Polyglot Persistence,应用程序使用多种数据库产品处理不同类型数据,从而在面临具体数据时可以选择最合适的产品。Polyglot Persistence 非常适合于复杂应用,从而为各种业务数据选择最合适的数据模型。Polyglot Persistence 在提供便利性的同时也引入了架构复杂度,需要在收益和复杂度之间做好权衡。

以蚂蚁业务为例,不同类型的业务数据有着各自最合适的数据库产品。交易域业务的数据,模式基本固定,且数据一致性要求很高,非常适合由关系型数据库提供服务,我们会选择 OceanBase;客户域业务的数据,一般跟用户ID直接关联,且是一个典型的读多写少的场景,非常适合由 KV数据库提供服务,我们往往选择 TBase;风控域业务的数据,模式灵活、请求量大、且对数据实时性和查询性能要求很高,非常适合由宽表数据库提供服务,我们往往选择 HBase。


ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;letter-spacing: 0.578px;min-height: 24px;line-height: 1.6em;">CQRS

Polyglot Persistence 是一种数据职责分离的范式,为不同的数据类型选择最合适的数据库产品。另一种数据职责分离的范式是 CQRS(Command Query Responsibility Segregation),将写入操作和读取操作分开。写入操作(Command)通过规范化的关系模型来提供,从而保证数据完整性和数据一致性。读取操作(Query)通过非规范化的数据模型来提供,从而可以获得灵活性和极致性能。两者之间的数据通过异步机制保持最终一致性,可以通过应用程序的异步消息,也可以通过数据库系统的 CDC(Change Data Capture)机制。

以蚂蚁的某关系业务为例,该业务通过 MsgQueue 订阅上游业务的事件消息,并把事件数据写到关系型数据库保证数据持久化。然后再通过订阅关系型数据库的 change stream,构建为图模型的关系数据后写入图数据库,图数据库提供关系数据的查询服务。


大数据分析与服务

现代应用有着数据实时性的需求,需要实时对海量数据进行分析,从而提供更有价值的数据视图,帮助快速决策。现代数据的4V特性促进了实时数据分析架构的演进,典型的分析技术有 Lambda 架构、HTAP、HSAP 等,代表着若干着不同的设计理念和适用场景。Lambda 架构是一种大数据分析与服务范式,将历史数据的分析和近期数据的分析分别交由不同的系统实现。历史数据的分析由专门的离线环境承担 —— 数据仓库或者大数据系统,离线环境的数据由在线系统的数据导入,分析产生的数据回流在线系统供在线业务访问,往往由擅长高吞吐高性能的点查负载的 NoSQL 承担。由于数据导入、数据计算、数据回流都需要时间,离线环境的数据不是实时的,因此在线系统往往会搭配一套实时计算引擎做近期数据的实时分析,或者直接由在线数据库承担轻量 AP 负载。

Lambda 架构使得应用程序能够对海量数据进行实时分析,且提供面向在线业务的优异的访问耗时。
以蚂蚁的风控业务为例,当用户发生金融行为时,需要基于该用户的历史行为数据和本次行为数据进行实时分析并作出风险决策,其风险决策的数据分别来自于离线分析链路和实时分析链路,是个典型的 Lambda 架构。


数据检索的挑战:从结构化时代到非结构化时代

统检索技术

传统数据库存储的是标量数据,标量原来是物理上的概念,指只有大小而没有方向的物理量,在数据库这里用标量来表示一类数据类型,例如数字型、字符型、日期型、布尔型,针对该类数据类型可以使用精确匹配的方式进行查询,例如传统关系数据库的 SQL,该检索方式称为标量查询。

全文检索是指在非结构化的文本数据中基于特定单词或者文本在全文范围内进行检索。常见的搜索引擎就是对全文检索技术的实现,例如 Lucene、Solr、ElasticSearch 等。我们在网络上使用搜索引擎检索特定内容的数据也是用到了全文检索技术。全文检索是一种非常重要的信息检索技术,可以帮助我们对文本数据进行检索。

标量查询和全文检索本质上是关于标量数据或关键字的精确匹配,其查找结果与输入目标之间是完全相同的关系。这与我们下文即将介绍的面向非结构化数据的向量检索的近似匹配有着截然不同的区别。

数据库索引是一种用于加速数据查找的数据结构。计算机科学有着丰富的数据结构帮助快速查找,例如红黑树、跳表、位图、布隆过滤器等。对于标量查询和全文检索,常见的索引类型有 B+树/B树、hash树、倒排索引:

非结构化数据的机遇和挑战

白皮书《IDC:2025年中国将拥有全球最大的数据圈》指出:

来源:《The Digitization of the World From Edge to Core》
传统数据库的标量查询解决了结构化数据的检索问题,但非结构化数据不遵循传统数据库的数据模型,因此传统数据库的检索方式无法处理该类数据,使得企业难以分析非结构化数据。根据调查显示,极少数公司能够有效利用非结构化数据,而非结构化数据往往能够提供更为全景化的视图和整体化的理解,因此挖掘非结构化数据中的信息对于企业发展至关重要,能够带来更大的机遇。

非结构化数据的语义表征

由于数据圈中的数据大部分都是非结构化数据,有效分析非结构化数据将会给企业带来巨大的机遇。我们虽然能够高效存储非结构化数据,例如文件存储、对象存储等,但计算机尚不能按照人的方式来理解图片或者文本中的语义信息。因此将非结构化数据中的语义信息转换为计算机可理解的方式是有效分析的第一步。

现代 AI/ML 技术的发展提供了一种从非结构数据中提取语义信息的方式 —— embedding。区别于前面提到的标量类型,embedding 是一种向量类型 —— 由多个数值组成的数组,因此 embedding 又被称为向量或者矢量。embedding 是非结构化数据的数值表示,能够将非结构化数据映射到其“含义”空间,使得计算机能够理解非结构化数据的语义信息。

embedding 是区别于传统数据库(包括关系型和 NoSQL)的崭新领域,通过 embedding model 将非结构化数据转换为 embedding。embedding model 本质上是一种数据压缩技术,通过 AI/ML 技术对原始数据进行编码,使用比原始数据更少的比特位来表示数据。压缩后的数据就是原始数据的“隐空间表示”,压缩过程中,外部特征和非重要特性被去除,最重要的特征被保存下来,随着数据维度的降低,本质上越相似的原始数据,其隐空间表示也越相近。因此,隐空间是一个抽象的多维空间,外部对象被编码为该空间的内部表示,被编码对象在外部世界越相似,在隐空间中就越靠近彼此。基于以上理论基础,我们可以通过 embedding 之间的距离来衡量其相似程度。

数据的隐空间表示包含了原始数据的所有重要特征,学习原始数据的特征并简化表示的过程,称为表征学习(Representation Learning)。表征学习将原始输入数据映射到隐空间表示,以便更有效的分析和处理,并可以发现原始数据中的隐藏模式和结构。表征学习包括从原始数据中发现特征并表示的一组技术,现代技术主要是深度学习。针对不同的非结构化数据,业界有着丰富的深度学习模型,例如用于文本处理的 Word2Vec、Universal Sentence Encoder、GLoVE,用于图片处理的 ResNet50、MobileNet、CLIP,用于视频处理的 OpenCV,用于音频处理的 PANNs 等。

因此,embedding 是非结构化数据的统一语义表征,是现代 AI/ML 的通用语言。有了非结构数据的语义信息的数值表示,接下来我们将直面第二个挑战:如何构建高效的 embedding 检索服务 —— 向量检索服务。

非结构化数据的检索

向量检索服务是专门存储、索引和查询由机器学习模型生成的非结构化数据的向量表征的服务。本节我们将介绍向量检索服务的核心技术和产品形态。

区别于标量数据的精确匹配,向量检索是一种基于距离函数的相似度检索,由于向量间的距离反映了向量的相似度,因此通过距离排序可以查找最相似的若干个向量。向量检索算法有 kNN 和 ANN 两种:

向量的相似性度量基于距离函数,常见的距离函数有欧式距离、余弦距离、点积距离,实际应用中选择何种距离函数取决于具体的应用场景:
来源:https://www.restack.io/p/similarity-search-answer-image-similarity-cat-ai
对于向量检索,常见的 ANN 索引类型有 IVF、HNSW、PQ、IVFPQ:


基于业界的相关论文及工程经验产出的最佳实践:

以上我们介绍了向量检索服务的核心技术,包括检索算法、相似度度量算法、索引构建算法。应用程序在实际运用中并不需要从头构建,业界有着丰富的支持向量检索的产品,主要由三种产品形态,分别是向量检索库、专用向量数据库、支持向量检索的普通数据库:

最后来个总结,向量检索服务基于 AI/ML 技术计算目标向量与候选向量集中向量的相似度,并返回最相似的若干条向量。ANN 算法提升了查询速度,使得查询耗时对应用程序更友好。ANN 算法在大幅提升查询速度的同时,有少量的查询精度牺牲,如果对查询精度要求更高,可以选择 kNN 算法查询。上节介绍的 embedding 解决了非结构化数据的“语义”难题,本节介绍的向量检索服务解决了 embedding 的“检索”难题,两者一起提供了区别于传统数据库的面向非结构化数据的检索方案。

非结构化数据检索的数据范式

现代 AI 技术的发展使得非结构化数据的检索能力得到了空前加强,进而使得现代应用解除了非结构化数据的桎梏,应用程序有了更多基于非结构化数据的数据范式。

混合检索

传统检索技术和面向非结构化数据的向量检索技术是两种完全不同的检索技术:

传统检索技术善于精确查询,但缺乏语义理解。而向量检索技术能够很好的识别用户意图,但在精确检索方面召回率大概率不如传统检索技术,两种技术都不完美。对于特定的检索场景,两者结合能够提供更准确的检索结果:

混合检索正是将传统检索技术与向量检索技术相结合的艺术,从而可以博采众长,相辅相成。它将传统检索技术的按关键字检索与向量检索技术的按语义检索的能力相结合,提升了最终结果的准确性与全面性,更适合面向现代多元化数据的检索场景。

混合检索有效的结合了多种检索技术,以提升检索召回率,但提出了对多个结果集重新排序的难题。全文检索返回的结果集基于TF-IDF、BM25等文档相关性评分排序,向量检索返回的结果集基于距离函数的相似性评分排序,应用程序需要对两者的结果进行重新排序(Re-ranking)。重新排序指将来自多种检索技术的有序结果集进行规范化合并,形成同一标准的单一有序结果集。单一有序结果集能够更好的供下游系统处理和分析。常见的重新排序算法有 RRF、RankNet、LambdaRank、LambdaMART 等。

检索技术是现代计算机科学解决的主要课题之一,传统的检索技术主要基于倒排索引技术,应用程序可以基于此技术构建全文检索的功能。现代 AI 技术的发展使得检索技术的能力得到了空前加强,能够对更多的非结构化数据进行更强大的语义检索,检索技术彻底解除了非结构化数据的桎梏。应用程序在检索技术红利的加持下得到了功能加强,或者从零到一破土而生,例如搜索引擎、推荐系统、问答系统等,能够处理更加多样化的非结构化数据。

RAG

RAG (Retrieval-Augmented Generation)是检索技术与大模型技术相结合的数据范式 —— 在知识库中检索与用户查询最相关的内容,然后将其提供给大模型用于知识生成,使得大模型能够利用最新数据和私域数据。如果没有 RAG,那么大模型的知识生成就只能完全基于预训练的数据,会面临“幻觉”、缺乏特定领域知识或私域知识、大模型的数据新鲜度不够等问题。Fine-tuning 也能部分解决这些问题,但召回率不够,且代价高昂。RAG 非常完美的解决了这些问题,其本质上是一个私有搜索引擎,使得大模型生成的知识更准确更新鲜,使得企业能够基于私域数据建立大模型应用,使得能够建立垂直行业的大模型应用。

RAG 经业界不断探索,架构经过多轮调整,最完整的架构如下图所示,其结合了关键词检索、图检索、语义检索等多种检索技术,及重新排序算法,从而提供更准确的检索结果和生成结果。应用程序在实际运用中并不需要完整搭建这个脚手架,社区有着丰富的框架直接使用,例如 LangChain、LlamaIndex 等。
来源:https://github.com/langchain-ai/rag-from-scratch/blob/main/README.md
VectorDB 就像海马体,负责信息提取。LLM 就像大脑,负责新信息的生成。两者解决了如何基于已有知识生成新知识的问题,而 Agent 负责执行,从而对物理世界产生实际影响。LLM、VectorDB、Agnet 是 AI native 应用的智能基础设施,VectorDB 是其中最重要的组成部分。

The most important piece of the preprocessing pipeline, from a systems standpoint, is the vector database. It’s responsible for efficiently storing, comparing, and retrieving up to billions of embeddings (i.e., vectors).


总结:从大数据到大模型
本文的副标题是“从大数据到大模型”,最后再点下题:

信息化时代定义了关系型数据库的数据范式。关系型数据库的本质特征在于 ACID,对应用程序提供了数据持久化、数据完整性、事务等应用语义,使得应用程序可以将数据管理的职责完全交给数据库。更重要的是,相比于层次模型和网状模型,关系模型的存取路径对应用透明,从而使得应用代码从具体的数据格式中解耦出来,极大简化了应用开发过程。关系型数据库是信息化时代的数据范式,解除了数据存储的桎梏,推动了信息化时代的蓬勃发展。

谷歌的老三篇 GFS、Map Reduce、BigTable 开启了大数据时代,大数据时代定义了 NoSQL 的数据范式。传统数据库在大数据场景下面临水平扩展性不够、数据模型单一等局限性,而 NoSQL 弥补了关系型数据库的这些不足。NoSQL 首先提供了非常好的水平扩展性,能够可靠的在数千台机器上处理 PB 级的数据;其次提供了灵活的多样化的数据模型,使得应用程序能够所见即所得的将业务数据映射为数据库的存储模型。获得扩展能力的同时,可能会牺牲一定的数据一致性,因此往往与关系型数据库搭配使用。NoSQL 是大数据时代的数据范式,解除了数据规模和业务数据复杂性的桎梏,推动了互联网时代及移动互联网时代的发展。

2022年底,OpenAI 的大模型 ChatGPT 正式发布,开启了生成式 AI 时代,生成式 AI 时代定义了 LLM + VectorDB 的数据范式。传统数据库擅长处理结构化数据,面对非结构化数据时心有余而力不足。LLM + VectorDB 提供了非结构化数据的语义理解和检索能力,而数据圈超过80%的数据都是非结构化数据,从而使得这些数据中的信息得以释放变成实际的生产力。LLM + VectorDB 是生成式 AI 时代的数据范式,解除了非结构化数据的桎梏,推动了 AI navive 应用的发展。







欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5