【RAG论文精读5】RAG论文综述1(2312.10997)-第3部分:检索器

更多AI知识点总结见我的专栏:【AI知识点】
AI论文精读、项目和一些个人思考见我另一专栏:【AI修炼之路】
有什么问题、批评和建议都非常欢迎交流,三人行必有我师焉😁


第1部分
第2部分

三、检索器

在RAG中,有效地从数据源中检索相关文档至关重要。涉及的关键问题包括检索源、检索粒度、检索的预处理以及选择相应的嵌入模型。

3.1. 检索源

RAG依赖外部知识来增强LLM,而检索源(Retrieval Source) 的类型(数据结构)和检索单元的粒度都会影响最终的生成结果。

3.1.1. 数据结构

1. 非结构化数据(Unstructured Data)

非结构化数据是检索的主要来源,最常见的形式是文本(如Wikipedia中的内容)。在开放域问答(ODQA)任务中,主要的检索来源包括:

  • HotpotQA 数据集(2017年10月1日发布)。
  • DPR 数据集(2018年12月20日发布)。

除了百科全书类数据外,非结构化数据还包括跨语言文本【19】和特定领域的数据,如医学【67】和法律【29】领域的数据。

2. 半结构化数据(Semi-structured Data)

半结构化数据通常包含文本和表格信息的组合,例如PDF文件。在处理这类数据时,传统的RAG系统面临以下挑战:

  1. 文本拆分过程中可能无意中将表格分开,导致检索时数据损坏。
  2. 表格的引入使得语义相似性搜索更加复杂。

一个解决方案是利用LLM的编码能力执行表格上的Text-2-SQL查询(如TableGPT【85】)。或者,可以将表格转换为文本进行基于文本的方法分析【75】。然而,这些方法目前都不是最佳解决方案,表明这一领域仍有较大的研究机会。

3. 结构化数据(Structured Data)

结构化数据通常指经过验证并且可以提供更精确信息的知识图谱(Knowledge Graph, KG)【86】。例如,KnowledGPT【15】通过生成KB搜索查询并存储知识来增强RAG模型的知识丰富性。

G-Retriever【84】是一个将图神经网络(GNN)、LLMs和RAG集成的系统,它通过软提示(soft prompting)增强图理解和问答能力,并使用奖收集斯坦纳树(PCST)优化问题进行目标导向的图检索。然而,构建、验证和维护结构化数据库需要额外的工作。

4. 由LLMs生成的内容(LLMs-Generated Content)

为了应对传统外部辅助信息的局限性,一些研究专注于利用LLM的内部知识来增强RAG。例如:

  • SKR【58】能够对问题进行分类(已知问题或未知问题),并选择性地应用检索增强。
  • GenRead【13】使用LLM生成器替代了检索器,发现LLM生成的上下文由于更好地符合预训练目标(如因果语言建模),常常包含更准确的答案。
  • Selfmem【17】通过迭代创建一个无限的记忆池,并使用一个记忆选择器来选择可以作为原问题的对偶问题的输出,从而自我增强生成模型。

这些研究展示了RAG中数据源利用的广泛创新,旨在提高模型性能和任务的有效性。

结论

RAG系统中的数据结构正变得多样化,从传统的非结构化数据扩展到半结构化和结构化数据,以及由LLMs生成的内容。每种数据结构都有其独特的挑战和机会,研究者正在开发新的方法来克服这些问题,以提高RAG的效果。


3.1.2. 检索粒度

检索粒度(Retrieval Granularity),即检索数据的颗粒度,这是影响检索效果的重要因素之一。

1. 粗粒度与细粒度的权衡

  • 粗粒度(Coarse-grained retrieval units) 理论上可以提供更多的上下文和相关信息,但它们也可能包含大量冗余内容,分散下游任务中的检索器和语言模型的注意力【50】、【87】。换句话说,粗粒度虽然包含更多信息,但其中一些信息可能对特定任务不必要,反而增加了模型的负担。
  • 细粒度(Fine-grained retrieval units) 通过更小的检索单位减少冗余信息,但这同时增加了检索的复杂性,并且不一定能保证语义完整性或满足所需知识【50】。在某些任务中,检索过小的单位会导致信息的割裂,使得检索的结果不具备连贯的上下文信息,从而影响后续任务的效果。

在推理过程中选择合适的检索粒度是提升稠密检索器(dense retrievers)性能的一种有效策略。

2. 文本中的检索粒度

在文本数据中,检索粒度可以从细到粗逐步增加,包括以下几种单位:

  • Token(词元):最小的文本单位。
  • Phrase(短语):由多个词元组成的短表达。
  • Sentence(句子):较大的独立语义单位。
  • Proposition(命题):DenseX【30】提出了将命题作为检索单位的概念。命题被定义为文本中的原子表达式,每个命题封装了一个独特的事实片段,并以简洁、独立的自然语言格式呈现。这种方法旨在提高检索的精度和相关性。
  • Chunks(片段):多个句子或段落组成的较大单位。
  • Document(文档):整个文本或文章。

在这些检索单位中,命题的使用被认为可以在保留信息精度的同时减少冗余。

3. 知识图谱(Knowledge Graph, KG)中的检索粒度

对于知识图谱(KG),检索的粒度包括:

  • Entity(实体):知识图谱中的基本元素,通常代表一个概念或对象。
  • Triplet(三元组):由实体和它们之间的关系组成的三元组,例如(实体1,关系,实体2)。
  • Sub-Graph(子图):多个三元组组成的局部子图,提供更丰富的语义上下文。

4. 其他领域的检索粒度

检索的粒度也可以根据下游任务进行调整。例如:

  • 在推荐任务中,检索单位可以是Item IDs(项目ID)【40】。
  • 在句子匹配任务中,检索单位可以是Sentence pairs(句子对)【38】。

结论

检索粒度的选择对检索器的效果有直接影响。粗粒度检索可以提供更全面的信息但也带来冗余,细粒度检索能够减少不必要的信息但可能缺乏完整性。通过选择适合的粒度,能够在不同任务中提高检索器的性能。


3.2 索引优化

索引优化(Indexing Optimization) 讨论了在索引阶段如何对文档进行处理、分割,并将其转化为嵌入存储在向量数据库中的方法。索引构建的质量直接影响检索阶段能否获取正确的上下文。在这一部分,主要介绍了三种索引优化策略:分块策略、元数据附加和结构化索引。

3.2.1 分块策略

分块策略(Chunking Strategy) 是文档处理和索引构建中的一个关键步骤,特别是在RAG(Retrieval-Augmented Generation)系统中。其基本思想是将文档按一定数量的词元(tokens)分割成多个小块(chunks),以便能更高效地处理、检索和推理。

1. 固定词元数量的分块方法

最常见的分块方法是基于固定数量的词元将文档分割成块。例如,常见的分块大小有100、256和512个词元【88】。这种方法相对简单且广泛应用,但不同大小的分块会带来不同的优缺点:

  • 较大的分块:较大的块可以捕捉更多的上下文信息,尤其在长文本中,有助于保持语义完整性。然而,较大的块也可能引入更多的噪音,降低信息的精确度,同时由于包含更多数据,处理时间更长,成本更高。

  • 较小的分块:较小的块则噪音更少,处理速度也更快。然而,它们可能无法完整传递必要的上下文,导致关键信息缺失,尤其在跨越句子或段落的情况下。

2. 递归分割与滑动窗口优化

当文档被分割成较小的块时,可能会出现句子被截断的问题。这种情况会削弱分块的语义完整性,影响模型的理解和推理效果。为了应对这一问题,提出了递归分割滑动窗口方法【89】:

  • 递归分割:是一种逐层分割的过程,避免直接在句子或段落中截断,确保每个块保留尽可能完整的上下文。
  • 滑动窗口:通过在相邻分块之间引入重叠的词元(tokens),可以保持跨块的语义连贯性。这种方法在多次检索过程中通过合并全局相关信息来实现分层检索,确保信息的完整性。

尽管这些方法能够在一定程度上改善语义截断问题,但仍然难以在语义完整性上下文长度之间达到理想的平衡。

3. Small2Big 方法的提出

为了解决以上方法中的局限性,提出了Small2Big策略【90】。该方法的核心思想是使用较小的单位(如句子)作为检索单位,但同时提供该句子的前后句子作为上下文,从而为LLM提供更多的上下文信息:

  • 小单位(small):以句子为单位进行检索,保证每个检索单位相对精确。
  • 大上下文(big):提供前后句子作为补充上下文,以确保模型能够基于更完整的语境进行推理和回答问题。

这种方法在一定程度上解决了上下文缺失语义完整性之间的矛盾,是对传统分块方法的改进。

结论

分块策略(Chunking Strategy) 是文本处理中的一个关键步骤,选择合适的分块大小可以在保持上下文信息完整性的同时减少噪音和处理开销。递归分割和滑动窗口方法通过分层检索在一定程度上优化了分块策略,但仍无法完全平衡语义完整性和上下文长度。Small2Big 方法则通过小单位检索和大上下文支持的方式,提供了进一步的改进。


3.2.2 元数据附加

元数据附加(Metadata Attachments) 是一种通过向文档的分块添加附加信息来丰富检索内容的优化策略。这些元数据可以帮助在检索过程中提供更多的上下文信息,从而提高检索的准确性和效率。

1. 元数据附加的常见形式

在文档分块的基础上,可以为每个块附加多种元数据信息,包括:

  • 页码(page number)
  • 文件名(file name)
  • 作者(author)
  • 类别(category)
  • 时间戳(timestamp)

这些附加信息可以用于检索时的过滤,限制检索的范围,从而提高检索结果的相关性。例如:

  • 基于元数据的检索过滤:可以根据特定的元数据来限定检索的范围,例如只检索某个特定作者的文档或某一类别的内容。这可以大大减少无关信息的干扰,优化检索结果。

  • 时间感知的RAG:通过为文档的时间戳赋予不同的权重,可以实现时间感知的RAG(time-aware RAG),确保检索到的知识是最新的,从而避免使用过时的信息。这在快速变化的领域(如新闻、技术更新等)中特别有用,能够提高模型的实时性和准确性。

2. 人工构建的元数据

除了从原始文档中提取元数据,还可以人工构建元数据,即通过人为方式增强检索块的信息含量。例如:

  • 段落摘要:可以为每个段落添加简短的摘要,使模型在检索时快速了解每个块的内容,从而更快定位相关信息。
  • 假设性问题:这种方法称为 Reverse HyDE,它有助于提升检索的准确性,尤其是在问答系统中【91】。它的机制如下:
    1. 使用LLM为文档生成假设性问题,这些问题都是文档内容可以回答的。
    2. 当用户提出问题时,检索系统不仅基于问题的直接相似性,还会计算用户问题与生成的假设性问题之间的相似度。
    3. 通过这种方式,可以减少用户问题与文档答案之间的语义差距,从而提高检索的准确度和模型的推理能力。

结论

元数据附加(Metadata Attachments) 是一种有效的检索优化策略,通过为文档分块附加元数据来增强RAG系统的检索能力。元数据可以直接从原始文档提取,也可以通过人工方式生成,如段落摘要和假设性问题。Reverse HyDE 作为其中一种创新方法,通过生成假设问题来缩小语义差距,显著提升了检索的准确性。


3.2.3 结构化索引

结构化索引(Structural Index) 是一种通过为文档建立层次结构以优化信息检索的方法。在RAG系统中,建立层次化的索引结构可以显著加速检索和处理相关数据的速度。

1. 分层索引结构(Hierarchical Index Structure)

分层索引是一种将文档组织成父子关系的结构,其中分块(chunks)与父节点相关联。具体结构如下:

  • 父子关系:文档中的不同部分以父节点和子节点的形式组织,形成一种树状结构。每个文档可以视为父节点,而其对应的分块则作为子节点。这种结构不仅使得数据更加有条理,而且有助于快速确定相关块。

  • 数据摘要存储:在每个节点上存储数据摘要,这样可以帮助RAG系统快速遍历数据,并确定需要提取哪些分块。这种分层的结构使得检索系统能够高效定位相关信息,避免不必要的全局搜索。

通过这种分层结构,系统可以更快地处理数据,有效减少由块提取问题(block extraction issues)带来的幻觉现象。幻觉是指模型生成的与事实不符的输出,而分层索引能够通过更精准的上下文匹配来减少这种情况的发生。

2. 知识图谱索引(Knowledge Graph Index)

除了分层索引,利用知识图谱(Knowledge Graph, KG) 来构建文档的层次结构也是一种有效的方式。知识图谱可以帮助保持文档结构和概念的一致性,减少幻觉的可能性。这种索引结构具有以下优势:

  • 概念与实体的连接:知识图谱定义了不同概念和实体之间的关系,通过这种方式可以更好地表示文档中不同部分的逻辑关联。这种连接有助于减少模型在回答问题时产生的幻觉现象,因为知识图谱能够清晰地表达信息的语义关联。

  • 指令转换:知识图谱不仅帮助表示文档结构,还将信息检索过程转化为LLM可以理解的指令。这样做可以增强知识检索的准确性,并使得LLM生成符合上下文的连贯回应,从而提升RAG系统的整体效率。

3. KGP方法(KGP Method)

为了捕捉文档内容和结构之间的逻辑关系,KGP(Knowledge Graph-based Processing)方法被提出【91】。KGP通过在多个文档之间建立索引,解决了多文档环境下的知识检索和推理问题。该方法的核心思想是使用知识图谱连接文档中的不同部分,确保语义一致性和信息的高效检索。其基本结构包括:

  • 节点(Nodes):代表文档中的段落或结构(如页面、表格)。
  • 边(Edges):表示段落之间的语义/词汇相似性,或文档结构中的关系。

通过这种图结构,系统可以更好地处理多文档环境中的知识检索问题,确保文档间的语义关联得到充分捕捉。


3.3 查询优化

传统的Naive RAG 直接使用用户提供的问题作为检索的基础,这种方法存在诸多挑战:

  • 查询的精确性不足:提出一个精确且清晰的问题是困难的。用户的问题可能不够明确,语句结构不够完善,导致检索效果不理想。
  • 复杂问题的表述:有时用户的问题本身就很复杂,语言组织不清晰,进一步加剧了检索的难度。如果问题包含多个子问题或不同层次的含义,检索模型可能无法充分理解上下文,从而影响生成答案的准确性。
  • 语言复杂性和歧义:复杂的语言结构和歧义也是RAG系统面临的挑战之一。特别是在处理专业术语或有多重含义的缩略词时,模型可能会误解问题。例如,缩写“LLM”既可以表示Large Language Model(大型语言模型),也可以表示Master of Laws(法律硕士)。如果上下文不明确,模型可能无法正确解读这些专业术语。

查询优化(Query Optimization) 中,针对Naive RAG系统直接依赖用户原始查询带来的问题,提出了三种优化方法:查询扩展查询转化查询路由


1. Query Expansion(查询扩展)

查询扩展 是通过将一个查询扩展为多个查询来最大限度地捕捉原始问题的不同层面和细节,从而提高答案的全面性。

  • Multi-Query(多查询):利用提示工程(Prompt Engineering) 通过LLM(大型语言模型)扩展查询。扩展后的查询不是随机生成的,而是经过精心设计的。这些查询可以并行执行,从而提高效率【92】。

  • Sub-Query(子查询):子查询规划的过程类似于查询扩展,它通过生成必要的子问题来帮助完整地回答原始问题。特别是在处理多步骤的复杂问题场景中,原始问题可以通过Least-to-Most Prompting Method(最小到最大提示方法) 分解为一系列更简单的子问题,然后组合成完整答案【92】。

  • Chain-of-Verification (CoVe,验证链):扩展后的查询还可以经过验证,减少幻觉现象。CoVe 验证链方法利用LLM对扩展的查询进行验证,确保其可靠性,并提高生成答案的可信度【93】。

2. Query Transformation(查询转化)

查询转化 的核心思想是基于转化后的查询进行检索,而不是直接使用用户的原始查询。它主要通过重新组织或生成新的查询,以便更好地适应LLM的检索过程。

  • Query Rewrite(查询重写):原始查询在实际场景中常常并不适合LLM检索。因此,通过提示LLM重写这些查询,可以改善检索效果。例如,RRR (Rewrite-Retrieve-Read)【7】 是一种专门的查询重写模型。此外,在Taobao平台上应用的BEQUE 系统通过查询重写方法显著提高了长尾查询召回率,从而增加了GMV(Gross Merchandise Volume,商品交易总额)【9】。

    • 长尾查询(Long Tail Query) 是指那些搜索频率较低、但数量众多的关键词或短语。这些查询通常相较于热门关键词而言,涵盖了更具体或细分的主题。
  • HyDE方法:另一种查询转化方法是通过提示工程让LLM基于原始查询生成假设文档(假设答案)。这种方法强调基于答案的嵌入相似性,而不是直接针对问题或查询的相似性来进行检索【11】。

  • Step-back Prompting(回溯提示法):该方法通过对原始查询进行抽象,生成一个高层次的概念性问题(step-back question),以此来扩展检索范围。在RAG系统中,原始查询和回溯问题同时用于检索,两者的结果结合后再作为LLM生成答案的基础【10】。

3. Query Routing(查询路由)

查询路由 基于不同的查询类型,将其引导到合适的RAG管道。这种方法特别适用于需要应对多样化场景的RAG系统。

  • Metadata Router/Filter(元数据路由/过滤器):首先从查询中提取关键词(实体),然后根据这些关键词与分块中的元数据进行过滤,缩小搜索范围。这种方法快速高效,尤其适用于有明确关键词的查询。

  • Semantic Router(语义路由):语义路由利用查询的语义信息来确定检索方向,适用于处理更复杂的自然语言查询【6】。这种方法不仅依赖关键词,还分析查询的上下文和意义。

  • Hybrid Routing(混合路由):混合路由结合了元数据和语义路由的优势,混合路由在初始阶段可以使用元数据过滤器快速缩小搜索范围,而后通过语义路由来更精细地检索信息。这样做的好处是既能充分利用关键词过滤的效率,又能通过语义分析来确保检索结果的准确性和相关性。


3.4 嵌入

Embedding(嵌入) 是RAG系统中至关重要的一环,通过计算查询与文档分块的嵌入之间的相似性(如余弦相似性)来实现检索。在这个过程中,嵌入模型的语义表示能力至关重要。目前的嵌入模型分为稀疏编码器(如BM25)和密集检索模型(如基于BERT架构的预训练语言模型)。最近的研究还引入了如AngIEVoyageBGE 等多任务指导调优的嵌入模型【94】–【96】。在Hugging FaceMTEB(Massive Text Embedding Benchmark)排行榜上,嵌入模型的表现被跨越8个任务、58个数据集进行评估;此外,C-MTEB 专注于评估模型的中文能力,覆盖了6个任务和35个数据集。

在选择嵌入模型时,没有适用于所有场景的万能模型,但某些特定模型在特定用例中表现更好。

1. Mix/hybrid Retrieval(混合检索)

混合检索 结合了稀疏和密集嵌入方法,这两者可以互相补充,捕捉不同的相关性特征。例如:

  • 稀疏检索模型(如BM25)可以用于为密集检索模型提供初步的搜索结果。在这种设置下,稀疏模型首先进行检索,而密集模型基于这些初步结果进行进一步优化。
  • 预训练语言模型(PLMs)可以被用于学习词项权重,从而增强稀疏检索模型的表现。密集检索模型可以通过这些词项权重,改善其对包含罕见实体查询的处理能力。

此外,研究表明,稀疏检索模型可以增强密集检索模型的零样本检索能力(即在没有具体训练样本的情况下进行准确检索),并在处理稀有实体查询时帮助密集检索模型,提高其鲁棒性。

2. Fine-tuning Embedding Model(微调嵌入模型)

在某些情况下,模型预训练的语料库与当前任务的上下文存在显著差异。特别是在高度专业化的领域,如医疗、法律等充满专有术语的行业,微调嵌入模型至关重要,以减少这种差异带来的性能下降。

  • 领域知识补充:微调嵌入模型不仅能够补充领域特定的知识,还能够更好地对齐检索器和生成器。例如,使用LLM的结果作为监督信号进行微调,称为LSR (LM-supervised Retriever)

  • PROMPTAGATOR【21】 利用LLM作为少样本查询生成器,创建任务特定的检索器,特别适用于数据匮乏的领域。它解决了监督微调中数据不足的问题。

  • LLM-Embedder【97】 通过让LLM生成多任务的奖励信号,使用双重监督信号对检索器进行微调:一方面是数据集的硬标签,另一方面是来自LLM的软奖励。这种双重信号方法能够更有效地微调嵌入模型,使其适应多样的下游应用。

  • REPLUG【72】 利用检索器和LLM计算检索文档的概率分布,然后通过计算KL散度进行监督训练。这种简单而有效的训练方法,通过使用LM作为监督信号,提升了检索模型的性能,而不需要特定的交叉注意力机制。

  • 基于RLHF(Reinforcement Learning from Human Feedback) 的启发:一些方法使用基于LM的反馈,通过强化学习(RL)强化检索器。这种方法通过结合人类反馈信号,进一步提升模型的鲁棒性和适应性。


3.5 适配器

Adapter(适配器) 是一种为了解决模型微调中的各种挑战而引入的外部组件,尤其在有限的计算资源或整合API功能时,Adapter可以作为一种轻量级的解决方案。在大型语言模型(LLM)的多任务优化过程中,Adapter能够有效地帮助模型对齐和提高性能。

1. 微调的挑战

在模型微调过程中,可能会遇到以下困难:

  • API集成的复杂性:在某些场景中,直接微调模型可能难以与现有的API功能集成。
  • 计算资源限制:微调大模型往往需要大量的计算资源,而在计算资源有限的环境中,微调会受到限制。

为了解决这些问题,Adapter提供了一种外部模块,帮助在不完全微调整个模型的情况下对任务进行优化和对齐。

2. 轻量级提示检索器(UP-RISE)

UP-RISE【20】 提出了一个轻量级的提示检索器,用于优化LLM的多任务能力。该方法的核心思想是:

  • 自动检索提示:UP-RISE可以从一个预构建的提示池中自动检索适合给定零样本任务输入的提示。这种方式减少了对模型进行大规模微调的需求,同时优化了零样本任务的处理能力。

UP-RISE的这种轻量级架构,极大地提高了模型的灵活性,尤其是在多任务环境中,能够快速响应不同类型的任务需求。

3. 增强适配检索器(AAR)

AAR (Augmentation-Adapted Retriever)【47】 引入了一个通用适配器,设计用于适应多种下游任务。AAR的设计目标是:

  • 多任务适应性:通过一个通用适配器来处理多种任务,使得模型能够在不需要重新训练整个模型的情况下快速适应新的任务。
  • 性能增强:在不同的下游任务中,该适配器帮助提升检索和生成的性能,使模型在任务间的迁移更加顺畅和有效。

4. 奖励驱动的上下文适配器(PRCA)

PRCA (Pluggable Reward-driven Contextual Adapter)【69】 通过添加一个可插拔的奖励驱动的上下文适配器来增强特定任务的性能:

  • 任务特定优化:PRCA通过使用特定于任务的奖励信号来调整上下文适配器,使得模型在处理特定任务时的表现得到优化。
  • 灵活性和可插拔性:这个适配器可以方便地插入到现有模型中,而无需对模型进行大规模修改或重新训练,使其成为一种高效且灵活的优化方式。

5. 桥接模型(BGM)

BGM (Bridge Model)【26】 是一种连接检索器和LLM的桥接模型。BGM的关键功能在于:

  • 固定检索器和LLM:BGM保持检索器和LLM的固定状态,仅训练一个Seq2Seq桥接模型来转换检索到的信息。
  • 信息转换和动态选择:桥接模型的目的是将检索到的信息转换为LLM能够高效处理的格式,不仅能够对信息重新排序,还能够为每个查询动态选择最相关的段落,甚至应用更高级的策略,如信息重复。

这种方法使得模型能够在处理复杂查询时表现得更加灵活和高效。

6. 指令微调的白盒模型集成(PKG)

PKG【75】 提出了一种创新的知识集成方法,即通过指令微调(directive fine-tuning) 来集成知识到白盒模型中。其核心思想包括:

  • 检索器模块的替代:在PKG方法中,检索器模块可以直接被替换为根据查询生成相关文档。这种方式能够在微调过程中有效集成领域知识,帮助模型更好地理解和生成相关的内容。

PKG通过指令微调,使得模型能够更加精准地处理特定领域的任务,减少了传统微调过程中的困难,同时提升了模型的表现。

结论

Adapter 技术通过为模型提供额外的外部支持模块,帮助解决微调过程中遇到的各种挑战。它们为RAG系统提供了灵活且高效的解决方案,特别是在多任务处理、任务特定优化和知识集成等方面。


第4部分:生成,见我下篇博客,未完待续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值