RAG 的预检索 PreRetrieval 优化之 QueryExpansion

提高搜索结果的相关性。通过扩大原始查询范围以包含相关术语、同义词或替代短语,可以增加检索更全面信息的机会

这在初始查询可能太窄或太具体的情况下特别有用。Query Expansion 允许您的系统在检索步骤中撒下更广泛的网,确保您的搜索捕获所有相关信息

QueryExpansion-20250116090331

MultiQuery

对原始 prompt 进行扩展,确保多样性和覆盖性,但是可能偏离初衷,此时需要原始 prompt 更大的权重

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#import Packages  
import os
from langchain_community.vectorstores import Chroma
from langchain_community.embeddings.sentence_transformer import SentenceTransformerEmbeddings
from langchain_openai import ChatOpenAI
from langchain.retrievers.multi_query import MultiQueryRetriever
from dotenv import load_dotenv
load_dotenv()

## initiate Vectordb here i have used persist vectordb which means i am loading the locally stored vectordb.
vectordb_path = "Vector_db"
embeddings = SentenceTransformerEmbeddings(model_name="all-MiniLM-L6-v2")
vectordb = Chroma(persist_directory=vectordb_path,
embedding_function=embeddings)
vectorstore_retriever = vectordb.as_retriever(
search_kwargs={
"k": 1
}
)
llm = ChatOpenAI(temperature=0)

## Here we use MultiQueryRetriever from langcahin which will generate multiple queriesand retriever data accordingly.
retriever_from_llm = MultiQueryRetriever.from_llm(
retriever=vectordb.as_retriever(), llm=llm
)

question = "How to store the data into VectorDB?"

unique_docs = retriever_from_llm.invoke(question)
len(unique_docs)

## Output
['What are the best practices for indexing and storing data in a vector database?',
, 'How can I optimize my data storage for efficient querying in a vector-based database?'
, 'What are the key considerations for designing a scalable and efficient data storage system using vector databases?']

SubQuery

通过分解和规划复杂产生多个子问题。明确地,可以采用最少到最多提示 LtM 将复杂问题分解为一系列更简单的子问题。根据原始问题的结构,生成的子问题可以并行执行,或者依次。

另一种方法涉及使用验证链(CoVe)。扩展的查询经历通过 LLM 验证,达到减少 hallu cinations 的效果。下图是 CoVe 通过 llm 对原始的 query 进行扩写,然后将原始 query 与 llm 输出拼接到一起,再进行检索

QueryExpansion-20250116090332

RAG-Fusion

RAG-Fusion 首先使用大型语言模型生成多个派生查询。此步骤拓宽了对初始用户输入的理解,确保从各个角度对查询主题进行彻底探索。接下来,向量搜索会识别原始查询和衍生查询的相关文档,从而编译各种相关信息。

文档检索后,倒数秩融合 (RRF) 算法会根据文档的相关性对文档进行重新排序。然后将这些文件组合起来,形成一个全面且相关的信息源。

在最后阶段,此组合数据集和所有查询都由大型语言模型处理。该模型综合了这些输入,以创建清晰且与上下文相关的响应。通过这种系统化的方法,RAG-Fusion 提高了响应的准确性和全面性,显著提高了用户查询的答案质量。

QueryExpansion-20250116090332-1