向量数据库 Faiss:搭建与使用

在大数据与 AI 的时代,向量数据库在高效搜索与相似度检索场景中扮演了至关重要的角色。Faiss(Facebook AI Similarity Search)作为一款强大的开源向量数据库,以其优越的性能和灵活的配置选项,成为处理高维向量检索的理想选择。本文将探讨 Faiss 的基本特点与核心技术原理、基础维护,以及基本使用,从而帮助用户搭建出高效的向量数据库解决方案。

在这里插入图片描述

Faiss 核心原理

Faiss 的主要特点

Faiss 的设计目标是高效处理大量的高维向量数据。其主要特点包括:

  • 高效的相似度搜索:Faiss 能够在高维空间中进行快速的最近邻搜索。
  • 多种索引类型:支持多种基于不同算法的索引方案,如倒排索引(IVF)、积量化(PQ)、HNSW 等。
  • GPU 与 CPU 加速:支持利用 GPU 加速高效的向量计算。
  • 多种距离度量方式:支持 L2、内积等多种距离计算方式。

索引结构

  • 倒排索引(IVF):通过将向量空间划分为多个小区域,加速检索过程。
  • 积量化(PQ):通过量化技术,将高维向量压缩到较低维度,降低存储需求并提高检索速度。

向量量化

  • 主要方法:Faiss 中的向量量化技术将原始向量分割为多个子向量,然后用较小的精度表示。
  • 实现方式:例如,使用 K-means 聚类进行质心的训练和选择。

GPU 支持

Faiss 能够在 GPU 上运行以加速计算,通过 CUDA 实现大规模并行处理,极大提升检索的效率。

模拟数据推演

我们可以通过创建一组随机的高维向量,演示 Faiss 的索引构建与搜索过程。

import numpy as np
import faiss

# 生成随机的10000个128维向量
d = 128  # 向量维度
nb = 10000  # 向量数量
np.random.seed(0)
xb = np.random.rand(nb, d).astype('float32')

# 创建索引
index = faiss.IndexFlatL2(d)  # 使用L2距离
index.add(xb)  # 添加向量

# 查询:生成一个随机的查询向量
xq = np.random.rand(1, d).astype('float32')

# 执行最近邻搜索
k = 5  # 查询最近邻
D, I = index.search(xq, k)  # 返回距离和索引
print("查询向量的最近邻距离:", D)
print("查询向量的最近邻索引:", I)

在上述示例中,我们生成了 10000 个 128 维向量,从构建索引到执行查询,过程简单明了。通过这种方式,Faiss 能够快速返回给定查询向量的最近邻。

场景演示

假设我们有一个推荐系统,用户的喜好被表示为高维向量。我们希望实现一个快速推荐功能,让用户能随时获得与自己喜好的相似产品。

我们将建立一个产品向量数据库,并实现快速的相似商品检索。

# 假设有5种商品,每个商品用128维向量表示
product_vectors = np.random.rand(5, 128).astype('float32')

# 创建产品的索引
index = faiss.IndexFlatL2(128)  # 使用L2距离
index.add(product_vectors)

# 用户的偏好向量
user_preference = np.random.rand(1, 128).astype('float32')

# 查询推荐
D, I = index.search(user_preference, k)
print("推荐商品的距离:", D)
print("推荐商品的索引:", I)

在这个示例中,我们生成了 5 种商品的随机向量,建立了 Faiss 索引,并根据用户的偏好向量返回了最相似的商品推荐。这种方式使得用户能够快速得到推荐,显著提升用户体验。

Faiss 基础维护

环境搭建

安装 Faiss

确保系统中安装了必要的依赖包。这可以通过 pip 命令进行安装。

pip install faiss-cpu  # 如果使用GPU,则用faiss-gpu

验证安装

安装完成后,通过以下代码验证 Faiss 是否正确安装。

import faiss
print(f"Faiss版本:{faiss.__version__}")

用户权限

在多用户环境中,可能需要管理用户权限,以确保数据安全。Faiss 本身并不提供用户系统,但可以通过其它方式(如数据库管理)实现。

数据管理

向量的插入、删除与更新

我们可以使用 Faiss 对数据集进行增量更新。以下是向量插入的示例:

# 增加新向量
new_vectors = np.random.rand(10, 128).astype('float32')
index.add(new_vectors)  # 向索引中添加新向量

对于删除向量,Faiss 提供的 API 有限,所以通常需要重新构建索引。

模拟数据演示

下面是一个操作示例,展示对 Faiss 向量数据库的基本维护操作。

# 生成初始向量集
initial_vectors = np.random.rand(20, 128).astype('float32')

# 创建Faiss索引
index = faiss.IndexFlatL2(128)
index.add(initial_vectors)

# 查询相似向量
query_vector = np.random.rand(1, 128).astype('float32')
D, I = index.search(query_vector, 5)
print("查询相似向量的索引:", I)

# 插入新向量
new_vector = np.random.rand(1, 128).astype('float32')
index.add(new_vector)

# 再次查询
D, I = index.search(query_vector, 5)
print("更新后查询相似向量的索引:", I)

在这个示例中,我们首先创建了一个包含 20 个向量的索引,然后进行了相似度查询,再插入新增的向量,并更新了查询结果。

场景演示

假设我们有一个产品数据库,并使用 Faiss 处理用户偏好的变化。用户可能会定期更新对某些类别产品的偏好,因此我们需要支持对产品向量的快速更新。

# 初始产品向量
product_vectors = np.random.rand(50, 128).astype('float32')
index = faiss.IndexFlatL2(128)
index.add(product_vectors)

# 用户的偏好更新为新的向量
user_preference = np.random.rand(1, 128).astype('float32')
index.add(user_preference)  # 将新的用户偏好添加到索引中

# 查询相似产品
D, I = index.search(user_preference, 5)
print("最新推荐产品的索引:", I)

在这个场景中,我们为用户添加了新的偏好向量,并基于此进行快速检索,确保推荐的实时性和相关性。

Faiss 的基本使用

构建向量索引

在 Faiss 中,首先需要构建索引,然后添加向量,例如使用 L2 距离的扁平索引。

d = 128
index = faiss.IndexFlatL2(d)
index.add(np.random.rand(100, d).astype('float32'))

执行查询

执行查询相似度检索例如:

query_vector = np.random.rand(1, d).astype('float32')
D, I = index.search(query_vector, 5)  # 查找最近的5个邻居

最佳实践

  • 选择适当的索引类型:Faiss 支持多种索引类型,选择合适的索引对于性能影响明显。对于小规模数据,IndexFlatL2是理想选择;对于大规模数据,可以考虑IVF或量化索引。
  • 参数调优:通过调节参数以优化搜索时间及精度,例如使用不同的 k 值查询。
  • 监测与调试:保持对查询性能的监测,处理准确性和效率之间的平衡。

模拟数据演示

我们可以创建一个完整的使用流程,从构建索引到查询。

# 创建向量集合
data = np.random.rand(5000, d).astype('float32')
index = faiss.IndexFlatL2(d)
index.add(data)

# 查询
query = np.random.rand(1, d).astype('float32')
D, I = index.search(query, 10)
print(f"查询结果索引: {I}")
print(f"查询结果距离: {D}")

场景演示

考虑一个大型图像检索系统,用户可以上传图片以搜索相关相似图片。我们利用 Faiss 构建一个图像特征的近邻检索系统。

# 假设我们有50000张图像的特征向量
image_features = np.random.rand(50000, 128).astype('float32')  # 图像特征

# 创建Faiss索引
index = faiss.IndexFlatL2(128)
index.add(image_features)

# 用户上传的图像特征
uploaded_image_feature = np.random.rand(1, 128).astype('float32')

# 查询相似图像
D, I = index.search(uploaded_image_feature, 5)
print("相似图像的索引:", I)

在这个案例中,上传的图像特征被即时检索,与数据库中最为相似的图像索引被返回,这种需求在电商、社交媒体等领域非常常见。

Faiss 的索引策略与优化

高性能索引策略

Faiss 支持多种高性能索引策略,以提高在大规模高维数据集上的检索效率。其核心在于将高维数据通过合理的索引结构进行存储与查询,以下是一些常见的索引策略:

  • 倒排文件索引(IVF):将数据划分到多个“桶”中,通过快速定位相关桶,加速检索。
  • 压缩感知(PCA):通过主成分分析减少维度,降低计算复杂度,但保留尽可能多的信息。
  • HNSW(Hierarchical Navigable Small World):利用小世界网络构建多层次索引,在保证查询速度的同时,提高准确性。

上述策略都旨在减少搜索的范围和复杂度,加快处理速度,提升用户体验。

模拟数据推演

我们通过创建一组 Random 数据,演示如何使用 IVF 索引。

import numpy as np
import faiss

# 创建随机数据
d = 128  # 向量维度
nb = 100000  # 向量数量
np.random.seed(0)
xb = np.random.rand(nb, d).astype('float32')

# 创建IVF索引
nlist = 100  # 分成100个桶
quantizer = faiss.IndexFlatL2(d)  # 使用L2距离的量化器
index_ivf = faiss.IndexIVFFlat(quantizer, d, nlist)
index_ivf.train(xb)  # 训练索引
index_ivf.add(xb)  # 添加向量

# 查询
xq = np.random.rand(5, d).astype('float32')  # 生成5个查询向量
k = 5  # 查找最近邻
D, I = index_ivf.search(xq, k)  # 返回距离与索引
print("查询向量的最近邻索引:", I)
print("查询向量的最近邻距离:", D)

在上述实例中,我们创建了随机向量,并使用 IVF 索引策略来处理数据,大幅提升了查询的速度与效率。

场景演示

假设我们部署了一个移动图片搜索应用,用户上传图片后,系统快速检索相似图片。为了满足快速检索的需求,我们选择使用 Faiss 的 IVF 索引策略。

# 假设有一个产品库,包含100000种图片特征
product_vectors = np.random.rand(100000, 128).astype('float32')

# 创建IVF索引
nlist = 100  # 调整分桶数量以平衡检索速度与准确性
quantizer = faiss.IndexFlatL2(128)  # 使用L2距离
index_ivf = faiss.IndexIVFFlat(quantizer, 128, nlist)
index_ivf.train(product_vectors)  # 训练索引
index_ivf.add(product_vectors)  # 添加向量

# 用户上传的查询图像特征
user_image_feature = np.random.rand(1, 128).astype('float32')

# 执行相似查询
D, I = index_ivf.search(user_image_feature, 5)
print("相似图像的索引:", I)
print("相似图像的距离:", D)

在这个示例中,我们构建了一个产品图像数据库,使用 IVF 索引策略以满足快速的相似检索需求,实现了用户友好的检索体验。

Faiss 与深度学习

深度学习能够有效地提取特征,通过将模型训练得到的特征与 Faiss 结合,可以实现高效的相似性检索。通过构建深度学习模型获取向量表示,结合 Faiss 进行快速检索,实现推荐、分类等功能。

模拟数据演示

在本例中,我们将使用一个简单的神经网络提取数据特征,再用 Faiss 进行相似度检索:

import numpy as np
import faiss
from keras.models import Sequential
from keras.layers import Dense

# 定义简单的神经网络
model = Sequential([
    Dense(64, activation='relu', input_shape=(128,)),
    Dense(128, activation='relu'),
])

# 创建随机数据
data = np.random.rand(1000, 128).astype('float32')  # 原始输入
features = model.predict(data)  # 提取特征

# 创建Faiss索引
index = faiss.IndexFlatL2(128)  # 使用L2距离
index.add(features)  # 将特征添加到索引

# 查询
query_vector = np.random.rand(1, 128).astype('float32')
D, I = index.search(query_vector, 5)  # 返回最近邻
print("最近邻索引:", I)
print("最近邻距离:", D)

通过深度学习提取特征后,我们能使用 Faiss 进行快速有效的相似性检索。

场景演示

考虑在一个推荐系统中,利用深度学习模型为用户生成个性化特征,然后使用 Faiss 快速找到适合用户的产品。

# 数据记录与模型
n_products = 5000
product_data = np.random.rand(n_products, 128).astype('float32')

# 定义模型并训练(这里假设有训练过程)
feature_model = Sequential([
    Dense(64, activation='relu', input_shape=(128,)),
    Dense(128, activation='relu'),
])
feature_model.compile(optimizer='adam', loss='mse')

# 提取特征
product_features = feature_model.predict(product_data)

# 使用Faiss创建索引
index = faiss.IndexFlatL2(128)
index.add(product_features)

# 用户的特征向量
user_feature = np.random.rand(1, 128).astype('float32')

# 找到相关产品
D, I = index.search(user_feature, 5)
print("个性化推荐产品的索引:", I)
print("推荐产品的距离:", D)

在该示例中,我们通过深度学习模型生成产品特征,通过 Faiss 实现快速个性化的产品推荐,确保用户体验的实时性与匹配度。

Faiss 的扩展与定制化

扩展功能

Faiss 还包括一些高级的扩展功能,如:

  • 量化(PQ 等)与哈希(LSH 等):支持更加高效的存储与搜索。
  • 支持大规模数据处理:使用 Faiss 的 GPU 版本,可实现对更大数据集的处理。
  • 多线程与批处理支持:通过并行计算提高效率。

模拟数据示例

我们使用 PQ 进行量化,创建一套量化索引并进行查询。

# 创建随机数据
d = 128
nb = 100000  # 向量数量
np.random.seed(0)
xb = np.random.rand(nb, d).astype('float32')

# 使用PQ进行量化
m = 16  # 将每个向量分成16个子向量
index_pq = faiss.IndexPQ(d, m, 8)  # 使用8位量化
index_pq.train(xb)  # 训练索引
index_pq.add(xb)  # 添加向量

# 查询
xq = np.random.rand(1, d).astype('float32')
D, I = index_pq.search(xq, 5)  # 查询最近邻
print("最近邻的索引:", I)
print("最近邻的距离:", D)

在该推演中,我们使用 PQ 构建了索引,并演示了如何查询,展示了 Faiss 在处理大规模数据时的强大功能。

场景演示

在需要大规模数据处理的推荐系统中,如果用户行为数据非常庞大且多样,Faiss 的量化和哈希功能可以实现更快的检索速度。

# 创建用户行为特征,并使用PQ量化
user_behaviors = np.random.rand(10000, 128).astype('float32')

# 使用PQ量化索引
m = 16  # 拆分为16个子向量
index_pq = faiss.IndexPQ(128, m, 8)
index_pq.train(user_behaviors)  # 训练
index_pq.add(user_behaviors)  # 添加用户行为特征

# 查询用户的行为特征
user_query = np.random.rand(1, 128).astype('float32')
D, I = index_pq.search(user_query, 5)
print("相似用户行为索引:", I)
print("相似用户行为距离:", D)

这种实现将用户的行为特征通过 PQ 量化的形式高效存储,并能迅速找到与目标行为相似的用户,提升个性化服务的效率。

Faiss 的内存管理与性能优化

在处理大规模向量数据时,内存管理和性能优化是至关重要的。这不仅关乎 Faiss 的工作效率,也直接影响整个平台的稳定性与响应速度。有效的内存管理能够防止在查询时出现瓶颈,同时提升 Faiss 的整体性能。这包括合理配置 Faiss 中的索引、使用合适的数据结构,以及通过 GPU 加速来提高数据处理的速度。

模拟数据示例

为了演示如何进行内存管理和性能优化,我们将创建一个大规模的数据集,并对其进行优化处理。

import numpy as np
import faiss

# 生成100000个128维的随机向量
d = 128
nb = 100000
np.random.seed(0)
xb = np.random.rand(nb, d).astype('float32')

# 创建适合内存的索引
index = faiss.IndexFlatL2(d)  # L2距离
index.add(xb)

# 测试查询性能
queries = np.random.rand(5, d).astype('float32')  # 5个查询向量
k = 10  # 查询10个最近邻

# 记录查询开始时间
import time

start_time = time.time()
D, I = index.search(queries, k)  # 执行查询
end_time = time.time()

print("查询距离:", D)
print("查询索引:", I)
print("查询耗时:", end_time - start_time)

在这个示例中,我们创建了一个包含 10 万个 128 维向量的索引,随后利用 Faiss 高效地进行查询。同时记录了查询时间,以方便后续的性能优化。

场景演示

假设我们在构建一个大规模的文档检索系统,用户可能会输入多个查询,系统需要快速返回相关文档。为了确保高性能和低延迟,我们将优先考虑内存管理和查询优化。

# 假设有100000个文档,每个文档用128维向量表示
doc_vectors = np.random.rand(100000, 128).astype('float32')

# 创建Faiss索引
index = faiss.IndexFlatL2(128)
index.add(doc_vectors)  # 添加文档向量

# 模拟用户查询
user_query = np.random.rand(5, 128).astype('float32')  # 5个查询

# 执行查询并记录性能
start_time = time.time()
D, I = index.search(user_query, 10)  # 查询10个最近邻
end_time = time.time()

print("查询最近邻索引:", I)
print("查询最近邻距离:", D)
print("查询耗时:", end_time - start_time)

在这个案例中,我们创建了一个文档库,运用 Faiss 进行高效查询,并通过时间记录进行性能分析,确保系统响应迅速,为用户提供良好的体验。

Faiss 的并行计算与分布式应用

随着数据规模的扩大,单机解决方案面临瓶颈,Faiss 通过支持并行计算和分布式架构来解决这一问题。利用多进程或集群环境的优势,Faiss 能够有效分割负载,处理更大规模的数据集。分布式 Faiss 可通过多个节点共同工作,以提高检索系统的吞吐量和响应速度。

模拟数据演示

我们可以用一个简单的示例展示 Faiss 如何在多个核心上并行处理查询。

import numpy as np
import faiss
from joblib import Parallel, delayed

# 生成大的向量数据集
d = 128
nb = 1000000  # 一百万个向量
np.random.seed(0)
data = np.random.rand(nb, d).astype('float32')

# 创建Faiss索引
index = faiss.IndexFlatL2(d)
index.add(data)

# 创建多个查询向量
queries = np.random.rand(10, d).astype('float32')  # 10个查询向量

# 并行执行查询
def query_fn(query):
    D, I = index.search(query.reshape(1, -1), k=5)  # 查询最近邻
    return D, I

results = Parallel(n_jobs=4)(delayed(query_fn)(q) for q in queries)  # 使用4个进程

for distance, index in results:
    print("查询结果:", index, "距离:", distance)

在这个示例中,我们生成了 100 万个随机向量,并使用 4 个 CPU 核心并行处理 10 个查询。通过并行计算,我们能够大幅提升查询速度。

场景演示

构建一个社交媒体平台的友谊推荐系统,用户可以在全球范围内以极快的速度获得潜在朋友的建议。这个系统需要同时处理大量查询,为此,我们需要利用分布式系统优化性能。

# 假设已有10000000个用户的特征向量
user_vectors = np.random.rand(10000000, 128).astype('float32')

# 创建Faiss索引
index = faiss.IndexFlatL2(128)
index.add(user_vectors)  # 添加用户向量

# 用户的查询向量
query_vectors = np.random.rand(50, 128).astype('float32')  # 50个用户

def query_fn(query_vector):
    D, I = index.search(query_vector.reshape(1, -1), 5)
    return D, I

# 并行处理所有查询
results = Parallel(n_jobs=8)(delayed(query_fn)(q) for q in query_vectors)  # 使用8个进程

# 输出部分查询结果
for i, (distance, index) in enumerate(results):
    print(f"用户查询第{i+1}结果:索引:{index}, 距离:{distance}")

在此场景中,我们模拟了一个具有 1000 万用户特征的友谊推荐系统,通过 Faiss 结合多线程支持,快速处理用户的查询请求,确保秒级响应时间。

Faiss 与实时推荐系统

实时推荐系统应根据用户的历史行为、兴趣和特征,动态更新并生成个性化的推荐。利用 Faiss,我们可以快速处理用户行为数据和实时查询,从而提供相应的推荐结果。

模拟数据演示

下列示例展示了如何利用 Faiss 构建一个实时推荐系统的基本框架。

import numpy as np
import faiss

# 创建用户行为向量库
n_users = 100000
user_behavior_vectors = np.random.rand(n_users, 128).astype('float32')

# 创建Faiss索引
index = faiss.IndexFlatL2(128)
index.add(user_behavior_vectors)

# 实时查询用户行为向量
def recommend_for_user(user_idx):
    user_vector = user_behavior_vectors[user_idx].reshape(1, -1)
    D, I = index.search(user_vector, 5)  # 查询5个最近邻
    return D, I

# 示例推荐
user_id = np.random.randint(0, n_users)
distance, indices = recommend_for_user(user_id)
print(f"用户{user_id}的推荐索引:", indices)
print(f"用户{user_id}的推荐距离:", distance)

在这个示例中,我们搭建了一个用户行为库,通过 Faiss 进行实时推荐查询。

场景演示

一个电子商务平台希望为用户提供更加个性化的购买推荐。利用用户的历史行为数据,系统需要实时返回与用户喜好最为接近的商品。

# 假设我们有一个包含电子商务品类的特征向量
product_vectors = np.random.rand(50000, 128).astype('float32')

# 创建Faiss索引并添加商品
index = faiss.IndexFlatL2(128)
index.add(product_vectors)

# 模拟用户的兴趣向量 (可以是多次交互后的结果)
user_interest_vector = np.random.rand(1, 128).astype('float32')

# 实现推荐系统函数
def recommend_products(user_vector):
    D, I = index.search(user_vector, 5)
    return D, I

# 进行推荐查询
recommended_distances, recommended_indices = recommend_products(user_interest_vector)
print("推荐的产品索引:", recommended_indices)
print("推荐的产品距离:", recommended_distances)

在这个例子中,我们基于用户的兴趣特征,利用 Faiss 快速进行了产品推荐,实现了实时、个性化的用户服务。

结语

通过对 Faiss 的多个维度探讨,包括 Faiss 向量数据库的功能、安装、内存管理、并行计算、深度学习结合、实时推荐等,本文深入解析了 Faiss 在多种应用场景下的强大功能与灵活性。无论是在高维数据检索、实时系统应用,还是在复杂的分布式环境中,Faiss 为各类企业提供了高效、可靠的解决方案。

作为开源工具,Faiss 将继续在高速发展的 AI 和大数据领域发挥重要作用,以满足用户日益增长的智能检索需求。通过对这些内容的学习与实现,读者将获得更全面的理解,为未来可能的应用打下坚实基础。


PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!


  • 19
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Faiss是一个用于高效向量检索的开源库。它通过将数据转换为向量使用索引结构和距离度量来实现快速的相似性搜索。在Faiss中,实现了一些细节操作,如将查询向量和簇心的向量转化为残差,以及使用PQ计算距离等,以提高搜索的准确性和效率。通过使用Faiss的索引结构,如IndexFlatL2,我们可以在向量数据库中进行快速搜索。例如,可以生成一些查询向量,并找到每个查询向量的最近的几个相似向量Faiss不仅仅可以应用于图片和文件的搜索,还可以应用于任何可以表示为向量的数据,如音频、视频等。因此,它成为处理大规模数据和进行相似性搜索的强大工具。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Github 15K! 亿级向量相似度检索库Faiss 原理+应用](https://blog.csdn.net/Kaiyuan_sjtu/article/details/121551473)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [向量数据库Faiss搭建使用](https://blog.csdn.net/xudepeng0813/article/details/131659050)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三余知行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值