图书搜索领域重大突破!用Apache SeaTunnel、Milvus和OpenAI提高书名相似度搜索精准度和效率

news2024/12/22 20:04:00

file

作者 | 刘广东,Apache SeaTunnel Committer

背景

目前,现有的图书搜索解决方案(例如公共图书馆使用的解决方案)十分依赖于关键词匹配,而不是对书名实际内容的语义理解。因此会导致搜索结果并不能很好地满足我们的需求,甚至与我们期待的结果大相径庭。这是因为仅仅依靠关键词匹配是不够的,因为它无法实现语义理解,也就无法理解搜索者真正的意图。

那么,有更好的方法可以让我们更加准确、高效地进行图书搜索吗?答案是有!本文中,我将介绍如何结合使用Apache SeaTunnel、Milvus和OpenAI进行相似度搜索,实现对整个书名的语义理解,从而让搜索结果更加精准。

使用训练有素的模型来表示输入数据被称为语义搜索,这种方法可以扩展到各种不同的基于文本的用例,包括异常检测和文档搜索。因此,本文所介绍的技术可以为图书搜索领域带来重大的突破和影响。

接下来我来简单介绍几个与本文相关的概念和用到的工具/平台,便于大家更好地理解本文。

什么是Apache SeaTunnel

Apache SeaTunnel是一个开源的、高性能的、分布式的数据管理和计算平台。它是由Apache基金会支持的一个顶级项目,能够处理海量数据、提供实时的数据查询和计算,并支持多种数据源和格式。SeaTunnel的目标是提供一个可扩展的、面向企业的数据管理和集成平台,以满足各种大规模数据处理需求。

什么是Milvus

Milvus是一个开源的类似向量搜索引擎,它支持海量向量的存储、检索和相似度搜索,是一个针对大规模向量数据的高性能、低成本的解决方案。Milvus可以在多种场景下使用,如推荐系统、图像搜索、音乐推荐和自然语言处理等。

什么是OpenAI

ChatGPT是一种基于GPT(Generative Pre-trained Transformer)模型的对话生成系统,是由OpenAI开发的。该系统主要使用了自然语言处理、深度学习等技术,可以生成与人类对话相似的自然语言文本。ChatGPT的应用范围很广,可以用于开发智能客服、聊天机器人、智能助手等应用程序,也可以用于语言模型的研究和开发。近年来,ChatGPT已经成为了自然语言处理领域的研究热点之一。

什么是LLM(Large Language Model)

大语言模型(Large Language Model)是一种基于深度学习技术的自然语言处理模型,它可以对一段给定的文本进行分析和理解,并生成与之相关的文本内容。大语言模型通常使用深度神经网络来学习自然语言的语法和语义规则,并将文本数据转换为连续向量空间中的向量表示。在训练过程中,大语言模型利用大量的文本数据来学习语言模式和统计规律,从而可以生成高质量的文本内容,如文章、新闻、对话等。大语言模型的应用领域非常广泛,包括机器翻译、文本生成、问答系统、语音识别等。目前,许多开放源代码深度学习框架都提供了大语言模型的实现,如TensorFlow、PyTorch等。

教程

重点来了!我将展示如何将Apache SeaTunnel、OpenAI的Embedding API与我们的矢量数据库结合使用,来通过语义搜索整个书名。

准备步骤

在实验之前,我们需要去官网获取一个OpenAI的token,然后在去部署一个Milvus的实验环境。我们还需要准备好将用于这个例子的数据。你可以从这里下载数据。

通过SeaTunnel将数据导入Milvus 首先,将book.csv放到/tmp/milvus_test/book下,然后配置任务配置为milvus.conf并放到config下。请参考快速使用指南。

env {
  # You can set engine configuration here
  execution.parallelism = 1
  job.mode = "BATCH"
  checkpoint.interval = 5000
  #execution.checkpoint.data-uri = "hdfs://localhost:9000/checkpoint"
}

source {
  # This is a example source plugin **only for test and demonstrate the feature source plugin**
  LocalFile {
    schema {
      fields {
        bookID = string
        title_1 = string
        title_2 = string
      }
    }
    path = "/tmp/milvus_test/book"
    file_format_type = "csv"
  }
}

transform {
}

sink {
  Milvus {
    milvus_host = localhost
    milvus_port = 19530
    username = root
    password = Milvus
    collection_name = title_db
    openai_engine = text-embedding-ada-002
    openai_api_key = sk-xxxx
    embeddings_fields = title_2
  }
}

执行如下命令:

./bin/SeaTunnel.sh --config ./config/milvus.conf -e local

查看数据库中数据,可以看到已经有数据写入进去。 file

然后使用如下代码通过语义搜索书名:

import json
import random
import openai
import time
from pymilvus import connections, FieldSchema, CollectionSchema, DataType, Collection, utility

COLLECTION_NAME = 'title_db'  # Collection name
DIMENSION = 1536  # Embeddings size
COUNT = 100  # How many titles to embed and insert.
MILVUS_HOST = 'localhost'  # Milvus server URI
MILVUS_PORT = '19530'
OPENAI_ENGINE = 'text-embedding-ada-002'  # Which engine to use
openai.api_key = 'sk-******'  # Use your own Open AI API Key here

connections.connect(host=MILVUS_HOST, port=MILVUS_PORT)

collection = Collection(name=COLLECTION_NAME)

collection.load()


def embed(text):
    return openai.Embedding.create(
        input=text, 
        engine=OPENAI_ENGINE)["data"][0]["embedding"]


def search(text):
    # Search parameters for the index
    search_params={
        "metric_type": "L2"
    }

    results=collection.search(
        data=[embed(text)],  # Embeded search value
        anns_field="title_2",  # Search across embeddings
        param=search_params,
        limit=5,  # Limit to five results per search
        output_fields=['title_1']  # Include title field in result
    )

    ret=[]
    for hit in results[0]:
        row=[]
        row.extend([hit.id, hit.score, hit.entity.get('title_1')])  # Get the id, distance, and title for the results
        ret.append(row)
    return ret

search_terms=['self-improvement', 'landscape']

for x in search_terms:
    print('Search term:', x)
    for result in search(x):
        print(result)
    print()

​ 搜索结果如下:

Search term: self-improvement
[96, 0.4079835116863251, "The Dance of Intimacy: A Woman's Guide to Courageous Acts of Change in Key Relationships"]
[56, 0.41880303621292114, 'Nicomachean Ethics']
[76, 0.4309804439544678, 'Possession']
[19, 0.43588975071907043, 'Vanity Fair']
[7, 0.4423919916152954, 'Knowledge Is Power (The Amazing Days of Abby Hayes: #15)']

Search term: landscape
[9, 0.3023473024368286, 'The Lay of the Land']
[1, 0.3906732499599457, 'The Angry Hills']
[78, 0.392495334148407, 'Cloud Atlas']
[95, 0.39346450567245483, 'Alien']
[94, 0.399422287940979, 'The Known World']

如果我们按照之前的老方法——关键词搜索,书名中必须包含自我提升、提升等关键词;但是提供大模型进行语义级别的理解,则可以检索到更加符合我们需求的书名。比如在上面的例子中,我们搜索的关键词为self-improvement(自我提升),展示的书名《关系之舞:既亲密又独立的相处艺术》、《尼各马可伦理学》等虽然不包含相关关键词,却很明显更加符合我们的要求。 可见,我们利用Apache SeaTunnel、Milvus和OpenAI,通过大语言模型的方法,可以实现更加精准的书名相似度搜素,为图书搜索领域带来重大的技术突破,同时对于语义理解也提供了有价值的参考,希望可以给大家带来一些启发。

相关链接

  • https://seatunnel.apache.org/
  • https://openai.com/
  • https://milvus.io/

    本文由 白鲸开源科技 提供发布支持!

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

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

相关文章

nodejs安装记录

1.更改安装目录 D:\env\nodejs 2.命令行输入 node -v 查看nodejs的版本号 3.命令行输入 npm -v查看npm的版本号 4.修改模块安装和缓存路径 之前的设置: 在nodejs安装目录下新建一个文件夹,命名为 node_cache 使用命令修改config配置,首先…

【超简单】Windows 使用 mstsc 远程连接 Ubuntu桌面

登录网站下载 《xrdp-installer-1.4.7.zip》 xRDP Installation Script (free):https://c-nergy.be/repository.html 在Ubuntu 下,解压,添加x 权限后执行安装 chmod 777 xrdp-installer-1.4.7.sh ./xrdp-installer-1.4.7.sh安装完毕后&…

【嵌入式模型转换】2. 算能盒子SE5 芯片板子BM1684 sophon-pipeline

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1. 开始安装 前言 文章1,我们在SE5上实现了,SOC模式下的 C 和 python-sail的模型转换,文章连接: 【嵌入式模型转…

VUE L ∠脚手架新生命周期过度动画 ⑩⑦

目录 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ V u e j s Vuejs Vuejs初识 V u e C L I VueCLI VueCLI C L I CLI CLI n e x t T i c k nextTick nextTick C L I CLI CLI V u e Vue Vue封装的过度与动画 C L I CLI …

第十五章 Swin-Transformer网络详解

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

Selenium教程__获取界面handle、title和url(7)

本文将介绍如何使用Selenium来获取界面的句柄、标题和URL,并展示一些实际应用场景。 学习本文内容将能够轻松地获取并利用界面的句柄、标题和URL,从而更好地跟踪和管理UI的状态和行为。 from selenium import webdriverdriver webdriver.Chrome() dr…

dlib 人脸识别

其实很不明白,这个库存在这么久了,但csdn有关其的资料那么少,这里写点抛砖引玉。 代码思路: 获取人脸人脸对齐对齐后的人脸转128维向量人脸识别(计算向量的距离) 效果: dlib检测人脸确实有点慢…

VLAN间通信之VLANIF虚接口

VLAN间通信之VLANIF虚接口 说明:想要实现VLAN间互访有很多解决方案: 1)VLAN终结--也称单臂路由 2)VLANIF虚接口---最受欢迎的解决方案 1、VLANIF虚接口 1)VLANIF接口是一种三层虚拟接口,可以实现VLAN间的…

浏览器F12开发者工具

浏览器F12开发者工具 1.介绍2.工具附录 1.介绍 F12常用于网站界面测试、调试,分析问题,查看HTML元素、查看响应事件和数据等,还可帮助测试工程师定位前后端Bug; 其中使用最多的功能页面是:元素(Elements&…

数据结构--顺序表的定义

数据结构–顺序表的定义 知识总览 顺序表 \color{red}顺序表 顺序表―一用 顺序存储 \color{red}顺序存储 顺序存储的方式实现线性表 顺序存储。把 逻辑上相邻 \color{red}逻辑上相邻 逻辑上相邻的元素存储在 物理位置上也相邻 \color{red}物理位置上也相邻 物理位置上也相邻的…

设计模式第16讲——迭代器模式(Iterator)

目录 一、什么是迭代器模式 二、角色组成 三、 优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 Student——学生实体类 5.2 StudentIterator——抽象迭代器(Iterator) 5.3 StudentListIterator——具体迭代器…

threejs官方demo学习:模型加载

前言 案例太多了&#xff0c;考虑了一下&#xff0c;实际项目中有可能用的情况一般就是加载模型&#xff0c;然后对模型进行一些操作。因此打算好好看一下关于模型加载的案例&#xff0c;其他案例就不看了。 模型加载并改变材质 <script lang"ts" setup> im…

基于 FPGA 的单脉冲技术:算法设计(附源码)

一、前言 本例显示了开发单脉冲技术的工作流程的前半部分&#xff0c;其中信号使用数字下变频&#xff08;DDC&#xff09;进行下变频。本例中的模型适合在FPGA上实现。本示例重点介绍单脉冲技术的设计&#xff0c;以估计物体的方位角和仰角。 示例的第二部分是基于FPGA的单脉冲…

【C++】hash:unordered_map和unordered_set的底层结构

hash 哈希概念哈希冲突哈希函数哈希冲突的两种解决方法之闭散列哈希冲突的两种解决方法之开散列开散列和闭散列的比较 哈希概念 在c98中还并没有提出哈希这样的结构&#xff0c;只有以红黑树为底层结构的map&#xff0c;set系列&#xff0c;这样使得查询时的效率 l o g 2 N lo…

c语言修炼第二章--分支与循环

目录 前言 2.1分支语句 2.1.1什么是语句 2.2分支语句 2.2.1if语句的语法形式 2.2.2悬空else问题 2.2.3if书写形式的对比 2.3switch语句 2.3.1switch的语法形式 2.3.2 switch与break的关系 2.3.3 switch与default的关系 前言 小伙伴们端午安康吖&#xff01;今天我们…

Mac菜单栏快捷开关 One Switch

One Switch是一款简单易用的 macOS 应用程序&#xff0c;它可以帮助用户快速地切换和管理 Mac 电脑的各种系统设置。这款应用程序提供了一个干净简洁的界面&#xff0c;让用户可以快速地启用或禁用诸如 Wi-Fi、蓝牙、Night Shift、暗色模式、Do Not Disturb 等功能。用户可以通…

建立无需build的vue单页面应用SPA框架

vue、react这种前端渲染的框架&#xff0c;比较适合做SPA&#xff08;Single Page Application&#xff09;。如果用ejs做SPA&#xff0c;js代码控制好全局变量冲突不算严重&#xff0c;但dom元素用jquery操作会遇到很多的名称上的冲突&#xff08;tag、id、name&#xff09;。…

运动蓝牙耳机怎么选、好用的运动蓝牙耳机推荐

在快节奏的现代生活中&#xff0c;运动成为了释放压力、保持健康和放松身心的重要方式。跑步、健身、骑行等各类运动成为了人们日常生活中不可或缺的一部分。然而&#xff0c;一场精彩的运动体验离不开动感的音乐伴奏。为了满足人们对高品质音乐的追求&#xff0c;一款出色的运…

nvm安装、管理多个node版本

1、官网下载nvm https://github.com/coreybutler/nvm-windows/releases 2、解压ZIP&#xff0c;双击nvm-setup.exe(假如以前安装了node.js&#xff0c;把以前的卸载了再安装nvm) 3、安装nvm 注意&#xff1a;这一步的nodejs目录需要手动创建 4、安装完毕&#xff0c;设置下载镜…

OpenCV动态人物识别代码

动态人物识别代码 int main() {// 打开视频文件或摄像头VideoCapture cap("vtest.avi");// VideoCapture cap(0); // 使用默认摄像头if (!cap.isOpened()){std::cout << "无法打开视频文件或摄像头流" << std::endl;return -1;}// 读取第一帧…