RankLLM:RAG架构下通过重排序实现精准信息检索

使用RankLLM Reranker提升检索效果:以RankZephyr和RankGPT为例 RankLLM提供了一种高效的方式来提升检索系统的准确性。通过重排序模型,如RankZephyr和RankGPT,结合向量检索,可以显著提高排序效果。 阅读详情

一、前言

在检索增强生成(Retrieval-Augmented Generation, RAG)的框架下,重排序(Re-Rank)阶段扮演着至关重要的角色。该阶段的目标是对初步检索得到的大量文档进行再次筛选和排序,以确保生成阶段能够优先利用最相关的信息。这一过程类似于传统信息检索中的两阶段排序策略,其中粗排(粗略排序)阶段追求高效的检索速度,而精排(精细排序)阶段则专注于提升结果的相关性和准确性。

在RAG架构中,重排序不仅仅是对文档列表的简单重新排列,它还涉及到对文档相关性的深入理解和评估。有效的重排序技术能够显著提升RAG系统的性能,确保生成的内容不仅准确,而且与用户查询高度相关。然而,现有的重排序方法面临着一系列挑战,包括对输入顺序的过度依赖、缺乏对动态网络信息的适应性,以及模型的不透明性和不可复现性。

针对这些挑战,开源的重排序方法 RankLLM 应运而生。RankLLM 利用大型语言模型(LLMs)的强大能力,通过零样本学习(zero-shot learning)的方式,无需特定任务的训练数据即可执行重排序任务。这种方法不仅提高了重排序的效率和效果,而且通过开源实现了模型的透明性和可访问性,为研究社区提供了一个可复现、可改进的重排序工具。

RankLLM 的引入为RAG架构的发展提供了新的动力,它不仅能够处理静态的、预先定义的查询,还能够适应实时变化的数据和查询,满足不断演变的信息需求。通过这种开源和高效的重排序策略,RankLLM有望成为未来RAG系统中不可或缺的组成部分,推动信息检索和自然语言处理领域的进一步发展。

二、RankLLM 介绍

RankLLM 是一种基于大型语言模型(Large Language Models, LLMs)的重排序方法,它利用了LLM的强大能力来改进信息检索的结果。在信息检索的过程中,初步检索阶段可能会返回大量相关或不相关的文档,RankLLM 的作用是在这些文档中进行再次排序,以提高检索结果的相关性和准确性。RankLLM通过使用LLM作为“提示-解码器”(prompt-decoder),在没有特定任务训练数据的情况下(即零样本设置),对文档列表进行重新排序,优化诸如归一化折扣累积增益(nDCG)等检索指标。

三、RankLLM 原理

RankLLM 重排序的原理基于零样本学习(zero-shot learning),它不需要特定任务的训练数据。RankLLM 使用一种提示(Prompt)来指导LLM如何对文档列表进行排序。这个提示描述了重排序任务,并提供了一个格式,让模型知道如何生成排序后的文档列表。RankLLM 利用了 LLM 的理解和生成能力,通过指令微调(instruction fine-tuning)来学习如何根据相关性对文档进行排序。

在实际操作中,RankLLM接收一系列候选文档和相关的查询,然后使用LLM生成一个按相关性排序的文档列表。这个过程涉及到从大型数据集中提取有用的信息,并将这些信息融入到LLM的生成过程中,以实现更准确的重排序。

四、RankLLM 实现

如何使用 RankLLM 工具对搜索结果进行重新排序,以提升结果的相关性和准确性。RankLLM 提供了一系列专门针对这项任务进行优化的开源大语言模型,例如 RankVicuna 和 RankZephyr。

本文将通过比较 Van Gogh Wiki 页面的搜索结果,分别使用了传统的检索方法和结合 RankLLM 的检索方法。一方面是仅利用检索(通过 llama-index 的 VectorIndexRetriever 实现),另一方面则是结合了 RankLLM 进行的检索加重排序。演示中展现了 RankLLM 的两种模型:

  • RankVicuna 7B V1
  • RankZephyr 7B V1 - Full - BF16

依赖项:

  • 目前,RankLLM 的重排序功能需要 CUDA 环境,并且必须安装 rank_llm(通过命令 pip install rank_llm 安装)。
  • 而内置的检索工具则依赖于 Pyserini,需要 JDK11、PyTorch 和 Faiss 环境。

castorini/rank_llm 是一个专门用于利用大语言模型(如 GPT3.5, GPT4, Vicuna 和 Zephyr)进行提示解码的代码库。

4.1、安装依赖

%pip install llama-index-core
%pip install llama-index-llms-openai
%pip install llama-index-postprocessor-rankllm-rerank
%pip install rank-llm
import nest_asyncio

# 启用异步I/O
nest_asyncio.apply()
import logging
import sys

logging.basicConfig(stream=sys.stdout, level=logging.INFO)
logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.postprocessor import LLMRerank
from llama_index.llms.openai import OpenAI
from IPython.display import Markdown, display
import os

OPENAI_API_TOKEN = "sk-"
os.environ["OPENAI_API_KEY"] = OPENAI_API_TOKEN

4.2、加载数据,构建索引

从维基百科(Wikipedia)获取Vincent van Gogh的文本内容,并将这些文本内容保存到本地文件中,最后构建一个索引以便后续的数据检索。

from pathlib import Path
import requests

wiki_titles = [
    "Vincent van Gogh",
]


data_path = Path("data_wiki")

for title in wiki_titles:
    response = requests.get(
        "https://en.wikipedia.org/w/api.php",
        params={
            "action": "query",
            "format": "json",
            "titles": title,
            "prop": "extracts",
            "explaintext": True,
        },
    ).json()
    page = next(iter(response["query"]["pages"].values()))
    wiki_text = page["extract"]

    if not data_path.exists():
        Path.mkdir(data_path)

    with open(data_path / f"{title}.txt", "w") as fp:
        fp.write(wiki_text)
# 加载文档
documents = SimpleDirectoryReader("./data_wiki/").load_data()
# 构建索引
index = VectorStoreIndex.from_documents(
    documents,
)

五、检索与 RankLLM 重排序流程

  1. 准备检索器和重排序器

在开始检索流程之前,首先需要准备两个关键组件:检索器(Retriever)和重排序器(Reranker)。检索器负责从大量文档中快速筛选出与查询相关的候选文档集合。常见的检索器包括基于词频的BM25算法、基于神经网络的SPLADE++ ED和RepLLaMA等。这些检索器可以是无监督的、监督的、稀疏的、密集的,或者是它们的混合形式。重排序器则进一步优化检索结果,通过深入理解文档内容和用户查询意图,对候选文档进行精细排序。

  1. 对给定的搜索查询进行检索,不加重排序

用户发起搜索查询后,检索器首先在文档集合中进行初步检索,生成一个未经排序的候选文档列表。这一步骤不涉及任何形式的排序,目的是尽可能广泛地覆盖与查询相关的文档,为后续的重排序提供原材料。

  1. 使用 RankZephyr 进行重排序后的搜索查询检索

接下来,利用 RankZephyr 对初步检索得到的候选文档列表进行重排序。RankZephyr 是一种基于开源大型语言模型(LLM)的重排序工具,它通过零样本学习(zero-shot learning)的方式,无需特定任务的训练数据即可执行重排序任务。RankZephyr通过指令微调(instruction fine-tuning)来学习如何根据相关性对文档进行排序,能够根据归一化折扣累积增益(nDCG)等检索指标优化文档排序。

  1. 使用 RankVicuna 进行重排序后的搜索查询检索

为了进一步提升检索效果,可以采用 RankVicuna 对 RankZephyr 的输出结果进行二次重排序。RankVicuna 是另一种基于开源LLM的重排序工具,它在 RankZephyr 的基础上进一步优化,通过多阶段的重排序策略(progressive reranking)来迭代改进排序结果。RankVicuna 通过引入变量窗口大小和随机输入顺序的训练,增强了模型对于不同重排序场景的适应性和鲁棒性。

通过上述流程,RankLLM 能够有效地结合检索器的快速筛选能力和重排序器的深度理解能力,为用户提供更加精准和相关的搜索结果。

from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core import QueryBundle
from llama_index.postprocessor.rankLLM_rerank import RankLLMRerank

import pandas as pd
from IPython.display import display, HTML


def get_retrieved_nodes(
    query_str,
    vector_top_k=10,
    reranker_top_n=3,
    with_reranker=False,
    with_retrieval=False,
    model="zephyr",
):
    query_bundle = QueryBundle(query_str)
    # 配置检索器
    retriever = VectorIndexRetriever(
        index=index,
        similarity_top_k=vector_top_k,
    )
    retrieved_nodes = retriever.retrieve(query_bundle)

    if with_reranker:
        # 配置reranker
        reranker = RankLLMRerank(
            top_n=reranker_top_n, with_retrieval=with_retrieval, model=model
        )
        retrieved_nodes = reranker.postprocess_nodes(
            retrieved_nodes, query_bundle
        )

    return retrieved_nodes


def pretty_print(df):
    return display(HTML(df.to_html().replace("\\n", "")))


def visualize_retrieved_nodes(nodes) -> None:
    result_dicts = []
    for node in nodes:
        result_dict = {"Score": node.score, "Text": node.node.get_text()}
        result_dicts.append(result_dict)

    pretty_print(pd.DataFrame(result_dicts))

不加重排序的检索前三结果:

预期结果显示:

经过梵高的多次恳求,高更于10月23日抵达阿尔勒,并于11月两人一起作画。高更在他的《向日葵画家》中描绘了梵高。

new_nodes = get_retrieved_nodes(
    "Which date did Paul Gauguin arrive in Arles?",
    vector_top_k=3,
    with_reranker=False,
    model="zephyr",
)

visualize_retrieved_nodes(new_nodes)

正确的结果在未重排序时排名第三。

使用 RankZephyr 重排序前 10 结果并返回前 3:

new_nodes = get_retrieved_nodes(
    "Which date did Paul Gauguin arrive in Arles?",
    vector_top_k=10,
    reranker_top_n=3,
    with_reranker=True,
    with_retrieval=False,
    model="zephyr",
)

visualize_retrieved_nodes(new_nodes)

在 RankZephyr 重排序后,正确的结果升至第一位。

使用 RankVicuna 重排序前 10 结果并返回前 3:

new_nodes = get_retrieved_nodes(
    "Which date did Paul Gauguin arrive in Arles?",
    vector_top_k=10,
    reranker_top_n=3,
    with_reranker=True,
    with_retrieval=False,
    model="vicuna",
)

visualize_retrieved_nodes(new_nodes)

在 RankVicuna 重排序后,正确的结果同样位居第一位。

六、总结

RankLLM是一种创新的重排序方法,它利用了大型语言模型的能力来改进信息检索的结果。通过零样本学习和指令微调,RankLLM能够在不需要特定任务训练数据的情况下,有效地对文档列表进行重新排序。这种方法不仅提高了检索结果的相关性和准确性,而且由于其开源性质,还增加了研究的可重复性和模型的可访问性。RankLLM的引入为解决RAG架构中的一些关键挑战提供了新的可能性,为未来的信息检索和文本生成任务开辟了新的道路。

七、References

[1]. RankLLM Github:https://github.com/castorini/rank_llm

[2]. Pyserini: https://github.com/castorini/pyserini

[3]. Ronak Pradeep, Sahel Sharifymoghaddam, Jimmy Lin, R. (2023). RankZephyr: Effective and Robust Zero-Shot Listwise Reranking is a Breeze: https://arxiv.org/abs/2312.02724

[利用RankLLM Reranker优化信息检索:RankVicuna与RankZephyr的应用解析] RankLLM致力于通过对大规模语言模型(LLM)进行微调来提升信息检索的效果。其核心功能为重排序器,能够基于质量和相关性对检索结果进行智能排序。RankVicuna和RankZephyr是该体系中两款值得注意的开源模型。通过结合使用RankLLM的开源模型和FAISS等工具,开发者可以有效提高文本数据的检索质量。RankLLM官方文档Langchain 文档FAISS简介。 阅读详情

相关推荐

本地部署Deepseek R1,并利用本地知识库创建RAG

巧用 Ollama,本地部署 DeepSeek R1 构建智能聊天新体验。

ai_tech_talk的博客 2489

(超详细)AI大模型部署安装,傻瓜式安装配置步骤,解决一切问题

Rerankers是Github上支持rerank模型本地化的一个开源项目,支持不同类型的rerank模型,比如transformer-based, API-based,RankGTP等。我理解transformer-based cross-encoder类型的模型是主流,所以后续采用的也是这种。我了解有限,建议参考github项目文档了解更全面的信息。

大模型研究中心 1万+

anaconda安装-超详细版

文章目录一、anaconda安装1.1 anaconda安装地址1.2 安装详细步骤检验安装是否成功更改conda源(后续安装第三方库可以加快速度) 一、anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。装anaconda,就不需要单独装python了。 anaconda优点: 1、anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便,而p

in546的博客 25万+

让RAG更进一步的利器:教你使用两种出色的Rerank排序模型

有意思的是,这里的前两名的排名结果刚好和未经过Rerank之前的排名相反!简单的说,Rerank就是对检索出来的多个chunks(或者nodes)列表进行重新排序,使得其排名与用户输入问题的相关性更匹配,使得更相关、更准确的chunk排名更靠前,从而在 LLM生成时能够被优先考虑以提高输出质量。• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

m0_63171455的博客 1万+

【Unity Animation 2D】从零到一:骨骼绑定与IK动画实战指南

本文详细介绍了Unity中2D骨骼绑定与IK动画的实战流程,从角色素材准备、骨骼系统创建到权重绘制和IK设置,逐步指导开发者掌握2D动画制作技巧。通过反向动力学(IK)技术,实现更自然的角色动画效果,适用于游戏开发和动画制作。

weixin_30430677的博客 370

从string一词感受从字母象形到语义生成的底层逻辑

从词源上看,个人认为,soft一词的含义主要来自于“柔软水滑或柔软光滑”这样的含义,是从这样的含义中逐渐窄化,最终主要用来指“柔软”之意,而光滑、水滑这样的含义或语义形象最终被淡化,所以,soft如果符合首字母象形原则,那么它主要的来源形象,应当是【水】,也就是说,soft一词和smooth(a.光滑的)、ski(滑雪)/skate(滑冰)、slip(滑倒)/slippers(拖鞋)、slide(滑动)是相通的,并最终和sea(海)、sweat(汗/汗水)这一类和水一直相关的单词也相通。

nshkfhwr的博客 1269

RAG-重排序策略

通过重排序策略对初始检索的候选文档重新打分排序,将最相关的内容提升到前列,从而提升大模型的上下文质量。

m0_59163425的博客 411

【Cadence】Virtuoso@LayoutXL 差分电路版图镜像同步技巧详解

本文详细介绍了在Cadence Virtuoso LayoutXL中实现差分电路版图镜像同步的技巧,包括核心需求、环境配置、分步操作指南及高级技巧。通过使用LayoutXL的Group功能,工程师可以高效保持差分电路的对称性,提升版图迭代效率,确保高速信号处理的稳定性。特别适用于深亚微米工艺下的差分放大器设计。

weixin_29215391的博客 323

【AI模型】——RAG检索优化

本文系统介绍了RAG检索优化的核心技术,涵盖混合检索(关键词+向量)、查询构建(Text2SQL/元数据过滤/Cypher)、查询重构、检索进阶三大方向——重排序(RRF/RankLLM/Cross-Encoder/ColBERT)、压缩(提取式/生成式/概念式)及校正(CRAG),并附Milvus、LangChain、LlamaIndex的实现示例与代码框架。

庄小焱 1045

计算机考研复试面试常问问题 数据结构篇(下)

计算机考研复试面试常问问题 数据结构篇(下) 使用前需知(拒绝白嫖,如果对你有帮助,你只需点个赞就行): 注意:有人在闲鱼上盗卖我的资料,而且还有很多同学买了,请各位擦亮双眼,我是整理出来免费分享给大家的! 大家请多点赞和评论,这样后面的同学更容易百度到,不至于被人盗卖,我就不加水印影响大家使用了! 第一次整理,度不好控制,有不好的地方希望大家理解,后面可能会改进,造福今年之后的同学们! ...

程序员宝藏的博客 1万+

AutoDock Vina实战:从零开始完成分子对接(附7VU6案例详解)

本文提供了一份详细的AutoDock Vina分子对接实战指南,以SARS-CoV-2 3CL蛋白酶(PDB ID: 7VU6)为例,从零开始手把手教学。内容涵盖软件安装、环境配置、受体与配体文件准备、对接参数设置,以及结果分析与可视化解读,旨在帮助计算生物学与药物发现领域的新手快速掌握这一核心技能。

ooo22的博客 535

探索高效文档重排名:RankLLM 开源项目详解

探索高效文档重排名:RankLLM 开源项目详解 在信息爆炸的时代,如何快速准确地找到所需的信息变得至关重要。为此,我们引荐一个名为 RankLLM 的开源项目,它提供了一套强大的提示解码器,专为兼容 FastChat 的开源大语言模型(如 Vicuna 和 Zephyr)设计。RankLLM 不仅能够提升搜索结果的排序质量,还支持多种重排名方法和模型,旨在优化用户体验。 项目介绍 RankLLM...

gitblog_00090的博客 563

MATLAB与ROS联合仿真——实例程序搭建思路

MATLAB与ROS联合仿真——实例程序搭建思路

慕羽★的博客 5228

RankLLM:开源大语言模型驱动的文档重排序利器

RankLLM:开源大语言模型驱动的文档重排序利器 项目介绍 RankLLM 是一个专注于文档重排序的开源项目,提供了一系列基于点对点模型(如 monoT5)和列表对点模型(如 RankGPT 变体)的文档重排序工具。这些模型不仅兼容 FastChat 支持的开源大语言模型(如 Vicuna、Zephyr 等),还支持 vLLM。RankLLM 的代码部分借鉴了 RankGPT、PyGaggle ...

gitblog_00906的博客 1112

全能媒体工具深度测评(下篇一):AI图文生成+全能解压+图片去文字,一键搞定素材精修

解压50多种格式,文生图,图生图

cs821984831的博客 40

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Ollama配置qwen3模型,但不支持rerank模型的解决方案

本文介绍如何在Dify中结合Ollama(运行qwen3:8b模型)与BGE-Reranker实现检索结果重排序。核心方案包括:1)通过Docker独立部署BGE-Reranker服务;2)在Dify中配置Rerank模型并关联知识库;3)在工作流中集成重排序功能。同时提供替代方案,建议使用Xinference统一管理LLM和Rerank模型,简化部署流程。该方法可有效提升基于qwen3的知识检索质量。

Code Captain的专栏 3558

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

基于decoder-only LLM 的embeddings:LLM2Vec、Echo embeddings、PromptEOL、E5-mistral-7b-instruct、Sgpt等

基于decoder-only LLM得到embedding的方法:LLM2Vec、Echo embeddings、PromptEOL、E5-mistral-7b-instruct、Sgpt、RepLLaMA 、cpt-text、UDEVER

beingstrong的博客 2752

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

使用RankLLM为文本检索提供优化的重排序

在信息检索系统中,通过构建向量检索器可以有效地从大量文档中提取相关信息。然而,这种方法的结果排序可能不够精确,这时引入重排序器(Reranker)即可优化结果。RankLLM的重排序器专门针对开放源代码的LLM进行了微调,拥有出色的性能。

jkgSFS的博客 621

在AI应用中使用RankLLM进行高效重排序

在现代的信息检索系统中,如何有效地对结果进行重排序以提高用户满意度是一项关键任务。RankLLM作为一种基于大型语言模型(LLM)的解决方案,提供了一整套开源的列表重排序器,专门针对任务进行微调,如RankVicuna和RankZephyr。在这篇文章中,我们将通过一个具体的例子,展示如何使用RankLLM进行高效的文档重排序,并将其应用于实际的查询回答(QA)系统中。

bBADAS的博客 505

使用RankLLM进行文档重排序以增强信息检索的精准度

RankLLM提供了一套专注于使用开源大语言模型(LLMs)进行列表重排序的工具,其中包括RankVicuna和RankZephyr。这些模型是为任务专门微调的,旨在提高信息检索的效果。本文将重点介绍如何使用RankLLM和Langchain进行文档检索和重排序,以便在问答系统中提升答案的相关性和精准度。

vaidfl的博客 348

使用RankLLM进行高效的文档重排序:如何提升信息检索的准确性

RankLLM提供了一种灵活且高效的方式来提升文档检索的准确性。通过结合使用开源LLM和重排序策略,RankLLM能显著提升搜索结果质量。建议读者进一步探索Langchain官方文档和RankLLM的GitHub资源。

qq_29929123的博客 483

使用RankLLM进行文档重新排序

对于大型语言模型(LLM)而言,精细调优(fine-tuning)是实现具体任务效果优化的常用方法。RankLLM提供了一套基于LLM的listwise reranker,可以通过对LLM的调整来提高文档排序的准确性。这些rerankers特别适用于开放源代码的语言模型。

srudfktuffk的博客 625

57 LlamaIndex 检索器模式详解(各种检索器模式的选择)

default: 使用embedding: 使用llm: 使用llm: 使用embedding: 使用通过本文的介绍,你应该对 LlamaIndex 中不同索引类型的检索器模式有了清晰的了解。根据你的具体需求选择合适的检索器模式,可以大大提高数据检索的效率和准确性。希望这些信息对你在使用 LlamaIndex 时有所帮助!如果你有任何问题或需要进一步的帮助,请随时在评论区留言。

xycxycooo的博客 747

ollama和RAG的本地运行

继上周刚刚入手的RAG,这周继续沿用上周的思想模块,做了一个这样已读乱回的这个样子,还请有大佬帮忙指教。参考的是GitHub上的。然后,流程基本和上周一致,下面给出全部代码和示例。3、给大家看看结果哈,纯属是已读乱回,我要哭死!1、刚做的时候是没有向量库的,我们用这个代码。2、做完向量库入库后,用如下代码。下面给出每个模块代码。1、文件读取工具模块。4、rerank模块。

weixin_52454379的博客 1413

LLM之RAG实战(五十六)| Ollama部署下载Qwen3-Embedding向量模型和Qwen3-Reranker重排模型

参考文献:https://blog.youkuaiyun.com/qq363685855/article/details/148512248之前分享过。本文将分享如何使用ollama来部署这些模型。

wshzd的博客 3099
上一篇: 特定领域 RAG 新突破:LlamaPack 实现 RAFT 论文方法
下一篇: RAGFlow:基于OCR和文档解析的下一代 RAG 引擎
技术狂潮AI
博客等级 码龄3年 1282粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

技术狂潮AI

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

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

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

打赏作者

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

抵扣说明:

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

余额充值