跳转到内容

快速入门

重排序是根据某些标准对项目列表进行重新排列的过程。在搜索场景中,重排序用于根据特定标准对搜索引擎返回的搜索结果进行重新排序。当搜索结果的初始排序不尽如人意,或用户提供了可用于改进搜索结果排序的附加信息时,这一技术尤为有用。

LanceDB内置了一些重新排序器。LanceDB中可用的部分重新排序器包括:

重排序器 描述 支持的查询类型
LinearCombinationReranker Reranks search results based on a linear combination of FTS and vector search scores Hybrid
CohereReranker Uses cohere Reranker API to rerank results Vector, FTS, Hybrid
CrossEncoderReranker Uses a cross-encoder model to rerank search results Vector, FTS, Hybrid
ColbertReranker Uses a colbert model to rerank search results Vector, FTS, Hybrid
OpenaiReranker(Experimental) Uses OpenAI's chat model to rerank search results Vector, FTS, Hybrid
VoyageAIReranker Uses voyageai Reranker API to rerank results Vector, FTS, Hybrid

使用重新排序器

对于向量搜索和全文搜索(FTS)来说,使用重排序器是可选的。但在混合搜索场景中,重排序器是必需的。要使用重排序器,您需要先创建重排序器实例,然后将其传递给查询构建器的rerank方法:

import lancedb
from lancedb.embeddings import get_registry
from lancedb.pydantic import LanceModel, Vector
from lancedb.rerankers import CohereReranker

embedder = get_registry().get("sentence-transformers").create()
db = lancedb.connect("~/.lancedb")

class Schema(LanceModel):
    text: str = embedder.SourceField()
    vector: Vector(embedder.ndims()) = embedder.VectorField()

data = [
    {"text": "hello world"},
    {"text": "goodbye world"}
    ]
tbl = db.create_table("test", data)
reranker = CohereReranker(api_key="your_api_key")

# Run vector search with a reranker
result = tbl.search("hello").rerank(reranker).to_list() 

# Run FTS search with a reranker
result = tbl.search("hello", query_type="fts").rerank(reranker).to_list()

# Run hybrid search with a reranker
tbl.create_fts_index("text")
result = tbl.search("hello", query_type="hybrid").rerank(reranker).to_list()

多向量重排序

大多数重排序器支持基于多个向量进行重排序。要基于多个向量进行重排序,您可以将向量列表传递给rerank方法。以下是一个使用CrossEncoderReranker基于多个向量列进行重排序的示例:

from lancedb.rerankers import CrossEncoderReranker

reranker = CrossEncoderReranker()

query = "hello"

res1 = table.search(query, vector_column_name="vector").limit(3)
res2 = table.search(query, vector_column_name="text_vector").limit(3)
res3 = table.search(query, vector_column_name="meta_vector").limit(3)

reranked = reranker.rerank_multivector([res1, res2, res3],  deduplicate=True)

可用的重排序器

LanceDB内置了以下重新排序器:

创建自定义重排序器

LanceDB 还允许您通过扩展基础 Reranker 类来创建自定义重新排序器。自定义重新排序器应实现 rerank 方法,该方法接收搜索结果列表并返回重新排序后的搜索结果列表。更多详细信息请参阅 创建自定义重新排序器 部分。