信息检索(十二):What Are You Token About? Dense Retrieval as Distributions Over the Vocabulary


Dense Retrieval as Distributions Over the Vocabulary)


原文链接:https://aclanthology.org/2023.acl-long.140.pdf
(2023)


摘要

双编码器现在是密集检索的主导架构。然而,我们对它们如何表示文本以及为什么这会带来良好的性能知之甚少。在这项工作中,我们通过词汇分布阐明了这个问题。我们建议通过将双编码器产生的向量表示投影到模型的词汇空间中来解释它们。我们表明,所得的投影包含丰富的语义信息,并在它们和稀疏检索之间建立联系。我们发现这种观点可以为密集检索器的一些失败案例提供解释。例如,我们观察到模型无法处理尾部实体与令牌分布忘记这些实体的一些令牌的趋势相关。我们利用这一见解,提出了一种简单的方法,在推理时用词汇信息丰富查询和段落表示,并表明,与零样本设置中的原始模型相比,这显着提高了性能,特别是在 BEIR 基准测试上
模型倾向于忘记尾部实体(不常见实体)

1. 引言

基于神经文本表示的密集检索模型已被证明非常有效(Karpukhin 等人,2020;Qu 等人,2021;Ram 等人,2022;Izacard 等人,2022a,b),改进了强大的传统稀疏模型,如 BM25(Robertson)和萨拉戈萨,2009)。然而,当现成应用时(即在域外设置中),它们的性能通常会严重下降(Thakur 等人,2021 年;Sciavolino 等人,2021 年;Reddy 等人,2021 年)。此外,人们对此类失败的原因知之甚少,因为他们的陈述中捕获的信息仍未得到充分调查。
在这项工作中,我们提出了一种解释和推理密集检索器的新方法,通过投影到词汇空间时由查询和段落表示引起的分布,即词汇空间上的分布(图1)。这种分布可以更好地理解密集模型的表征性质及其失败,这为提高其性能的简单解决方案铺平了道路。
首先,我们展示了密集的检索表示可以投影到词汇空间,方法是通过预训练模型的掩码语言建模 (MLM) 头,这些模型是在没有任何进一步训练的情况下初始化的。此操作导致词汇表的分布,我们将其称为查询词汇表投影和段落词汇表投影。

令人惊讶的是,我们发现这些预测对于人类来说是高度可解释的(图 2;表 1)。我们分析这些投影,并在它们与稀疏检索中的众所周知的概念之间建立有趣的联系(§5)。
首先,我们强调查询共享的标记的高覆盖率以及其预测的前 k 个段落。这一观察表明查询和段落之间的词汇重叠在检索机制中起着重要作用。
其次,我们展示了段落的词汇投影,它们可能包含出现在有关给定段落的查询中的单词。因此,它们可以被视为预测人们会针对该段落提出的问题。
最后,我们表明该模型隐式实现了查询扩展(Rocchio,1971)。例如,在图 2 中,查询是“目前有多少名法官在最高法院任职?”,查询投影 Q 中的单词包括“法官”(称呼他们的常用方式)和“九”(正确的说法是“九”)。回答)。
上述发现尤其令人惊讶,因为这些检索模型是以对比方式进行微调的,因此在微调期间不会对词汇进行任何预测或使用其语言建模头。此外,这些表示是运行可以实现高度复杂功能的深层变压器网络的结果。尽管如此,模型输出仍然“忠实”于预训练期间学到的原始词汇空间。
我们进一步表明,我们的方法能够揭示密集检索器难以解决简单的以实体为中心的问题的原因(Sciavolino 等人,2021)。通过词汇投影的镜头,我们发现了一个有趣的现象:密集的检索器倾向于“忽略”给定段落中出现的一些标记。这反映在段落投影中分配给此类标记的排名中。例如,图 2 底部示例中的单词“michael”排名相对较低(即使它出现在段落标题中),从而阻碍了模型检索该段落。我们将这种综合症称为象征性遗忘症(§6​​)。
我们利用这一见解,提出了一种简单的推理时间修复方案,可以用词汇信息丰富密集表示,解决令牌遗忘症。我们表明,在具有挑战性的 BEIR 基准(Thakur 等人,2021)和其他数据集上,与普通模型相比,词汇丰富显着提高了性能。例如,我们将 BEIR 上的强 MPNet 模型的性能从 43.1% 提升到 44.1%。
总而言之,我们的分析和结果证明了词汇预测作为更原则性的密集检索模型研究和开发框架的巨大潜力。

2. 背景

在这项工作中,我们提出了一个简单的框架,通过将密集检索的表示投影到词汇空间来解释密集检索。这是使用相应预训练模型的(屏蔽)语言建模头来完成的。我们首先提供相关背景

2.1 掩码语言建模

大多数基于仅编码器转换器的语言模型(Vaswani 等人,2017)都是使用掩码语言建模(MLM)任务的某些变体进行预训练的(Devlin 等人,2019;Liu 等人,2019;Song 等人,2020),这涉及屏蔽一些输入标记,并让模型重建它们。
具体来说,对于输入序列 x1, …, xn,变换器编码器应用于输出上下文化标记表示 h1, …, hn ∈ R d 。
然后,为了预测丢失的标记,将 MLM 头应用于它们的上下文表示。MLM head 是一个函数,它以向量 h ∈ R d 作为输入,并返回模型词汇表 V 上的分布 P,定义如下:
在这里插入图片描述
g : R d → R d 是一个潜在的非线性函数(例如,BERT 的全连接层后跟 LayerNorm;Devlin et al 2019),vi ∈ R d 对应于第 i 项的静态嵌入在词汇中

2.2 密集检索

在密集检索中,我们得到一个段落语料库 C = {p1, …, pm} 和一个查询 q(例如,要检查的问题或事实),并且我们希望计算查询和段落表示(eq 和ep,分别),使得该空间中的相似性意味着段落与查询的高度相关性。形式上,令 EncQ 为查询编码器,EncP 为通道编码器。
这些编码器是从输入文本到 R d 中的向量的映射,并且是通过微调给定的 LLM 获得的。具体来说,它们返回 LLM 上下文嵌入的池化版本(例如,[CLS] 嵌入或平均池化)。我们将查询向量和段落向量的嵌入表示如下:
在这里插入图片描述
为了微调检索器,定义了相似性度量 s(q, p)(例如 eq 和 eq 之间的点积或它们的余弦相似性),并以对比方式训练模型以最大化检索器准确性(Lee 等人) ,2019;Karpukhin 等人,2020)。重要的是,在这个过程中,传销头部功能根本没有改变

3. 词汇投影

我们现在描述将密集检索器的查询和段落表示投影到词汇空间的框架。给定一个密集检索模型,我们利用初始化模型的 MLM 头将编码器输出表示映射到词汇表上的分布(等式 1)。例如,对于 DPR (Karpukhin et al, 2020),我们采用 BERT 的 MLM 头,因为 DPR 是从 BERT 初始化的。给定一个查询 q,我们使用查询编码器 EncQ 来获取其表示 eq,如式2所示。 2类似地,对于段落 p,我们应用段落编码器 EncP 来获取 ep。然后我们应用 MLM 头,如等式 1 所示。 获取词汇投影:
在这里插入图片描述

请注意,先验并不清楚 Q 和 P 是否有意义,因为编码器模型自预训练以来已发生变化,而 MLMhead 函数保持固定。此外,MLM 函数尚未经过训练可以在预训练期间解码“池化”序列级表示(即 CLS 或平均池化的结果)。尽管有这种直觉,但在这项工作中,我们认为 P 和 Q 实际上是高度直观的,可以促进更好地理解密集检索器。

4. 实验设置

为了定量评估我们的框架和方法,我们考虑了几种密集的检索模型和数据集。

4.1 模型

我们现在列出用于演示我们的框架和方法的检索器。所有密集模型都共享相同的架构和大小(即 BERTbase 的架构和大小;1.1 亿个参数),并且所有模型都以与批内负数形成对比的方式进行训练,这是训练密集模型的突出范式(Lee 等人,2019 年;Karpukhin 等人)等人,2020;Chang 等人,2020;Qu 等人,2021;Ram 等人,2022;Izacard 等人,2022a;Ni 等人,2022;Chen 等人,2022)。为了进行分析,我们使用 DPR(Karpukhin 等人,2020)和 BERT(Devlin 等人,2019)作为其预训练基线。对于我们方法的结果,我们还使用 S-MPNet(Reimers 和 Gurevych,2019)和 Spider(Ram 等人,2022)。我们的稀疏检索模型是 BM25(Robertson 和 Zaragoza,2009)。我们建议读者参考App。 A 了解更多详情。

4.2 数据集

我们遵循之前的工作(Karpukhin 等人,2020;Ram 等人,2022)并考虑六个常见的开放域问答(QA)数据集来评估我们的框架:自然问题(NQ;Kwiatkowski 等人,2019)、TriviaQA( Joshi 等人,2017 年)、WebQuestions(WQ;Berant 等人,2013 年)、CulatedTREC(TREC;Baudiš 和 Šedivý 2015 年)、SQuAD(Rajpurkar 等人,2016 年)和 EntityQuestions(EntityQs;Sciavolino 等人,2021 年)。我们还考虑了 BEIR(Thakur 等人,2021)和 MTEB(Muennighoff 等人,2022)基准。

4.3 实验细节

我们的代码基于 DPR 的官方存储库(Karpukhin 等人,2020),构建在 Hugging Face Transformers(Wolf 等人,2020)的基础上。
对于六个 QA 数据集,我们使用由 Karpukhin 等人(2020)标准化的维基百科语料库,其中包含大约 2100 万个段落,每个段落有 100 个单词。为了对此语料库进行密集检索,我们使用 FAISS 应用精确搜索(Johnson 等人,2021)。对于稀疏检索,我们使用 Pyserini(Lin 等人,2021)。

5. 通过词汇投影分析密集检索器

在第 3 节中,我们介绍了一个用于解释密集检索器产生的表示的新框架。接下来,我们描述了实证研究结果,为这些表示中编码的内容提供了新的线索。通过词汇投影,我们在密集检索和稀疏检索中的众所周知的概念之间建立了联系,例如词汇重叠(第 5.1 节)、查询预测(第 5.2 节)和查询扩展(第 5.3 节)。
5.1)经过训练的encoder,在表示 query 和 passage 时,更强调两者共享的 token
  i.e. 即使是 DPR,也会强调词汇的重叠
5.2)对于 passage 编码来说,同时出现在 query 和 passage 中的 token 更重要
5.3)对于 query 编码来说,通过训练,可以让其映射 token 集合中包含更多的查询扩展(查询扩展:存在于 passage,但是不存在于 query 中的 token)
  i.e. 查询扩展包含两类:a)query 中 token 的同义词;b)answer token

5.1 词汇重叠的主导地位

问题共享的标记及其相应的黄金段落构成了检索中的词汇重叠信号,由 BM25 等稀疏模型使用。我们首先要问:他们在词汇投射中有多突出?图 3 说明了训练后 DPR 的 Q 和 P 中这些标记的覆盖范围,与训练前的初始化(即具有均值或 CLS 池化的 BERT)相比。
换句话说,对于每个 k,我们检查 Q 和 P 中排名前 k 的共享代币的百分比是多少。结果表明,训练后,模型学会将共享令牌排名比以前高得多。
具体来说,63% 和 53% 的共享 token 分别出现在 Q 和 P 的前 20 个 token 中,而 BERT 中只有 16% 和 8%(即训练前)。这些数字增加到 Q 和 P 的前 100 个令牌中出现的共享令牌的 78% 和 69%。此外,我们观察到,对于 71% 的问题,Q 中得分最高的令牌同时出现在问题和 P 中。段落(App.B)。这些发现表明,即使对于密集检索器(不在词汇层面进行操作),词汇重叠仍然是一个高度主导的信号。
在这里插入图片描述

5.2 段落编码器作为查询预测

我们的下一个分析涉及通道编码器的作用。在第 5.1 节中,我们表明问题及其黄金段落所共享的标记在 Q 和 P 中均排名较高。然而,段落包含许多标记,并且共享标记仅占所有标记的一小部分。我们假设,在段落标记中,那些可能出现在相关问题中的标记在 P 中的得分高于其他标记。如果确实如此,则意味着段落编码器隐式学习预测哪些段落标记将出现在相关问题中。为了检验我们的假设,我们分析了段落词汇投影 P 中问题和段落标记的排名。正式地,令 Tq 和 Tp 分别为问题 q 及其黄金段落 p 中的标记集。表 2 显示了 P 中这些集合的标记级别平均倒数排名 (MRR)。我们观察到 q 和 p 共享的标记(即 Tq ∩ Tp)的排名显着高于其他通道标记(即 Tp)。例如,在DPR中,共享代币的MRR为26.1,而其他通道代币的MRR仅为3.0。另外,BERT中共享代币的MRR仅为1.4。这些发现支持我们的主张,即相关问题中出现的标记的排名高于其他标记,并且这种行为是在微调过程中获得的。
在这里插入图片描述

5.3 查询编码器实现查询扩展

为了克服“词汇不匹配”问题(即当问题-文档对在语义上相关,但缺乏明显的词汇重叠时),查询扩展方法已被广泛研究(Rocchio,1971;Voorhees,1994;Zhao and Callan,2012;Mao等,2021)。主要思想是使用附加术语扩展查询,以更好地指导检索过程。如果一个标记没有出现在查询本身中,但出现在查询投影 Q 中,并且也出现在该查询 p 的黄金段落中(不包括停用词和标点符号),则我们将其定义为查询扩展。
图 4 显示了在 top-k 中至少有一个查询扩展标记的查询的百分比,作为 DPR 和 BERT 基线(即在 DPR 训练之前)的 k 的函数。我们观察到,训练后,模型将查询扩展标记提升到比以前更高的排名。此外,我们发现 Q 的前 5 名中几乎 14% 的令牌是查询扩展令牌(参见 App B)。

在这里插入图片描述
我们注意到,有两类有趣的查询扩展标记:
(1)问题标记的同义词,以及与 q 中的标记共享相似语义的标记(例如表 1 第一个示例中的“michigan”)。
(2)“答案标记”,其中包含查询的答案(例如表 1 的第二个示例中的“motown”)。此类标记的存在可能表明模型已经“知道”给定问题的答案,无论是通过预训练还是通过训练期间看到的类似问题(Lewis 等人,2021)。
鉴于这些发现,我们推测该模型“使用”这些查询扩展标记向检索过程引入语义信号。
在这里插入图片描述

6. Token 失忆

第 5 节中的分析表明,段落的词汇预测(即 P)可以预测哪些输入标记可能出现在相关问题中。然而,在某些情况下,这些预测完全失败。例如,在图 2 中,段落投影 P 的 top-k 中缺少标记“michael”。我们将这种情况称为标记失忆症。这里我们要问,查询预测的这些失败是否会影响检索?
接下来,我们证明 token 遗忘确实与众所周知的密集检索器失败相关(第 6.1 节)。为了克服这个问题,我们建议采用密集表示的词汇丰富程序(第 6.2 节),并证明其对下游检索性能的有效性(第 6.3 节)。
6.1)(简单理解)检索失败跟 token 遗忘是有关系的
6.2)丰富 passage 的表示,使得 query 中出现但是不常见的词,在 passage 表示映射的 top 前列出现
6.3)本文有效果,但是某些数据集还是 bm25 更强
  (说明,密集检索 + 词汇信号 是很重要的)
6.4)消融实验
  a)通过 IDF,提高稀有 token 在 query 或 passage 表示中的重要性
  b)single-token 的必要
  c)whitening 和 normalization 的必要

6.1 token 遗忘与检索失败相关

密集检索器在域外设置中表现出了困难(Sciavolino 等人,2021;Thakur 等人,2021),即使像 BM25 这样的稀疏模型也明显优于它们。我们现在通过token失忆症对这些失败提供直观的解释。我们重点关注 BM25 优于密集模型的设置,并问:为什么密集检索器无法对词汇重叠信号进行建模?为了回答这个问题,我们考虑 NQ 和 EntityQ 的子集,其中 BM25 能够在其前 5 个结果中检索正确的段落。我们关注这些子集,因为它们在问题和段落之间包含显着的词汇重叠(根据定义,因为 BM25 成功检索了正确的段落)。
令 q 为问题,p 为 BM25 为 q 检索到的段落,Q 和 P 为某些密集检索器的相应词汇投影。另外,令 T ⊆ V 为同时出现在 q 和 p 中的标记集合(不包括停用词)。图 5 显示了分布 P(左)和 Q(右)中来自 T 的标记的最大(即最低)排名,作为 DPR 是否能够检索该段落的函数(即检索结果中 p 的排名) DPR)。
事实上,DPR 成功在前 5 个结果中获取 p 的问题(蓝色框)的最大排名中位数远低于 DPR 未能检索段落的问题(红色框)。正如预期的那样(由于问题包含的标记比段落少),问题投影 Q 中共享标记的排名要高得多。然而,Q 中也存在这种趋势。App 中给出了其他数字(对于 EntityQ;以及中位数排名而不是最高排名)。 C。
总体而言,这些发现表明象征性遗忘与 DPR 失败之间存在相关性。接下来,我们介绍一种通过密集表示的词汇丰富来解决密集检索器中的令牌遗忘症的方法。

6.2 方法:词汇丰富

正如第 6.1 节中的分析所示,密集检索器倾向于忽略某些输入标记。我们现在利用这种洞察力来改进这些模型。我们将我们的方法称为词汇丰富(LE),因为它用特定的词汇项目丰富了文本编码
直观上,解决“令牌失忆症”问题的一个自然方法是更改​​检索器编码,使其包含这些令牌。例如,假设查询 q 是“迈克尔·杰克出生在哪里?”相应的段落 p 包含文本“迈克尔·杰克出生于英国福克斯通”。根据图 2,标记“michael”在 P 中的排名相对较低,DPR 未能检索到正确的段落 p。我们希望修改段落表示 ep 并获得一个丰富版本 e ′ p ,该版本在其 top-k 投影标记中确实包含此标记,同时保持大多数其他投影标记完好无损。这是我们在 LE 中的目标,接下来我们将描述该方法。我们专注于段落表示的丰富,因为查询丰富的工作原理类似。我们首先解释如何使用单个令牌丰富表示,然后将该过程扩展到多个令牌。

single-token 的丰富
假设我们想用标记 t 来丰富段落表示 ep(例如,上面示例中的 t =“michael”)。如果段落中没有其他单词,我们只想找到一个嵌入,以便将其输入 MLM 会产生 t 作为顶部标记。3 我们将此嵌入称为 t 的单标记丰富,表示它由 st 定义为:
在这里插入图片描述
为了近似解决方程4中的优化问题。 对于词汇表中的每个 t,我们使用 Adam,学习率为 0.01。当所有标记的(交叉熵)损失阈值达到 0.1 时,我们停止。然后我们应用白化(Jung et al, 2022),这被证明对密集检索有效

multi-token 的丰富
现在假设我们有一个输入 x(问题或段落),并且我们希望用其标记 x = [x1, …, xn] 来丰富其表示形式,这样稀有标记的权重就会高于频繁标记的权重(如 BM25)。然后,我们简单地采用其原始表示 ex 并添加单令牌丰富度的加权和(等式 4)。也就是说,我们定义:
在这里插入图片描述

这里 λ 是通过交叉验证选择的超参数。我们使用标记的逆文档频率(Sparck Jones,1972)作为它们的权重:wxi = IDF(xi)。然后在丰富的表示上定义相关性分数

6.3 结果

我们的实验证明了我们的方法对于多个模型的有效性,特别是在零样本设置中。表 3 显示了使用和不使用我们的富集方法 LE 的几个模型的结果。其他结果在 App 中给出。 D. 结果证明了 LE 添加到所有基线模型时的有效性。重要的是,我们的方法将 S-MPNet(迄今为止 MTEB 基准上最好的基本大小模型(Muennighoff 等人,2022))在 MTEB 和 BEIR 上的性能分别提高了 1.1% 和 1.0%。当考虑 EntityQ(已知密集检索器在其上遇到困难)时,我们观察到所有模型都有显着的增益,并且 S-MPNet 和 Spider 获得比在相同文本单元上运行的 BM25(即具有 BERT 词汇的 BM25)更高的准确度。这一发现表明他们能够将语义信息(来自原始表示)与词汇信号整合起来。然而,vanilla BM25 在 EntityQ 和 SQuAD 上仍然优于 LE 模型,这促使人们进一步研究如何在密集检索中合并词汇信号。总体而言,与所有模型和数据集的基线模型(即零样本设置)相比,LE 显然提高了检索精度。

6.4 消融实验

我们进行了一项消融研究来测试第 6.2 节中我们的设计选择。我们评估我们方法的四个要素:(1)使用 IDF 来突出显示稀有标记,(2)我们导出单标记表示的方法,(3)白化的使用,以及(4)单位标准化的使用。

IDF
在我们的方法中,我们创建问题和段落的词汇表示,e lex x 。这些词汇表示是标记嵌入的平均值,每个标记都乘以其标记的 IDF。我们验证 IDF 确实是必要的——表 4 表明在等式 1 中设置 wxi = 1。 5 导致 EntityQ 性能显着下降。例如,top-20 检索准确率从 65.2% 下降到 57.7%。
在这里插入图片描述

Single-Token 丰富
等式。 4 定义了我们的单标记丰富:对于词汇表 v ∈ V 中的每个项目,我们找到一个嵌入,当输入到 MLM 头时,它给出了在 v 处达到峰值的单热向量。我们通过替换方程式来确认这是必要的。 4 与预训练模型的静态嵌入(例如,DPR 中的 BERT)。我们发现我们的方法比 BERT 在 EntityQ 上的嵌入有了显着的改进(例如,前 20 名的准确度裕度为 3.4%)。

Whitening & Normalization
最后,我们尝试去除白化和 ℓ2 标准化。很明显,它们都是必要的,因为删除其中任何一个都会导致性能急剧下降(EntityQ 的前 20 名准确率分别为 3.8% 和 2.2%)。

7. 相关工作

先前主要在语言模型的背景下研究了将表示和模型参数投影到词汇空间。
该方法最初由 nostalgebraist (2020) 探索。 Geva 等人 (2021) 表明,变压器中的前馈层可以被视为键值存储器,其中值向量引起词汇表上的分布。 Geva 等人(2022)将令牌表示本身视为诱导这种分布,并通过前馈层“更新”它们。 Dar 等人(2022)建议将所有转换器参数投影到词汇空间。然而,密集检索模型在微调期间没有任何语言建模目标,但我们表明它们的表示仍然可以投影到词汇表。
尽管DPR最近取得了广泛的成功,但对它们的表现的解释仍然没有得到充分探索。 MacAvaney 等人 (2022) 通过诊断探针分析神经检索模型(不仅仅是密集检索器),测试对释义、风格和事实的敏感性等特征。Adolphs 等人 (2022) 使用 T5 解码器解码神经检索器的查询表示,并展示如何在表示空间中“移动”以解码更好的检索查询。
语言模型(特别是 MLM)已用于术语加权和词汇扩展上下文中的稀疏检索。例如,Bai 等人 (2020) 和 Formal 等人 (2021) 在 BERT 的词汇空间上学习此类函数。我们的不同之处在于表明密集检索器也在该空间中隐式操作。因此,这些方法对于密集模型也可能有效。虽然我们的工作重点是基于仅编码器模型的密集检索器,但我们的框架可以轻松扩展到基于仅自回归解码器(即从左到右)模型的检索器,例如 GPT(Radford 等人,2019 年;Brown 等人) al, 2020),例如 Neelakantan 等人 (2022) 和 Muennighoff (2022)。

8. 结论

在这项工作中,我们探索将通过密集检索获得的查询和段落表示投影到词汇空间。我们表明,这些预测有助于更好地理解密集检索背后的机制及其失败。我们还演示了预测如何帮助改进这些模型。正如我们的词汇丰富方法所证明的那样,这种理解可能有助于改进检索器。

局限性

我们指出了我们工作的一些局限性。首先,我们的工作考虑了被称为“密集检索器”的流行模型系列,但其他检索方法包括稀疏检索器(Robertson 和 Zaragoza,2009;Bai 等人,2020;Formal 等人,2021)、生成检索器(Tay)等人,2022;Bevilacqua 等人,2022),后期交互模型(Khattab 和 Zaharia,2020)等。虽然我们的工作在密集检索和稀疏检索之间建立了有趣的联系,但我们的主要重点是理解和改进密集模型。其次,我们分析的所有三个密集模型都是双向的,并且以对比方式进行训练。
虽然大多数密集检索器确实满足这些属性,但也有一些工作提出了其他方法,包括其他架构(Muennighoff,2022;Neelakantan 等人,2022;Ni 等人,2022)和其他训练框架(Lewis 等人,2020) ;Izacard 等人,2022b)。最后,虽然我们的工作引入了解释和分析密集检索模型的新方法,但我们相信我们的工作只是冰山一角,为了充分理解这些模型还有很多工作要做。

  • 19
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值