LLMs将向量数据库与LLMs集成:实用指南!

探索如何利用向量数据库提升大型语言模型,为精准、具有上下文意识的人工智能解决方案。

文章目录
  • 向量数据库简要概述
  • LLMs兴起之前的向量数据库
  • 向量数据库与传统数据库的比较
  • 提升向量数据库性能
    • 索引策略
    • 优化的额外考虑因素
  • 用向量数据库丰富LLMs的上下文
  • 使用Falcon-7B和ChromaDB构建闭合问答机器人
  • 环境设置
  • 构建“知识库”
  • 生成基本答案
  • 生成具有上下文意识的答案
  • 总结

欢迎来到我们的实用指南,在这里我们将深入探讨大型语言模型(LLMs)及其与向量数据库的协同作用。LLMs在科技领域产生了深远影响,推动了应用开发的创新。然而,当单独使用时,它们的全部潜力往往无法得到充分发挥。这就是向量数据库发挥作用的地方,它们增强了LLMs的能力,使其不仅产生任何回应,而是产生正确的回应。

通常,LLMs会在各种数据上进行训练,这使它们具有广泛的理解能力,但可能导致特定知识领域存在空白。有时,它们甚至可能输出与目标无关或带有偏见的信息 —— 这是从庞大、未经过滤的网络学习的副产品。为了解决这一问题,我们引入了向量数据库的概念。这些数据库以一种称为“向量嵌入”的独特格式存储数据,使LLMs能够更具上下文和准确性地理解和利用信息。

本指南介绍了如何使用向量数据库构建LLM并改进LLM对这种流的使用。我们将探讨如何结合这两者可以使LLMs更加准确和有用,特别是对于特定主题。

接下来,我们将简要概述向量数据库,解释向量嵌入的概念及其在增强人工智能和机器学习应用中的作用。我们将向您展示这些数据库与传统数据库的区别,以及它们为AI驱动任务提供更好支持的原因,特别是在处理文本、图像和复杂模式等非结构化数据时。

此外,我们将探讨这项技术在构建闭环问答机器人中的实际应用。这款机器人由Falcon-7B和ChromaDB提供支持,展示了当LLMs与正确的工具和技术结合时的有效性。

通过本指南,您将更清楚地了解如何利用LLMs和向量数据库的力量创建不仅创新而且具有上下文意识和可靠性的应用程序。无论您是人工智能爱好者还是经验丰富的开发人员,本指南都旨在帮助您轻松自信地探索这个令人兴奋的领域。

向量数据库简要概述

在深入了解向量数据库是什么之前,理解向量嵌入的概念至关重要。向量嵌入在机器学习中至关重要,用于将原始数据转换为人工智能系统可以理解的数值格式。这涉及将数据(如文本或图像)转换为一系列数字,称为向量,在高维空间中。高维数据指的是具有许多属性或特征的数据,每个特征代表不同的维度。这些维度有助于捕捉数据的微妙特征。

创建向量嵌入的过程始于输入数据,这可以是句子中的单词或图像中的像素等任何内容。大型语言模型和其他人工智能算法分析这些数据并识别其关键特征。例如,在文本数据中,这可能涉及理解单词的含义以及它们在句子中的上下文。嵌入模型然后将这些特征转换为数值形式,为每个数据片段创建一个向量。向量中的每个数字代表数据的特定特征,这些数字共同体现了原始输入的本质,以便机器可以处理。

这些向量是高维的,因为它们包含许多数字,每个数字对应数据的不同特征。这种高维度使得向量能够捕捉复杂、详细的信息,使它们成为人工智能模型的强大工具。模型使用这些嵌入来识别数据中的模式、关系和潜在结构。

向量数据库旨在提供针对向量嵌入独特性质的优化存储和查询能力。它们擅长提供高效的搜索能力、高性能、可扩展性和数据检索,通过比较和识别数据点之间的相似性来实现。

这些复杂、高维信息的数值表示使向量数据库与主要存储文本和数字等格式的传统系统有所不同。它们的主要优势在于管理和查询诸如图像、视频和文本等数据类型,特别是在这些数据被转换为机器学习和人工智能应用所需的向量格式时。

在下图中,我们展示了将文本转换为单词向量的过程。这一步在自然语言处理中至关重要,使我们能够量化和分析语言关系。例如,“小狗”的向量表示在向量空间中会更接近“狗”而不是“房子”,反映了它们的语义接近性。这种方法也适用于类比关系。在“男人”和“女人”之间的向量距离和方向可以类比于“国王”和“皇后”之间的关系。这说明了单词向量不仅代表单词,还允许在多维向量空间中对它们的语义关系进行有意义的比较。

img

来源

LLMs兴起之前的向量数据库

设计用于处理向量嵌入的向量数据库在机器学习和人工智能领域有几个关键用例,特别是:

相似性搜索: 这是向量数据库擅长的核心功能。它们可以快速在高维空间中找到与给定查询相似的数据点。这对于诸如图像或音频检索等应用至关重要,其中您希望找到与特定输入相似的项目。以下是一些行业用例示例:

  • 电子商务: 通过允许客户搜索与参考图像视觉相似的产品,增强产品发现功能。
  • 音乐流媒体服务: 找到并推荐具有与用户喜爱曲目相似音频特征的歌曲。
  • 医疗影像: 通过检索显示类似病变的医学图像(如X射线或MRI)来协助放射科医生进行比较分析。

推荐系统: 向量数据库通过处理用户和项目嵌入来支持推荐系统。它们可以将用户与最符合其兴趣或过去互动的项目(如产品、电影或文章)匹配。以下是一些行业用例:

  • 流媒体平台: 通过根据观看历史推荐电影和电视节目,个性化观影体验。
  • 在线零售商: 根据用户浏览和购买历史推荐产品,增强交叉销售和提升销售机会。
  • 新闻聚合器: 通过将文章与读者过去的互动模式和偏好匹配,提供个性化新闻订阅。

基于内容的检索: 在这里,向量数据库用于根据内容本身而不是传统元数据搜索内容。这对于文本和图像等非结构化数据尤为重要,其中内容本身需要进行分析以进行检索。以下是一些行业用例:

  • 数字资产管理: 通过根据视觉或音频内容特征搜索和检索图像或视频,帮助公司管理庞大的数字媒体库。
  • 法律与合规: 通过搜索大量文件以找到与法律案例或合规查询相关的特定信息或文件。
  • 学术研究: 帮助研究人员找到与其工作在语境上相似的学术文章和研究论文,即使特定关键词未被提及。

关于基于内容的检索的最后一点越来越重要,并促进了一种新颖的应用:

增强LLMs的上下文理解: 通过存储和处理文本嵌入,向量数据库使LLMs能够执行更加细致和具有上下文意识的信息检索。它们有助于理解大量文本的语义内容,在回答复杂查询、保持对话上下文或生成相关内容等任务中至关重要。这种应用正迅速成为向量数据库的一个突出用例,展示了它们增强先进AI系统如LLMs能力的能力。

向量数据库与传统数据库的比较

传统的SQL数据库擅长管理结构化数据,依赖于精确匹配和明确定义的条件逻辑。它们保持数据完整性,适用于需要精确、结构化数据处理的应用。然而,它们的严格模式设计使其不太适应非结构化数据的语义和上下文细微差别,这在LLMs和生成式人工智能等AI应用中至关重要。
向量数据库填补了这一空白。专为人工智能场景量身定制,它们以向量形式处理数据,能够有效管理非结构化数据的复杂性。在处理大型语言模型(LLMs)时,向量数据库支持诸如相似性搜索和上下文理解等操作,提供了超越传统 SQL 和灵活 NoSQL 数据库的功能。它们擅长处理近似值和模式识别,特别适用于对细微数据解释比准确数据匹配更为重要的人工智能应用。

提升向量数据库性能

优化向量数据库的性能对于依赖快速准确检索高维数据的应用至关重要。这涉及提高查询速度、确保高准确性,并保持可扩展性以有效处理不断增长的数据量和用户请求。这种优化的重要部分围绕索引策略展开,这些策略是用于更有效地组织和搜索向量数据的技术。下面,我们将详细介绍这些索引策略以及它们如何有助于提升向量数据库性能。

索引策略

向量数据库中的索引策略旨在促进快速准确地检索与查询向量相似的向量。这些策略可以极大地影响搜索操作的速度和准确性。

  • 量化(Quantization):量化涉及将向量映射到向量空间中的有限一组参考点,有效地压缩向量数据。这种策略通过将搜索限制在一组参考点的子集而不是整个数据集上,从而减少存储需求并加快搜索过程。量化有各种形式,包括标量量化和向量量化,每种形式在搜索速度和准确性之间都有其权衡。

量化特别适用于管理大规模数据集的应用,其中存储和内存效率至关重要。它在需要在查询速度和准确性之间取得平衡的环境中表现出色,因此非常适合那些可以容忍一定精度损失的速度敏感应用。然而,对于那些要求最高准确性和最小信息丢失的用例(例如精确的科学研究),量化则不太推荐,因为数据压缩和搜索精度之间固有的权衡。

  • 分层可导航小世界(HNSW)图:HNSW 是一种索引策略,它构建了一个分层图,其中每一层代表数据集的不同粒度。搜索从顶层开始,该层具有较少、更远的点,然后向下移动到更详细的层。这种方法允许快速遍历数据集,通过快速缩小类似向量的候选集,显著减少搜索时间。

HNSW 图在查询速度和准确性之间取得了极佳的平衡,使其非常适用于需要即时响应时间的实时搜索应用和推荐系统。它在中等到大型数据集上表现良好,提供可扩展的搜索能力。然而,对于极大型数据集,其内存消耗可能成为限制因素,使其在内存资源受限或数据集大小显著超出实际内存容量的情况下不太理想。

  • 倒排文件索引(IVF):IVF 方法将向量空间划分为预定义数量的簇,使用 k-means 等算法。每个向量被分配到最近的簇,而在搜索过程中,只考虑最相关簇中的向量。这种方法减少了搜索范围,提高了查询速度。将 IVF 与其他技术结合使用,例如量化(导致 IVFADC — 具有非对称距离计算的倒排文件索引),可以通过减少距离计算的计算成本进一步提高性能。

倒排文件索引(IVF)方法推荐用于在可扩展搜索环境中处理高维数据,通过将相似项聚类以有效缩小搜索空间。它特别适用于相对静态的数据集,其中偶尔重新聚类的开销是可以接受的。然而,对于低维数据或要求最低延迟的应用,IVF 可能不是最佳选择,因为聚类过程和需要跨多个簇搜索可能会引入额外的查询时间。

优化的额外考虑因素
  • 降维(Dimensionality Reduction):在应用索引策略之前,降低向量的维度可能是有益的。诸如 PCA 或自动编码器之类的技术有助于保留数据的基本特征同时减少其复杂性,这可以提高索引的效率和搜索操作的速度。
  • 并行处理(Parallel Processing):许多索引策略可以并行化,无论是在具有多个核心的 CPU 上还是在 GPU 上。这种并行处理能力允许同时处理多个查询,显著提高大规模应用的吞吐量并减少响应时间。
  • 动态索引(Dynamic Indexing):对于频繁更新数据的数据库,允许有效插入和删除向量而无需重组索引的动态索引策略至关重要。这确保数据库保持响应并随时间减少性能降级。

通过这些索引策略和考虑因素来提升向量数据库性能,需要深入了解底层数据和应用程序的具体要求。通过精心选择和调整这些策略,开发人员可以显著增强其基于向量的应用程序的响应性和可扩展性,确保其满足实际用例的需求。

用向量数据库丰富LLMs的上下文

像 Facebook 的LLama2或 TIIUAE 的Falcon等大型语言模型(LLMs)通过其类人文本生成显著推进了人工智能能力。然而,由于它们在广泛、通用数据集上进行训练,因此在处理专业上下文时面临挑战。

解决上下文限制可以通过两种主要方式来实现:

  1. 定向训练(Targeted Training):这涉及在专注于特定领域的数据集上重新训练或微调LLM。虽然这种方法可以显著提升模型在特定主题或行业方面的专业知识,但对于许多组织或个人来说通常并不可行。原因包括与训练所需的计算资源相关的高成本,以及有效重新训练这种复杂模型所需的专业知识:有效地重新训练LLMs需要对机器学习、自然语言处理以及所讨论模型的特定架构有深入了解。
  2. 通过向量数据库增加上下文:另一种方法是通过向LLM直接添加上下文来增强其提示,使用来自向量数据库的数据。在这种设置中,向量数据库将专业信息存储为向量嵌入,LLM可以检索并使用这些信息来增强其响应。这种方法允许包含相关的专业知识,而无需进行广泛的重新训练。对于缺乏定向训练资源的组织或个人来说,这种方法特别有用,因为它利用了现有模型的能力,同时提供了专注的上下文洞见。

第二个选择被称为RAG,我们将在接下来的章节中更详细地探讨它。

img

来源

使用Falcon-7B和ChromaDB构建闭合问答机器人

在本节中,我们概述了如何使用向量数据库构建LLM。该模型是一个闭合问答机器人。这个机器人旨在使用一组集成的技术组件有效地回答与科学相关的查询:

  1. databricks-dolly-15k HuggingFace 数据集:这是由 Databricks 员工生成的一组遵循指令的记录的开源数据集。它旨在训练大型语言模型(LLMs)、合成数据生成和数据增强。该数据集包括各种类型的提示和响应,涵盖头脑风暴、分类、闭合问答、生成、信息提取、开放问答和摘要等类别。
  2. Chroma作为向量存储(知识库):我们将Chroma作为我们的主要向量存储,充当机器人的知识库。
  3. 用于语义搜索的Sentence Transformers:具体来说,我们使用来自Sentence Transformers的’multi-qa-MiniLM-L6-cos-v1’模型,该模型针对语义搜索应用进行了优化。该模型负责生成存储在Chroma中的嵌入。
  4. Falcon 7B Instruct 模型:作为我们的开源生成模型,Falcon 7B是一个仅解码器模型,具有70亿个参数。由TII开发,它在一个广泛的1,500B令牌数据集RefinedWeb上进行了训练,并补充了精心策划的语料库。值得注意的是,其更大的对应物Falcon 40B在Hugging Face的Open LLM Leaderboard上排名第一。

环境设置

为了实现本文中讨论的代码,需要进行以下安装:

!pip install -qU \
    transformers==4.30.2 \
    torch==2.0.1+cu118 \
    einops==0.6.1 \
    accelerate==0.20.3 \
    datasets==2.14.5 \
    chromadb \
    sentence-transformers==2.2.2```


这段代码最初在 Qwak 的 Workspaces 上的 gpu.a10.2xl 实例 上运行。需要注意的是,运行 Falcon-7B-Instruct 模型所需的特定代码可能会因使用的硬件配置而有所不同。

构建“知识库”

首先,我们获取 Databricks-Dolly 数据集,专注于 closed_qa 类别。这些条目通常以对精确信息的需求为特征,对于一般训练的大型语言模型(LLM)来说,由于其特定性,这些条目构成了挑战。

from datasets import load_dataset

# 仅加载数据集的训练部分
train_dataset = load_dataset("databricks/databricks-dolly-15k", split='train')

# 过滤数据集,仅包括 'closed_qa' 类别的条目
closed_qa_dataset = train_dataset.filter(lambda example: example['category'] == 'closed_qa')

print(closed_qa_dataset[0])


典型的数据集条目如下所示:

{
  "instruction": "Tomoaki Komorida 出生于哪一天?",
  "context": "Komorida 于1981年7月10日出生于熊本县。高中毕业后,他于2000年加入了J1联赛俱乐部Avispa Fukuoka。他的职业涉及各种职位和俱乐部,从Avispa Fukuoka 的中场球员到 Oita Trinita、Montedio Yamagata、Vissel Kobe 和 Rosso Kumamoto 等俱乐部的防守型中场和中后卫。他还曾在印度尼西亚的 Persela Lamongan 队效力,后回到日本并加入 Giravanz Kitakyushu,于2012年退役。",
  "response": "Tomoaki Komorida 于1981年7月10日出生。",
  "category": "closed_qa"
}


接下来,我们专注于为每组指令及其相应上下文生成词嵌入,并将其整合到我们的向量数据库 ChromaDB 中。

Chroma DB 是一个开源的向量存储系统,擅长管理向量嵌入。它专为语义搜索引擎等应用而设计,这在自然语言处理和机器学习领域至关重要。Chroma DB 的高效性,特别是作为内存数据库,有助于快速数据访问和操作,这对高速数据处理至关重要。其友好的 Python 设置增强了其在我们项目中的吸引力,简化了其整合到我们的工作流程中。详细文档请参阅:Chroma DB 文档

img

来源

为了为答案生成嵌入,我们使用了专门针对语义搜索用例进行训练的 multi-qa-MiniLM-L6-cos-v1 模型。给定一个问题/搜索查询,该模型能够找到相关的文本段落,这正是我们的目标。

在下面的示例中,我们说明了嵌入是如何存储在 Chroma 的内存集合中的。

import chromadb
from sentence_transformers import SentenceTransformer

class VectorStore:

    def __init__(self, collection_name):
       # 初始化嵌入模型
        self.embedding_model = SentenceTransformer('sentence-transformers/multi-qa-MiniLM-L6-cos-v1')
        self.chroma_client = chromadb.Client()
        self.collection = self.chroma_client.create_collection(name=collection_name)
    
    # 从数据集中填充向量存储的方法
    def populate_vectors(self, dataset):
        for i, item in enumerate(dataset):
            combined_text = f"{item['instruction']}. {item['context']}"
            embeddings = self.embedding_model.encode(combined_text).tolist()
            self.collection.add(embeddings=[embeddings], documents=[item['context']], ids=[f"id_{i}"])
    
    # 根据查询搜索 ChromaDB 集合中的相关上下文的方法
    def search_context(self, query, n_results=1):
        query_embeddings = self.embedding_model.encode(query).tolist()
        return self.collection.query(query_embeddings=query_embeddings, n_results=n_results)


# 示例用法
if __name__ == "__main__":
   # 使用集合名称初始化处理程序
    vector_store = VectorStore("knowledge-base")
    
    # 假设 closed_qa_dataset 已定义并可用
    vector_store.populate_vectors(closed_qa_dataset)


对于每个数据集条目,我们生成并存储了“指令”和“上下文”字段的组合嵌入,其中上下文充当了我们在 LLM 提示中检索的文档。

接下来,我们将利用 Falcon-7b-instruct LLM 生成对没有额外上下文的封闭信息查询的响应,展示我们丰富知识库的有效性。

生成基本答案

对于我们的生成文本任务,我们将利用来自 Hugging Face 的 falcon-7b-instruct 模型的能力。

Falcon-7B-Instruct 的独特之处在于它在先进功能和可管理大小之间的高效平衡。它专为复杂的文本理解和生成任务而设计,提供了与更大、闭源模型相媲美的性能,但以更简化的方式呈现。这使其成为我们项目的理想选择,我们需要深入的语言理解,而无需更大型模型的额外开销。

如果您计划在本地计算机或远程服务器上运行 Falcon-7B-Instruct 模型,请务必注意硬件要求。如 HuggingFace 文档 所述,该模型需要至少 16GB RAM。然而,为了获得最佳性能和更快的响应时间,强烈建议使用 GPU。

import transformers
import torch
from transformers import AutoTokenizer, AutoModelForCausalLM

class Falcon7BInstructModel:

    def __init__(self):
        # 模型名称
        model_name = "tiiuae/falcon-7b-instruct"
        self.pipeline, self.tokenizer = self.initialize_model(model_name)
    
    def initialize_model(self, model_name):
        # 初始化分词器
        tokenizer = AutoTokenizer.from_pretrained(model_name)
    
        # 用于文本生成的管道设置
        pipeline = transformers.pipeline(
            "text-generation",
            model=model_name,
            tokenizer=tokenizer,
            torch_dtype=torch.bfloat16,
            trust_remote_code=True,
            device_map="auto",
        )
    
        return pipeline, tokenizer
    
    def generate_answer(self, question, context=None):
        # 准备输入提示
        prompt = question if context is None else f"{context}\n\n{question}"
    
        # 生成响应
        sequences = self.pipeline(
            prompt,
            max_length=500,
            do_sample=True,
            top_k=10,
            num_return_sequences=1,
            eos_token_id=self.tokenizer.eos_token_id,
        )
    
        # 提取并返回生成的文本
        return sequences['generated_text']


这段代码示例基于 Hugging Face 的文档构建,非常清晰易懂。

让我们对其主要组件进行解析,以便更好地理解:

  • 分词器 是自然语言处理(NLP)模型(如 Falcon-7B-Instruct)中的关键组件。其主要作用是将输入文本转换为模型可以理解的格式。它将文本分解为称为标记的较小单元。这些标记可以是单词、子词或甚至字符,取决于分词器的设计。在 Falcon-7B-Instruct 模型的上下文中,AutoTokenizer.from_pretrained(model) 调用加载了一个专门设计用于与该模型配合工作的分词器,确保文本被分词的方式与模型训练时的方式一致。
  • 管道 在 transformers 库中是一个高级实用程序,它抽象了处理数据和从模型获取预测所涉及的许多复杂性。它在内部处理多个步骤,例如对输入文本进行分词、将标记传递给模型,然后将模型的输出处理为人类可读的形式。在此脚本中,管道设置为“text-generation”,这意味着它经过优化,可以接受提示(如用户问题)并生成基于该提示的文本延续。

示例用法:

# 初始化 Falcon 模型类
falcon_model = Falcon7BInstructModel()

user_question = "Tomoaki Komorida 出生于哪一天?"

# 使用 LLM 为用户问题生成答案
answer = falcon_model.generate_answer(user_question)

print(f"结果: {answer}")


正如您可能已经猜到的那样,这是针对给定用户问题的模型输出:

{ answer: “我没有关于 Tomoaki Komorida 出生日期的信息。” }


在没有额外上下文的情况下利用 Falcon-7B-Instruct 会产生负面响应,因为它没有接受过这种“较少知名”信息的训练。这说明了在为非通用问题生成更有针对性和有用的答案时,需要丰富的上下文。

生成具有上下文意识的答案

现在,让我们通过为生成模型提供相关上下文来提升其能力,这些上下文是从我们的向量存储中检索的。

有趣的是,我们在为生成嵌入和从用户问题中提取上下文时都使用了相同的 VectorStore 类:

# 假设 vector_store 和 falcon_model 已经被初始化

# 从 VectorStore 中获取上下文,假设已经填充
context_response = vector_store.search_context(user_question)

# 从响应中提取上下文文本
# 假定上下文位于 'context' 键的第一个元素中
context = "".join(context_response['context'][0]) 

# 使用 Falcon 模型生成答案,结合提取的上下文
enriched_answer = falcon_model.generate_answer(user_question, context=context)

print(f"结果: {enriched_answer}")


田智明,生于1981年7月10日。


img

总结

在我们的详细探讨中,我们向您展示了如何打造一个基于大型语言模型(LLM)的应用程序,并丰富了自定义数据集。显而易见,管理这样一个模型,尝试不同数据集的实验,建立必要的基础设施,并实现一个功能性解决方案远非易事。

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值