Heim Java javaLernprogramm Bildbasierte Produktsuche mit Spring Boot, Google Cloud Vertex AI und Gemini Model

Bildbasierte Produktsuche mit Spring Boot, Google Cloud Vertex AI und Gemini Model

Aug 14, 2024 am 10:35 AM

Einführung

Stellen Sie sich vor, Sie kaufen online ein und stoßen auf ein Produkt, das Sie lieben, dessen Namen Sie jedoch nicht kennen. Wäre es nicht toll, ein Bild hochzuladen und die App es für Sie finden zu lassen?

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

In diesem Artikel zeigen wir Ihnen, wie Sie genau das erstellen: eine bildbasierte Produktsuchfunktion mit Spring Boot und Google Cloud Vertex AI.

Übersicht über die Funktion

Mit dieser Funktion können Benutzer ein Bild hochladen und eine Liste der dazu passenden Produkte erhalten, wodurch das Sucherlebnis intuitiver und visuell gesteuerter wird.

Die bildbasierte Produktsuchfunktion nutzt Google Cloud Vertex AI, um Bilder zu verarbeiten und relevante Schlüsselwörter zu extrahieren. Diese Schlüsselwörter werden dann verwendet, um in der Datenbank nach passenden Produkten zu suchen.

Technologie-Stack

  • Java 21
  • Spring Boot 3.2.5
  • PostgreSQL
  • Vertex AI
  • ReactJS

Wir werden den Prozess der Einrichtung dieser Funktionalität Schritt für Schritt durchgehen.

Schrittweise Umsetzung

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

1. Erstellen Sie ein neues Projekt in der Google Console

Zuerst müssen wir dazu ein neues Projekt in der Google Console erstellen.

Wir müssen zu https://console.cloud.google.com gehen und ein neues Konto erstellen, falls Sie bereits eines haben. Wenn Sie eines haben, melden Sie sich bei dem Konto an.

Wenn Sie Ihr Bankkonto hinzufügen, bietet Ihnen Google Cloud eine kostenlose Testversion an.

Sobald Sie ein Konto erstellt oder sich bei einem bereits vorhandenen Konto angemeldet haben, können Sie ein neues Projekt erstellen.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

2. Aktivieren Sie den Vertex AI-Dienst

In der Suchleiste müssen wir Vertex AI finden und alle empfohlenen APIs aktivieren.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Vertex AI ist die vollständig verwaltete Plattform für maschinelles Lernen (ML) von Google Cloud, die darauf ausgelegt ist, die Entwicklung, Bereitstellung und Verwaltung von ML-Modellen zu vereinfachen. Es ermöglicht Ihnen, ML-Modelle im großen Maßstab zu erstellen, zu trainieren und bereitzustellen, indem Sie Tools und Dienste wie AutoML, benutzerdefiniertes Modelltraining, Hyperparameter-Tuning und Modellüberwachung bereitstellen

Gemini 1.5 Flash ist Teil der Gemini-Modellfamilie von Google, die speziell für effiziente und leistungsstarke Inferenz in ML-Anwendungen entwickelt wurde. Gemini-Modelle sind eine Reihe fortschrittlicher KI-Modelle, die von Google entwickelt wurden und häufig in der Verarbeitung natürlicher Sprache (NLP), Sehaufgaben und anderen KI-gestützten Anwendungen verwendet werden

Hinweis: Für andere Frameworks können Sie die Gemini-API direkt unter https://aistudio.google.com/app/prompts/new_chat verwenden. Verwenden Sie die Strukturaufforderungsfunktion, da Sie Ihre Ausgabe an die Eingabe anpassen können, um bessere Ergebnisse zu erzielen.

3. Erstellen Sie eine neue Eingabeaufforderung, die zu Ihrer Anwendung passt

In diesem Schritt müssen wir eine Eingabeaufforderung anpassen, die zu Ihrer Anwendung passt.

Vertex AI Studio hat viele Beispiel-Eingabeaufforderungen in der Eingabeaufforderungsgalerie bereitgestellt. Wir verwenden Beispiel-Bildtext in JSON, um Schlüsselwörter zu extrahieren, die sich auf das Produktbild beziehen.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Meine Anwendung ist ein CarShop, also erstelle ich eine Eingabeaufforderung wie diese. Ich erwarte, dass das Model mir mit einer Liste von Schlüsselwörtern antwortet, die sich auf das Bild beziehen.

Meine Eingabeaufforderung: Extrahieren Sie den Namen „car“ in ein Listenschlüsselwort und geben Sie sie in JSON aus. Wenn Sie keine Informationen zum Auto finden, geben Sie die Liste bitte leer aus.nBeispielantwort: [„rolls“, „royce“, „wraith“]

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Nachdem wir Ihrer Bewerbung eine passende Eingabeaufforderung angepasst haben. Jetzt untersuchen wir die Integration in die Spring Boot-Anwendung.

4. Integrieren Sie die Spring Boot-Anwendung

Ich habe eine E-Commerce-Anwendung zum Thema Autos erstellt. Ich möchte also Autos anhand des Bildes finden.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Zuerst sollten Sie in der pom.xml-Datei Ihre Abhängigkeit aktualisieren:

<!-- config version for dependency-->
<properties>
    <spring-cloud-gcp.version>5.1.2</spring-cloud-gcp.version>
    <google-cloud-bom.version>26.32.0</google-cloud-bom.version>
</properties>

<!-- In your dependencyManagement, please add 2 dependencies below -->
<dependencyManagement>
  <dependencies>
      <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>spring-cloud-gcp-dependencies</artifactId>
          <version>${spring-cloud-gcp.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>

      <dependency>
          <groupId>com.google.cloud</groupId>
          <artifactId>libraries-bom</artifactId>
          <version>${google-cloud-bom.version}</version>
          <type>pom</type>
          <scope>import</scope>
      </dependency>
  </dependencies>
</dependencyManagement>

<!-- In your tab dependencies, please add the dependency below -->
<dependencies>
  <dependency>
      <groupId>com.google.cloud</groupId>
      <artifactId>google-cloud-vertexai</artifactId>
  </dependency>
</dependencies>
Nach dem Login kopieren

Nachdem Sie die Konfiguration in der pom.xml-Datei vorgenommen haben, erstellen Sie eine Konfigurationsklasse GeminiConfig.java

  • MODEL_NAME: „gemini-1.5-flash“
  • STANDORT: „Ihr Standort beim Einrichten des Projekts“
  • PROJECT_ID: „Ihre Projekt-ID“

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

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);
    }
}
Nach dem Login kopieren

Zweitens erstellen Sie die Ebenen Service, Controller, um die Funktion „Auto finden“ zu implementieren. Klassendienst erstellen.

Da die Gemini-API mit dem Markdown-Format antwortet, müssen wir eine Funktion erstellen, die die Konvertierung in JSON unterstützt, und von JSON werden wir in Java in einen Listenstring konvertieren.

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

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<ProductResponse> 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<String> keywords = convertJsonToList(jsonContent).stream()
                    .map(String::toLowerCase)
                    .toList();

            Set<Product> results = new HashSet<>();
            for (String keyword : keywords) {
                List<Product> 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<String> 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```

", "");
    }
}


Nach dem Login kopieren

Wir müssen eine Controller-Klasse erstellen, um einen Endpunkt für das Frontend zu erstellen


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
@Slf4j
public class YasMiniAIController {

    private final YasMiniAIService yasMiniAIService;


    @PostMapping
    public List<ProductResponse> findCar(@RequestParam("file") MultipartFile file) {

        var response = yasMiniAIService.findCarByImage(file);
        return response;
    }
}



Nach dem Login kopieren

5. WICHTIGER Schritt: Melden Sie sich mit der Google Cloud CLI bei Google Cloud an

Die Spring Boot-Anwendung kann nicht überprüfen, wer Sie sind, und ist nicht in der Lage, dass Sie die Ressource in Google Cloud akzeptieren.

Wir müssen uns also bei Google anmelden und eine Autorisierung erteilen.

5.1 Zuerst müssen wir GCloud CLI auf Ihrem Computer installieren

Link-Tutorial: https://cloud.google.com/sdk/docs/install
Überprüfen Sie den obigen Link und installieren Sie ihn auf Ihrem Computer

5.2 Anmelden

  1. Öffnen Sie Ihr Terminal im Projekt (Sie müssen in das Projekt einsteigen)
  2. Typ: gcloud auth login
  3. Geben Sie ein und Sie sehen die Fenster, in denen Sie sich anmelden können

gcloud auth login


Nach dem Login kopieren

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Image-Based Product Search Using Spring Boot, Google Cloud Vertex AI, and Gemini Model

Hinweis: Nach der Anmeldung werden die Anmeldeinformationen im Google Maven-Paket gespeichert und Sie müssen sich beim Neustart der Spring Boot-Anwendung nicht erneut anmelden.

Abschluss

Wenn Sie diese oben basierend auf meinem E-Commerce-Projekt implementieren, können Sie sie an Ihr Projekt und Ihr Framework anpassen. In anderen Frameworks als Spring Boot (NestJs usw.) können Sie https://aistudio.google.com/app/prompts/new_chat verwenden. und Sie müssen kein neues Google Cloud-Konto erstellen.

Sie können die detaillierte Implementierung in meinem Repo überprüfen:

Backend: https://github.com/duongminhhieu/YasMiniShop
Frontend: https://github.com/duongminhhieu/YasMini-Frontend

Viel Spaß beim Lernen !!!

Das obige ist der detaillierte Inhalt vonBildbasierte Produktsuche mit Spring Boot, Google Cloud Vertex AI und Gemini Model. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1670
14
PHP-Tutorial
1274
29
C#-Tutorial
1256
24
Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? Apr 19, 2025 pm 11:27 PM

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Apr 19, 2025 pm 11:36 PM

Wie erkennt die Redis -Caching -Lösung die Anforderungen der Produktranking -Liste? Während des Entwicklungsprozesses müssen wir uns häufig mit den Anforderungen der Ranglisten befassen, z. B. das Anzeigen eines ...

See all articles