使用 Milvus 和 Streamlit 搭建多模态产品推荐系统

3dd2bfe26836a5a718e427ff80aee678.png7537eb3d7b7145d105a79510feaf164e.png

我们可以使用 Milvus 搭建多模态 RAG 应用,用于产品推荐系统。用户只需简单上传一张图片并输入文字描述,Google 的 MagicLens 多模态 Embedding 模型就会将图像和文本编码成一个多模态向量。然后,使用这个向量从 Milvus 向量数据库中找到最相似的亚马逊产品。

🎨🔍 Milvus 魔法:图像搜索和智能购物!

您是否曾经希望只需上传一张图片并简单描述你想要的东西就能找到对应的产品?我们现在可以帮您实现这个想法!🛍️✨

以下是我们搭建的应用示例的使用流程:

  1. 📸 拍摄一张照片并输入您想要搜索的内容

  2. 🧙♂️ Milvus 会将您的输入转换成一个特殊的"多模态向量"(很神奇吧?)

  3. 🕵️♀️ 这个输入向量将扮演超级侦探的角色,在 Milvus 向量数据库中进行相搜索

  4. 🎉 随后,系统就能够根据您的图片和描述在亚马逊上找到对应的产品

本文将展示如何使用 Milvus 搭建多模态 RAG 应用。

01.

多模态产品推荐系统使用的技术

Google DeepMind 的 MagicLens 是一个多模态 Embedding 模型,使用双编码器架构基于 CLIP(OpenAI 2021)或 CoCa(Google Research 2022)模型处理文本和图像。MagicLens 通过将训练得到的权重(weights)整合到同一个向量空间中,实现对多种检索任务的支持,包括以图搜图和以文本搜图。该模型基于 3670 万个三元训练,能够执行图像到图像、文本到图像和多模态文本-图像混合的检索任务,且相较于此前的模型显著减小了模型大小。

OpenAI GPT-4o 是一个生成式多模态大语言模型,集成了文本、图像和其他数据类型,突破了传统的语言模型。先进的 AI 技术能够更深层次地理解和处理复杂信息,提高了准确性和上下文感知能力。该模型支持自然语言处理(NLP)、计算机视觉等多种应用。

Milvus 是一款开源的分布式向量数据库,可用于存储、索引和搜索向量,十分适合生成式 AI 应用。凭借其混合搜索、元数据过滤、重排(Reranking)等功能,以及能够高效处理万亿级向量数据的能力,Milvus 是 AI 和 ML 应用的首选解决方案。您可以直接本地运行 Milvus 可以本地运行或部署集群版 Milvus,抑或是使用全托管的 Milvus 服务——Zilliz Cloud。

Streamlit 是一个开源的 Python 库,简化了创建和运行 Web 应用的过程。Streamlit 能够助力开发人员使用简单的 Python 脚本构建和部署仪表板(dashboard)、数据报告和简单的机器学习接口,免去深入学习 CSS 或 JavaScript 框架(如 Node.js)等 Web 技术的麻烦。

02.

准备数据

本文示例使用的数据来自 Amazon Reviews 2023 数据集。原始数据中包含 5400 万条用户评论,涵盖 4800 万件商品,分属于 33 个类别(如电器、美妆、服装、运动、户外以及“未知”等类别)。

我们将只使用上述数据集中的 5000 件商品数据,按类别均匀抽样。您可以通过运行 download_images.py 来下载图片。

$ python download_images.py

每行产品数据包含商品元数据(如:类别名称、平均用户评分)以及产品缩略图和大图的 URL。

本文示例仅针对每个产品的大图生成向量。

03.

MagicLens 设置指南

MagicLens 是由 Google DeepMind 开发的图像检索模型。本指南介绍如何设置环境并下载 MagicLens 的模型权重。更多信息,请前往 MagicLens 的 GitHub 仓库。

环境设置:

1.使用 Conda 创建环境:

$ conda create --name magic_lens python=3.9

2.启动环境:

$ conda activate magic_lens

3.克隆 Scenic 仓库:

$ git clone https://github.com/google-research/scenic.git

4.打开 Scenic 目录:

$ cd scenic

5.安装 Scenic:

$ pip install

6.安装 CLIP 依赖:

$ pip install -r scenic/projects/baselines/clip/requirements.txt

7.安装 Jax:

如果您使用 GPU,您还需要安装对应的 GPU 版本 Jax。更多信息,请阅读 Jax 文档。

以下为使用特定 CUDA 版本安装的示例(仅 Linux 系统):

使用 CUDA 12 安装:

$ pip install --upgrade "jax[cuda12_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

使用 CUDA 11 安装:

$ pip install --upgrade "jax[cuda11_pip]" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html

本地下载模型权重

1.返回主文件夹:

$ cd ..  This will take you back to the main directory where you cloned the demo.

2.下载模型(可能需要填写验证信息):

$ gsutil cp -R gs://gresearch/magiclens/models ./

04.

创建 Milvus Collection 并存储向量

本教程使用 Milvus Lite 以及 schema-less Milvus Client。

创建 Collection、将图片编码为向量,并运行 index.py 在 Milvus 中加载向量数据。

$ python index.py

此步骤将每张图片编码为一个 768 维的向量。对于示例中的每个产品,图像向量及其相关的产品元数据将被保存到一个名为 “cir_demo_large” 的 Milvus Collection 中,并使用 AUTOINDEX (HNSW) 索引。

05.

在 Milvus 中创建索引并执行搜索

当您进行图片搜索时,Milvus 将使用 COSINE 向量距离搜索 top_k = 100 个最接近的图片向量。

Milvus 会自动将 top_k 结果按降序排列。这是因为两个向量的 COSINE 距离值越大,这两个向量越相似。

06.

运行 Streamlit Server 实现前端界面

更新本地文件 cfg.py,使用您实际的图片和模型权重路径作为路径名称。

在终端输入以下指令,运行应用;

$ streamlit run ui.py
  1. 使用 Streamlit 应用:

  2. 在终端输入以下指令,运行应用

$ streamlit run ui.py

3.   使用 Streamlit 应用:

  • 上传用于产品搜索的图片。

  • 输入文字描述。

  • 点击 "搜索" 从 Milvus 向量数据库中查找相似产品。

  • 点击 "Ask GPT" 获取 AI 产品推荐。

6f317d934f54a2c21e786cd7e077fe8d.png

本文示例中的应用工作流程如下:

  • 搜索功能:使用多模态 Embedding 模型 MagicLens 将您的查询图片和文本转换为向量。此时使用的模型与此前批量将产品图片转换为向量并存储在 Milvus 向量数据库中的模型相同。然后 Milvus 执行近似最近邻(ANN)搜索,查找与您输入向量最接近的 top_k 个产品图片向量。

  • Ask GPT 功能:调用 OpenAI 的 GPT-4o mini 多模态生成式模型,从搜索结果中取出前 25 张图片,将它们放入 Prompt 中,并传入模型。然后 GPT-4o mini 将选择最推荐的产品图片并提供推荐理由。

6a9bac074c42c17c8c31741bc6d208ae.png

参考链接

(1)多模态图像检索 Bootcamp:

https://github.com/milvus-io/bootcamp/tree/master/bootcamp/tutorials/quickstart/apps/cir_with_milvus

(2)使用 Reranking 的多模态 RAG 推荐系统 Bootcamp:

https://github.com/milvus-io/bootcamp/tree/master/bootcamp/tutorials/quickstart/apps/multimodal_rag_with_milvus

(3)Google MagicLens 模型:

https://github.com/google-deepmind/magiclens

(4)介绍本示例原理的视频:

https://youtu.be/uaqlXRCvjG4?si=e83DnUsLZvVnWt-0&t=51

Source: https://zilliz.com/blog/build-multimodal-product-recommender-demo-using-milvus-and-streamlit

推荐阅读

8c940c12c887f8615c258a052514c4dc.png

1589398a21e36ac0ca1ba15f08ad8b95.png

33de4495eb9be157ba7b1e2006730642.png

df3a367ba49558d919fd6faab97af832.png

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

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

相关文章

C++设计模式——Template Method模板方法模式

一,模板方法模式的定义 模板方法模式是一种行为型设计模式,它先定义了一个算法的大致框架,然后将算法的具体实现步骤分解到多个子类中。 模板方法模式为算法设计了一个抽象的模板,算法的具体代码细节由子类来实现,从…

【Linux】进程状态(RSDT 阻塞 僵尸 孤儿)

目录 进程状态 进程状态的查看 R和S 运行状态 T/t 暂停状态 kill命令 D (disk sleep)状态、 Z 状态(僵尸状态) 孤儿状态 运行状态 阻塞状态 进程状态 一个进程通常有三种状态 ◉ 就绪状态(Ready&#xff0…

如何验证谷歌seo服务商的实力真假?

要验证谷歌SEO服务商的实力真假,可以通过几种简单有效的方法。 你可以要求对方通过视频会议或上门服务,展示谷歌官方后台的真实数据。 通过Google Search Console的实时数据,你可以直接看到他们为客户提供的服务效果,这样的数据是…

【加密社】如何根据.dat文件恢复密钥

加密社 看了这篇指南,你将了解助记词和密钥地址(qianbao)背后的基本原理。 以及,如何找回你的大饼密钥。 Not your key, not your coin 如果你不掌握自己加密货币钱包的私钥,那么你实际上并不能完全控制你的资产 在当今…

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决

【STM32开发笔记】STM32H7S78-DK上的CoreMark移植和优化--兼记STM32上的printf重定向实现及常见问题解决 一、CoreMark简介二、创建CubeMX项目2.1 选择MCU2.2 配置CPU时钟2.3 配置串口功能2.4 配置LED引脚2.5 生成CMake项目 三、基础功能支持3.1 支持记录耗时3.2 支持printf输出…

基于FPGA的OV5640摄像头图像采集

1.OV5640简介 OV5640是OV(OmniVision)公司推出的一款CMOS图像传感器,实际感光阵列为:2592 x 1944(即500w像素),该传感器内部集成了图像出炉的电路,包括自动曝光控制(AEC…

内网渗透-域环境搭建

构建内网环境 在学习内网渗透测试时,需要构建一个内网环境并搭建攻击主机,通过具体操作理解漏洞的工作原理,从而采取相应的防范措施。 一个完整的内网环境,需要各种应用程序、操作系统和网络设备,可能比较复杂。我们只需要搭建其中的核心部分,也就是Linux服务器和 Windows服务…

复变函数在大模型中的应用

1. 导入 说来惭愧,我研究生时的研究方向是复分析,但毕业近十年来几乎没用到它。 我还记得实习时做自我介绍时,我说我的研究方向是复分析。面试官不太了解,我便解释说,这是关于对 -1 开平方得到的虚数 i 的研究。 在…

【iOS】——分类拓展关联对象

分类 OC的动态特征允许使用类别为现有的类添加新方法并且不需要创建子类,不需要访问原有类的源代码。通过使用类别即可动态为现有的类添加新方法,而且可以将类定义模块化分布到多个相关文件。 分类是 Objective-C 中的一种语言特性,它允许你…

缓解webclient频繁报‘Connection prematurely closed BEFORE response’的问题

现象: 我在Java代码中使用org.springframework.web.reactive.function.client.WebClient进行网络请求,一开始会有比较多的偶发报错:Connection prematurely closed BEFORE response,网络连接莫名其妙就断了。 处理: …

pm2 + linux + nginx

pm2 pm2是一个用于管理node项目的工具 前言 有如下两个文件 index.js const express require("express"); const app express(); const port 9999;app.get("/index", (req, res) > {res.json({code:200,msg:"songzx001"}) });app.lis…

学习硬件测试06:IIC(SHT30)+HMI串口屏+RS485(modbus)+SPI Flash读写+CAN通信(P81、P91、P95、P120、)

文章以下内容全部为硬件相关知识,鲜有软件知识,并且记的是自己需要的部分,大家可能看不明白。 一、IIC(SHT30 数字温湿度传感器) 1.1实验现象 1、软件模拟 I2C 协议与 SHT30 数字温湿度传感器通讯; &am…

怎么把视频转换成mp4:好用的mp4格式转换器免费版推荐

用手机或者其他拍摄设备记录生活已经成为一种日常,当你想把手机里储存的日常小确幸发布到平台上时,才发现你视频的格式在平台上并不被支持。这个事实难免让人丧气。如果你还想继续上传视频的话,就不得不把视频格式转换成被平台支持的mp4格式。…

ELK系列之一---探索ELK奇妙世界:初识日志界大名鼎鼎的ES集群!

目录 一、为什么要使用ELK 二、ELK简介 三、Elaticsearch入门 3.1、什么是elaticsearch 3.2、elaticsearch的底层优点 3.2.1、全文检索 3.2.2、倒排索引 3.3、elaticsearch集群原理 一、为什么要使用ELK 一般我们需要进行日志分析场景:直接在日志文件中 gre…

Redis从入门到入门(上)

1.Redis概述 文章目录 1.Redis概述1.1 什么是Redis1.2 Redis的应用场景 2.Linux下Redis的安装与使用2.1 Redis下载2.2 Redis的启动2.3 Redis配置2.4 连接Redis 1.1 什么是Redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库&#xff0…

C语言sprintf函数使用

1 其函数原型为:int sprintf(char *str, const char *format,...)。 具体用法如下: 基本语法: str:目标字符串的指针,用于存储格式化后的结果。format:格式化字符串,用于指定输出的格式。后续是…

数据结构-队列的介绍及循环队列

1.队列的概念 在开始前,请牢记这句话:队列是一个先进先出的数据结构。 队列(queue)是限定在表的一端进行插入,表的另一端进行删除的数据结构,如同栈的学习,请联系前文所学链表,试想…

4.5SQL注入之加解密注入

SQL注入之加解密注入Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。 Less-21关 Cookie加密注入: 通过Burpsuite抓包: 进行Base64解密:

波场(Tron)监听区块交易(TRX,USDT)

前言说明: 本篇文章参考GitHub一位伙伴的代码,再代码基础上优化改良以后的结果,但是一下找不到那位大佬的GitHub链接了,如有侵权请联系作者调整文章,让跟多人收益。谢谢。 实现思路: 波场链是一条很新奇的链&#xff…

Nexus配置npm私服

1,配置npm-hub 2,配置proxy-npm 3,配置group-npm 4,配置local-npm 5,配置淘宝