当前位置: 首页 > news >正文

知识库检索方法详解:稀疏 vs 稠密;《第一篇》

📚 知识库检索方法详解:稀疏 vs 稠密


🔸 一、稀疏检索(Sparse Retrieval)

1. TF-IDF

  • 原理:Term Frequency-Inverse Document Frequency,衡量词语在文档中出现的重要程度。
    • TF:词频
    • IDF:逆文档频率(常见词权重低)
    • 最终打分 = TF × IDF
  • 使用方式
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
tfidf_matrix = vectorizer.fit_transform(docs)

2. BM25

  • 原理:改进版 TF-IDF,引入词频饱和惩罚和文档长度归一,提升效果。
    • 每个词项的得分与词频、文档长度挂钩
  • 使用方式(用 rank_bm25):
from rank_bm25 import BM25Okapi
tokenized_corpus = [doc.split() for doc in docs]
bm25 = BM25Okapi(tokenized_corpus)
scores = bm25.get_scores(query.split())

3. 工具:Elasticsearch / Lucene / Solr

  • 原理:基于倒排索引(Inverted Index)结构,支持高效的关键词检索
  • 使用方式
    • 建立索引:上传文档 JSON 到 Elasticsearch
    • 搜索:发送 query DSL 请求(GET)

🔹 二、稠密检索(Dense Retrieval)

1. DPR(Dense Passage Retrieval)

  • 原理:用双塔结构的 BERT 模型分别编码 query 与 passage,计算向量余弦相似度。
  • 使用方式
from transformers import DPRQuestionEncoder, DPRContextEncoder, DPRQuestionEncoderTokenizer, DPRContextEncoderTokenizerctx_model = DPRContextEncoder.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
ctx_tokenizer = DPRContextEncoderTokenizer.from_pretrained("facebook/dpr-ctx_encoder-single-nq-base")
ctx_embedding = ctx_model(**ctx_tokenizer("some passage", return_tensors="pt")).pooler_output

2. SimCSE / BGE / E5

  • 原理:将文本转为高质量语义向量,支持余弦相似度检索。
  • 使用方式
from sentence_transformers import SentenceTransformer
model = SentenceTransformer("BAAI/bge-small-en")
embeddings = model.encode(docs)

3. ColBERT

  • 原理:Late interaction,通过 token-level 相似度计算提高精度。
    • query 和 document 保留所有 token 的向量
    • 使用 MaxSim 聚合

4. 工具:Faiss / Milvus / Qdrant

  • Faiss(Facebook):适合本地运行的大规模向量检索
  • Milvus / Qdrant / Weaviate:适合云端向量存储 + REST API 检索
import faiss
index = faiss.IndexFlatL2(embedding_dim)
index.add(embeddings)
D, I = index.search(query_embedding, k=5)

✅ 三、总结对比

类别方法原理简介工具平台
稀疏检索TF-IDF基于词频和逆文档频率加权Lucene, Elastic
稀疏检索BM25改进 TF-IDF,引入长度归一RankBM25
稠密检索DPRBERT 双塔结构Faiss, Milvus
稠密检索SimCSE/BGE/E5编码器转语义向量SentenceTransf.
稠密检索ColBERTtoken 粒度匹配,Late InteractionColBERT Faiss

相关文章:

  • Temporal Fusion Transformer(TFT)扩散模型时间序列预测模型
  • 【Pandas】pandas DataFrame rename
  • Java 中执行命令并使用指定配置文件的最佳实践
  • 在 Dify 项目中的 Celery:异步任务的实现与集成
  • xmake的简易学习
  • C++11:unique_ptr的基本用法、使用场景和最佳使用指南
  • day32-系统编程之 进程间通信IPC
  • 蓝绿部署解析
  • 转战web3远程工作的英语学习的路线规划
  • Windows下将Nginx设置注册安装为服务方法!
  • 半导体行业-研发设计管理数字化转型案例分享
  • C/S医学影像系统源码,全院一体化PACS系统源码,实现全院检查预约和信息共享互通
  • CppCon 2014 学习: Less Code = More Software
  • 春雪食品×MTC AI助手:创新驱动再升级,效率革命正当时!
  • python中可以对数组使用的所有方法
  • 基于VLC的Unity视频播放器(四)
  • qt控制台程序与qt窗口程序在读取数据库中文字段的差异!!巨坑
  • 大模型 提示模板 设计
  • 腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布
  • 大模型赋能:金融智能革命中的特征工程新纪元
  • 盐城网站建设制作工作室/信阳搜索引擎优化
  • 高佣联盟做成网站怎么做/google推广公司
  • 网站管理工作流程/产品推广
  • 自建微网站服务器/电商平台营销策划方案
  • 网站建设与开发开题报告/网站seo案例
  • JAVA网站开发ssm/企业邮箱如何申请注册