File size: 3,258 Bytes
86b24b1
d674d56
 
 
 
 
 
 
 
 
 
 
 
 
 
95e9582
0c82665
 
 
 
d674d56
 
 
 
 
 
 
0c82665
843da58
d674d56
 
 
 
 
 
 
 
 
 
 
 
 
 
 
843da58
d674d56
 
 
 
 
 
48c0181
d674d56
 
 
0c82665
843da58
5cb5d26
0c82665
 
48c0181
5cb5d26
d674d56
 
8769251
 
 
d674d56
 
 
 
 
 
0c82665
 
d674d56
843da58
0c82665
 
 
d674d56
843da58
d674d56
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import spaces
import marqo
import requests
import io
from PIL import Image
import gradio as gr
import os
from dotenv import load_dotenv

load_dotenv() 

# Initialize Marqo client (for Marqo Cloud deployment)
api_key = os.getenv("MARQO_API_KEY")
mq = marqo.Client("https://api.marqo.ai", api_key=api_key)

@spaces.GPU
def search_marqo(query, themes, negatives):
    # Set model to "marqo-ecommerce-b"
    model = "marqo-ecommerce-b"
    
    # Build query weights
    query_weights = {query: 1.0}
    if themes:
        query_weights[themes] = 0.75
    if negatives:
        query_weights[negatives] = -1.1
    
    # Perform search with Marqo using the specified model
    res = mq.index(model).search(query_weights, limit=10)  # limit to top 10 results

    # Prepare results
    products = []
    for hit in res['hits']:
        image_url = hit.get('image_url')
        title = hit.get('title', 'No Title')
        description = hit.get('description', 'No Description')
        price = hit.get('price', 'N/A')
        score = hit['_score']
        
        # Fetch the image from the URL
        response = requests.get(image_url)
        image = Image.open(io.BytesIO(response.content))

        # Append product details for Gradio display
        product_info = f'{title}'
        products.append((image, product_info))

    return products

# Function to clear inputs and results
def clear_inputs():
    return "", "", [], []

# Gradio Blocks Interface for Custom Layout
with gr.Blocks(css=".orange-button { background-color: orange; color: black; }") as interface:
    gr.Markdown("<h1 style='text-align: center;'>Multimodal Ecommerce Search with Marqo's SOTA Embedding Model</h1>")
    gr.Markdown("### This search demo uses:")
    gr.Markdown("### 1. [Marqo Cloud](https://www.marqo.ai/cloud) for the Search Engine.")
    gr.Markdown("### 2. [Marqo-Ecommerce-Embeddings](https://huggingface.co/collections/Marqo/marqo-ecommerce-embeddings-66f611b9bb9d035a8d164fbb) for the multimodal embedding model.")
    gr.Markdown("### 3. Dataset: This search demo uses a subset from [Marqo-GS-10M](https://huggingface.co/datasets/Marqo/marqo-GS-10M).")

    gr.Markdown("")

    with gr.Row():
        query_input = gr.Textbox(placeholder="comfy chair for a living room", label="Search Query")
        themes_input = gr.Textbox(placeholder="soft material", label="More of...")
        negatives_input = gr.Textbox(placeholder="green", label="Less of...")

    with gr.Row():
        search_button = gr.Button("Submit", elem_classes="orange-button")

    results_gallery = gr.Gallery(label="Top 10 Results", columns=4)

    # Set up function call for search on button click or Enter key
    search_button.click(fn=search_marqo, inputs=[query_input, themes_input, negatives_input], outputs=results_gallery)
    
    # Enable Enter key submission for all input fields
    query_input.submit(fn=search_marqo, inputs=[query_input, themes_input, negatives_input], outputs=results_gallery)
    themes_input.submit(fn=search_marqo, inputs=[query_input, themes_input, negatives_input], outputs=results_gallery)
    negatives_input.submit(fn=search_marqo, inputs=[query_input, themes_input, negatives_input], outputs=results_gallery)

# Launch the app
interface.launch()