提高文档检索精度:利用LangChain和MMR优化向量数据库

LangChain 向量数据库使用多重查询提高文档检索精确度

向量数据库多重查询精确度优化

  1. 嵌入模型选择与优化

    • 使用性能更强的嵌入模型,如OpenAI的text-embedding-3或Cohere嵌入
    • 针对您的特定领域数据微调嵌入模型
  2. 查询向量处理优化

    • 实现查询向量增强(Query Vector Augmentation)
    • 使用多维度嵌入表示同一查询
  3. 相似度度量调整

    • 切换到更适合精确匹配的相似度算法(如余弦相似度、点积)
    • 动态调整相似度阈值

代码示例

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)

向量数据库特有的精确度优化技术

  1. 混合检索策略

    # 创建混合检索器 - 针对精确性
    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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI Agent首席体验官

您的打赏是我继续创作的动力!

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

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

打赏作者

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

抵扣说明:

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

余额充值