SentenceTransformers×Milvus:如何进行向量相似性搜索

news2024/11/23 0:23:27

bb413b7e52aeff11fd0c97abcaf9a908.png

2cf2c46da8a44fc34116ba61b22f4d3a.png

你可曾经历过在 Meetup 上听到一段绝妙的内容,但发现回忆不起具体的细节?作为一名积极组织和参与 Meetup 的开发者关系工程师,我常常会有这种感受。

为了解决这个问题,我开始探索使用相似性搜索技术来筛选大量的非结构化数据。非结构化数据占全世界数据的80%,可以通过不同的 ML 模型转换为向量。本文中,我选择的工具是 Milvus——一款流行的开源向量数据库,擅长管理并搜索复杂的数据。Milvus 能够帮助我们发现数据之间潜在的联系和比较数据相似性。

本文将使用 SentenceTransformers 将非结构化数据转换为 Embedding 向量。SentenceTransformers 是一个能够将句子、文本和图像转换为 Embedding 向量的 Python 框架。您可以用它来编码超过100种语言的句子或文本。然后,我们就可以通过相似度类型(例如:余弦距离)来比较这些 Embedding 向量,从而找到相似含义的句子。

01.

下载数据

Meetup.com 不提供免费的 public API。你需要购买 Pro 版本才可使用其 API。

本文中我自己生成了一些 Meetup 数据。您可以在 GitHub 上获取这些数据(https://github.com/stephen37/similarity_search_mlops/blob/abc1d91878320911f069fcb8a2949b0d7d592370/data/data_meetup.csv),并使用 Pandas 加载数据。

import pandas as pd
df = pd.read_csv(‘data/data_meetup.csv’)

02.

技术栈:Milvus 和 SentenceTransformers

我们将使用 Milvus 作为 向量数据库,SentenceTransformers 用于生成文本向量,OpenAI GPT 3.5-turbo 用于总结 Meetup 内容。由于 Meetup 通常包含很多内容,所以我们需要通过总结来简化数据。

2.1 Milvus Lite

Milvus 提供了不同的部署选项以满足不同的需求。对于追求快速设置的轻量级应用,Milvus Lite 是理想的选择。它可以通过  pip install pymilvus 轻松安装,并直接在 Jupyter 笔记本中运行。

2.2 使用 Docker/Docker Compose 的 Milvus

对于追求稳定性的应用而言,可以使用 Docker Compose 部署分布式架构的 Milvus。您可以在文档(https://milvus.io/docs/install_standalone-docker-compose.md)和 GitHub 页面(https://github.com/milvus-io/milvus)上获取 Docker Compose 文件。当您通过 Docker Compose 启动 Milvus 时,您将看到三个容器,并通过默认的 19530 端口连接到 Milvus。

2.3 SentenceTransformers

SentenceTransformers 用于创建 Embedding 向量。可以在 PyPi 上通过 pip install sentence-transformers 安装。我们将使用 all-MiniLM-L6-v2 模型,因为它与 SentenceTransformers 提供的最佳模型相比小 5 倍,速度快 5 倍,同时仍然提供与最佳模型相当的性能。

03.

进行相似性搜索

3.1 启动 Milvus

为了进行相似性搜索,我们需要一个向量数据库。通过Docker即可快速启动 Milvus 向量数据库(https://milvus.io/docs/install_standalone-docker.md)

3.2 将数据导入 Milvus

在导入数据前,我们需要先创建 1 个 Collection 并设置 Schema。首先设置参数,包括字段 Schema、Collection Schema 和 Collection 名称。

from pymilvus import FieldSchema, CollectionSchema, DataType, Collection

# We insert the object in the format of title, date, content, content embedding
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="title", dtype=DataType.VARCHAR, max_length=500),
    FieldSchema(name="date", dtype=DataType.VARCHAR, max_length=100),
    FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=10000),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=384)
]
schema = CollectionSchema(fields=fields)
collection = Collection(name=”mlops_meetups”, schema=schema)

完成创建 Collection 和 Schema 后,现在让我们来针对 embedding 字段创建索引,然后通过 load() 将数据加载到内存。

collection.create_index(field_name="embedding")
collection.load()

3.3 使用 SentenceTransformer 生成 Embedding 向量

正如之前所述,我们将使用 SentenceTransformer 以及 all-MiniLM-L6-v2 模型来生成 Embedding 向量。首先,让我们导入所需的工具。

from sentence_transformers import SentenceTransformer

transformer = SentenceTransformer('all-MiniLM-L6-v2')
content_detail = df[‘content’]
content_detail = content_detail.tolist()
embeddings = [transformer.encode(c) for c in content_detail]

# Create an embedding column in our Dataframe
df['embedding'] = embeddings

# Insert the data in the collection
collection.insert(data=df)

3.4 总结 Meetup 内容

Meetup 的内容十分丰富,还会包含日程安排、活动赞助商以及场地/活动的特定规则等信息。这些信息对于参加 Meetup 来说非常重要,但对于我们本文的用例来说并不相关。我们将使用 OpenAI GPT-3.5-turbo 对 Meetup 内容进行总结。

def summarise_meetup_content(content: str) -> str: 
    response = openai.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[
        {
          "role": "system",
          "content": "Summarize content you are provided with."
        },
        {
          "role": "user",
          "content": f"{content}"
        }
    ],
        temperature=0,
        max_tokens=1024,
        top_p=1,
        frequency_penalty=0,
        presence_penalty=0
    )
    summary = response.choices[0].message.content
    return summary

3.5 返回相似内容

在进行相似性搜索前,需要确保向量数据库能够理解我们的查询。因此,我们需要为查询创建 Embedding 向量。

search_terms = "The speaker speaks about Open Source and ML Platform"
search_data = [transformer.encode(search_terms)] # Must be a list.

3.5.1 在 Milvus Collection 中搜索相似内容

res = collection.search(
    data=search_data,  # Embedded search value
    anns_field="embedding",  # Search across embeddings
    param={"metric_type": "IP"},
    limit = 3,  # Limit to top_k results per search
    output_fields=["title", "content"]  # Include title field in result
)
for hits_i, hits in enumerate(res):
    print("Search Terms:", search_terms)
    print("Results:")
    for hit in hits:
        content_test = hit.entity.get("content")
        print(hit.entity.get("title"), "----", hit.distance)
        print(f'{summarise_meetup_content(hit.entity.get("content"))} \n')

3.5.2 结果

Search terms: The speaker speaks about Open Source and ML Platform
Results:
First MLOps.community Berlin Meetup ---- 0.5537542700767517
The MLOps.community meetup in Berlin on June 30th will feature a main talk by Stephen Batifol from Wolt on Scaling Open-Source Machine Learning. The event will also include lightning talks, networking, and food and drinks. The agenda includes opening doors at 6:00 pm, Stephen's talk at 7:00 pm, lightning talks at 7:50 pm, and socializing at 8:15 pm. Attendees can sign up for lightning talks on Meetup.com. The event is in collaboration with neptune.ai. 
MLOps.community Berlin 04: Pre-event Women+ In Data and AI Festival ---- 0.4623506963253021
The MLOps.community Berlin is hosting a special edition event on June 29th and 30th at Thoughtworks. The event is a warm-up for the Women+ In Data and AI festival. The meetup will feature speakers Fiona Coath discussing surveillance capitalism and Magdalena Stenius talking about the carbon footprint of machine learning. The agenda includes talks, lightning talks, and networking opportunities. Attendees are encouraged to review and abide by the event's Code of Conduct for an inclusive and respectful environment. 
MLOps.community Berlin Meetup 02 ---- 0.41342616081237793
The MLOps.community meetup in Berlin on October 6th will feature a main talk by Lina Weichbrodt on ML Monitoring, lightning talks, and networking opportunities. The event will be held at Wolt's office with a capacity limit of 150 people. Lina has extensive experience in developing scalable machine learning models and has worked at companies like Zalando and DKB. The agenda includes food, a bonding activity, the main talk, lightning talks, and socializing. Attendees can also sign up to give lightning talks on various MLOps-related topics. The event is in collaboration with neptune.ai.

请前往 GitHub 页面查看代码(https://github.com/stephen37/similarity_search_mlops/)。

作者介绍

e117a46e858562904c44a0420943d4bc.jpeg

Stephen Batifol

Developer Advocate at Zilliz

推荐阅读

2fd4973617e1d85ed256c56e474a3b33.png

ec8598890faffb6ab4d59c2794deb17b.png

756a266ac2dccbcd65cb29c80cc3f1a9.png

6c446d92bec5bec6829ec2e3dadfc644.png

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

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

相关文章

如何在 Ubuntu 20.04 上的 PyCharm 中使用 Conda 安装并配置 IPython 交互环境

如何在 Ubuntu 20.04 上的 PyCharm 中使用 Conda 安装并配置 IPython 交互环境 要在 Ubuntu 20.04 上的 PyCharm 中配置 IPython 交互环境,并使用 Conda 作为包管理器进行安装,你需要遵循一系列明确的步骤。这些步骤将确保你可以在 PyCharm 中使用 Cond…

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源

VMware虚拟机(Ubuntu或centOS)共享宿主机网络资源 由于需要在 Linux 环境下进行一些测试工作,于是决定使用 VMware 虚拟化软件来安装 Ubuntu 24.04 .1操作系统。考虑到测试过程中需要访问 Github ,要使用Docker拉去镜像等外部网络资源,因此产…

近期两篇NeRF/3DGS-based SLAM方案赏析:TS-SLAM and MBA-SLAM

原文链接:近期两篇NeRF/3DGS-based SLAM方案赏析:TS-SLAM and MBA-SLAM paper1:TS-SLAM: 基于轨迹平滑约束优化的神经辐射场SLAM方法 导读 本文提出了TS-SLAM,一种改进的基于神经辐射场(NeRF)的SLAM方法…

C# 实现BLE Client 程序与ardunioESP32 通信

编写一个C# Windows 桌面应用程序,与ardunio ESP32 Client 通信。 预备工作 建立一个项目Nuget安装 Microsoft.Windows.SDK.Contracts右击引用菜单中点击:从 packages.config 迁移到 PackageReference using System; using System.Collections.Generi…

【c++丨STL】stack和queue的使用及模拟实现

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C、STL 目录 前言 一、什么是容器适配器 二、stack的使用及模拟实现 1. stack的使用 empty size top push和pop swap 2. stack的模拟实现 三、queue的…

MyBatis-Plus分页插件IPage用法

首先就是service接口需要继承IService<entity> 然后就是业务类实现类中需要继承ServiceImpl<Mapper,entity> Mapper正常写法&#xff0c;继承baseMapepr<entity> IPage的使用方式 QueryWrapper<MdSaleDayPhone> queryWrappernew QueryWrapper<>…

基于阿里云服务器部署静态的website

目录 一&#xff1a;创建服务器实例并connect 二&#xff1a;本地文件和服务器share 三&#xff1a;关于IIS服务器的安装预配置 四&#xff1a;设置安全组 五&#xff1a;建站流程 六&#xff1a;关于备案 一&#xff1a;创建服务器实例并connect 创建好的服务器实例在云…

Android Studio 设置不显示 build-tool 无法下载

2024版本查看build-tool版本 File -> Settings -> Languages & Frameworks -> Android SDK 或者直接打开Settings后搜索“SDK” 解决方案 将 Android Studio 升级到2022.2.1以上的版本将 C:/Windows/System32/drivers/etc/hosts 文件用管理员身份打开&#xff0c…

【JavaSE】【网络编程】UDP数据报套接字编程

目录 一、网络编程简介二、Socket套接字三、TCP/UDP简介3.1 有连接 vs 无连接3.2 可靠传输 vs 不可靠传输3.3 面向字节流 vs 面向数据报3.4 双向工 vs 单行工 四、UDP数据报套接字编程4.1 API介绍4.1.1 DatagramSocket类4.1.1.1 构造方法4.1.1.2 主要方法 4.1.2 DatagramPocket…

MFC图形函数学习10——画颜色填充矩形函数

一、介绍绘制颜色填充矩形函数 前面介绍的几个绘图函数填充颜色都需要专门定义画刷&#xff0c;今天介绍的这个函数可以直接绘制出带有填充色的矩形。 原型1&#xff1a;void FillSolidRect(int x,int y,int cx,int cy,COLORREF color); 参数&#xff1a;&a…

macOS 无法安装第三方app,启用任何来源的方法

升级新版本 MacOS 后&#xff0c;安装下载的软件时&#xff0c;不能在 ”安全性与隐私” 中找不到 ”任何来源” 选项。 1. 允许展示任何来源 点击 启动器 (Launchpad) – 其他 (Other) – 终端 (Terminal)&#xff1a; 打开终端后&#xff0c;输入以下代码回车&#xff1a; …

基于“开源 2+1 链动模式 S2B2C 商城小程序”的社区团购运作主体特征分析

摘要&#xff1a;本文聚焦社区团购运作主体&#xff0c;深入探讨便利连锁店型与社会力量型运作主体在社区团购中的特点&#xff0c;并结合“开源 21 链动模式 S2B2C 商城小程序”&#xff0c;分析其对社区团购的影响与作用机制&#xff0c;旨在为社区团购的进一步发展与优化提供…

Properties文件:Properties属性文件键值对的获取方法、如何写入信息到Properties属性文件、Properties对象的用法

目录 1、什么是Properties文件&#xff1f;和普通txt文件有什么区别&#xff1f; 2、读写Properties文件 2.1 代码演示-读取属性文件 2.2、代码演示-把键值对的数据写入到属性文件中去 1、什么是Properties文件&#xff1f;和普通txt文件有什么区别&#xff1f; 我们都知道…

枫清科技亮相 2024 中国 5G+工业互联网大会,推动 AI 赋能新型工业化

11 月 19 日&#xff0c;2024 中国 5G工业互联网大会在武汉盛大开幕&#xff0c;吸引了来自国内外的行业专家与领先企业。本次大会以“实数融合 智造翘楚”为主题&#xff0c;重点围绕 5G 与工业互联网的深度融合应用、人工智能、智能网联汽车等领域展开讨论与成果展示。作为行…

Spring Boot 3.x + OAuth 2.0:构建认证授权服务与资源服务器

Spring Boot 3.x OAuth 2.0&#xff1a;构建认证授权服务与资源服务器 前言 随着Spring Boot 3的发布&#xff0c;我们迎来了许多新特性和改进&#xff0c;其中包括对Spring Security和OAuth 2.0的更好支持。本文将详细介绍如何在Spring Boot 3.x版本中集成OAuth 2.0&#xf…

使用Python编写脚本,为Excel表格添加水印

简介 这是本人实习中的一个小任务&#xff0c;经过无数努力&#xff0c;终于搞出来了。网上很多资料和博客都是lese&#xff0c;完全没有理清楚水印在excel中的定义是什么&#xff0c;插个图片就是水印吗&#xff1f;当然不是&#xff01;如果帮助到佬们请点个赞吧。 Ecxel中…

MacOS下的Opencv3.4.16的编译

前言 MacOS下编译opencv还是有点麻烦的。 1、Opencv3.4.16的下载 注意&#xff0c;我们使用的是Mac&#xff0c;所以ios pack并不能使用。 如何嫌官网上下载比较慢的话&#xff0c;可以考虑在csdn网站上下载&#xff0c;应该也是可以找到的。 2、cmake的下载 官网的链接&…

jspm东风锻造有限公司重大停管理系统

摘要 东风锻造有限公司重大停管理系统提供给员工和经理一个重大停信息管理的系统。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员&#xff0c;员工和经理三个部分&#xff0c;系统管理员主要功能包括个人中心…

list =和addAll在List<实体类>数组的应用

实体类 A public class A {private String name;private Integer age;public String getName() {return name;}public void setName(String name) {this.name name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age age;} }用会报错 publi…

探索设计模式:原型模式

设计模式之原型模式 &#x1f9d0;1. 概念&#x1f3af;2. 原型模式的作用&#x1f4e6;3. 实现1. 定义原型接口2. 定义具体的原型类3. 定义客户端4. 结果 &#x1f4f0; 4. 应用场景&#x1f50d;5. 深拷贝和浅拷贝 在面向对象编程中&#xff0c;设计模式是一种通用的解决方案…