大型语言模型的语义搜索(一):关键词搜索

关键词搜索(Keyword Search)是文本搜索种一种常用的技术,很多知名的应用app比如Spotify、YouTube 或 Google map等都会使用关键词搜索的算法来实现用户的搜索任务,关键词搜索是构建搜索系统最常用的方法,最常用的搜索算法是Okapi BM25,简称BM25。在信息检索中,Okapi BM25(BM是最佳匹配的缩写)是搜索引擎用来估计文档与给定搜索查询的相关性的排名函数。它基于Stephen E. Robertson、Karen Spärck Jones等人 在 20 世纪 70 年代和 80 年代开发的概率检索框架。今天我们会教大家使用Cohere的API来调用BM25算法搜索维基百科的数据库。

一、环境配置

我们需要安装如下的python包:

pip install cohere
pip install weaviate-client

这里简单介绍一下cohere是一家从事大模型应用开发的公司,而weaviate是一个开源的向量数据库,本次实验我们会用到weaviate-client这个包。接下来我们需要导入一些基础配置,这些基础配置主要包含cohere和weaviate的相关的api_key:

import os
from dotenv import load_dotenv, find_dotenv
_ = load_dotenv(find_dotenv()) # read local .env file

接下来我们来创建一个weaviate的client,它将会允许我们连接一个在线数据库。

import weaviate#创weaviate建验证配置
auth_config = weaviate.auth.AuthApiKey(api_key=os.environ['WEAVIATE_API_KEY'])#创建weaviate client
client = weaviate.Client(url=os.environ['WEAVIATE_API_URL'],auth_client_secret=auth_config,additional_headers={"X-Cohere-Api-Key": os.environ['COHERE_API_KEY'],}
)#测试client连接
client.is_ready() 

这里需要说明的是Weaviate 是一个开源的向量数据库。 它具有关键字搜索功能,同时还具有基于大语言模型(LLM)的向量搜索功能。 我们在这里使用的 API key是公共的,它是公共Demo的一部分,因此它是公开的,您可以使用它通过一个url地址来访问在线Demo数据库。 另外需要说明的是这个在线数据库是一个公共数据库,包含1000万条自维基百科的数据记录。数据库中的每一行记录表示维基百科文章的一个段落。这 1000 万条记录来自 10 种不同的语言。 因此,其中一百万是英语,另外九百万对应其他9种不同语言。 我们在执行查询时可以设置不同的语言。这种语言包括:en, de, fr, es, it, ja, ar, zh, ko, hi

二、关于API KEY

这里我们会用到3个配置参数:COHERE_API_KEY、 WEAVIATE_API_KEY、WEAVIATE_API_URL。其中COHERE_API_KEY我们需要去cohere的网站自己注册一个cohere账号然后自己创建一个自己的api_key, 而WEAVIATE_API_KEY和WEAVIATE_API_URL我们使用的是对外公开的api_key和url":

  • weaviate_api_key: "76320a90-53d8-42bc-b41d-678647c6672e"
  • weaviate_api_url: "https://cohere-demo.weaviate.network/"

Keyword Search在基本原理是它会比较问题和文档中的相同词汇的数量,从而找出和问题最相关的文档,如下图所示:

在上图中Query表示用户的问题,而Responses表示根据问题检索到的结果,Number of words in common表示query和responses中出现重复单词的数量,在这个例子中我们的问题是:“what color is the grass?” 与结果中第二个结果 “The grass is green” 重复的单词数量最多,因此第二个结果是最优的结果。

下面我们来定义一个关键词搜索函数:

def keyword_search(query,results_lang='en',properties = ["title","url","text"],num_results=3):where_filter = {"path": ["lang"],"operator": "Equal","valueString": results_lang}response = (client.query.get("Articles", properties).with_bm25(query=query).with_where(where_filter).with_limit(num_results).do())result = response['data']['Get']['Articles']return result

这里在定义keyword_search函数时设置了如下四个参数

  • query: 用户的问题
  • results_lang:使用的语言,默认使用英语。
  • properties :结果的组成结构。
  • num_results:结果的数量,默认3个结果。

由于该在在线数据库中的数据由10种不同的语言组成,其中包括:en, de, fr, es, it, ja, ar, zh, ko, hi。因此我们可以在查询时设置不同的语言来进行查询。另外在该函数中我们还指定了BM25算法(“with_bm25”)来实现关键词搜索,下面我们就来使用默认的英文来进行关键词搜索:

query = "Who is Donald Trump?"
keyword_search_results = keyword_search(query)
print(keyword_search_results)

 由于上面的多条结果混在一起看上去比较乱,因此我们可以定义一个整理结果的函数:

def print_result(result):""" Print results with colorful formatting """for i,item in enumerate(result):print(f'item {i}')for key in item.keys():print(f"{key}:{item.get(key)}")print()print()print_result(keyword_search_results)

 这里我们看到了关键词搜索函数返回了3条包含“Donald Trump”的文档。接下来我们使用中文来进行搜索:

query = "安史之乱"
keyword_search_results = keyword_search(query, results_lang='zh')
print_result(keyword_search_results)

四、关键词搜索基本原理

这里我们需要解释一下该关键词搜索系统的基本原理,这里主要包含了查询(query)和搜索系统(Search System)两个主要的组件,搜索系统可以访问它预先处理过的文档数据,然后响应查询,系统最后为我们提供一个按与问题最相关的文档排序结果列表,如下图所示:

搜索系统(Search System)的内部结构

然而在搜索系统内部包含了2个主要的工作阶段, 第一个阶段通常是检索或搜索阶段,之后还有另一个阶段,称为重新排名即所谓的re-ranking。第一阶段通常使用 BM25 算法对文档集中的文档与问题进行评分,第一阶段检索的实现通常包含倒排索引的思想(inverted index)。第二阶段(re-ranking)则对评分结果进行排序后输出结果,如下图所示:

从上图种我们看到了在倒排序表中包含了2列,第一列时关键词,第二列是该关键词所在的文档的Id. 设计这样的倒排序表主要是为了优化搜索速度。 当您在搜索引擎中输入查询的问题时,系统便能在几毫秒内得到结果。另外在执行搜索任务时关键词对应的文档id出现的频率是评分的重要依据,在上图中的例子中“Color” 在804文档中出现,而“Sky”也在804文档中出现,因此804文档被命中的次数较多,所以会有较高的评分,最后它在检索结果中出现的位置会比较靠前。

五,关键词检索的局限性

我们知道关键词检索并非是根据关键词的语义来检索,而是根据问题和文档中出现的重复单词数量来进行检索,这就会带来一个棘手的问题,那就是如果文档和问题在语义相关,但是它们之间却没有重复的单词,那么就会照成关键词检索无法检索到相关的文档,如下图所示:

 当文档与问题在语义上相关,但它们之间又没有出现重复词汇,此时关键词检索将会失效,它将无法检索到相关文档,当遇到这种情况时则需要借助语言模型来通过语义识别来进行检索。后续我们将会借助语言模型来改进关键词搜索的两个阶段,如下图所示:

参考资料


The Cohere Platform

Home | Weaviate - Vector Database

https://en.wikipedia.org/wiki/Okapi_BM25

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Unity基于AssetBundle资源管理流程详解

在Unity游戏开发中,资源管理是一个非常重要的环节。随着游戏的发展,资源会变得越来越庞大,因此需要一种高效的资源管理方式来减少内存占用和加快加载速度。AssetBundle是Unity提供的一种资源打包和加载方式,可以将资源打包成一个独…

JS前端高频面试

JS数据类型有哪些,区别是什么 js数据类型分为原始数据类型和引用数据类型。 原始数据类型包括:number,string,boolean,null,undefined,和es6新增的两种类型:bigint 和 symbol。&am…

使用 Coze 搭建 TiDB 助手

导读 本文介绍了使用 Coze 平台搭建 TiDB 文档助手的过程。通过比较不同 AI Bot 平台,突出了 Coze 在插件能力和易用性方面的优势。文章深入讨论了实现原理,包括知识库、function call、embedding 模型等关键概念,最后成功演示了如何在 Coze…

【EasyV】QGIS转换至EasyV

QGIS转换至EasyV 第一步:导入QGIS第二步 坐标系转换第三步 集合修正第四步 重命名字段第五步 导出WGS geojson坐标第六步 导入EasyV 第一步:导入QGIS 第二步 坐标系转换 第三步 集合修正 第四步 重命名字段 第五步 导出WGS geojson坐标 第六步 导入EasyV…

【Git】:初识git

初识git 一.创建git仓库二.管理文件三.认识.git内部结构 一.创建git仓库 1.安装git 使用yum install git -y即可安装git。 2.创建仓库 首先创建一个git目录。 3.初始化仓库 这里面有很多内容,后面会将,主要是用来进行追踪的。 4.配置name和email 当然也…

ClickHouse快速上手

简介 ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS) 官网(https://clickhouse.com/docs/zh)给出的定义,其实没看懂 特性 ClickHouse支持一种基于SQL的声明式查询语言,它在许多情况下与ANSI SQL标准相同。使用时和MySQL有点相似&#…

Python输出函数有知道的吗?

print()函数主要用于在终端中输出程序结果。它接受可变参数,可输出多个数据,数据之间默认用空格隔开,输出完毕后默认以换行结尾。print()函数还接受sep和end参数来指定数据间隔和结尾符号,以及file参数来指定输出流。 1.print() 函…

一分钟学会MobaXterm当Linux客户端使用

一、介绍 MobaXterm是一款功能强大的远程计算机管理工具,它集成了各种网络工具和远程连接协议,可以帮助用户在Windows系统上轻松管理远程计算机。MobaXterm支持SSH、Telnet、RDP、VNC等多种远程连接协议,同时还集成了X11服务器,可…

爬虫在网页抓取的过程中可能会遇到哪些问题?

在网页抓取(爬虫)过程中,开发者可能会遇到多种问题,以下是一些常见问题及其解决方案: 1. IP封锁: 问题:封IP是最常见的问题,抓取的目标网站会识别并封锁频繁请求的IP地址。 解决方案…

【解决(几乎)任何机器学习问题】:处理分类变量篇(上篇)

这篇文章相当长,您可以添加至收藏夹,以便在后续有空时候悠闲地阅读。 本章因太长所以分为上下篇来上传,文章末尾有下篇链接 很多⼈在处理分类变量时都会遇到很多困难,因此这值得⽤整整⼀章的篇幅来讨论。在本章中,我将…

C++动态分配内存知识点!

个人主页:PingdiGuo_guo 收录专栏:C干货专栏 大家好呀,又是分享干货的时间,今天我们来学习一下动态分配内存。 文章目录 1.动态分配内存的思想 2.动态分配内存的概念 2.1内存分配函数 2.2动态内存的申请和释放 2.3内存碎片问…

MyBatis小技巧

MyBatis小技巧 一、#{}和${}1.#{}和${}的区别2.什么情况下必须使⽤${} 二、别名机制-typeAliases1.typeAlias2.package 三、mappers的配置1.mapper(1)resource(3)URL(3)class 2.package 四、插⼊数据时获取…

pikachu靶场-CSRF

CSRF: 介绍: Cross-site request forgery简称为"CSRF”。 在CSF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接) 然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击也就完成了&#xff0…

泽攸科普——扫描电子显微镜(SEM)像衬度形成原理

扫描电镜通过电子束在样品表面进行周而复始的扫描运动,同时实时监测各种信号图像的产生,然后根据产生的信号多少来调制图像。 引起各种信号产生的扫描电镜图像衬度的来源有三个方面: 1. 试样本身性质:包括表面的凹凸不平、成分的…

把excel模版保存到文件夹里不走接口进行下载的方法

把excel保存到文件夹不走接口进行下载,一定要注意,需要放到public下的static文件夹下,如果没有static文件夹,就新建一个 !!!不放在static文件夹下可能会报错,提示:无法从…

尾矿库排洪系统结构仿真软件WKStruc(可试用)

1、背景介绍 尾矿库作为重大危险源之一,在国际灾害事故排名中位列第18位,根据中国钼业2019年8月刊《中国尾矿库溃坝与泄漏事故统计及成因分析》的统计,在46起尾矿库泄漏事故中,由于排洪设施导致的尾矿泄漏事故占比高达1/3&#x…

Mysql第二关之存储引擎

简介 所有关于Mysql数据库优化的介绍仿佛都有存储引擎的身影。本文介绍Mysql常用的有MyISAM存储引擎和Innodb存储引擎,还有常见的索引。 Mysql有两种常见的存储引擎,MyISAM和Innodb,它们各有优劣,经过多次优化和迭代,…

基于 QUIC 协议的 HTTP/3 正式发布!

近期,超文本传输协议新版本 HTTP/3 RFC 文档,已由互联网工程任务组(IETF)对外发布。HTTP/3 全称为 HTTP-over-QUIC,指在 QUIC(Quick UDP Internet Connections, 快速 UDP 互联网连接)上映射 HTT…

TSINGSEE青犀AI智能分析网关V4初始配置与算法相关配置介绍

TSINGSEE青犀AI智能分析网关V4内置了近40种AI算法模型,支持对接入的视频图像进行人、车、物、行为等实时检测分析,上报识别结果,并能进行语音告警播放。硬件管理平台支持RTSP、GB28181协议、以及厂家私有协议接入,可兼容市面上常见…

CSS基础属性

【三】基础属性 【1】高度和宽度 (1)参数 width(宽度):用于设置元素的宽度。可以使用具体的数值(如像素值)或百分比来指定宽度。 height(高度):用于设置元…