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

关键词搜索(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

两种动态代理(可以看到代理类的样子,方便理解)

这里写目录标题 jdk动态代理例子CGlib动态代理例子手写spring中的事务部分自定义注解版aop实现方式 Spring的两大重点,IOC和AOP,今天我们就来学AOP,众所周知AOP的底层是动态代理,让我们看一下这两种动态代理的区别。 例子&#x…

软件压力测试:测试方法与步骤详解

随着软件应用的不断发展,用户对系统性能的要求也逐渐提高。在不同的负载条件下,系统必须能够保持稳定、高效的运行。软件压力测试是一种验证系统在各种负载情况下性能表现的关键手段。本文将详细探讨软件压力测试的方法和步骤。 1. 明确测试目标 在进行压…

数字化转型:八大关键词揭示企业增长新引擎

导语: 在数字化浪潮的席卷下,企业正面临前所未有的转型挑战与增长机遇。为了把握这一时代的脉搏,我们需要深入剖析数字化转型的核心要素。本文将通过“洞察不确定性、驾驭复杂系统、重塑竞争边界、数据驱动决策、智能软件崛起、技术架构重塑…

WooCommerce商品采集与发布插件

如何采集商品或产品信息,并自动发布到Wordpress系统的WooCommerce商品? 推荐使用简数采集器,操作简单方便,且无缝衔接WooCommerce插件,快速完成商品的采集与发布。 简数采集器的智能自动生成采集规则和可视化操作功能…

C 语言基本语法及实用案例分享

一、什么是 C 语言? C语言是一种较早的程序设计语言,诞生于1972年的贝尔实验室。1972 年,Dennis Ritchie 设计了C语言,它继承了B语言的许多思想,并加入了数据类型的概念及其他特性。C语言是一门面向过程的计算机编程语…

AI绘画与修图:重塑数字艺术的新纪元

文章目录 一、AI绘画与修图的原理二、AI绘画的应用三、AI修图的优势四、面临的挑战五、未来发展趋势《AI绘画与修图实战:PhotoshopFirefly从入门到精通 轻松玩转AI绘画与修图实战》亮点内容简介作者简介 随着人工智能技术的飞速发展,AI绘画与修图已经成为…

DTV的LCN功能介绍

文章目录 LCN简介LCN获取LCN Conflict LCN简介 Logical Channel Number(LCN)是数字电视系统中用于标识和组织频道的逻辑编号。LCN的目的是为了方便用户浏览和选择频道,使得数字电视接收设备能够根据这些逻辑编号对频道进行排序和显示。 LCN…

掌握CSS盒子模型:一站式指南

更多web开发知识欢迎访问我的专栏>>> 盒子模型 01-选择器 结构伪类选择器 基本使用 作用:根据元素的结构关系查找元素。 选择器说明E:first-child匹配父元素的第一个子元素EE:last-child匹配父元素的最后一个子元素EE:nth-child(n)匹配父元素的第n个…

043-WEB攻防-PHP应用SQL注入符号拼接请求方法HTTP头JSON编码类

043-WEB攻防-PHP应用&SQL注入&符号拼接&请求方法&HTTP头&JSON&编码类 #知识点: 1、PHP-MYSQL-SQL注入-数据请求类型 2、PHP-MYSQL-SQL注入-数据请求方法 3、PHP-MYSQL-SQL注入-数据请求格式 演示案例: ➢PHP-MYSQL-数据请求类型…

java替换jar中的class文件

1、编译好class文件2、找到需要修改class文件的路径3、解压需要替换的文件4、上传编译后的class文件5、重新压缩 在调整java代码过程中会遇到需要改jar包中的class文件的情况,改了如何替换呢? 1、编译好class文件 将需要修改的class文件代码复制到java编…

第四套CCF信息学奥赛c++ CSP-J认证初级组 中小学信奥赛入门组初赛考前模拟冲刺题(选择题)

第四套中小学信息学奥赛CSP-J考前冲刺题 1、在网络上,若某台电脑的设备及数据可由其他电脑共享,这台电脑称为 A、个人服务器 B、主机 C、副机 D、服务器 答案:D 考点分析:主要考查网络相关知识,网络上这样的电脑统称为服务器&#xff0…

mac/windows git ssh 配置多平台账号(入门篇)

目录 引子多账号多平台配置git一、.ssh文件夹路径1.1 mac 系统1.2 windows 系统 二、生成new ssh2.1 mac系统2.2 windows 系统 三、配置 config四、验证五、用ssh方式拉取远程仓库代码 引子 push代码到github仓库时,提示报错。 Push failed Remote: Support for pa…

【自然语言处理】:实验5,司法阅读理解

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现(实验满分),只展示主要任务实验结果,如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题,也欢…

Unity接入SQLite (一):SQLite介绍

1.简介 SQLite是一个开源的嵌入式关系数据库管理系统。它是一种轻量级的数据库引擎,不需要单独的服务器进程,可以直接嵌入到应用程序中使用。Sqlite使用简单、高效,并且具有对标准SQL的完整支持。它适用于需要在本地存储和访问数据的应用程序…

hash,以及数据结构——map容器

1.hash是什么? 定义:hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出, 该输出就是散列值。这种转换是一种压缩映射&…

Maven depoly:Skipping artifact deployment

问题描述: 使用IDEA执行mvn depoly将本地开发的模块发布到Maven私服时,一直提示:Skipping artifact deployment,自动跳过了depoly部署阶段。 问题分析 Maven构建生命周期中的每一个阶段都是由对应的maven插件执行具体工作的。既然…

linux运维xshell同时控制多个窗口的快捷方式

下面去实现同时操作的功能。 1. 找到 工具- 2. 根据需要,选择需要操作的窗口即可。 以上就是对xshell中同时操作多个窗口的方法

【k8s核心概念与专业术语】

k8s架构 1、服务的分类 服务分类按如下图根据数据服务支撑,分为无状态和有状态 无状态引用如下所示,如果一个nginx服务,删除后重新部署有可以访问,这个属于无状态,不涉及到数据存储。 有状态服务,如redis&a…

四、矩阵的分类

目录 1、相等矩阵 2、同形矩阵 3、方阵: 4、负矩阵、上三角矩阵、下三角矩阵: 5、对角矩阵:是方阵 ​编辑7、单位矩阵:常常用 E或I 来表示。它是一个方阵 8、零矩阵: 9、对称矩阵:方阵 1、相等矩阵 …

力扣经典题目解析--两数之和

两数之和 题目地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 简单来说就是在一个数组中找出两个数,这两个数相加要等于给定的target,下面是完整的题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中…