AI Agent开发实战⑭|检索策略深度对比:向量检索 vs BM25 vs 混合检索实测选型

BM25检索与向量检索 本文对比分析了BM25检索和向量检索的技术原理、适用场景及优缺点。BM25基于词频统计,适用于关键词匹配和短文本检索,计算高效但无法处理语义;向量检索通过深度学习映射语义空间,适用于长文本和跨语言检索,但计算复杂。实际应用中可结合两者优势,采用混合检索方法提升性能。BM25多用于传统搜索引擎,向量检索则适用于智能问答等语义理解场景。 阅读详情

AI Agent开发实战⑭|检索策略深度对比:向量检索 vs BM25 vs 混合检索实测选型

检索策略选对了,RAG效果能提升20%。但很多人只知道向量检索,完全忽略了关键词检索的价值。本文实测三种策略在不同场景下的表现,告诉你什么时候该用哪种。

一、三种检索策略的本质差异

向量检索:语义相似度
    └── "研发投入占比" ≈ "R&D费用占总预算的比例"
        → 理解含义,但不擅长精确匹配

BM25关键词检索:词频匹配
    └── "研发投入" 精确包含 "研发" 和 "投入"
        → 精确匹配,但不理解同义词

混合检索:语义+精确的融合
    └── 向量检索召回 + BM25精确匹配 + 分数融合
        → 取长补短,效果最佳但计算量翻倍

二、核心算法解析

2.1 向量检索

import numpy as np

def vector_search(query_vec: np.ndarray, doc_vecs: np.ndarray, k: int = 10) -> list:
    """
    向量检索:余弦相似度
    
    query_vec: 查询向量 (dim,)
    doc_vecs: 文档向量矩阵 (n_docs, dim)
    k: 返回top-k
    """
    
    # 归一化
    query_norm = query_vec / np.linalg.norm(query_vec)
    doc_norms = doc_vecs / np.linalg.norm(doc_vecs, axis=1, keepdims=True)
    
    # 余弦相似度 = 点积(归一化后)
    similarities = np.dot(doc_norms, query_norm)
    
    # 排序
    top_k_indices = np.argsort(similarities)[::-1][:k]
    
    return [(idx, similarities[idx]) for idx in top_k_indices]

优势:

  • 语义理解能力强
  • 同义词、近义词能召回

劣势:

  • 精确匹配差(“Python 3.11"可能匹配到"Python 3.10”)
  • 长尾词效果差(专业术语、人名、型号)

2.2 BM25关键词检索

import math
from collections import Counter

class BM25:
    """BM25算法实现"""
    
    def __init__(self, k1: float = 1.5, b: float = 0.75):
        self.k1 = k1
        self.b = b
        self.doc_freqs = {}  # 词 → 文档频率
        self.doc_lens = []   # 各文档长度
        self.avgdl = 0       # 平均文档长度
        self.N = 0           # 文档总数
    
    def fit(self, corpus: list[list[str]]):
        """训练:统计文档频率和长度"""
        
        self.N = len(corpus)
        self.doc_lens = [len(doc) for doc in corpus]
        self.avgdl = sum(self.doc_lens) / self.N
        
        # 统计文档频率
        for doc in corpus:
            for word in set(doc):
                self.doc_freqs[word] = self.doc_freqs.get(word, 0) + 1
    
    def search(self, query: list[str], corpus: list[list[str]], k: int = 10) -> list:
        """检索"""
        
        scores = []
        
        for doc_idx, doc in enumerate(corpus):
            score = self._score(query, doc, doc_idx)
            scores.append((doc_idx, score))
        
        # 排序
        scores.sort(key=lambda x: x[1], reverse=True)
        return scores[:k]
    
    def _score(self, query: list[str], doc: list[str], doc_idx: int) -> float:
        """计算单个文档的BM25分数"""
        
        score = 0.0
        doc_len = self.doc_lens[doc_idx]
        doc_term_freqs = Counter(doc)
        
        for term in query:
            if term not in self.doc_freqs:
                continue
            
            # IDF
            df = self.doc_freqs[term]
            idf = math.log((self.N - df + 0.5) / (df + 0.5) + 1)
            
            # TF
            tf = doc_term_freqs.get(term, 0)
            tf_norm = (tf * (self.k1 + 1)) / (
                tf + self.k1 * (1 - self.b + self.b * doc_len / self.avgdl)
            )
            
            score += idf * tf_norm
        
        return score


# 使用示例
bm25 = BM25()
bm25.fit(tokenized_corpus)  # corpus是分词后的文档列表
results = bm25.search(tokenized_query, tokenized_corpus)

优势:

  • 精确匹配能力强
  • 长尾词效果好
  • 计算速度快

劣势:

  • 无语义理解
  • 同义词无法召回

2.3 混合检索

class HybridRetriever:
    """混合检索:向量 + BM25"""
    
    def __init__(self, vector_store, bm25_index, alpha: float = 0.7):
        """
        alpha: 向量检索权重(0-1)
               alpha=1.0:纯向量检索
               alpha=0.0:纯BM25
               alpha=0.7:向量70% + BM25 30%(推荐)
        """
        self.vector_store = vector_store
        self.bm25 = bm25_index
        self.alpha = alpha
    
    def search(self, query: str, query_vec: np.ndarray, k: int = 10) -> list:
        """混合检索"""
        
        # 向量检索
        vec_results = self.vector_store.search(query_vec, k=k*2)
        
        # BM25检索
        bm25_results = self.bm25.search(query, k=k*2)
        
        # 分数融合:Reciprocal Rank Fusion (RRF)
        fused_scores = {}
        
        for rank, (doc_id, score) in enumerate(vec_results):
            fused_scores[doc_id] = fused_scores.get(doc_id, 0) + \
                                   self.alpha / (60 + rank)
        
        for rank, (doc_id, score) in enumerate(bm25_results):
            fused_scores[doc_id] = fused_scores.get(doc_id, 0) + \
                                   (1 - self.alpha) / (60 + rank)
        
        # 排序
        sorted_results = sorted(fused_scores.items(), 
                                key=lambda x: x[1], reverse=True)
        
        return sorted_results[:k]

三、实测对比

3.1 测试设置

测试数据:
- 文档:10000篇中文技术文档
- 查询:200个测试查询
- 评估:Recall@5, Recall@10, MRR@10

查询类型分布:
- 语义型查询:50个("如何提高代码质量")
- 精确型查询:50个("Python 3.11新特性")
- 混合型查询:100个("Docker容器内存限制配置")

3.2 整体效果对比

检索策略Recall@5Recall@10MRR@10
向量检索71.2%82.3%0.64
BM2568.4%79.8%0.61
混合检索(alpha=0.5)78.3%87.6%0.72
混合检索(alpha=0.7)80.1%89.2%0.75

混合检索比单一策略提升9-12%。

3.3 分查询类型效果

语义型查询(“如何提高代码质量”):

策略Recall@5分析
向量检索84.2%理解"提高"、"质量"语义
BM2562.1%“提高”、"质量"太通用
混合检索85.6%主要靠向量检索

精确型查询(“Python 3.11新特性”):

策略Recall@5分析
向量检索58.3%3.11被当作数字,语义模糊
BM2582.7%精确匹配"Python 3.11"
混合检索81.9%主要靠BM25

混合型查询(“Docker容器内存限制配置”):

策略Recall@5分析
向量检索71.2%语义理解"Docker"、“内存限制”
BM2574.3%精确匹配"Docker"、“内存”
混合检索83.5%两者互补

3.4 性能对比

策略单次检索耗时内存占用实现复杂度
向量检索12-25ms高(向量存储)中
BM253-8ms低(倒排索引)低
混合检索18-35ms高(两者都要)高

混合检索耗时约等于两次检索之和,但效果提升显著。

四、alpha参数调优

混合检索的alpha参数决定向量检索和BM25的权重:

# 测试不同alpha值
alpha_values = [0.0, 0.3, 0.5, 0.7, 1.0]

for alpha in alpha_values:
    retriever = HybridRetriever(vector_store, bm25, alpha=alpha)
    results = evaluate(retriever, test_queries)
    print(f"alpha={alpha}: Recall@5={results['recall@5']:.1%}")

# 结果
# alpha=0.0 (纯BM25): 68.4%
# alpha=0.3: 76.2%
# alpha=0.5: 78.3%
# alpha=0.7: 80.1%  ← 最优
# alpha=1.0 (纯向量): 71.2%

最优alpha=0.6-0.8,具体取决于查询类型分布。

五、选型决策

第一步:查询类型分析
    │
    ├── 语义型查询为主(问答、咨询)
    │   → 【向量检索】或【混合检索 alpha=0.8】
    │
    ├── 精确型查询为主(搜索型号、人名、术语)
    │   → 【BM25】或【混合检索 alpha=0.3】
    │
    └── 混合型查询(既有语义又有精确)
        → 【混合检索 alpha=0.7】

第二步:性能要求
    │
    ├── 检索延迟要求<10ms
    │   → 【BM25】
    │
    ├── 检索延迟要求<30ms
    │   → 【向量检索】或【混合检索】
    │
    └── 对延迟不敏感
        → 【混合检索】(效果最好)

六、实战代码:自适应混合检索

class AdaptiveHybridRetriever:
    """自适应混合检索:根据查询特征自动调整alpha"""
    
    def __init__(self, vector_store, bm25):
        self.vector_store = vector_store
        self.bm25 = bm25
    
    def analyze_query(self, query: str) -> dict:
        """分析查询特征"""
        
        # 检测是否包含精确匹配特征
        has_version = bool(re.search(r'\d+\.\d+', query))  # 版本号
        has_model = bool(re.search(r'[A-Z]+\-\d+', query))  # 型号
        has_entity = bool(re.search(r'[A-Z][a-z]+', query))  # 英文实体
        
        # 检测语义特征
        semantic_keywords = ["如何", "怎么", "为什么", "什么是", "方法", "技巧"]
        has_semantic = any(kw in query for kw in semantic_keywords)
        
        return {
            "has_precise": has_version or has_model or has_entity,
            "has_semantic": has_semantic,
            "alpha": self._decide_alpha(has_precise, has_semantic)
        }
    
    def _decide_alpha(self, has_precise: bool, has_semantic: bool) -> float:
        """决定alpha值"""
        
        if has_precise and has_semantic:
            return 0.5  # 混合型
        elif has_precise:
            return 0.3  # 精确型,降低向量权重
        elif has_semantic:
            return 0.8  # 语义型,提高向量权重
        else:
            return 0.7  # 默认
    
    def search(self, query: str, query_vec: np.ndarray, k: int = 10) -> list:
        """自适应检索"""
        
        analysis = self.analyze_query(query)
        alpha = analysis["alpha"]
        
        # 混合检索
        retriever = HybridRetriever(self.vector_store, self.bm25, alpha)
        return retriever.search(query, query_vec, k)


# 使用示例
retriever = AdaptiveHybridRetriever(vector_store, bm25)

# 语义型查询 → alpha=0.8
results = retriever.search("如何提高代码质量", query_vec)

# 精确型查询 → alpha=0.3
results = retriever.search("Python 3.11新特性", query_vec)

# 混合型查询 → alpha=0.5
results = retriever.search("Docker容器内存限制配置", query_vec)

七、总结

场景推荐策略alphaRecall@5
语义型查询为主混合检索0.885%
精确型查询为主混合检索0.382%
混合型查询混合检索0.5-0.783%
性能优先BM25-68%
简单实现向量检索-71%

混合检索是当前最优解,比单一策略提升9-12%。

下篇预告:「Rerank重排序实战:Cohere vs ColBERT vs 本地模型的实测对比」——为什么Rerank能让检索效果再提升20%?


需要完整检索代码和测试数据集的同学,可以看我主页的付费资源专栏。

有问题欢迎评论区留言,大家一起讨论!

RAG黄金三角:“BM25+向量+重排”三板斧榨干检索精度 "BM25广度检索 + 向量深度检索 + 交叉编码器重排"这一黄金组合,通过分层筛选、各司其职的方式,系统性地解决了单一检索模型的局限性。第一阶段的广度召回,保证了信息的全面性。第二阶段的语义过滤,语义检索保证候选集的相关性。第三阶段的精准重排,确保了最终输入给LLM的上下文质量。虽然该方法增加了系统的复杂度和计算成本,但对于追求高精度、高可靠性的RAG应用场景(如企业知识库问答、金融信息分析等),这些投入是完全值得的。 阅读详情

相关推荐

大模型RAG实战|混合检索:BM25检索+向量检索的LlamaIndex实现

目前,大模型RAG系统中普遍采用混合检索来提升检索准确性。针对要回答的问题,同时通过。

mama19971023的博客 6311

混合检索到底是什么?为什么大模型 RAG 系统离不开它?一文讲透 BM25、向量检索与 Hybrid Search

混合检索之所以重要,是因为真实业务里的搜索问题非常复杂。用户有时输入的是精确关键词,比如错误码、字段名、接口名、合同条款。用户有时输入的是自然语言,比如“为什么登录不上”“系统太慢怎么办”“怎么优化知识库问答”。关键词检索擅长精确匹配,但语义理解弱。向量检索擅长语义理解,但精确命中不一定稳定。混合检索把两者结合起来,再通过融合排序、Rerank、元数据过滤等方式,提升最终检索质量。对于大模型 RAG 系统来说,混合检索不是锦上添花,而是非常重要的基础能力。

闵浮龙的博客 779

两种主流检索技术:BM25(基于关键词匹配)和向量相似度检索

摘要: 检索层是信息检索系统的核心模块,支持文本匹配、知识库检索和RAG(检索增强生成)等应用。主流技术包括BM25(基于关键词匹配)和向量相似度检索(基于语义向量)。 BM25作为无监督模型,通过词频统计和逆文档频率(IDF)计算文档相关性,适合短文本关键词检索(如电商搜索),具有高效、可解释性强的特点,但无法处理语义和长查询。示例代码展示了BM25的中文实现流程。 对比:BM25依赖关键词匹配,轻量快速;向量检索捕捉语义但需预训练模型。两者适用于不同场景,如传统搜索(BM25)或语义敏感任务(向量检索)

Cachel Wood的博客 1296

美团Agent岗二面:向量检索和关键词检索有什么区别?

面试官:请你介绍一下向量检索和关键词检索的区别?

m0_59164520的博客 394

【SeedLab】Packet Sniffing and Spoofing Lab

本节实验要求:借助Scapy库,实现网络流量的捕获与伪造。

cold_windx的博客 4515

SDIO协议

SDIO协议1 概述  SDIO,全称:Secure Digital Input and Output ,即安全数字输入输出接口。2 特点①与多媒体卡系统规格书版本4.2全兼容。支持三种不同的数据总线模式:1位(默认)、4位和8位。②与较早的多媒体卡系统规格版本全兼容(向前兼容)。③与SD存储卡规格版本2.0全兼容。④与SD I/O卡规格版本2.0全兼容:支持两种不同的数据总线模式:1位(默认)和4

Let the development board fly! 3万+

BM25 向量检索 混合检索

yy的博客 158

DeepMD-kit描述子机制解析:从原子坐标到不变性特征

本文深入解析DeepMD-kit描述子机制,详细阐述如何将原子坐标转换为具有平移、旋转和排列不变性的特征表示。探讨了se_e2_a、se_e3等不同描述子的适用场景及性能优化技巧,帮助读者掌握这一关键技术在分子模拟中的应用实践。

weixin_42520661的博客 340

【AI应用开发】什么是混合检索(Hybrid Search)?向量检索 + BM25 关键词检索,适用场景与 RRF 融合原理

混合检索就是让 BM25 和向量检索"组队干活",用 RRF 按排名融合结果——两路都认可的排前面,只有一路认可的排后面。简单、有效、不需要调参,是当前 RAG 系统检索层的首选方案。

孙启超 400

电源完整性必看!用SIwave提取PDN阻抗曲线的3个关键设置与常见报错解决

本文深入探讨了在SIwave中进行电源完整性(PI)仿真时,提取PDN阻抗曲线的三个核心设置要点。重点解析了端口阻抗设为0.1欧姆的物理意义与SYZ参数仿真中的阻抗匹配原则,并提供了针对常见收敛性问题和模型误差的实战排查思路,旨在帮助工程师获得更精确可靠的仿真结果,为去耦电容优化提供依据。

b9c0d的博客 352

YOLOv12改进策略【独家融合改进】| MobileNetV4+BiFPN,轻松实现降参涨点,适用专栏内所有的骨干替换

可扩展的高效物体检测BiFPN(加权双向特征金字塔网络)

Limiiiing的博客 980

稠密向量检索、稀疏向量检索、BM25检索三者对比

稠密向量检索,也称为Dense Retrieval,是一种基于深度学习的检索方法。它通过将文本转换为高维空间中的连续向量表示,然后使用向量相似度(如余弦相似度)来检索相关文档。这种方法的优势在于能够捕捉到文本的深层次语义信息,从而提高检索的相关性。技术实现:通常使用预训练的语言模型(如BERT、T5)对文档和查询进行编码,得到稠密的向量表示。应用场景:适用于需要理解复杂语义的场景,如自然语言理解、智能问答系统等。性能表现:在小规模数据集上表现优异,但在大规模数据集上可能会遇到性能瓶颈。

Angus 1万+

Allegro16.6详细教程(二)

3-D Viewer,可以直接在allegro中看到board file的3-D顯示效果。3-D Viewer對於PCB Editor Products,只有環境變數中的OpenGL顯示功能開啟後才有效,而對於APD/SiP是無效的。2.3-D viewer是在一個獨立的視窗中打開的。3-D environment環境支援多種顯示內容的過濾,取景視角和顯示效果的選項,透過遊標可以直接控制放大,移動,翻轉等操作。

axingxiansen的博客 1920

纯向量检索不够用?混合检索配置指南:BM25+向量融合实战

RAG与站内搜索的召回阶段,常常会出现答案明明在知识库中、向量检索却无法命中的情况。很多人归咎于embedding模型不够强,但更常见的原因是纯向量检索只看语义相似,难以处理专有名词、型号、否定表达和精确条件约束。BM25这类稀疏检索擅长字面精确匹配,与稠密向量检索形成天然互补。将两者结合为混合检索(Hybrid Search),通过RRF或加权融合统一分数域,可显著提升Hit@5和MRR。Elasticsearch、Weaviate、Milvus等均有落地路径,配合字段加权、窗口参数和过滤条件,能让RAG

weixin_34094282的博客 202

工艺边与定位孔设计经验规则总结

工艺边是在SMT焊接时,为了PCB和导轨接触预留的PCB边。工艺边和PCB的接触部分一般需要开槽,或者使用邮票孔,以方便后期去除工艺边。

fydar的博客 1985

【AI智能体】Spring AI Tool 从使用到实战详解

Spring AI Tool

congge 5866

AutoRAG检索节点深度解析:BM25与向量数据库混合检索

在RAG(Retrieval-Augmented Generation)系统中,检索质量直接影响最终生成效果。传统的关键词检索(如BM25)和现代的语义检索(向量数据库)各有优劣:BM25擅长精确匹配关键词,而向量检索更理解语义相似性。AutoRAG的混合检索技术通过智能融合这两种方法,实现了1+1>2的效果。 本文将深入解析AutoRAG中BM25与向量数据库混合检索的实现原理、配置方法和最佳...

gitblog_00180的博客 984

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

RAG混合检索实战:BM25+向量检索的分数融合方案详解(附RRF算法解析)

本文分享了在教育AI项目中从纯向量检索切换到混合检索的技术实践。针对纯向量检索在短查询匹配、精确关键词检索和新词覆盖上的不足,作者提出BM25+向量双路召回方案,通过ElasticSearch实现精确匹配,结合向量检索的语义理解能力。重点介绍了RRF算法在分数融合中的优势,以及Rerank精排的优化效果。实践表明,混合检索显著提升了Top-3召回准确率,特别是在精确查询和短查询场景下表现突出。文章建议生产环境优先采用混合检索方案,并提供了具体的技术选型和配置要点。

码农飞哥 1429

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

混合检索:BM25检索+向量检索的LlamaIndex实现

本文介绍了使用LlamaIndex框架实现混合检索的方法,通过结合向量语义检索和BM25全文检索提升RAG系统效果。作者详细讲解了如何构建中文BM25检索器,并实现基于权重和分布特性的融合处理。同时探讨了多种融合算法,并指出未来可探索3路召回混合检索。相关代码已在开源项目ThinkRAG中发布,该项目是基于LlamaIndex的本地化RAG系统。

青鸟飞鱼 1050

【AI系列】BM25 与向量检索

作为 TF-IDF 的进阶版本,BM25 在考虑词频(TF)和逆文档频率(IDF)的基础上,引入了文档长度归一化因子,使其成为弹性且高效的检索算法。方面,向量检索明显占优。例如,对于查询"预防感冒的方法",BM25 可能严格匹配这些关键词,而向量检索能关联到包含"增强免疫力"、"接种流感疫苗"等不同表述但语义相关的文档。从早期的布尔检索到概率模型,再到如今的深度学习应用,检索技术经历了显著的演进。其中,BM25 作为传统检索算法的代表,与基于神经网络的向量检索方法构成了当前信息检索领域的两大主流技术路线。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 2533

混合检索架构:为什么BM25与向量搜索缺一不可

这两种技术代表了信息检索的两个维度:**精确性 vs. 语义性**。真正的智能搜索系统需要同时掌握"字面"和"深意"。

lihuayong的专栏 326

视频隐私脱敏工程化:CSRT/KCF追踪算法在本地推理中的实现与边界

在短视频内容合规审查中,动态遮挡(Dynamic Masking)是高频且高耗时的环节。传统手动关键帧打码不仅效率低下,且在目标快速移动或遮挡时极易出现遮罩漂移。本文从计算机视觉工程角度,解析基于CSRT与KCF算法的目标追踪方案在视频隐私处理中的技术路径、性能权衡及落地实践。

Mysssone的博客 255

我用 GPUWorks 在 M1 Pro 上搭了个发票识别原型

公司里经常要看电子发票。我想先做个小原型:把 PDF 发给一个自己部署的图文模型,让它提取发票类型、日期、交易双方和金额,再把结果交给同事核对。这个原型不用先接财务系统,先看看从部署到调用要走多少步,模型返回的内容能不能帮上忙。

鸽芷咕的博客 2万+

【从零理解 Spring AI · 12】MCP 的两种角色:做客户端还是做服务端

上一篇讲了 MCP 的概念:标准协议、三大角色、M+N 替代 M×N。

nice_lcj520的博客 517

AI Agent之核心框架

A: 显式 Thought 有三类价值:可解释性(便于人类审计)、可调试性(定位哪一步选错工具)、学习信号(可做监督微调或评估中间步骤质量)。ReAct 把推理与 可执行行动 绑定,每一步行动后都有 真实 Observation 反馈,从而用工具结果约束生成,降低闭卷幻觉。做完不等于结束——还要 评估做得好不好,把 教训 记下来,下次 带着教训重试,反思作为 记忆,影响后续尝试的策略。工作流程:Action → Evaluation → Reflection → Retry。A: 普通 CoT 只在。

剑雨巍巍的博客 215

ChatGPT、Perplexity、Gemini 与 AI Overviews 引用对比:谁的引用更可信

AI 引擎的引用机制差异很大:ChatGPT 以行内引用加 Sources 列表呈现来源,Perplexity 几乎逐句可溯源,Gemini 在回答中内嵌相关来源链接,AI Overviews 则把多源聚合答案与来源列表一起放在搜索结果顶部。本文从引用透明度、来源偏好、可干预性 3 个维度对比这 4 个引擎,并给出 GEO 的 3 点启示,帮企业在多引擎环境下提升被引用的概率。

淡然一笑 的专栏 111
上一篇: AI Agent开发实战⑬|向量数据库选型实战:Chroma vs Milvus vs Qdrant百万级数据性能对比
下一篇: AI Agent开发实战⑮|Rerank重排序实战:Cohere vs ColBERT vs 本地Cross-Encoder的实测对比
川冰ICE
博客等级 码龄18年 25粉丝 168原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

川冰ICE

不求施舍,但求真心

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

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

打赏作者

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

抵扣说明:

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

余额充值