前面已经介绍过RAG中ReRanker的优化技巧和使用方法,我们趁这个机会,来对ReRanker进行一次全面的总结与梳理。
无论你是刚刚接触RAG,还是已经在项目中有所应用,这篇文章都将帮助你系统了解ReRanker的原理、常见实现方式及其在实际场景中的优化应用。希望这次总结能为你带来新的启发,助力你的技术提升。
重新排名是根据某些标准对项目列表重新排序的过程。在搜索上下文中,重新排名用于根据某些标准对搜索引擎返回的搜索结果进行重新排序。当搜索结果的初始排名不令人满意或者当用户提供了可用于改进搜索结果的排名的附加信息时,这可能很有用。
下面是几种常见的Reranker的实现方式,具体如下图片所示:
下面,我们通过LanceDB向量数据库来介绍上述Reranker的实现方式。LanceDB 是一个用于人工智能的开源矢量数据库,旨在存储、管理、查询和检索大规模多模式数据的嵌入。
LanceDB 的核心是用 Rust 编写的,并构建在Lance之上,Lance 是一种开源列式数据格式,专为高性能 ML 工作负载和快速随机访问而设计。
对于向量和 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.query("hello").rerank(reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.query("hello", query_type="fts").rerank(reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text")``result = tbl.query("hello", query_type="hybrid").rerank(reranker).to_list()
一、Multi-vector reranking 多向量重排序
大多数重新排序器支持基于多个向量的重新排序。要基于多个向量重新排序,您可以将向量列表传递给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)
二、Cohere Reranker 一致性重排序器
支持的查询类型:混合、矢量、FTS(全文检索:Full-text Search)。
Cohere 是一家专注于企业人工智能的加拿大跨国科技公司,专门研究大型语言模型。
Cohere 由 Aidan Gomez、Ivan Zhu 和 Nick Frosst 于 2019 年创立,总部位于多伦多和旧金山,在帕洛阿尔托、伦敦和纽约市设有办事处。
原生的Cohere Rerank实现方式如下:
import cohere``co = cohere.Client(api_key="<YOUR API KEY>")`` ``query = "What is the capital of the United States?"``docs = [` `"Carson City is the capital city of the American state of Nevada. At the 2010 United States Census, Carson City had a population of 55,274.",` `"The Commonwealth of the Northern Mariana Islands is a group of islands in the Pacific Ocean that are a political division controlled by the United States. Its capital is Saipan.",` `"Charlotte Amalie is the capital and largest city of the United States Virgin Islands. It has about 20,000 people. The city is on the island of Saint Thomas.",` `"Washington, D.C. (also known as simply Washington or D.C., and officially as the District of Columbia) is the capital of the United States. It is a federal district. The President of the USA and many major national government offices are in the territory. This makes it the political center of the United States of America.",` `"Capital punishment (the death penalty) has existed in the United States since before the United States was a country. As of 2017, capital punishment is legal in 30 of the 50 states. The federal government (including the United States military) also uses capital punishment."]``results = co.rerank(model="rerank-english-v3.0", query=query, documents=docs, top_n=5, return_documents=True)
LanceDB中,通过将CohereReranker()传递给rerank()方法来使用此重新排序器。请注意,您需要设置COHERE_API_KEY环境变量或传递api_key参数才能使用此重新排序器。
import numpy``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = CohereReranker(api_key="key")`` ``# Run vector search with a reranker``result = tbl.search("hello").rerank(reranker=reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
三、Cross Encoder Reranker 交叉编码器重排序
在交叉编码器架构中,模型的输入始终由编码器联合处理的数据对(例如,两个句子或文档)组成。这使得模型能够更有效地捕获输入序列之间的交互和关系。编码器通常由多层神经网络单元组成,例如变压器或循环神经网络 (RNN),它们将输入序列中的信息编码为固定大小的表示。
此重新排序器使用句子转换器中的交叉编码器模型对搜索结果进行重新排序。您可以通过将CrossEncoderReranker()传递给rerank()方法来使用此重新排序器。
import numpy``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import CrossEncoderReranker`` ``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = CrossEncoderReranker()`` ``# Run vector search with a reranker``result = tbl.search("hello").rerank(reranker=reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
四、ColBERT Reranker ColBERT 重排序器
ColBERT(https://github.com/stanford-futuredata/ColBERT)是一种快速、准确的检索模型,可在数十毫秒内对大型文本集合进行基于 BERT 的可扩展搜索。尤其是最后一部分非常重要。
RAG 本身并不是一项快速技术。所有LLM调用都会引入延迟。由于再次重新排序需要调用重新排序模型,因此引入了额外的延迟。 ColBERT 是可用的最快的重新排名模型之一,可以减少这种摩擦点。
ColBERT 依赖于细粒度的上下文后期交互:它将每个段落编码为令牌级嵌入矩阵(如上图蓝色所示)。然后在搜索时,它将每个查询嵌入到另一个矩阵中(以绿色显示),并使用可扩展向量相似度 ( MaxSim ) 运算符有效地查找与查询上下文匹配的段落。
此重新排序器使用 ColBERT 模型对搜索结果进行重新排序。您可以通过将ColbertReranker()传递给rerank()方法来使用此重新排序器。
import numpy``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import ColbertReranker`` ``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = ColbertReranker()`` ``# Run vector search with a reranker``result = tbl.search("hello").rerank(reranker=reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
五、OpenAI Reranker OpenAI 重新排序器
此重新排序器使用 OpenAI 聊天模型对搜索结果进行重新排序。您可以通过将OpenAI()传递给rerank()方法来使用此重新排序器。
此重新排序器是实验性的。 OpenAI 没有专门的重新排名模型,因此我们使用聊天模型进行重新排名。
import numpy``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import OpenaiReranker`` ``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = OpenaiReranker()`` ``# Run vector search with a reranker``result = tbl.search("hello").rerank(reranker=reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
六、Linear Combination Reranker 线性组合重排序器
这是 LanceDB 混合搜索使用的默认重新排序器。它使用分数的线性组合来组合语义和全文搜索的结果。可以指定线性组合的权重。默认为0.7,即语义搜索权重为70%,全文搜索权重为30%。
import numpy``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import LinearCombinationReranker`` ``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = LinearCombinationReranker()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
七、Jina Reranker 吉娜·重新排序
Jina 重新排序器 v2 ( jina-reranker-v2-base-multilingual )是一个基于变压器的模型,已针对文本重新排序任务进行了微调,文本重新排序任务是许多信息检索系统中的关键组成部分。它是一个交叉编码器模型,将查询和文档对作为输入,并输出指示文档与查询的相关性的分数。该模型在大型查询文档对数据集上进行训练,能够高精度地对多种语言的文档进行重新排名。
与最先进的 reranker 模型(包括之前发布的jina-reranker-v1-base-en相比, Jina Reranker v2模型在一系列针对文本检索、多语言能力、功能的基准测试中表现出了竞争力。调用感知和文本到 SQL 感知的重新排序以及代码检索任务。
此重新排序器使用Jina API 对搜索结果进行重新排序。您可以通过将JinaReranker()传递给rerank()方法来使用此重新排序器。请注意,您需要设置JINA_API_KEY环境变量或传递api_key参数才能使用此重新排序器。
import os``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import JinaReranker`` ``os.environ['JINA_API_KEY'] = "jina_*"`` `` ``embedder = get_registry().get("jina").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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = JinaReranker(api_key="key")`` ``# Run vector search with a reranker``result = tbl.search("hello").rerank(reranker=reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
八、AnswerDotAI Rerankers AnswerDotAI 重新排名
此集成允许使用answersdotai 的重新排名器对搜索结果重新排名。 Rerankers一个轻量级、低依赖性、统一的 API,可使用所有常见的重新排名和交叉编码器模型。
import numpy``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import AnswerdotaiRerankers`` ``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = AnswerdotaiRerankers()`` ``# Run vector search with a reranker``result = tbl.search("hello").rerank(reranker=reranker).to_list()` ` ``# Run FTS search with a reranker``result = tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
九、Reciprocal Rank Fusion Reranker 倒数排名融合重排名器
倒数排名融合 (RRF) 是一种算法,用于评估多个先前排名结果的搜索分数,以生成统一的结果集。每当有两个或多个查询并行执行时,就会使用 RRF。每个查询都会生成一个排名结果集,并且 RRF 用于将排名合并并同质化为单个结果集,并在查询响应中返回。始终使用 RRF 的场景示例包括混合搜索和同时执行的多个向量查询。
参考论文:https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf
Lancedb使用倒数排名融合 (RRF) 是一种通过利用文档的位置/排名来评估搜索分数的算法,代码示例如下:
import numpy``import lancedb``from lancedb.embeddings import get_registry``from lancedb.pydantic import LanceModel, Vector``from lancedb.rerankers import RRFReranker`` ``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", schema=Schema, mode="overwrite")``tbl.add(data)``reranker = RRFReranker()`` ``# Run hybrid search with a reranker``tbl.create_fts_index("text", replace=True)``result = tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
以上便是多种Reranker在Lancedb中的应用,其实不局限在Lancedb,这些方法不依赖任何向量数据库,只要在RAG应用中,都可以使用。
以上便是多种 Reranker 在 Lancedb 中的应用介绍,实际上这些方法并不仅限于 Lancedb。
Reranker 的原理和实现方式并不依赖于任何特定的向量数据库,因而无论你使用的是哪种数据库或检索系统,在任何 RAG 应用场景中,都可以灵活地集成和使用这些优化技术。
如何学习大模型 AI ?
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
- 大模型 AI 能干什么?
- 大模型是怎样获得「智能」的?
- 用好 AI 的核心心法
- 大模型应用业务架构
- 大模型应用技术架构
- 代码示例:向 GPT-3.5 灌入新知识
- 提示工程的意义和核心思想
- Prompt 典型构成
- 指令调优方法论
- 思维链和思维树
- Prompt 攻击和防范
- …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
- 为什么要做 RAG
- 搭建一个简单的 ChatPDF
- 检索的基础概念
- 什么是向量表示(Embeddings)
- 向量数据库与向量检索
- 基于向量检索的 RAG
- 搭建 RAG 系统的扩展知识
- 混合检索与 RAG-Fusion 简介
- 向量模型本地部署
- …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
- 为什么要做 RAG
- 什么是模型
- 什么是模型训练
- 求解器 & 损失函数简介
- 小实验2:手写一个简单的神经网络并训练它
- 什么是训练/预训练/微调/轻量化微调
- Transformer结构简介
- 轻量化微调
- 实验数据集的构建
- …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
- 硬件选型
- 带你了解全球大模型
- 使用国产大模型服务
- 搭建 OpenAI 代理
- 热身:基于阿里云 PAI 部署 Stable Diffusion
- 在本地计算机运行大模型
- 大模型的私有化部署
- 基于 vLLM 部署大模型
- 案例:如何优雅地在阿里云私有部署开源大模型
- 部署一套开源 LLM 项目
- 内容安全
- 互联网信息服务算法备案
- …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。