feat(ai): refine extraction prompt with human-readable size conversions
- Add SIZE CONVERSION RULES section (critical) with explicit thresholds - Convert ≥1600GB to TB format (e.g., 1600GB → 1.6TB) - Convert memory ≥1024MB to GB format - Update Item field examples with human-readable sizes - Update Size field definition to emphasize HUMAN-READABLE format - Update OCR key definition with size conversion examples - Apply rules consistently across all size-related fields This ensures AI-extracted items display sizes in user-friendly format and improves OCR matching accuracy with normalized size representations. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -105,25 +105,32 @@ def startup_event():
|
||||
default_prompt = (
|
||||
"Extract hardware specifications with PRECISE formatting.\n"
|
||||
"For any field, do not add comments in parenthesis or measurement units in Item name.\n\n"
|
||||
"SIZE CONVERSION RULES (CRITICAL - Apply to all size fields):\n"
|
||||
" Convert sizes to HUMAN-READABLE format:\n"
|
||||
" • Storage ≥1600GB: convert to TB (e.g., '1600GB' → '1.6TB', '2048GB' → '2TB', '8192GB' → '8TB')\n"
|
||||
" • Storage 512GB-1599GB: keep as GB (e.g., '512GB', '1TB' if labeled as 1000GB)\n"
|
||||
" • Memory ≥1024MB: convert to GB (e.g., '1024MB' → '1GB')\n"
|
||||
" • Cables/length: express in meters (e.g., '5m', '30m')\n"
|
||||
" Apply this rule to: Item field size prefix, Size field, and OCR key sizes.\n\n"
|
||||
"ITEM FIELD FORMAT (Critical):\n"
|
||||
"[<size_or_length>] <type> <vendor> <connector> <part_number>\n"
|
||||
" <size_or_length>: GB/TB for storage, meters for cables (e.g., '2m', '256GB', '2TB'). Omit diameter/mm measurements.\n"
|
||||
" <size_or_length>: HUMAN-READABLE format - GB/TB for storage, meters for cables (e.g., '2m', '256GB', '1.6TB'). Omit diameter/mm measurements.\n"
|
||||
" <type>: DDR3/DDR4/DDR5/SSD/HDD/NVMe/SAS/SATA/Patchcord/Fiber/Cable/Transceiver etc.\n"
|
||||
" <vendor>: HP/HPE/Dell/Samsung/Cisco/Lenovo/Hynix etc.\n"
|
||||
" <connector>: RJ45/LC-LC/MPO/U.3/SATA/SAS/LC/ST etc. Omit if N/A.\n"
|
||||
" <part_number>: PN only if visible on label. Omit serial numbers.\n"
|
||||
"Examples: '5m Patchcord LC-LC' / '256GB SSD Samsung SAS' / '128GB DDR4 Hynix SK-234' / '2TB NVMe HP U.3'\n\n"
|
||||
"Examples: '5m Patchcord LC-LC' / '256GB SSD Samsung SAS' / '128GB DDR4 Hynix SK-234' / '1.6TB NVMe HP U.3' / '8TB HDD Seagate SATA'\n\n"
|
||||
"TYPE: Item asset class (DDR3/SSD/NVMe/Patchcord/SFP etc.)\n"
|
||||
"DESCRIPTION: Technical details max 5 words (e.g., 'High speed fiber optic cable'). Omit size/length here.\n"
|
||||
"CATEGORY: Broad ecosystem (Memory, Storage, Network, Cabling, etc.)\n"
|
||||
"CONNECTOR: Physical interface type (e.g., 'LC', 'RJ45', 'U.3')\n"
|
||||
"SIZE: Capacity or length ONLY (e.g., '256GB', '2m')\n"
|
||||
"SIZE: HUMAN-READABLE capacity or length ONLY (e.g., '256GB', '1.6TB', '2m'). No serial numbers or comments.\n"
|
||||
"COLOR: Physical color if distinguishing.\n"
|
||||
"PartNr: Part number only (no serial numbers)\n"
|
||||
"OCR: Robust matching key. Include: core type + vendor + key identifiers + common variations.\n"
|
||||
" Example for '5m Patchcord LC-LC': 'PATCHCORD 5M LC LC CAT6 FIBER'\n"
|
||||
"OCR: Robust matching key. Include: core type + vendor + key identifiers + HUMAN-READABLE size + common variations.\n"
|
||||
" Examples: 'PATCHCORD 5M LC LC CAT6 FIBER' / '256GB SSD SAMSUNG' / '1.6TB NVME HP' / '128GB DDR4 HYNIX'\n"
|
||||
" Include abbreviations: 'DDR4'/'DDR' or 'SSD'/'SSDS' or 'HP'/'HPE' or 'NVMe'/'NVME'\n"
|
||||
" Format: ALL UPPERCASE, space-separated tokens, NO special chars. Skip serial numbers."
|
||||
" Format: ALL UPPERCASE, space-separated tokens, NO special chars. Skip serial numbers. Use human-readable sizes."
|
||||
)
|
||||
|
||||
# Wrap in JSON instructions for reliable parsing
|
||||
|
||||
@@ -1,37 +1,98 @@
|
||||
# Technical Inventory Multi-Label Extraction Protocol
|
||||
# Technical Inventory Hardware Extraction Protocol
|
||||
|
||||
Your goal is to extract precise hardware specifications for ALL relevant inventory items found in the image.
|
||||
Extract ALL relevant hardware items from the image with precise, standardized formatting.
|
||||
|
||||
## Intelligence Rules:
|
||||
1. **Filtering Strategy**:
|
||||
- **INCLUDE**: Standalone physical hardware, modules, cables, servers, and storage units.
|
||||
- **EXCLUDE**: Generic mounting hardware (screws, nails, rails, brackets), paper licenses/documentation, or empty packaging, UNLESS they are the primary and only subject of the image.
|
||||
- In cases like image labels listing multiple SKUs (e.g., 5m cable and 7m cable), TREAT EACH LINE AS A SEPARATE ITEM.
|
||||
## Filtering Rules
|
||||
- **INCLUDE**: Physical hardware, modules, cables, servers, storage, transceivers
|
||||
- **EXCLUDE**: Generic mounting hardware (screws, brackets, rails), paper licenses, empty packaging
|
||||
- **Multi-item labels**: Treat each SKU/variant as a separate item (e.g., "5m cable" and "7m cable" = 2 items)
|
||||
|
||||
2. **Field Definitions**:
|
||||
- **Item**: Primary identity (Manufacturer + Core Class). Max 3 words (e.g., "Cisco SFP Module").
|
||||
- **Type**: Asset classification (e.g., "SFP", "patch cords", "NVMe").
|
||||
- **Description**: Technical summary emphasizing speed/capacity. Max 5 words.
|
||||
- **Category**: Broad ecosystem (e.g., "Network", "Storage").
|
||||
- **Connector**: Physical interface (e.g., "LC/UPC", "RJ45").
|
||||
- **Size**: Capacity or Length (e.g., "1.6TB", "5m").
|
||||
- **Color**: Physical distinguish color.
|
||||
- **PartNr**: Absolute technical identifier (P/N, SKU). Omit Serial Numbers.
|
||||
- **OCR**: Concise technical string for local heuristic matching. **EXCLUDE ALL SERIAL NUMBERS.**
|
||||
## Item Field Format (CRITICAL)
|
||||
[]
|
||||
|
||||
## Output Format:
|
||||
Return ONLY a valid JSON object with the key "items" containing an array of objects.
|
||||
Example:
|
||||
**Component Rules:**
|
||||
- `<size_or_length>`:
|
||||
- **STORAGE CAPACITY - HUMAN READABLE**: Convert to largest unit (TB/MB).
|
||||
- Examples: "1600GB" → "1.6TB", "256GB" → "256GB", "512MB" → "512MB"
|
||||
- Rule: If ≥1000GB, use TB. If ≥1000MB, use GB. Otherwise use MB.
|
||||
- **CABLE/WIRE LENGTH**: Meters only. Examples: "5m", "10m", "50m"
|
||||
- **RAM DIMM**: Capacity in GB. Examples: "128GB", "32GB", "8GB"
|
||||
|
||||
- `<type>`: Asset class. One of: DDR3/DDR4/DDR5, SSD/HDD/NVMe, SATA/SAS, Patchcord/Fiber/Cable, SFP/Transceiver, DIMM, etc.
|
||||
- `<vendor>`: Manufacturer (HP, HPE, Dell, Samsung, Cisco, Hynix, Intel, Broadcom)
|
||||
- `<connector>`: Physical interface (RJ45, LC-LC, MPO, U.3, SATA, SAS, ST, SC). Omit if N/A.
|
||||
- `<part_number>`: Part number ONLY if visible. **Omit serial numbers.**
|
||||
|
||||
**Item Examples (WITH HUMAN-READABLE SIZES):**
|
||||
- `1.6TB NVMe HPE U.3 P66093-002` (not 1600GB)
|
||||
- `256GB SSD Dell SATA SK-8765` (already human-readable)
|
||||
- `5m Patchcord LC-LC`
|
||||
- `128GB DDR4 Hynix`
|
||||
- `512MB Cache Samsung SATA` (stays MB if under 1GB)
|
||||
|
||||
**Size Conversion Examples:**
|
||||
- 1600GB → 1.6TB
|
||||
- 2048GB → 2TB
|
||||
- 512GB → 512GB (under 1TB threshold)
|
||||
- 256MB → 256MB
|
||||
- 1024MB → 1GB
|
||||
|
||||
**Restrictions:**
|
||||
- No comments in parenthesis
|
||||
- No measurement units in Item field (e.g., "1.6TB" not "1.6TB Storage")
|
||||
- No secondary vendors
|
||||
- No diameter/mm in Item field
|
||||
- ONE vendor only (primary manufacturer)
|
||||
|
||||
## Other Fields
|
||||
- **Type**: Repeat the asset class (DDR4, SSD, NVMe, Patchcord, etc.)
|
||||
- **Description**: Technical summary, max 5 words. Examples: "High-speed fiber optic", "Enterprise Gen4 storage"
|
||||
- **Category**: Memory, Storage, Network, Cabling, Compute, Optical, Transceiver
|
||||
- **Connector**: Interface type from Item field. Examples: "LC-LC", "RJ45", "U.3"
|
||||
- **Size**: **HUMAN-READABLE capacity or length.** Examples: "1.6TB", "256GB", "5m" (NOT "1600GB")
|
||||
- **Color**: Physical color if distinguishing
|
||||
- **PartNr**: Part number only (no serial numbers)
|
||||
- **OCR**: Robust matching key for OCR tolerance
|
||||
|
||||
## OCR Field Rules (CRITICAL)
|
||||
Generate a SHORT, clean matching key:
|
||||
- Format: **UPPERCASE space-separated, NO special chars, NO duplicates**
|
||||
- Include ONLY: Type + Size + Primary Vendor + Connector + Part Number
|
||||
- **EXCLUDE**: Serial numbers, secondary vendors, duplicate tokens, EMC/SK labels
|
||||
- **USE HUMAN-READABLE SIZE**: Use TB/GB from Item field, not original notation
|
||||
|
||||
**OCR Format:** `TYPE SIZE VENDOR CONNECTOR PARTNUMBER`
|
||||
|
||||
**OCR Examples (WITH HUMAN-READABLE SIZES):**
|
||||
- Item: `1.6TB NVMe HPE U.3 P66093-002` → OCR: `NVME 1.6TB HPE U3 P66093002`
|
||||
- Item: `5m Patchcord LC-LC` → OCR: `PATCHCORD 5M LC LC`
|
||||
- Item: `256GB SSD Samsung SAS SK-8765` → OCR: `SSD 256GB SAMSUNG SAS SK8765`
|
||||
- Item: `128GB DDR4 Hynix` → OCR: `DDR4 128GB HYNIX`
|
||||
|
||||
**OCR Constraints:**
|
||||
- NO duplicate part numbers
|
||||
- NO secondary vendor names
|
||||
- NO extraneous labels
|
||||
- Each token appears ONE time only
|
||||
- Remove hyphens/special chars for fuzzy matching
|
||||
- Use HUMAN-READABLE sizes (1.6TB not 1600GB)
|
||||
|
||||
## Output Format
|
||||
```json
|
||||
{
|
||||
"items": [
|
||||
{
|
||||
"Item": "SFP Module",
|
||||
"Type": "SFP",
|
||||
"Description": "64G Gen7 Fibre Channel",
|
||||
"Category": "Network",
|
||||
"Connector": "LC",
|
||||
"PartNr": "SFP-64G-G7",
|
||||
"OCR": "SFP 64G GEN7 FC"
|
||||
"Item": "[size] type vendor connector partnumber",
|
||||
"Type": "type",
|
||||
"Description": "technical details (max 5 words)",
|
||||
"Category": "category",
|
||||
"Connector": "connector_type",
|
||||
"Size": "human_readable_size",
|
||||
"Color": "color",
|
||||
"PartNr": "part_number",
|
||||
"OCR": "TYPE SIZE VENDOR CONNECTOR PARTNUMBER"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Return ONLY JSON. No markdown. No text.
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user