Spaces:
Sleeping
Sleeping
File size: 5,851 Bytes
0013d23 | 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 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | # LLD: AURA // Neural Visual Search System
This Low-Level Design (LLD) document outlines the architecture, data models, exact match detection algorithms, API specifications, and frontend component layout of the **AURA Neural Visual Search System**.
---
## 1. Architectural Overview
The system is split into a **FastAPI backend** running a local CLIP-based embedding engine and a **Vanilla HTML/CSS/JS frontend** featuring a glassmorphic user interface.
```mermaid
graph TD
UI[Frontend Client] -->|HTTP POST Image/Text| API[FastAPI App]
API -->|Raw Text/Image| CLIP[CLIP Embedder]
CLIP -->|512-dim Normalized Embedding| API
API -->|Vector + Query Params| DB[In-Memory Vector Store]
DB -->|Matches & Scores| API
API -->|Classified Results exact_match + related| UI
```
---
## 2. Component Specifications
### 2.1 Backend Modules
#### `models.py` // `CLIPEmbedder`
- **Model**: `openai/clip-vit-base-patch32`
- **Execution Target**: Auto-detects `cuda` (if available), falls back to `cpu`.
- **Image Embeddings**: Normalizes and runs image pixel values through the CLIP Vision Transformer.
- **Text Embeddings**: Standardizes input strings, applies sub-word tokenization, and computes CLIP Text Transformer embeddings.
- **Normalizing Vector Output**: Normalizes outputs to unit length ($L_2$ norm = 1.0) so that dot-product searches compute exact Cosine Similarity:
$$\text{Cosine Similarity} = \vec{A} \cdot \vec{B}$$
#### `vector_store.py` // `InMemoryVectorEngine` & `VectorStore`
- **Data Catalog**: Serialized as JSON list (`catalog.json`) containing metadata:
- `id` (e.g. `prod-15970`)
- `title`
- `desc`
- `price`
- `category`
- `image_url`
- **Embeddings Store**: Serialized as a `.npy` NumPy array (`embeddings.npy`) of dimensions $(N, 512)$.
- **Search Execution**:
- Computes the dot product of the search vector with all stored product vectors.
- Sorts indices in descending order.
- Returns top $K$ results containing metadata and corresponding cosine similarity score.
---
## 3. Exact Product Match Classifier Logic
The search classifier differentiates between an **Exact Match** and **Related Recommendations**.
```mermaid
flowchart TD
Start([Receive Query]) --> QueryType{Query Type?}
QueryType -->|Text Query: q| TextExact{Exact Title/ID Match?}
TextExact -->|Yes| SetExactText[exact_match = Product <br> score = Vector Score / 1.0]
TextExact -->|No| SetExactNull[exact_match = null]
QueryType -->|Image Upload| VectorSearch[Perform Vector Search]
VectorSearch --> ImageScore{Top Similarity >= 0.92?}
ImageScore -->|Yes| SetExactImage[exact_match = Top Product <br> score = Similarity Score]
ImageScore -->|No| SetExactNull
SetExactText --> FilterRelated[Filter exact_match ID from related_products]
SetExactImage --> FilterRelated
SetExactNull --> FilterRelated
FilterRelated --> ReturnJSON([Return exact_match & related_products])
```
### 3.1 Text Search Exact Matching
1. The search query `q` is stripped of leading/trailing spaces and lowercased.
2. The database is checked for a product where:
`q_clean == product["title"].strip().lower()` or `q_clean == product["id"].strip().lower()`.
3. If matched, it is returned as `exact_match`. If it is present in the vector search results, its calculated score is returned; otherwise, it defaults to a score of `1.0`.
### 3.2 Visual Search Exact Matching
1. The upload image is processed, and its unit-normalized embedding is calculated.
2. The vector index retrieves the top results.
3. If the highest cosine similarity score is $\ge 0.92$ (calibrated for matching identical or slightly transformed images), the top match is classified as the `exact_match`.
4. Otherwise, no exact match is returned.
### 3.3 Related Products Resolution
1. Vector search is executed with $K = 7$ to find similar items.
2. If an `exact_match` was resolved (via text or image check), its corresponding ID is filtered out of the results array.
3. The remaining array is sliced to return the top 6 `related_products`.
---
## 4. API Endpoints
### 4.1 Search Endpoint: `/api/search`
- **Method**: `POST`
- **Content-Type**: `multipart/form-data`
- **Parameters**:
- `q` (string, optional)
- `file` (binary stream, optional)
- **Response Format (`application/json`)**:
```json
{
"exact_match": {
"product": {
"id": "prod-15970",
"title": "Turtle Check Men Navy Blue Shirt",
"desc": "Navy Blue Shirts for Men. Designed for casual wear.",
"price": 64.0,
"category": "Apparel",
"image_url": "/static/images/prod-15970.png"
},
"score": 0.9998
},
"related_products": [
{
"product": { ... },
"score": 0.8431
}
]
}
```
### 4.2 Similarity Endpoint: `/api/search/similar`
- **Method**: `POST`
- **Content-Type**: `application/json`
- **Payload**:
```json
{ "product_id": "prod-15970" }
```
- **Response**: Array of similar products, excluding the queried product itself.
---
## 5. Frontend Layout & CSS Styling
The page layout consists of a responsive container structured with CSS grids and glassmorphism panels.
### 5.1 Results Section Layout
- **Exact Match Area (`#exact-match-section`)**:
- Border: Dashed accent border with soft glow (`hsl(263, 70%, 50%)`).
- Active State: Shows up to 1 card representing the exact match (enhanced with green `Exact Match` badge).
- Empty State: Renders a premium banner (🕵️♂️ *No matching products found*) informing the user that no exact match is available in the database.
- **Related Recommendations Grid (`#related-products-grid`)**:
- CSS Grid structure: `repeat(auto-fill, minmax(260px, 1fr))`.
- Header: *Related Products You Might Like*.
- Renders the remaining 6 visual matches.
|