使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

介绍

想象一下您在网上购物时发现了一种您喜欢的产品,但不知道它的名字。上传图片并让应用程序为您找到它,这不是很棒吗?

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

在本文中,我们将向您展示如何构建这一功能:使用 spring boot 和 google cloud vertex ai 的基于图像的产品搜索功能。

功能概述

此功能允许用户上传图像并接收与其匹配的产品列表,使搜索体验更加直观和视觉驱动。

基于图像的产品搜索功能利用 google cloud vertex ai 处理图像并提取相关关键词。然后使用这些关键字在数据库中搜索匹配的产品。

技术栈

java 21spring 启动 3.2.5postgresql顶点人工智能reactjs

我们将逐步完成设置此功能的过程。

逐步实施

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

1. 在google console上创建一个新项目

首先,我们需要为此在 google console 上创建一个新项目。

如果您已经有一个帐户,我们需要转到 https://console.cloud.google.com 并创建一个新帐户。如果您有的话,请登录该帐户。

如果您添加银行帐户,google cloud 将为您提供免费试用。

创建帐户或登录现有帐户后,您可以创建新项目。

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

2. 启用顶点ai服务

在搜索栏上,我们需要找到 vertex ai 并启用所有推荐的 api。

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

vertex ai 是 google cloud 完全托管的机器学习 (ml) 平台,旨在简化 ml 模型的开发、部署和管理。它允许您通过提供 automl、自定义模型训练、超参数调整和模型监控等工具和服务来大规模构建、训练和部署 ml 模型gemini 1.5 flash 是 google gemini 模型系列的一部分,专为 ml 应用程序中的高效、高性能推理而设计。 gemini 模型是 google 开发的一系列高级 ai 模型,常用于自然语言处理 (nlp)、视觉任务和其他 ai 驱动的应用程序

注意: 对于其他框架,您可以直接使用 gemini api,网址为 https://aistudio.google.com/app/prompts/new_chat。使用结构提示功能,因为您可以自定义输出以匹配输入,这样您将获得更好的结果。

3. 创建与您的应用程序匹配的新提示

在这一步,我们需要定制一个与您的应用相匹配的提示。

vertex ai studio 在提示图库提供了很多示例提示。我们使用示例图像文本到json来提取与产品图像相关的关键字。

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

我的应用程序是一个 carshop,所以我构建了一个这样的提示。我期望模型会用与图像相关的关键字列表来回复我。

我的提示:将名称 car 提取到列表关键字并以 json 格式输出。如果没有找到任何有关汽车的信息,请将列表输出为空。n响应示例:[“rolls”, “royce”, “wraith”]

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

纳米搜索 纳米搜索

纳米搜索:360推出的新一代AI搜索引擎

纳米搜索 30 查看详情 纳米搜索

我们根据您的应用程序定制合适的提示后。现在,我们就来探讨一下如何与 spring boot application 集成。

4. 与 spring boot 应用程序集成

我构建了一个关于汽车的电子商务应用程序。所以我想通过图像找到汽车。

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

首先,在 pom.xml 文件中,您应该更新您的依赖项:

    5.1.2    26.32.0                  com.google.cloud          spring-cloud-gcp-dependencies          ${spring-cloud-gcp.version}          pom          import                      com.google.cloud          libraries-bom          ${google-cloud-bom.version}          pom          import                com.google.cloud      google-cloud-vertexai  

在 pom.xml 文件中完成配置后,创建一个配置类 geminiconfig.java

model_name:“gemini-1.5-flash”location:“设置项目时的位置”project_id:“您的项目id”

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

import com.google.cloud.vertexai.vertexai;import com.google.cloud.vertexai.generativeai.generativemodel;import org.springframework.context.annotation.bean;import org.springframework.context.annotation.configuration;@configuration(proxybeanmethods = false)public class geminiconfig {    private static final string model_name = "gemini-1.5-flash";    private static final string location = "asia-southeast1";    private static final string project_id = "yasmini";    @bean    public vertexai vertexai() {        return new vertexai(project_id, location);    }    @bean    public generativemodel getmodel(vertexai vertexai) {        return new generativemodel(model_name, vertexai);    }}

其次,创建图层service、controller来实现寻车功能。创建班级服务。

因为 gemini api 响应的是 markdown 格式,所以我们需要创建一个函数来帮助转换为 json,然后我们将 json 转换为 java 中的 list 字符串。

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

import com.fasterxml.jackson.core.jsonprocessingexception;import com.fasterxml.jackson.databind.objectmapper;import com.google.cloud.vertexai.api.content;import com.google.cloud.vertexai.api.generatecontentresponse;import com.google.cloud.vertexai.api.part;import com.google.cloud.vertexai.generativeai.*;import com.learning.yasminishop.common.entity.product;import com.learning.yasminishop.common.exception.appexception;import com.learning.yasminishop.common.exception.errorcode;import com.learning.yasminishop.product.productrepository;import com.learning.yasminishop.product.dto.response.productresponse;import com.learning.yasminishop.product.mapper.productmapper;import lombok.requiredargsconstructor;import lombok.extern.slf4j.slf4j;import org.springframework.stereotype.service;import org.springframework.transaction.annotation.transactional;import org.springframework.web.multipart.multipartfile;import java.util.hashset;import java.util.list;import java.util.objects;import java.util.set;@service@requiredargsconstructor@slf4j@transactional(readonly = true)public class yasminiaiservice {    private final generativemodel generativemodel;    private final productrepository productrepository;    private final productmapper productmapper;    public list findcarbyimage(multipartfile file){        try {            var prompt = "extract the name car to a list keyword and output them in json. if you don't find any information about the car, please output the list empty.\nexample response: [\"rolls\", \"royce\", \"wraith\"]";            var content = this.generativemodel.generatecontent(                    contentmaker.frommultimodaldata(                            partmaker.frommimetypeanddata(objects.requirenonnull(file.getcontenttype()), file.getbytes()),                            prompt                    )            );            string jsoncontent = responsehandler.gettext(content);            log.info("extracted keywords from image: {}", jsoncontent);            list keywords = convertjsontolist(jsoncontent).stream()                    .map(string::tolowercase)                    .tolist();            set results = new hashset();            for (string keyword : keywords) {                list products = productrepository.searchbykeyword(keyword);                results.addall(products);            }            return results.stream()                    .map(productmapper::toproductresponse)                    .tolist();        } catch (exception e) {            log.error("error finding car by image", e);            return list.of();        }    }    private list convertjsontolist(string markdown) throws jsonprocessingexception {        objectmapper objectmapper = new objectmapper();        string parsejson = markdown;        if(markdown.contains("```json")){            parsejson = extractjsonfrommarkdown(markdown);        }        return objectmapper.readvalue(parsejson, list.class);    }    private string extractjsonfrommarkdown(string markdown) {        return markdown.replace("```json\n", "").replace("\n```", "");    }}

我们需要创建一个控制器类来为前端做一个端点

import com.learning.yasminishop.product.dto.response.productresponse;import lombok.requiredargsconstructor;import lombok.extern.slf4j.slf4j;import org.springframework.security.access.prepost.preauthorize;import org.springframework.web.bind.annotation.*;import org.springframework.web.multipart.multipartfile;import java.util.list;@restcontroller@requestmapping("/ai")@requiredargsconstructor@slf4jpublic class yasminiaicontroller {    private final yasminiaiservice yasminiaiservice;    @postmapping    public list findcar(@requestparam("file") multipartfile file) {        var response = yasminiaiservice.findcarbyimage(file);        return response;    }}

5. 重要步骤:使用 google cloud cli 登录 google cloud

spring boot 应用程序无法验证您的身份,并且无法让您接受 google cloud 中的资源。

所以我们需要登录google并提供授权。

5.1 首先我们需要在您的机器上安装gcloud cli

教程链接:https://cloud.google.com/sdk/docs/install
检查上面的链接并将其安装到您的机器上

5.2 登录

在项目中打开你的终端(你必须 cd 进入项目)类型:gcloud auth login输入,就会看到允许登录的窗口

gcloud auth login

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索

注意: 登录后,凭据会保存在 google maven 包中,重启 spring boot 应用程序时无需再次登录。

结论

所以上面这些都是基于我的电子商务项目实现的,你可以根据你的项目、你的框架进行修改。在其他框架中,除了 spring boot(nestjs,..),您可以使用 https://aistudio.google.com/app/prompts/new_chat。并且不需要创建新的 google cloud 帐户。

具体实现可以在我的repo查看:

后端:https://github.com/duongminhhieu/yasminishop
前端:https://github.com/duongminhhieu/yasmini-frontend

学习愉快!!!

以上就是使用 Spring Boot、Google Cloud Vertex AI 和 Gemini 模型进行基于图像的产品搜索的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/496949.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 18:26:03
下一篇 2025年11月8日 18:27:01

相关推荐

  • TikTok视频无法下载怎么办 TikTok视频下载异常修复方法

    先检查链接格式、网络设置及工具版本。复制以https://www.tiktok.com/@或vm.tiktok.com开头的链接,删除?后参数,尝试短链接;确保网络畅通,可切换地区节点或关闭防火墙;更新工具至最新版,优先选用yt-dlp等持续维护的工具。 遇到TikTok视频下载不了的情况,别急着换…

    2025年12月6日 软件教程
    000
  • Vue.js应用中配置环境变量:灵活管理后端通信地址

    在%ignore_a_1%应用中,灵活配置后端api地址等参数是开发与部署的关键。本文将详细介绍两种主要的环境变量配置方法:推荐使用的`.env`文件,以及通过`cross-env`库在命令行中设置环境变量。通过这些方法,开发者可以轻松实现开发、测试、生产等不同环境下配置的动态切换,提高应用的可维护…

    2025年12月6日 web前端
    000
  • VSCode性能分析与瓶颈诊断技术

    首先通过资源监控定位异常进程,再利用开发者工具分析性能瓶颈,结合禁用扩展、优化语言服务器配置及项目设置,可有效解决VSCode卡顿问题。 VSCode作为主流的代码编辑器,虽然轻量高效,但在处理大型项目或配置复杂扩展时可能出现卡顿、响应延迟等问题。要解决这些性能问题,需要系统性地进行性能分析与瓶颈诊…

    2025年12月6日 开发工具
    000
  • 优化PDF中下载链接的URL显示:利用HTML title 属性

    在pdf文档中,当包含下载链接时,完整的url路径通常会在鼠标悬停时或直接显示在链接文本中,这可能不符合预期。本文将探讨为何传统方法如`.htaccess`重写或javascript不适用于pdf环境,并提出一种利用html “ 标签的 `title` 属性来定制链接悬停显示文本的解决方…

    2025年12月6日 后端开发
    000
  • Linux命令行中tail -f命令的详细应用

    tail -f 用于实时监控文件新增内容,常用于日志查看;支持 -F 处理轮转、-n 指定行数、结合 grep 过滤,可监控多文件,需注意权限与资源释放。 tail -f 是 Linux 中一个非常实用的命令,主要用于实时查看文件的新增内容,尤其在监控日志文件时极为常见。它会持续输出文件末尾新增的数…

    2025年12月6日 运维
    000
  • VSCode插件:GitLens使用详解

    GitLens是VSCode中强大的Git增强插件,提供行级代码追踪、提交历史浏览、版本对比、跨文件导航及与GitHub等平台集成;通过启用Current Line Blame和In-Line Blame,可实时查看每行代码的作者与修改时间;支持按分支、作者过滤提交记录,比较差异,并利用Go Bac…

    2025年12月6日 开发工具
    000
  • mysql如何备份存储过程和函数

    最直接且推荐的方式是使用mysqldump工具并添加–routines参数,可完整导出存储过程和函数;若需跨版本迁移,应结合–triggers、处理DEFINER用户、验证SQL_MODE,并在测试环境充分验证恢复与兼容性。 MySQL备份存储过程和函数,最直接且推荐的方式是…

    2025年12月6日 数据库
    000
  • VSCode界面优化:精简布局与元素

    通过隐藏冗余组件和调整视觉元素可提升VSCode专注度。依次操作:1. 用Ctrl+B和Ctrl+J快捷键或设置隐藏侧边栏与面板;2. 在设置中关闭活动栏显示,并在settings.json中设置”window.titleBarStyle”: “inline&#8…

    2025年12月6日 开发工具
    000
  • 在Laravel中处理JSON字段并计算每行总和的教程

    本教程旨在指导如何在laravel应用中处理存储为json字符串的数据库字段。我们将通过一个具体示例,展示如何从json字段中提取数值并计算每条记录的总和,并探讨如何通过控制器逻辑和laravel模型访问器实现这一功能,以提高代码的可读性和维护性。 场景描述 在现代Web应用开发中,有时我们需要在数…

    2025年12月6日 后端开发
    000
  • JavaScript持续集成与部署

    持续集成与部署(CI/CD)通过自动化测试、构建和部署提升JavaScript项目交付效率。1. CI指频繁合并代码并自动运行测试以快速发现错误;2. CD在CI通过后自动将应用部署至生产环境;3. 常用工具包括GitHub Actions、GitLab CI/CD、CircleCI和Jenkins…

    2025年12月6日 web前端
    000
  • 解决HTML锚点链接页面重载与URL路径丢失问题

    在使用html锚点链接进行页面内部导航时,开发者可能会遇到页面意外重载或url路径丢失的问题,导致无法正确滚动到目标区域。本文将深入探讨这一常见问题的根源,并提供一种简洁有效的解决方案:确保锚点链接的`href`属性包含当前页面的完整相对路径,从而实现平滑的页面内跳转,避免不必要的页面刷新和url结…

    2025年12月6日 后端开发
    000
  • PDF文档中隐藏下载链接真实路径的教程

    本教程旨在解决pdf文档中下载链接显示完整url路径的问题,尤其是在鼠标悬停时暴露动态参数。文章将解释为何传统的.htaccess重写或javascript方法不适用于pdf环境,并提出一种利用html “标签的`title`属性来控制链接提示文本的有效策略,从而在不影响功能的前提下,优…

    2025年12月6日 后端开发
    000
  • 如何在Laravel中计算JSON字符串字段中各值的总和

    本教程将指导您如何在laravel应用中,从数据库中存储的json字符串字段(例如element_degree)中提取并计算每个记录(如用户)内所有键值对中数值的总和。通过遍历模型集合、解码json数据并累加其内部数值,您可以轻松地为每条记录生成一个聚合总和。 在现代Web开发中,我们经常需要在数据…

    2025年12月6日 后端开发
    000
  • 如何在mysql中排查权限不足导致的错误

    答案是权限配置不当导致MySQL访问被拒。需检查用户是否存在、密码是否正确、权限是否覆盖当前主机和数据库,并通过SHOW GRANTS确认授权,必要时创建用户并授予对应权限,最后执行FLUSH PRIVILEGES生效。 当在 MySQL 中遇到权限不足导致的错误时,通常会看到类似 ERROR 10…

    2025年12月6日 数据库
    000
  • 谷歌浏览器标签页分组颜色怎么修改_谷歌浏览器标签分组个性化设置指南

    可通过右键菜单、拖拽建组或扩展程序修改谷歌浏览器标签分组颜色。首先右键分组圆点选新颜色;其次拖动标签创建分组时选择配色;最后可用“Tab Modifier”等扩展按规则自动着色。 如果您在使用谷歌浏览器时创建了标签页分组,但希望调整其颜色以便更好地区分不同任务或项目,则可以通过内置功能直接修改。以下…

    2025年12月6日 电脑教程
    000
  • Chrome扩展开发:解决图片资源加载失败的完整指南

    本文详细阐述了chrome扩展程序中图片资源加载失败的常见原因及解决方案。核心在于理解`manifest.json`中的`web_accessible_resources`配置,并掌握在内容脚本或动态生成元素中通过`chrome.runtime.geturl()`函数正确引用扩展内部图片资源的最佳实…

    2025年12月6日 web前端
    000
  • 如何管理和同步VSCode的扩展配置,以便在新设备上快速恢复开发环境?

    使用 Settings Sync 是最快方式,通过 GitHub 账号同步扩展、设置、快捷键和代码片段;也可手动导出扩展列表(code –list-extensions > extensions.txt)并在新设备安装,结合备份 settings.json 等配置文件实现环境快速恢…

    2025年12月6日 开发工具
    000
  • JavaScript无障碍访问性实现

    JavaScript若合理使用可提升无障碍体验,关键在于动态内容更新时采用aria-live属性、管理键盘焦点与语义化交互元素。 JavaScript在现代网页开发中扮演着重要角色,但若使用不当,可能破坏无障碍访问性(Accessibility, 简称a11y)。合理使用JavaScript可以增强…

    2025年12月6日 web前端
    000
  • 键盘背光模式设置

    键盘背光设置需根据设备类型选择方法:1. 先了解支持的背光模式,如常亮、呼吸、波浪等;2. 多数键盘可通过Fn组合键快捷切换亮度或模式,具体按键因品牌而异;3. 品牌机械键盘建议使用官方软件(如iCUE、Synapse)进行精细自定义;4. 笔记本通常用Fn加功能键调节,部分可在系统或厂商工具中设置…

    2025年12月6日 电脑教程
    000
  • VS Code扩展生态剖析:API设计与商店发布全流程指南

    VS Code扩展成功源于其插件化架构与丰富API。通过Activation Events、Contribution Points和Extension Host实现高效稳定的功能扩展,结合vscode.commands、languages、window、workspace等核心API提供完整开发支持…

    2025年12月6日 开发工具
    000

发表回复

登录后才能评论
关注微信