率先实现混合搜索:使用 Elasticsearch 和 Semantic Kernel

news2025/5/24 13:47:08

作者:来自 Elastic Enrico Zimuel 及 Florian Bernd

混合搜索功能现在已在 .NET Elasticsearch Semantic Kernel 连接器中提供。阅读这篇博客文章了解如何开始使用。

Elasticsearch 已原生集成业内领先的生成式 AI 工具和服务提供商。欢迎观看我们的网络研讨会,了解如何突破 RAG 基础,或在 Elastic 向量数据库上构建可投入生产的应用程序。

为了为你的使用场景构建最佳搜索解决方案,现在就开始免费的云试用,或在本地机器上试用 Elastic 吧。


我们与 Microsoft Semantic Kernel 团队合作,在 .NET Elasticsearch Semantic Kernel 连接器中推出了混合搜索功能 —— 这是首个实现该功能的向量数据库。Microsoft Semantic Kernel 最近宣布支持混合搜索用例,这让客户可以将 Elasticsearch 用于更广泛的应用。Elasticsearch 从 8.8.0 版本起就已支持混合搜索,在本文中,我们将介绍如何将 Elasticsearch 与 Semantic Kernel 结合使用混合搜索。

你可以在这里找到支持混合搜索的最新版本 Elasticsearch Semantic Kernel 连接器。如果你还不熟悉在 .NET 中的 Semantic Kernel 集成 Elasticsearch,建议先阅读我们之前发布的这篇文章。

什么是混合搜索?

混合搜索是一种强大的信息检索策略,它将两种或以上的搜索技术结合进一个搜索算法中。一个典型的用例是将词法搜索(例如 BM25)与语义搜索(例如 kNN)结合使用。通过并行运行这两种策略,用户可以获得更相关的结果,从而整体提升答案质量(见图 1)。

图 1:混合搜索是词法搜索与语义搜索的交集

为了合并结果,我们可以使用不同的策略。Elasticsearch 中的每个查询结果都会生成一个相关文档列表,并按分数值排序。这个分数是一个浮点数,表示文档的相关性,分数越高,相关性越强。

如果我们有两个结果列表,一个来自词汇搜索,另一个来自语义搜索,那么我们该如何将它们合并?

一种策略是使用 RRF(Reciprocal Rank Fusion)算法。这个算法会使用以下方式重新计算每个文档的得分:

score = 0.0
for q in queries:
    if d in result(q):
        score += 1.0 / (k + rank(result(q), d))
return score

其中:

  • k 是一个排序常数

  • q 是查询集合中的一个查询(例如词法查询和语义查询)

  • d 是查询 q 返回结果中的一个文档

  • result(q) 是查询 q 的结果集

  • rank(result(q), d) 是文档 d 在查询 q 的结果中的排名位置

例如,假设我们运行一次混合搜索查询,目标是获取排名前 3 的重要文档。我们使用词法查询和语义查询,并设置 k = 1

词法查询的结果按顺序为:

  1. Doc4
  2. Doc3
  3. Doc2
  4. Doc1

这意味着最相关的文档是 Doc4,其次是 Doc3、Doc2 和 Doc1。

语义查询的结果按顺序为:

  1. Doc3
  2. Doc2
  3. Doc1
  4. Doc5

接下来我们可以使用之前提到的算法计算 RRF 分数。在下表中,我们分别计算了词法查询和语义查询的分数,然后将两者相加得到最终的 RRF 分数。

DocumentsLexicalSemanticRRF
Doc11/(1+4)1/(1+3)⅕ + ¼ = 0.4500
Doc21/(1+3)1/(1+2)¼ + ⅓ = 0.5833
Doc31/(1+2)1/(1+1)⅓ + ½ = 0.8333
Doc41/(1+1)0½ = 0.5
Doc501/(1+4)⅕ = 0.2

对 RRF 分数进行排序后,我们得到以下结果:

  1. Doc3
  2. Doc2
  3. Doc4
  4. Doc1
  5. Doc5

最后,排名前三的结果是:Doc3、Doc2 和 Doc4。

RRF 算法是 Semantic Kernel 中 Elasticsearch 混合搜索集成默认使用的算法。

Semantic Kernel 中的混合搜索集成

最新版本的 Elasticsearch Semantic Kernel 连接器在 ElasticsearchVectorStoreRecordCollection<TKey, TRecord> 类型中实现了全新的 IHybridSearch 接口。该接口在现有功能基础上新增了一个方法,定义如下:

HybridSearchAsync<TVector>(
    TVector vector,
    ICollection<string> keywords,
    int top,
    HybridSearchOptions<TRecord>? options = null,
    [EnumeratorCancellation] CancellationToken cancellationToken = default)

其中:

  • vector 是用于语义搜索的 TVector(使用 kNN);

  • keywords 包含一组字符串,用于 Elasticsearch 的词法搜索 terms 查询(集合中的词被视为 OR 条件);

  • top 表示返回的最大文档数;

  • options 是一些选项,比如用于向量搜索的向量属性/字段,用于词法搜索的属性/字段,或用 .NET 表达式树语法指定的额外预过滤条件;

  • cancellationToken 是用于取消异步操作的 CancellationToken;

例如,假设我们重用之前文章《如何使用 Elasticsearch 向量存储连接器进行 Microsoft Semantic Kernel AI Agent 开发》中介绍的酒店数据集。

我们可以执行一次混合搜索查询,检索包含关键词 “downtown” 或 “luxury”,并结合使用向量 {1, 2, 3} 的语义搜索,返回排名前 5 的酒店:

var results = (collection as IKeywordHybridSearch<Hotel>)
    .HybridSearchAsync(
        new float[] { 1, 2, 3 },
        ["downtown", "luxury"],
        5
    ).ToBlockingEnumerable().ToList();

如果我们想在执行混合搜索前应用过滤条件,可以使用 HybridSearchOptions。例如,假设我们只想考虑靠海滩的酒店,可以通过如下方式添加过滤器:Filter = x => x.Description.Contains("beachfront")。

var results = (collection as IKeywordHybridSearch<Hotel>)
    .HybridSearchAsync(
        new float[] { 1, 2, 3 },
        ["downtown", "luxury"],
        5,
        new HybridSearchOptions<Hotel>
        {
            Filter = x => x.Description.Contains("beachfront")
        }
     ).ToBlockingEnumerable().ToList();

这样,搜索将只考虑靠海滩的酒店,然后应用之前的混合搜索条件(提示:基于表达式树的过滤也适用于 Semantic Kernel 中的常规向量搜索)。

最近版本的 Semantic Kernel 对基于表达式树的过滤支持,是对之前过滤 API 的很大改进。目前,Elasticsearch Semantic Kernel 连接器只支持比较操作符(=、!=、<、<=、>、>=)和布尔操作符(!、&&、||)。更多操作,如 collection.Contains(),将很快实现。

针对 .NET 应用的混合搜索,结合 Elasticsearch 和 Semantic Kernel

本文介绍了如何使用 Semantic Kernel 的混合搜索功能与 Elasticsearch 集成。展示了如何结合词法搜索和语义搜索以提升检索效果。该技术可用于改进信息检索系统,例如基于检索增强生成(RAG)。此外,我们还讲解了如何使用 HybridSearchOptions 对象应用预过滤,过滤条件可用 .NET 表达式树语法表达。

虽然 Reciprocal Rank Fusion 为结合词法和语义分数的混合搜索提供了稳健的默认方案 —— 正如本博客中使用 Semantic Kernel 展示的那样,Elasticsearch 还广泛支持其他检索器样式。这包括线性检索器(Linear Retriever)等选项,允许用户在 RRF 默认之外轻松定制组合策略,实现混合方法下的搜索相关性微调。

未来,我们将继续扩展对 Semantic Kernel 的支持,集成 Elasticsearch 的最新功能。祝你混合搜索愉快!

原文:First to hybrid search: with Elasticsearch and Semantic Kernel - Elasticsearch Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2384634.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的网上租赁系统设计与实现

项目简介 本项目是基于 Spring Boot Vue 技术栈开发的 网上租赁系统。该系统通过前后端分离的架构&#xff0c;提供用户和管理员两种角色的操作权限&#xff0c;方便用户进行商品租赁、订单管理、信息查询等操作&#xff0c;同时也为管理员提供了商品管理、用户管理、订单管理…

AI浪潮下,第五消费时代的商业进化密码

解锁 AI 与第五消费时代 在时代的长河中,消费浪潮的更迭深刻地影响着商业的格局。当下,我们正处于第五消费时代,这个时代有着鲜明的特征,如老龄化、单身化趋势日益显著,社会逐渐步入低欲望、个性化与共享化并行的阶段 。随着人工智能技术的飞速发展,它在商业领域的渗透也…

Jouier 普及组十连测 R4

反思 本次比赛到时没有什么细节错误&#xff0c;不过代码思路不好所以分数也不是很高。 T1 代码思路 看题意&#xff0c;发现数据范围不大&#xff0c;直接动用码力暴力即可。 代码 #include<bits/stdc.h> using namespace std;vector<vector<int> > a(110…

bi平台是什么意思?bi平台具体有什么作用?

目录 一、BI平台是什么意思 1. 具体内涵 2. 主要构成 二、BI 平台具体有什么作用 1. 提供全面的数据洞察 2. 支持快速决策 3. 优化业务流程 4. 提升企业协作 三、BI 平台的应用场景 1. 金融行业 2. 零售行业 3. 制造行业 4. 医疗行业 总结 “每天在海量数据中反复…

Redis从入门到实战 - 原理篇

一、数据结构 1. 动态字符串SDS 我们都知道Redis中保存的key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串&#xff0c;因为C语言字符串存在很多问题&#xff1a; 获取字符串长…

26考研|高等代数:线性变换

前言 线性变换这一章节是考频较高的一部分&#xff0c;此部分涉及考点较多&#xff0c;涉及的考题也较多&#xff0c;学习线性变换时&#xff0c;应该注意搭建线性变换与矩阵之间的联系&#xff0c;掌握如何利用矩阵表示一个线性变换结构&#xff0c;同时介绍了最简单的线性变…

VSCode如何像Pycharm一样“““回车快速生成函数注释文档?如何设置文档的样式?autoDocstring如何设置自定义模板?

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 让VSCode拥有PyCharm级注释生成能力 📒🚀 实现方案🛠️ 备用方案📒 自定义注释文档格式样式 📒🔄 切换主流注释风格✨ 深度自定义模板🛠️ 类型提示与注释联动优化⚓️ 相关链接 ⚓️📖 介绍 📖 用PyCharm写P…

PCIe学习笔记(3)链路初始化和训练

PCIe学习系列往期文章 PCIe学习笔记&#xff08;1&#xff09;Hot-Plug机制 PCIe学习笔记&#xff08;2&#xff09;错误处理和AER/DPC功能 文章目录 链路训练概述Bit LockSymbol Lock (Gen1/2)Block Alignment (Gen3)Lane Polarity InversionLane ReversalLane-to-Lane De-ske…

Oracle 11g导出数据库结构和数据

第一种方法&#xff1a;Plsql 利用plsql可视化工具导出&#xff0c;首先根据步骤导出表结构&#xff1a; 工具(Tools)->导出用户对象(export user objects)。 其次导出数据表结构&#xff1a; 工具(Tools)->导出表(export Tables)->选中表->sql inserts(where语…

零基础设计模式——创建型模式 - 抽象工厂模式

第二部分&#xff1a;创建型模式 - 抽象工厂模式 (Abstract Factory Pattern) 我们已经学习了单例模式&#xff08;保证唯一实例&#xff09;和工厂方法模式&#xff08;延迟创建到子类&#xff09;。现在&#xff0c;我们来探讨创建型模式中更为复杂和强大的一个——抽象工厂…

解锁内心的冲突:神经症冲突的理解与解决之道

目录 一、神经症冲突概述 二、冲突的基本类型 三、未解决冲突的后果 四、尝试解决的途径 五、真正解决冲突 六、总结 干货分享&#xff0c;感谢您的阅读&#xff01; 人类的内心世界复杂多变&#xff0c;常常充满了各种冲突和矛盾。每个人在成长的过程中&#xff0c;都或…

Redisson读写锁和分布式锁的项目实践

解决方案:采用读写锁 什么是读写锁 Redisson读写锁是一种基于Redis实现特殊的机制,用于在分布式系统中协调对共享资源的访问,其继承了Java中的ReentrantReadWriteLock的思想.特别适用于读多写少的场景.其核心是:允许多个线程同时读取共享资源,但写操作必须占用资源.从而保证线…

SkyWalking高频采集泄漏线程导致CPU满载排查思路

SkyWalking高频采集泄漏线程导致CPU满载排查思路 契机 最近在消除线上服务告警&#xff0c;发现Java线上测试服经常CPU满载告警&#xff0c;以前都是重启解决&#xff0c;今天好好研究下&#xff0c;打arthas火焰图发现是SkyWalking-agent的线程采集任务一直在吃cpu&#xff…

【HarmonyOS 5】Map Kit 地图服务之应用内地图加载

#HarmonyOS SDK应用服务&#xff0c;#Map Kit&#xff0c;#应用内地图 目录 前期准备 AGC 平台创建项目并创建APP ID 生成调试证书 生成应用证书 p12 与签名文件 csr 获取 cer 数字证书文件 获取 p7b 证书文件 配置项目签名 配置签名证书指纹 项目开发 配置Client I…

ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e)

ld: cpu type/subtype in slice (arm64e.old) does not match fat header (arm64e) in ‘/Users/*****/MposApp/MposApp/Modules/Common/Mpos/NewLand/MESDK.framework/MESDK’ clang: error: linker command failed with exit code 1 (use -v to see invocation) 报错 解决方…

通过vue-pdf和print-js实现PDF和图片在线预览

npm install vue-pdf npm install print-js <template><div><!-- PDF 预览模态框 --><a-modal:visible"showDialog":footer"null"cancel"handleCancel":width"800":maskClosable"true":keyboard"…

视频监控管理平台EasyCVR结合AI分析技术构建高空抛物智能监控系统,筑牢社区安全防护网

高空抛物严重威胁居民生命安全与公共秩序&#xff0c;传统监管手段存在追责难、威慑弱等问题。本方案基于EasyCVR视频监控与AI视频分析技术&#xff08;智能分析网关&#xff09;&#xff0c;构建高空抛物智能监控系统&#xff0c;实现24小时实时监测、智能识别与精准预警&…

2.2.1 05年T1复习

引言 从现在进去考研英语基础阶段的进阶&#xff0c;主要任务还是05-09年阅读真题的解题&#xff0c;在本阶段需要注意正确率。阅读最后目标&#xff1a;32-34分&#xff0c;也就是每年真题最多错四个。 做题步骤&#xff1a; 1. 预习&#xff1a;读题干并找关键词 做题&#…

Python-11(集合)

与字典类似&#xff0c;集合最大的特点就是唯一性。集合中所有的元素都应该是独一无二的&#xff0c;并且也是无序的。 创建集合 使用花括号 set {"python","Java"} print(type(set)) 使用集合推导式 set {s for s in "python"} print(set…

Opixs: Fluxim推出的全新显示仿真模拟软件

Opixs 是 Fluxim 最新研发的显示仿真模拟软件&#xff0c;旨在应对当今显示技术日益复杂的挑战。通过 Opixs&#xff0c;研究人员和工程师可以在制造前&#xff0c;设计并验证 新的像素架构&#xff0c;从而找出更功节能、色彩表现更优的布局方案。 Opixs 适用于学术研究和工业…