快速入门
重排序是根据某些标准对项目列表进行重新排列的过程。在搜索场景中,重排序用于根据特定标准对搜索引擎返回的搜索结果进行重新排序。当搜索结果的初始排序不尽如人意,或用户提供了可用于改进搜索结果排序的附加信息时,这一技术尤为有用。
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内置了以下重新排序器:
- Cohere Reranker
- 交叉编码器重排序器
- ColBERT 重排序器
- OpenAI 重新排序器
- 线性组合重排序器
- Jina Reranker
- AnswerDotAI 重排序器
- 互逆排名融合重排序器
- VoyageAI 重排序器
创建自定义重排序器
LanceDB 还允许您通过扩展基础 Reranker 类来创建自定义重新排序器。自定义重新排序器应实现 rerank 方法,该方法接收搜索结果列表并返回重新排序后的搜索结果列表。更多详细信息请参阅 创建自定义重新排序器 部分。