作者:來自 Elastic?Serena Chou?及?Max Hniebergall
了解 Cohere reranking,如何將 Cohere 的 Rerank 3 模型與 Elasticsearch 的 open inference API 一起使用,以及 Elastic 在語義 reranking 方面的路線圖。
注:原文在 2024 年 4 月發布。在文中提到的 retrievers 檢索器早已經在后續的版本中發布。
Elasticsearch 原生集成了業界領先的生成式 AI 工具和服務提供商。你可以查看我們的網絡研討會,了解如何超越 RAG 基礎知識,或如何構建可用于生產的 Elastic 向量數據庫應用。
要為你的使用場景構建最佳搜索解決方案,現在就開始免費云試用,或者在本地機器上嘗試 Elastic。
Elasticsearch Open Inference API 新增對 Cohere 的 Rerank 3 模型支持
Cohere 的 Rerank 3 模型(rerank-english-v3.0
)現已通過其 Rerank 端點提供,而 Elasticsearch 是唯一在 Cohere Rerank 3 發布中集成支持的向量數據庫,已通過其開放 Inference API 無縫支持該模型。
簡而言之,什么是 reranking(重排序)?
Reranker 會對現有向量搜索或關鍵詞搜索系統返回的 “前 n 個結果” 進行語義增強,不需要更換模型或更改數據索引,就能顯著提升這些結果的相關性,使其更適合作為上下文傳遞給大語言模型(LLMs)。
Elastic 最近與 Cohere 合作,使 Elasticsearch 開發者能輕松使用 Cohere 的 embeddings(在 Elasticsearch 8.13 和 Serverless 中支持)。將 Cohere 的 rerank 能力引入其中,是對結果精細優化的自然演進。
Cohere Rerank 3 優勢:
-
可直接集成到現有 Elasticsearch 檢索流程中,無需大改代碼。
-
支持將來自任何第三方模型的向量 embedding 與 Elastic 一起使用。
-
在 Elastic 強大的向量數據庫和混合搜索能力(hybrid search)支持下,Rerank 3 能進一步提升檢索結果質量。
Elastic 的混合搜索方法
在實施 RAG( Retrieval Augmented Generation )時,檢索和重排序的策略是客戶用來支撐 LLMs 并獲得準確結果的關鍵優化。多年來,客戶一直信任 Elastic 來處理他們的私有數據,并能夠利用多種第一階段的檢索算法(例如 BM25 /關鍵詞、稠密和稀疏向量檢索)。更重要的是,大多數真實世界的搜索用例都受益于混合搜索,而我們從 Elasticsearch 8.9 起就已支持這一功能。
對于中間階段的重排序,我們也提供對 Learning To Rank 和查詢重評分的原生支持。在本次演示中,我們將重點介紹 Cohere 的最后階段重排序功能,并將在后續的博客中介紹 Elastic 的中間階段重排序能力。
Cohere 的重排序方法
Cohere 的新 Rerank 模型在測試中表現出色。Cohere 報告指出,重排序模型在處理較長上下文時尤其有效。在為密集向量檢索準備文檔時,由于模型的 token 限制,進行分塊是必須的。然而,使用 Cohere 的重排序方法時,基于整個文檔上下文而非某一具體分塊內容,可以獲得顯著的效果提升。Rerank 支持 4k token 限制,從而能輸入更多上下文,充分發揮該模型在 Elasticsearch 搜索系統中帶來的相關性優勢。
(i) 基于 BEIR 基準的通用檢索;準確率以 nDCG@10 衡量
(ii) 基于 6 個常見代碼基準的代碼檢索;準確率以 nDCG@10 衡量
(iii) 基于 7 個常見基準的長上下文檢索;準確率以 nDCG@10 衡量
(iv) 基于 4 個常見基準的半結構化(JSON)檢索;準確率以 nDCG@10 衡量
如果你對如何使用 LangChain 和 LlamaIndex 進行分塊感興趣,我們在 Search Labs 和開源倉庫中提供了聊天應用參考代碼、集成等內容。或者,你也可以利用 Elastic 的段落檢索功能,并通過 ingest pipelines 進行分塊。
用 Elasticsearch 和 Cohere 構建 RAG 實現
現在你已經大致了解了這些功能的使用方法,接下來我們進入一個用 Elasticsearch 和 Cohere 構建 RAG 實現的示例。
你需要一個 Cohere 賬號,并對 Cohere Rerank 端點有一定了解。如果你打算使用 Cohere 最新的生成模型 Command R+,請熟悉 Chat 端點。
在 Kibana 中,你可以使用控制臺輸入這些 Elasticsearch 的操作步驟,即使沒有設置 IDE 也沒問題。如果你更喜歡使用語言客戶端,可以參考提供的指南。
Elasticsearch 向量數據庫
在之前的公告中,我們提供了一些入門步驟,幫你開始使用 Elasticsearch 向量數據庫。你可以查看如何導入示例 books 目錄,并使用 Cohere 的 Embed 功能生成向量,詳情請閱讀公告。或者,如果你愿意,我們也提供了教程和 Jupyter 筆記本,幫助你開始這一過程。
Cohere 重新排序
以下部分假設你已經導入了數據并執行了第一次搜索。這將讓你了解第一次密集向量檢索的結果排序情況。
上一次公告結束時,針對示例 books 目錄執行了一個查詢,查詢字符串為 “Snow”,返回了以下按相關度降序排列的結果。
{"took": 201,"timed_out": false,"_shards": {"total": 3,"successful": 3,"skipped": 0,"failed": 0},"hits": {"total": {"value": 6,"relation": "eq"},"max_score": 0.80008936,"hits": [{"_index": "cohere-embeddings","_id": "3VAixI4Bi8x57NL3O03c","_score": 0.80008936,"_source": {"name": "Snow Crash","author": "Neal Stephenson"}},{"_index": "cohere-embeddings","_id": "4FAixI4Bi8x57NL3O03c","_score": 0.6495671,"_source": {"name": "Fahrenheit 451","author": "Ray Bradbury"}},{"_index": "cohere-embeddings","_id": "31AixI4Bi8x57NL3O03c","_score": 0.62768984,"_source": {"name": "1984","author": "George Orwell"}},{"_index": "cohere-embeddings","_id": "4VAixI4Bi8x57NL3O03c","_score": 0.6197722,"_source": {"name": "Brave New World","author": "Aldous Huxley"}},{"_index": "cohere-embeddings","_id": "3lAixI4Bi8x57NL3O03c","_score": 0.61449933,"_source": {"name": "Revelation Space","author": "Alastair Reynolds"}},{"_index": "cohere-embeddings","_id": "4lAixI4Bi8x57NL3O03c","_score": 0.59593034,"_source": {"name": "The Handmaid's Tale","author": "Margaret Atwood"}}]}}
接下來,你需要通過指定 Rerank 3 模型和 API key 來配置 Cohere Rerank 的推理端點。
PUT _inference/rerank/cohere_rerank?{"service": "cohere","service_settings": {"api_key": <API-KEY>,?"model_id": "rerank-english-v3.0"},"task_settings": {"top_n": 10,"return_documents": true}}
一旦指定了這個推理端點,你就可以通過傳入用于檢索的原始查詢 “Snow” 和我們剛用 kNN 搜索檢索到的文檔來重新排序結果。記住,你也可以對任何混合搜索查詢重復這個過程!
為了演示這一點,同時仍然使用開發控制臺,我們會對上面的 JSON 響應做一些清理。
從 JSON 響應中取出 hits,構造如下的 JSON 作為輸入,然后 POST 到我們剛配置的 cohere_rerank 端點。
POST _inference/rerank/cohere_rerank{"input": ["Snow Crash", "Fahrenheit 451", "1984", "Brave New World","Revelation Space", "The Handmaid's Tale"],?"query": "Snow"?}
就是這樣,你的結果已經使用 Cohere 的 Rerank 3 模型完成了重新排序。
我們用來演示這些功能的 books 語料庫沒有包含大量的段落,且是一個相對簡單的示例。在為你自己的搜索體驗實現這些功能時,建議你遵循 Cohere 的方法,用第一批檢索結果中完整文檔的上下文來填充輸入,而不僅僅是文檔中的某個檢索塊。
Elasticsearch 加速語義重排序和檢索器的路線圖
在 Elasticsearch 即將發布的版本中,我們將繼續構建對中間和最終階段重排序器的無縫支持。我們的最終目標是讓開發者能夠使用語義重排序來提升任何搜索的結果,無論是 BM25、密集向量檢索、稀疏向量檢索,還是與混合檢索的組合。為實現這一體驗,我們正在查詢 DSL 中構建一個稱為檢索器(retrievers)的概念。檢索器將提供一種直觀的方式來執行語義重排序,并且能讓你直接在 Elasticsearch 堆棧中執行通過開放推理 API 配置的內容,而無需在應用邏輯中執行。
將檢索器應用到之前的密集向量示例中,重排序體驗會有如下不同:
(i) Elastic 的路線圖:通過增加未來自動對索引數據進行分塊的功能,簡化了索引步驟。
(ii) Elastic 的路線圖:kNN 檢索器指定了作為推理端點配置的模型(此處為 Cohere 的 Rerank 3)。
(iii) Cohere 的路線圖:將結果數據發送到 Cohere 的 Command R+ 之間的步驟,將受益于一個名為 extractive snippets 的計劃功能,該功能將允許用戶向 Command R+ 模型返回重排序文檔中的相關片段。
這是我們在 books 語料庫上執行的原始 kNN 密集向量搜索,用于返回查詢 “Snow” 的第一批結果。
GET cohere-embeddings/_search{"knn": {"field": "name_embedding","query_vector_builder": {"text_embedding": {"model_id": "cohere_embeddings","model_text": "Snow"}},"k": 10,"num_candidates": 100},"_source": ["name","author"]}
正如這篇博客所解釋的,檢索文檔并將正確的響應傳遞給推理端點需要幾個步驟。在本文發布時,這些邏輯應由你的應用代碼處理。
未來,retrievers 可以配置為在單次 API 調用中直接使用 Cohere rerank 推理端點。
{"retriever": {"text_similarity_rank": {"retriever": {"knn": {"field": "name_embedding","query_vector_builder": {"text_embedding": {"model_id": "cohere_embeddings","model_text": "Snow"}},"k": 10,"num_candidates": 100}},"field": "name","window_size": 10,"inference_id": "cohere_rerank","inference_text": "Snow"}},"_source": ["name","author"]}
在這種情況下,kNN 查詢與我原始的完全相同,但在傳入 rerank 端點之前清理響應將不再是必要步驟。retriever 會知道已執行 kNN 查詢,并能無縫地使用配置中指定的 Cohere rerank 推理端點進行重新排序。這個原則同樣適用于任何搜索,包括 BM25、dense、sparse 和 hybrid。
retrievers 作為實現優秀語義重排序的關鍵,將成為我們當前和近期的產品路線圖重點。
Cohere 的生成模型能力
現在你已經有了一組經過語義重排序的文檔,可以用來為你選擇的大型語言模型提供基礎!我們推薦 Cohere 最新的生成模型 Command R+。在構建完整的 RAG 流程時,你可以在應用程序代碼中輕松向 Cohere 的 Chat API 發送用戶查詢和重排序后的文檔。
下面是一個如何在你的 Python 應用代碼中實現的示例:
response = co.chat(message=query, documents=documents, model='command-r-plus')source_documents = []for citation in response.citations:for document_id in citation.document_ids:if document_id not in source_documents:source_documents.append(document_id)print(f"Query: {query}")print(f"Response: {response.text}")print("Sources:")for document in response.documents:if document['id'] in source_documents:print(f"{document['title']}: {document['text']}")
與 Cohere 的集成已在 Serverless 提供,并且很快將在 Elastic Cloud 或你的筆記本電腦或自管理環境中的版本化 Elasticsearch 版本中可用。我們建議你使用 Elastic Python 客戶端 v0.2.0 來連接你的 Serverless 項目開始使用!
祝你重排序順利!
原文:https://www.elastic.co/search-labs/blog/elasticsearch-cohere-rerank