于稀疏检索与稠密检索的混合搜索

部署运行你感兴趣的模型镜像

目的:

  1. 通过结合稀疏检索稠密检索混合检索解决基于向量检索RAG方案的暴露问题;
  2. 通过多路检索召回,提高整体RAG检索准确性和稳定性;
  3. 支持非结构化文档的知识准确检索;

优点:它同时考虑了查询与存储文档之间的语义相似性和关键字匹配度;

  1. 文本分片策略(文本特征处理)

文本分片:固定大小分块,内容感知分块,递归分块,专门分块(Markdown, html)

  • 总体策略方向:以语义为单位进行切分, 切分策略按数据集进行适配和微调
  • 文本切分常用的切割器:NLTK, SpaCy, langchian, llamaIndex;
  • 1)文档分块策略:对文档进行大小块切分(检索子块,返回父块)
  • 2)对切片文档进行相关问题生成,增强文档检索相关性(检索策略)
  • 3) 按chunk大小进行滑动窗口切分:即把文档按照chunk分成有重叠的若干段
  1. 查询转换(query transformation)策略 (搜索策略)

对用户query进行清洗和关键词抽取,由于用户query存在部分口语化的词,如停用词等,直接抽取用户中的关键词做召回是一个有效的方式。

  • queries 生成转换策略:对user query生成多个query, 单个query可能无法捕获用户感兴趣的全部范围,或者它可能太窄而无法产生全面的结果。
  • 基于规则对user query重写: 补充用户query隐含的先验知识或上下文知识
  • 基于LLM的转换对复杂语句拆分多子句并行查询,对query生成多个query
  1. 混合检索的重排与过滤算法策略(搜索策略)
  • convex combination (权重加和):
  • RRF(倒排融合算法):
  1. 多轮对话的上下文检索(搜索策略)

:基本方法:检索与用户查询相关的上下文,然后将其与内存缓冲区中的聊天历史记录一起发送给LLM, 让LLM在生成下一个答案时了解先前上下文

:聊天历史记录和最后一条消息都

  1. 响应合成策略 (回答生成策略)

-基本方法:将所有获取的上下文(>相关阈值)与查询一起连接并立即提供给LLM。

-其他响应合成策略:涉及多个LLM调用,以细化检索到的上下文并生成更好的答案:

- 1. 通过将检索到的上下文逐块发送到LLM来迭代地细化答案

- 2. 总结检索到的上下文以适应提示

- 3. 同的上下文块生成多个答案,然后将它们连接或总结

https%3A//arxiv.org/pdf/2005.11401.pdf

https%3A//arxiv.org/abs/2312.10997

GitHub - PKU-YuanGroup/ChatLaw: 中文法律大模型

GitHub - Raudaschl/rag-fusion

Response Synthesizer - LlamaIndex

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

在RAG(Retrieval-Augmented Generation)框架中,稀疏检索稠密检索是两种关键的信息检索技术,它们各自有不同的特点适用场景。 ### 稀疏检索 稀疏检索通常指的是基于关键词匹配的传统信息检索方法。在这种方法中,文档查询都被表示为词频-逆文档频率(TF-IDF)向量或其他形式的高维稀疏向量。这些向量中的大部分元素都是零,因为每个文档或查询只包含词汇表中的一小部分词语[^1]。 **特点**: - 基于词汇重合度来评估查询文档的相关性。 - 计算效率高,适合大规模数据集。 - 对于同义词语义相似性的处理能力较弱。 **使用场景**: - 当需要快速处理大量文档时,例如在早期的搜索引擎中。 - 在计算资源有限的情况下,或者对实时性能有较高要求的应用场合。 ### 稀疏检索的代码示例 ```python from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import linear_kernel # 示例文档集合 documents = ["The quick brown fox jumps over the lazy dog", "A fast brown fox leaps over a sleepy canine"] # 创建TF-IDF向量器 tfidf_vectorizer = TfidfVectorizer() # 转换文档到TF-IDF空间 tfidf_matrix = tfidf_vectorizer.fit_transform(documents) # 查询 query = "fast moving animal" # 将查询转换到相同的TF-IDF空间 query_tfidf = tfidf_vectorizer.transform([query]) # 计算查询文档之间的余弦相似度 cosine_similarities = linear_kernel(query_tfidf, tfidf_matrix).flatten() # 输出最相关的文档索引 most_relevant_document_index = cosine_similarities.argmax() ``` ### 稀疏检索稠密检索对比 | 特性 | 稀疏检索 | 稠密检索 | | --- | --- | --- | | 向量表示 | 高维且稀疏 | 低维且稠密 | | 相似度计算 | 主要依赖词汇重合 | 基于语义层面的相似性 | | 语义理解 | 较弱 | 较强 | | 计算复杂度 | 相对较低 | 相对较高 | ### 稀疏检索的扩展应用 除了传统的TF-IDF方法外,稀疏检索还可以结合其他技术来提升检索效果,比如通过生成相关问题来增强文档的可检索性,或是采用更精细的文本分片策略以更好地匹配用户的查询意图[^2]。 ### 稠密检索 稠密检索则利用深度学习模型将文本映射到一个低维的连续向量空间中,其中每个词、短语乃至整个句子都可以用一个稠密向量来表示。这种表示能够捕捉到词语间的语义关系,因此可以更准确地衡量查询文档之间的相关性。 **特点**: - 使用神经网络模型(如BERT等预训练模型)生成文本嵌入。 - 向量是低维且稠密的。 - 能够有效处理同义词上下文相关的语义变化。 **使用场景**: - 对于需要高质量语义匹配的任务,如问答系统、对话机器人等。 - 当数据集中存在大量的同义表达或者复杂的语言结构时。 ### 稠密检索的代码示例 ```python from transformers import BertTokenizer, BertModel import torch # 加载预训练的BERT模型分词器 tokenizer = BertTokenizer.from_pretrained('bert-base-uncased') model = BertModel.from_pretrained('bert-base-uncased') def get_embedding(text): # 分词并转换为token IDs inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True) # 获取最后一层隐藏状态的平均池化作为句子嵌入 with torch.no_grad(): outputs = model(**inputs) return torch.mean(outputs.last_hidden_state, dim=1).squeeze() # 示例文档集合 documents = ["The quick brown fox jumps over the lazy dog", "A fast brown fox leaps over a sleepy canine"] # 获取文档嵌入 document_embeddings = [get_embedding(doc) for doc in documents] # 查询 query = "fast moving animal" # 获取查询嵌入 query_embedding = get_embedding(query) # 计算查询文档之间的余弦相似度 cosine_similarities = [torch.nn.functional.cosine_similarity(query_embedding, doc_emb) for doc_emb in document_embeddings] # 输出最相关的文档索引 most_relevant_document_index = torch.argmax(torch.stack(cosine_similarities)) ``` ### 稀疏检索稠密检索的选择 选择稀疏检索还是稠密检索取决于具体的应用需求可用资源。如果追求更高的语义理解匹配精度,并且有足够的计算资源支持,那么稠密检索可能是更好的选择。而对于那些对速度资源消耗敏感的应用,稀疏检索可能更为合适。 ### 混合检索策略 有时为了达到最佳效果,会将稀疏检索稠密检索结合起来形成混合检索策略。这样可以在一定程度上兼顾效率准确性,同时利用两者的优势来提高整体的检索质量[^2]。 ### 文本分块策略 对于非常长的文档,直接进行检索可能会导致效率低下或效果不佳。这时可以采用文本分块策略,比如固定大小分块、内容感知分块、递归分块以及专门针对特定格式(如Markdown, HTML)的分块方法。通过这种方式,可以确保每个分块都能独立地被检索到,同时也能够保持上下文的相关性[^2]。 ### 查询转换策略 为了进一步提高检索的效果,还可以实施查询转换策略。这包括但不限于生成相关的提问、改写原始查询或是添加额外的信息以帮助检索系统更好地理解用户的意图。这样的策略有助于增加查询文档之间潜在的相关性,从而提升最终的检索结果质量。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值