LangChain 向量数据库使用多重查询提高文档检索精确度
向量数据库多重查询精确度优化
-
嵌入模型选择与优化
- 使用性能更强的嵌入模型,如OpenAI的text-embedding-3或Cohere嵌入
- 针对您的特定领域数据微调嵌入模型
-
查询向量处理优化
- 实现查询向量增强(Query Vector Augmentation)
- 使用多维度嵌入表示同一查询
-
相似度度量调整
- 切换到更适合精确匹配的相似度算法(如余弦相似度、点积)
- 动态调整相似度阈值
代码示例
from langchain.retrievers.multi_query import MultiQueryRetriever
from langchain.chat_models import ChatOpenAI
from langchain.vectorstores import Chroma
from langchain.embeddings import OpenAIEmbeddings
import numpy as np
# 使用高性能嵌入模型
embedding = OpenAIEmbeddings(model="text-embedding-3-large")
# 创建向量数据库,使用余弦相似度
vectorstore = Chroma(
embedding_function=embedding,
collection_name="your_collection",
metadata={
"hnsw:space": "cosine"} # 显式指定余弦相似度
)
# 创建精确度导向的多重查询检索器
llm = ChatOpenAI(temperature=0)
retriever = MultiQueryRetriever.from_llm(
retriever=vectorstore.as_retriever(
search_type="similarity", # 可选 similarity, similarity_score_threshold, mmr
search_kwargs={
"k": 5, # 每个查询较少的文档
"score_threshold": 0.85, # 高相似度阈值
"filter": None # 如有必要可添加元数据过滤
}
),
llm=llm,
num_queries=3 # 控制生成的查询数量
)
# 执行带有后处理的检索
def precision_focused_retrieval(query, retriever, min_score=0.85):
# 获取多重查询结果
docs = retriever.get_relevant_documents(query)
# 过滤低分结果
filtered_docs = [
doc for doc in docs
if doc.metadata.get("score", 0) >= min_score
]
# 查找结果频率(被多个子查询返回的文档更可能相关)
doc_frequencies = {
}
for doc in docs:
doc_id = hash(doc.page_content[:100]) # 简单散列作为ID
doc_frequencies[doc_id] = doc_frequencies.get(doc_id, 0) + 1
# 根据频率和分数重新排序
for doc in filtered_docs:
doc_id = hash(doc.page_content[:100])
doc.metadata["frequency"] = doc_frequencies.get(doc_id, 1)
doc.metadata["combined_score"] = doc.metadata.get("score", 0.8) * (1 + 0.1 * doc.metadata["frequency"])
# 返回重排序结果
return sorted(filtered_docs, key=lambda d: d.metadata.get("combined_score", 0), reverse=True)
向量数据库特有的精确度优化技术
-
混合检索策略
# 创建混合检索器 - 针对精确性 from langchain.retrievers import EnsembleRetriever # 向量检索器 vector_retriever = vectorstore.as_retriever(search_kwargs={ "k": 10}) # 关键词检索器(如BM25),对精确匹配更敏感 bm25_retriever = BM25Retriever.from_documents(documents) # 组合检索器,权重偏向精确匹配 hybrid_retriever = EnsembleRetriever( ret