
{"id":8533,"date":"2026-05-14T17:54:52","date_gmt":"2026-05-14T16:54:52","guid":{"rendered":"https:\/\/dasini.net\/blog\/?p=8533"},"modified":"2026-05-14T17:54:57","modified_gmt":"2026-05-14T16:54:57","slug":"building-an-ai-vision-search-engine-with-mysql-heatwave-genai","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2026\/05\/14\/building-an-ai-vision-search-engine-with-mysql-heatwave-genai\/","title":{"rendered":"Building an AI Vision Search Engine with MySQL HeatWave GenAI"},"content":{"rendered":"\n<p>Modern AI systems increasingly rely on multimodal data: text, images, documents, audio, and video. Among these modalities, image understanding has become one of the most important capabilities for AI-powered applications.<\/p>\n\n\n\n<p>Organizations now expect systems to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Search images using natural language<\/li>\n\n\n\n<li>Compare visually similar assets<\/li>\n\n\n\n<li>Classify and enrich image catalogs<\/li>\n\n\n\n<li>Validate AI-generated descriptions<\/li>\n\n\n\n<li>Build semantic retrieval pipelines<\/li>\n<\/ul>\n\n\n\n<p>Traditionally, implementing these capabilities required specialized computer vision infrastructure, external vector databases, custom ML pipelines, and multiple frameworks.<\/p>\n\n\n\n<p>With <strong><a href=\"https:\/\/www.oracle.com\/in\/mysql\/genai\/\" target=\"_blank\" rel=\"noopener\" title=\"MySQL HeatWave GenAI\">MySQL HeatWave GenAI<\/a><\/strong>, many of these capabilities can now be implemented directly inside <strong>SQL workflows<\/strong> using built-in AI routines such as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-generate.html\" target=\"_blank\" rel=\"noopener\" title=\"ML_GENERATE - generate text-based content as a response for the given natural-language query\">sys.ML_GENERATE<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-embed-row.html\" target=\"_blank\" rel=\"noopener\" title=\"sys.ML_EMBED_ROW - encode the specified text or query into a vector embedding\">sys.ML_EMBED_ROW<\/a><\/code><\/li>\n\n\n\n<li><a href=\"https:\/\/www.google.com\/url?sa=t&amp;source=web&amp;rct=j&amp;opi=89978449&amp;url=https:\/\/dev.mysql.com\/doc\/refman\/9.3\/en\/vector.html&amp;ved=2ahUKEwj7nsnpvayUAxVzVaQEHZF9BR8QFnoECAwQAQ&amp;usg=AOvVaw3-ch-c0j77Uy-_hBI_NRVM\" target=\"_blank\" rel=\"noopener\" title=\"The MySQL VECTOR type\">VECTOR<\/a> data types<\/li>\n\n\n\n<li>Similarity search with <code><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/9.7\/en\/vector-functions.html#function_distance\" target=\"_blank\" rel=\"noopener\" title=\"DISTANCE - Calculates the distance between two vectors\">DISTANCE<\/a><\/code> and the other <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/9.7\/en\/vector-functions.html\" target=\"_blank\" rel=\"noopener\" title=\"MySQL vector functions\">Vector functions<\/a>.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>In this article, we will build the foundations of a <strong>Vision Model Evaluation Assistant<\/strong> using <strong>MySQL HeatWave GenAI<\/strong>.<\/p>\n\n\n\n<p>The objective is not to create another image classifier, but rather a <strong>semantic image understanding platform<\/strong> capable of:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Generating image descriptions<\/li>\n\n\n\n<li>Producing semantic embeddings<\/li>\n\n\n\n<li>Performing text-to-image search<\/li>\n\n\n\n<li>Performing semantic reverse image search<\/li>\n\n\n\n<li>Evaluating image understanding quality<\/li>\n<\/ul>\n\n\n\n<p>This article intentionally focuses on the database layer and the SQL logic powering the system.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Landscape of Vision-to-Embedding Approaches<\/h1>\n\n\n\n<p>Before building the solution, it is important to understand the major approaches currently used for AI-powered image understanding systems.<\/p>\n\n\n\n<p>Let&rsquo;s have a look on three paradigms for representing images in AI systems.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">1. Direct Image Embeddings<\/h2>\n\n\n\n<p>The first approach consists of converting raw image pixels directly into vectors.<\/p>\n\n\n\n<p>Popular architectures include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/openai\/CLIP\" target=\"_blank\" rel=\"noopener\" title=\"CLIP (Contrastive Language-Image Pre-Training) is a neural network trained on a variety of (image, text) pairs\">CLIP<\/a>-like (Contrastive Language-Image Pretraining) models<\/li>\n\n\n\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Residual_neural_network\" target=\"_blank\" rel=\"noopener\" title=\"Residual neural network\">ResNet<\/a> + projector architectures<\/li>\n\n\n\n<li><a href=\"https:\/\/en.wikipedia.org\/wiki\/Vision_transformer\" target=\"_blank\" rel=\"noopener\" title=\"Vision Transformers (ViT)\">Vision Transformers<\/a> (ViT)<\/li>\n<\/ul>\n\n\n\n<p>In this approach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The image is fed directly into a neural network<\/li>\n\n\n\n<li>The network produces a dense vector embedding<\/li>\n\n\n\n<li>Similarity search is performed directly on image vectors<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Workflow<\/h3>\n\n\n\n<figure class=\"wp-block-image size-full\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"620\" height=\"160\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.1.workflow_Direct_Image_Embedding.png?resize=620%2C160&#038;ssl=1\" alt=\"\" class=\"wp-image-8551\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.1.workflow_Direct_Image_Embedding.png?w=620&amp;ssl=1 620w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.1.workflow_Direct_Image_Embedding.png?resize=300%2C77&amp;ssl=1 300w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Strengths<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Extremely fast similarity search<\/li>\n\n\n\n<li>Excellent for image-to-image matching<\/li>\n\n\n\n<li>End-to-end architecture<\/li>\n\n\n\n<li>No intermediate textual representation required<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Limitations<\/h3>\n\n\n\n<p>These embeddings are often difficult to interpret:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>No human-readable explanation<\/li>\n\n\n\n<li>Harder to debug<\/li>\n\n\n\n<li>Harder to refine<\/li>\n\n\n\n<li>Black-box behavior<\/li>\n<\/ul>\n\n\n\n<p>If a search result is incorrect, it is difficult to understand <em>why<\/em> the model failed.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">To summarize<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>High-performance retrieval<\/li>\n\n\n\n<li>Strong visual similarity matching<\/li>\n\n\n\n<li>Can compare image-to-image directly<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Requires specialized model deployment<\/li>\n\n\n\n<li>Less explainable<\/li>\n\n\n\n<li>Harder to integrate into SQL-centric workflows<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">2. Semantic Metadata Embeddings<\/h2>\n\n\n\n<p>This is the approach used in this article.<\/p>\n\n\n\n<p>Instead of embedding raw pixels directly, we first generate a textual understanding of the image.<\/p>\n\n\n\n<p>The workflow becomes:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"206\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.2workflow_Semantic_Metadata_Embeddings-1.png?resize=800%2C206&#038;ssl=1\" alt=\"\" class=\"wp-image-8564\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.2workflow_Semantic_Metadata_Embeddings-1.png?resize=800%2C206&amp;ssl=1 800w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.2workflow_Semantic_Metadata_Embeddings-1.png?resize=300%2C77&amp;ssl=1 300w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.2workflow_Semantic_Metadata_Embeddings-1.png?resize=768%2C198&amp;ssl=1 768w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.2workflow_Semantic_Metadata_Embeddings-1.png?resize=1536%2C396&amp;ssl=1 1536w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/1.2workflow_Semantic_Metadata_Embeddings-1.png?w=2046&amp;ssl=1 2046w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>This pipeline is composed of two distinct stages:<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Step 1: Image <em>-> <\/em>Text<\/h3>\n\n\n\n<p>A <a href=\"https:\/\/en.wikipedia.org\/wiki\/Vision-language_model\" target=\"_blank\" rel=\"noopener\" title=\"Vision Language Model\">Vision Language Model<\/a> (VLM) analyzes the image and generates:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A description and \/ or Keywords<\/li>\n\n\n\n<li>Contextual understanding<\/li>\n<\/ul>\n\n\n\n<p><span style=\"text-decoration: underline;\">Example<\/span>:<\/p>\n\n\n\n<pre title=\"Contextual understanding\" class=\"wp-block-code\"><code lang=\"json\" class=\"language-json\"><code>{<\/code>    \"description\": \"A red motorcycle parked on a city street near buildings during daytime.\",\n\n    \"keywords\": [\"motorcycle\", \"street\", \"urban\", \"vehicle\", \"city\"]\n<code>}<\/code><\/code><\/pre>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Step 2: Text <em>-> <\/em>Embedding<\/h3>\n\n\n\n<p>The generated text is then converted into a vector embedding using a text embedding model.<\/p>\n\n\n\n<p>This creates semantic vectors representing the meaning of the image.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Strengths<\/h3>\n\n\n\n<p>This approach offers several advantages:<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Human-readable and explainable<\/h4>\n\n\n\n<p>Unlike direct image embeddings, the generated metadata is understandable by humans.<\/p>\n\n\n\n<p>If a search fails, developers can inspect:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The generated description<\/li>\n\n\n\n<li>The extracted keywords<\/li>\n\n\n\n<li>The semantic interpretation<\/li>\n<\/ul>\n\n\n\n<p>This creates a powerful audit trail.<\/p>\n\n\n\n<div style=\"height:19px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h4 class=\"wp-block-heading\">SQL-native workflow<\/h4>\n\n\n\n<p>Because the representation becomes textual:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Standard embedding models can be used<\/li>\n\n\n\n<li>VECTOR columns integrate naturally<\/li>\n\n\n\n<li>SQL workflows remain simple<\/li>\n<\/ul>\n\n\n\n<p><strong>This aligns perfectly with MySQL HeatWave GenAI capabilities<\/strong>.<\/p>\n\n\n\n<div style=\"height:9px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Trade-offs<\/h3>\n\n\n\n<p>The quality of retrieval depends heavily on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Caption quality<\/li>\n\n\n\n<li>Prompt engineering<\/li>\n\n\n\n<li>Vision model performance<\/li>\n<\/ul>\n\n\n\n<p>Low-level visual details may also be lost:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Texture<\/li>\n\n\n\n<li>Exact shape<\/li>\n\n\n\n<li>Pixel-specific patterns<\/li>\n<\/ul>\n\n\n\n<div style=\"height:19px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">To summarize<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Pros<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Human-readable<\/li>\n\n\n\n<li>Easy to debug<\/li>\n\n\n\n<li>Works well with SQL systems<\/li>\n\n\n\n<li>Easier operationalization<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Cons<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Less precise for purely visual similarity<\/li>\n\n\n\n<li>Depends on generated metadata quality<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">3. Multimodal Fusion Models<\/h2>\n\n\n\n<p>A third category consists of multimodal architectures capable of jointly processing:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Images<\/li>\n\n\n\n<li>Text<\/li>\n\n\n\n<li>Audio<\/li>\n\n\n\n<li>Video<\/li>\n\n\n\n<li>Structured data<\/li>\n<\/ul>\n\n\n\n<p>These systems use:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Early fusion<\/li>\n\n\n\n<li>Intermediate fusion<\/li>\n\n\n\n<li>Late fusion<\/li>\n\n\n\n<li>Hybrid fusion architectures<\/li>\n<\/ul>\n\n\n\n<p>Their objective is to create unified multimodal embeddings.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Strengths<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Very powerful semantic understanding<\/li>\n\n\n\n<li>Strong cross-modal reasoning<\/li>\n\n\n\n<li>Rich contextual interpretation<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Challenges<\/h3>\n\n\n\n<p>These architectures are often:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>More complex<\/li>\n\n\n\n<li>Harder to operationalize<\/li>\n\n\n\n<li>Less transparent<\/li>\n\n\n\n<li>Difficult to integrate into SQL-centric architectures<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Why We Chose the Image -&gt; Text -&gt; Embedding Approach?<\/h2>\n\n\n\n<p>In this article, we intentionally choose the <strong>Semantic Metadata Embeddings<\/strong> pipeline because it aligns perfectly with MySQL HeatWave GenAI capabilities.<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Specifically<\/span><\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-generate.html\" target=\"_blank\" rel=\"noopener\" title=\"ML_GENERATE - generate text-based content as a response for the given natural-language query\"><strong>ML_GENERATE<\/strong><\/a><\/code><\/code> handles image-to-text generation<\/li>\n\n\n\n<li><code><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-embed-row.html\" target=\"_blank\" rel=\"noopener\" title=\"sys.ML_EMBED_ROW - encode the specified text or query into a vector embedding\"><strong>ML_EMBED_ROW<\/strong><\/a><\/code><\/code> handles text-to-vector conversion<\/li>\n<\/ul>\n\n\n\n<p>This approach also creates a human-readable semantic audit trail.<\/p>\n\n\n\n<p>If retrieval quality degrades, architects and developers can directly inspect the generated descriptions to understand:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What the model detected<\/li>\n\n\n\n<li>What it missed<\/li>\n\n\n\n<li>Why semantic similarity failed<\/li>\n<\/ul>\n\n\n\n<p><strong>For AI evaluation systems, explainability is often just as important as accuracy<\/strong>.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Overview of MySQL HeatWave GenAI<\/h1>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a063b2ce2609&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a063b2ce2609\" class=\"aligncenter size-full is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"550\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/09\/rc24-heatwave-logo.gif?fit=770%2C550&amp;ssl=1\" alt=\"MySQL HeatWave\" class=\"wp-image-8340\" style=\"aspect-ratio:1;object-fit:cover;width:200px\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandir\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>MySQL HeatWave is a fully managed cloud service that combines:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Transactional processing (OLTP)<\/li>\n\n\n\n<li>Analytics (OLAP)<\/li>\n\n\n\n<li>Machine Learning<\/li>\n\n\n\n<li>Generative AI<\/li>\n\n\n\n<li>Vector Store capabilities<\/li>\n<\/ul>\n\n\n\n<p>within a single MySQL platform.<\/p>\n\n\n\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a063b2ce2996&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a063b2ce2996\" class=\"wp-block-image size-large wp-lightbox-container\"><img data-recalc-dims=\"1\" decoding=\"async\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?ssl=1\" alt=\"Transactional processing (OLTP)\n\nAnalytics (OLAP)\nMachine Learning\nGenerative AI\nVector Store capabilities\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandir\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>One of the most interesting aspects of <strong>HeatWave GenAI<\/strong> is that it enables <strong>AI-powered workflows directly inside SQL<\/strong>.<\/p>\n\n\n\n<p>Instead of exporting data to external AI pipelines, developers can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Generate embeddings<\/li>\n\n\n\n<li>Execute semantic similarity search<\/li>\n\n\n\n<li>Perform retrieval augmented generation (RAG)<\/li>\n\n\n\n<li>Analyze images<\/li>\n\n\n\n<li>Invoke LLMs<\/li>\n<\/ul>\n\n\n\n<p>using SQL routines \\o\/.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">MySQL HeatWave Key GenAI Capabilities<\/h2>\n\n\n\n<p>MySQL HeatWave GenAI includes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Text generation<\/li>\n\n\n\n<li>Text embeddings<\/li>\n\n\n\n<li>Vector similarity search<\/li>\n\n\n\n<li>In-database AI processing<\/li>\n\n\n\n<li>Vision model integration<\/li>\n<\/ul>\n\n\n\n<p>Key routines and data types used in this article include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-generate.html\" target=\"_blank\" rel=\"noopener\" title=\"sys.ML_GENERATE\"><code><\/code><\/a><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-generate.html\" target=\"_blank\" rel=\"noopener\" title=\"ML_GENERATE - generate text-based content as a response for the given natural-language query\">sys.ML_GENERATE<\/a><\/code><\/code><\/li>\n\n\n\n<li><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-embed-row.html\" target=\"_blank\" rel=\"noopener\" title=\"sys.ML_EMBED_ROW\">sys.ML_EMBED_ROW<\/a><\/code><\/li>\n\n\n\n<li><code><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/9.7\/en\/vector-functions.html#function_distance\" target=\"_blank\" rel=\"noopener\" title=\"DISTANCE\">DISTANCE<\/a><\/code><\/li>\n\n\n\n<li><a href=\"https:\/\/www.google.com\/url?sa=t&amp;source=web&amp;rct=j&amp;opi=89978449&amp;url=https:\/\/dev.mysql.com\/doc\/refman\/9.3\/en\/vector.html&amp;ved=2ahUKEwj7nsnpvayUAxVzVaQEHZF9BR8QFnoECAwQAQ&amp;usg=AOvVaw3-ch-c0j77Uy-_hBI_NRVM\" target=\"_blank\" rel=\"noopener\" title=\"VECTOR\">VECTOR<\/a><\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>In this article, I&rsquo;m using MySQL HeatWave version <strong>9.6.1<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"SQL\" class=\"language-SQL\">mysql&gt; \nSELECT VERSION();\n+-------------+\n| VERSION()   |\n+-------------+\n| 9.6.1-cloud |\n+-------------+<\/code><\/pre>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Significantly lower the Total Cost of Ownership<\/h2>\n\n\n\n<p>Traditionally, AI pipelines require:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Multiple services<\/li>\n\n\n\n<li>External vector databases<\/li>\n\n\n\n<li>Dedicated ML infrastructure<\/li>\n\n\n\n<li>Separate orchestration layers<\/li>\n<\/ul>\n\n\n\n<p>With MySQL HeatWave:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Data remains inside MySQL<\/li>\n\n\n\n<li>AI logic becomes SQL-native<\/li>\n\n\n\n<li>Governance is simplified<\/li>\n\n\n\n<li>Operational complexity is reduced<\/li>\n<\/ul>\n\n\n\n<p>By consolidating these diverse requirements into a single platform, <strong>MySQL HeatWave significantly lowers the Total Cost of Ownership<\/strong> (TCO). It eliminates the expensive licensing fees associated with multiple third-party services and external vector databases. <\/p>\n\n\n\n<p>Furthermore, by making AI logic SQL-native and reducing operational complexity, organizations can leverage their existing database expertise rather than hiring specialized ML engineers to manage separate orchestration layers, drastically cutting both infrastructure and personnel overhead.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Summary of TCO Drivers<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Skill Set Leverage<\/strong>: AI tasks become accessible to anyone with SQL skills, reducing the need for niche, high-cost specialists.<\/li>\n\n\n\n<li><strong>Reduced Licensing<\/strong>: Consolidating multiple services into one platform removes the need for separate vendor contracts.<\/li>\n\n\n\n<li><strong>Lower Infrastructure Costs<\/strong>: Eliminating dedicated ML infrastructure and external databases reduces the physical or cloud hardware footprint.<\/li>\n\n\n\n<li><strong>Operational Efficiency<\/strong>: Keeping data inside MySQL HeatWave simplifies governance and reduces the labor hours required for complex data movement and synchronization.<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-left\">Generating Image Understanding with <code>sys.ML_GENERATE<\/code><\/h1>\n\n\n\n<p>The foundation of our evaluation assistant is the ability to convert images into semantic understanding.<\/p>\n\n\n\n<p>This is where <code><strong><code><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-generate.html\" target=\"_blank\" rel=\"noopener\" title=\"ML_GENERATE - generate text-based content as a response for the given natural-language query\">sys.ML_GENERATE<\/a><\/code><\/strong><\/code> becomes extremely powerful.<\/p>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Prerequisites<\/h2>\n\n\n\n<p>The environment requires:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A MySQL HeatWave instance with a HeatWave cluster attached<\/li>\n\n\n\n<li>Access to supported vision models (<em>like google.gemini-2.5-pro<\/em>)<\/li>\n\n\n\n<li>Access to supported embedding models (<em>like cohere.embed-english-v3.0<\/em>)<\/li>\n\n\n\n<li>A table capable of storing:\n<ul class=\"wp-block-list\">\n<li>Images<\/li>\n\n\n\n<li>Descriptions<\/li>\n\n\n\n<li>Keywords<\/li>\n\n\n\n<li>Embeddings<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Table Definition<\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\"><code><span style=\"background-color: rgb(40, 44, 52);\">CREATE TABLE image_details (<\/span><\/code>  id_image int unsigned NOT NULL AUTO_INCREMENT,\n  image_name varchar(255) NOT NULL,\n  image_base64 longtext NOT NULL,\n  image_description json NOT NULL,\n  image_description_embedding vector(2048) NOT NULL COMMENT 'GENAI_OPTIONS=EMBED_MODEL_ID=cohere.embed-english-v3.0',\n  image_keywords json NOT NULL,\n  image_keywords_embedding vector(2048) NOT NULL COMMENT 'GENAI_OPTIONS=EMBED_MODEL_ID=cohere.embed-english-v3.0',\n  created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP,\n  PRIMARY KEY (id_image)\n) ENGINE=InnoDB;<\/code><\/pre>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>This table stores:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The original image (in base 64).<\/li>\n\n\n\n<li>Semantic metadata (Image description and keywords).<\/li>\n\n\n\n<li>Vector embeddings (of the description and the keywords).<\/li>\n<\/ul>\n\n\n\n<p>directly inside MySQL.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">What <code>sys.ML_GENERATE<\/code> Enables<\/h2>\n\n\n\n<p>The <code>sys.ML_GENERATE<\/code> routine supports multimodal prompts combining:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Text<\/li>\n\n\n\n<li>Images<\/li>\n<\/ul>\n\n\n\n<p>This enables:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Caption generation<\/li>\n\n\n\n<li>Object detection prompts<\/li>\n\n\n\n<li>Context extraction<\/li>\n\n\n\n<li>Semantic interpretation<\/li>\n<\/ul>\n\n\n\n<p>Please read the <a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-ml-generate.html?utm_source=dasini.net\" target=\"_blank\" rel=\"noopener\" title=\"MySQL HeatWave ML_GENERATE Documentation\">MySQL HeatWave ML_GENERATE Documentation<\/a> if you want to know more.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Bridging Structured and Unstructured Data<\/h2>\n\n\n\n<p>One of the most interesting aspects of <code>ML_GENERATE<\/code> is that it bridges the gap between:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Structured SQL systems<\/li>\n\n\n\n<li>Unstructured image content<\/li>\n<\/ul>\n\n\n\n<p>The output becomes structured semantic metadata that can:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Be stored<\/li>\n\n\n\n<li>Indexed<\/li>\n\n\n\n<li>Embedded<\/li>\n\n\n\n<li>Queried<\/li>\n\n\n\n<li>Compared<\/li>\n<\/ul>\n\n\n\n<p>using <strong>standard SQL operations<\/strong>.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Supported Vision Models<\/h2>\n\n\n\n<p>The supported vision models can be queried directly from MySQL HeatWave:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"SQL\" class=\"language-SQL\">mysql&gt;\nSELECT * \nFROM sys.ML_SUPPORTED_LLMS\nWHERE model_id LIKE 'google.gemini%'\\G\n\n*************************** 1. row ***************************\n         provider: OCI Generative AI Service\n         model_id: google.gemini-2.5-flash\navailability_date: 2026-01-22\n     capabilities: [\"GENERATION\"]\n    default_model: 0\n*************************** 2. row ***************************\n         provider: OCI Generative AI Service\n         model_id: google.gemini-2.5-pro\navailability_date: 2026-01-22\n     capabilities: [\"GENERATION\"]\n    default_model: 0\n*************************** 3. row ***************************\n         provider: OCI Generative AI Service\n         model_id: google.gemini-2.5-flash-lite\navailability_date: 2026-01-22\n     capabilities: [\"GENERATION\"]\n    default_model: 0<\/code><\/pre>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The model used in this article is:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"SQL\" class=\"language-SQL\">google.gemini-2.5-pro<\/code><\/pre>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>The workflow is straightforward:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"120\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/3.4_Generating_Image_Understanding.png?resize=800%2C120&#038;ssl=1\" alt=\"\" class=\"wp-image-8621\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/3.4_Generating_Image_Understanding.png?resize=800%2C120&amp;ssl=1 800w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/3.4_Generating_Image_Understanding.png?resize=300%2C45&amp;ssl=1 300w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/3.4_Generating_Image_Understanding.png?resize=768%2C116&amp;ssl=1 768w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/3.4_Generating_Image_Understanding.png?w=1308&amp;ssl=1 1308w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n\n\n\n<p>This transforms unstructured visual data into structured semantic data.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Examples<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"450\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/hornet_black_gold.jpg?fit=300%2C169&amp;ssl=1\" alt=\"\" class=\"wp-image-8731\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/hornet_black_gold.jpg?w=800&amp;ssl=1 800w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/hornet_black_gold.jpg?resize=300%2C169&amp;ssl=1 300w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/hornet_black_gold.jpg?resize=768%2C432&amp;ssl=1 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><\/figure>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\">Object Detection Prompt<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql> \nSELECT image_base64\nFROM image_details\nWHERE id_image = 1\nINTO @image_base64;\n\nSET @prompt_desc_key_json = 'What objects are present?';\n\nSELECT JSON_UNQUOTE(\n    JSON_EXTRACT(\n        sys.ML_GENERATE(@prompt_desc_key_json, JSON_OBJECT(\"model_id\", \"google.gemini-2.5-pro\", \"image\", @image_base64)),\n        '$.text'\n    )\n) AS description\n\\G\n\n*************************** 1. row ***************************\ndescription: Based on the image provided, here are the objects that are present:\n\n**Main Subject:**\n*   A black motorcycle, which appears to be a Honda Hornet, is the central object. Its visible parts include:\n    *   Wheels and tires\n    *   Engine\n    *   Exhaust pipe and muffler\n    *   Frame\n    *   Seat\n    *   Fuel tank (with a black tank cover on it)\n    *   Handlebars with mirrors and levers\n    *   Front and rear disc brakes\n    *   Gold-colored front forks\n\n**Background and Surroundings:**\n*   A white or light gray garage door with vertical panels.\n*   A red brick wall on the left.\n*   A white drainpipe between the wall and the garage door.\n*   Pavement or concrete on the ground, with some patches of frost or thin snow.\n*   Dry, brown leaves scattered on the ground.<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Scene Context Prompt<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql> \nSET @prompt_desc_key_json = 'What is the context of this scene?';\n\nSELECT JSON_UNQUOTE(\n    JSON_EXTRACT(\n        sys.ML_GENERATE(@prompt_desc_key_json, JSON_OBJECT(\"model_id\", \"google.gemini-2.5-pro\", \"image\", @image_base64)),\n        '$.text'\n    )\n) AS description\n\\G\n\n*************************** 1. row ***************************\ndescription: Based on the image, the context of the scene is an outdoor, residential setting, likely during a cold season like late autumn or winter.\n\nHere are the key details that establish this context:\n\n*   **Subject:** The central focus is a modern, black and silver Honda Hornet motorcycle. It is parked and appears to be the subject of the photo, possibly taken by its owner.\n*   **Location:** The motorcycle is parked on a paved surface, such as a driveway or a courtyard, in front of white, vertical-paneled garage doors. To the left, there is a red brick wall. This combination suggests a residential area.\n*   **Season\/Weather:** The ground is littered with dead, brown leaves and patches of what looks like frost or old, melting snow. This indicates cold weather, pointing to late autumn or winter. The lighting appears flat and overcast, which is common for that time of year.<\/code><\/pre>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>This capability becomes the semantic foundation of the evaluation assistant. We are not merely generating captions.<\/p>\n\n\n\n<p>We are enabling:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Queryable visual understanding<\/li>\n\n\n\n<li>Semantic enrichment<\/li>\n\n\n\n<li>Explainable AI retrieval<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Text-to-Image Search (Semantic Retrieval)<\/h1>\n\n\n\n<p>One of the most powerful applications of semantic embeddings is natural language image search.<\/p>\n\n\n\n<p>The objective is simple:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code>Input: Text<\/code>\n<code>Output: Relevant Images<\/code><\/pre>\n\n\n\n<p>But internally, the logic is fundamentally different from traditional image retrieval systems.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">The Core Idea<\/h2>\n\n\n\n<p>We are not searching for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pixels<\/li>\n\n\n\n<li>Shapes<\/li>\n\n\n\n<li>Exact visual patterns<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>We are searching for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Meaning<\/li>\n\n\n\n<li>Context<\/li>\n\n\n\n<li>Semantics<\/li>\n<\/ul>\n\n\n\n<p>This is <strong>semantic retrieval<\/strong>.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Workflow Overview<\/h2>\n\n\n\n<p>The workflow contains two phases:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Preprocessing<\/li>\n\n\n\n<li>Query execution<\/li>\n<\/ol>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Preprocessing Phase<\/h2>\n\n\n\n<p>Each image must first be semantically enriched. <\/p>\n\n\n\n<p>The workflow is the following:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a063b2ce4704&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a063b2ce4704\" class=\"aligncenter size-full is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"393\" height=\"567\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/4.1_workflow_Text-to-Image-Search.png?fit=393%2C567&amp;ssl=1\" alt=\"\" class=\"wp-image-8641\" style=\"width:auto;height:450px\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/4.1_workflow_Text-to-Image-Search.png?w=393&amp;ssl=1 393w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/4.1_workflow_Text-to-Image-Search.png?resize=208%2C300&amp;ssl=1 208w\" sizes=\"auto, (max-width: 393px) 100vw, 393px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandir\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><br>Supported Embedding Models<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql&gt; \nSELECT *\nFROM sys.ML_SUPPORTED_LLMS\nWHERE capabilities LIKE '[\"TEXT_EMBEDDINGS\"]'\\G\n\n*************************** 1. row ***************************\n         provider: HeatWave\n         model_id: all_minilm_l12_v2\navailability_date: 2024-07-01\n     capabilities: [\"TEXT_EMBEDDINGS\"]\n    default_model: 0\n*************************** 2. row ***************************\n         provider: HeatWave\n         model_id: multilingual-e5-small\navailability_date: 2024-07-24\n     capabilities: [\"TEXT_EMBEDDINGS\"]\n    default_model: 1\n*************************** 3. row ***************************\n         provider: OCI Generative AI Service\n         model_id: cohere.embed-english-v3.0\navailability_date: 2024-02-17\n     capabilities: [\"TEXT_EMBEDDINGS\"]\n    default_model: 0\n*************************** 4. row ***************************\n         provider: OCI Generative AI Service\n         model_id: cohere.embed-multilingual-v3.0\navailability_date: 2024-02-17\n     capabilities: [\"TEXT_EMBEDDINGS\"]\n    default_model: 0<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Generating Semantic Metadata<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql&gt; \nSET @prompt_desc_key_json = '\nAnalyze the image and return a minified JSON object.\nThe JSON must contain two fields:\n\"description\" (a concise, single-paragraph description of visible content with no speculation)\nand \"keywords\" (a JSON array of relevant lowercase visual keywords).\nOutput ONLY the raw JSON on a single line without any markdown formatting, backticks, or preamble\n';<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Generate Description and Keywords<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql> \nSELECT JSON_UNQUOTE(\n    JSON_EXTRACT(\n        sys.ML_GENERATE(@prompt_desc_key_json, JSON_OBJECT(\"model_id\", \"google.gemini-2.5-pro\", \"image\", @image_base64)),\n        '$.text'\n    )\n) AS description\n\\G\n\n*************************** 1. row ***************************\ndescription: {\"description\":\"A side profile view of a black Honda Hornet naked motorcycle parked on a paved surface with scattered leaves. The bike has a black frame, engine, and fuel tank, with a silver tail section and exhaust pipe. The front forks are gold-colored. In the background, there is a red brick wall on the left and a light-colored, vertically-paneled garage door on the right.\",\"keywords\":[\"motorcycle\",\"honda\",\"honda hornet\",\"naked bike\",\"street bike\",\"black\",\"parked\",\"outdoors\",\"garage door\",\"brick wall\",\"engine\",\"exhaust\",\"two-wheeler\",\"vehicle\",\"wheel\",\"tire\",\"disc brake\"]}<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Generate Embeddings and Store Data<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql&gt; \nINSERT INTO image_details (\n    image_name,\n    image_base64,\n    image_description,\n    image_description_embedding,\n    image_keywords,\n    image_keywords_embedding\n)\nVALUES (\n    image_name,\n    image_base64,\n    image_description,\n    sys.ML_EMBED_ROW(\n        @source_image_descriptions,\n        '{\"model_id\": \"cohere.embed-english-v3.0\"}'\n    ),\n    image_keywords,\n    sys.ML_EMBED_ROW(\n        @source_image_keywords,\n        '{\"model_id\": \"cohere.embed-english-v3.0\"}'\n    )\n);<\/code><\/pre>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Query Phase<\/h2>\n\n\n\n<p>At query time:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>The user enters a text description<\/li>\n\n\n\n<li>The text becomes an embedding<\/li>\n\n\n\n<li>Similarity search retrieves matching images<\/li>\n<\/ol>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Generate Query Embedding<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql&gt; \nSET @embeddOptions = '{\"model_id\": \"cohere.embed-english-v3.0\"}';\n\nSET @searchImage = 'street motorcycle';\n\nSELECT sys.ML_EMBED_ROW(\n    @searchImage,\n    @embeddOptions\n) INTO @searchImageEmbedding;<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<p>If you want to see what a vector embedding looks like under the hood, you can use the <code><strong><a href=\"https:\/\/dev.mysql.com\/doc\/refman\/9.1\/en\/vector-functions.html#function_vector-to-string\" target=\"_blank\" rel=\"noopener\" title=\"MySQL Vector Functions\">FROM_VECTOR<\/a>()<\/strong><\/code> function:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql>\nSELECT from_vector(@searchImageEmbedding)\\G\n*************************** 1. row ***************************\nfrom_vector(@searchImageEmbedding): [2.09045e-02,1.06277e-02,2.59590e-03,-6.01807e-02,-4.44336e-02,8.44574e-03,-4.88281e-02,8.72803e-03,-1.45645e-02,2.78168e-02,-4.73328e-02,2.53296e-03,-5.47791e-03,-1.36337e-02,4.00696e-02,-1.90735e-02,6.69556e-02,-3.72314e-02,3.95203e-02,2.24457e-02,-1.06964e-02,7.75757e-02,-1 \n                 ... even more numbers ...\n,-3.04871e-02,5.33295e-03,3.96729e-03]<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Similarity Search Using Descriptions<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql> \nSELECT \n    image_name,\n    DISTANCE(\n        image_description_embedding,\n        @searchImageEmbedding,\n        'COSINE'\n    ) AS min_distance\nFROM image_details\nORDER BY min_distance\nLIMIT 3;\n\n+-----------------------+---------------------+\n| image_name            | min_distance        |\n+-----------------------+---------------------+\n| vintage_sidecar.JPG   | 0.46460431814193726 |\n| Le_Mans_24_moto.png   | 0.49795448780059814 |\n| hornet_black_gold.jpg |  0.5088052749633789 |\n+-----------------------+---------------------+<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Similarity Search Using Description + Keywords<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"sql\" class=\"language-sql\">mysql> \nWITH distances AS (\n    SELECT\n        image_name,\n        (\n            DISTANCE(\n                image_keywords_embedding,\n                @searchImageEmbedding,\n                'COSINE'\n            )\n            +\n            DISTANCE(\n                image_description_embedding,\n                @searchImageEmbedding,\n                'COSINE'\n            )\n        ) \/ 2 AS avg_distance\n    FROM image_details\n)\nSELECT *\nFROM distances\nORDER BY avg_distance ASC\nLIMIT 3;\n\n+-----------------------+---------------------+\n| image_name            | avg_distance        |\n+-----------------------+---------------------+\n| hornet_black_gold.jpg | 0.48873063921928406 |\n| vintage_sidecar.JPG   |  0.4904197156429291 |\n| Yamaha_DTX.jpg        |  0.5230678915977478 |\n+-----------------------+---------------------+<\/code><\/pre>\n\n\n\n<div class=\"wp-block-separator has-alpha-channel-opacity is-style-dots\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Simple Re-ranking Strategy<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"SQL\" class=\"language-SQL\">mysql> \nWITH initial_results AS (\n    SELECT\n        image_name,\n        DISTANCE(\n            image_keywords_embedding,\n            @searchImageEmbedding,\n            'COSINE'\n        ) AS keywords_distance,\n\n        DISTANCE(\n            image_description_embedding,\n            @searchImageEmbedding,\n            'COSINE'\n        ) AS description_distance\n\n    FROM image_details\n\n    ORDER BY keywords_distance + description_distance\n    LIMIT 15\n),\n\nreranked_results AS (\n    SELECT\n        image_name,\n        (\n            0.3 * keywords_distance +\n            0.7 * description_distance\n        ) AS combined_distance\n\n    FROM initial_results\n)\n\nSELECT *\nFROM reranked_results\nORDER BY combined_distance ASC\nLIMIT 3;\n\n+-----------------------+--------------------+\n| image_name            | combined_distance  |\n+-----------------------+--------------------+\n| vintage_sidecar.JPG   | 0.4800935566425323 |\n| hornet_black_gold.jpg |  0.496760493516922 |\n| Le_Mans_24_moto.png   | 0.5196295261383057 |\n+-----------------------+--------------------+<\/code><\/pre>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Key Insight<\/h2>\n\n\n\n<p>The most important concept here is this:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>We are not comparing images.<\/li>\n\n\n\n<li>We are comparing semantic representations of images.<\/li>\n<\/ul>\n\n\n\n<p>This distinction fundamentally changes how image retrieval systems can be designed using SQL-native AI capabilities.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">Reverse Image Search (Image-to-Image via Semantics)<\/h1>\n\n\n\n<p>Traditional reverse image search systems rely heavily on:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pixel similarity<\/li>\n\n\n\n<li>Feature extraction<\/li>\n\n\n\n<li>Specialized computer vision pipelines<\/li>\n<\/ul>\n\n\n\n<p>Our approach is different.<\/p>\n\n\n\n<p>We perform <strong>Semantic Image-to-Image Search<\/strong>.<\/p>\n\n\n\n<p>This is:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Similarity of meaning<\/li>\n\n\n\n<li>Not similarity of pixels<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Workflow<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a063b2ce6768&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a063b2ce6768\" class=\"aligncenter size-full is-resized wp-lightbox-container\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"381\" height=\"641\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/5.2_workflow_Reverse_Image_Search.png?resize=381%2C641&#038;ssl=1\" alt=\"\" class=\"wp-image-8668\" style=\"width:auto;height:450px\" srcset=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/5.2_workflow_Reverse_Image_Search.png?w=381&amp;ssl=1 381w, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2026\/05\/5.2_workflow_Reverse_Image_Search.png?resize=178%2C300&amp;ssl=1 178w\" sizes=\"auto, (max-width: 381px) 100vw, 381px\" \/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandir\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<div style=\"height:40px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Why This Is Interesting<\/h2>\n\n\n\n<p>Two images may be visually different while still being semantically related.<\/p>\n\n\n\n<p>For example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Different motorcycles<\/li>\n\n\n\n<li>Different lighting conditions<\/li>\n\n\n\n<li>Different camera angles<\/li>\n<\/ul>\n\n\n\n<p>Yet both images may describe: \u00ab <em>A motorcycle parked on an urban street<\/em> \u00bb.<\/p>\n\n\n\n<p>Semantic retrieval captures this meaning.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Advantages of the Semantic Approach<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Simpler Architecture<\/h3>\n\n\n\n<p>No need for:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Complex Computer Vision frameworks<\/li>\n\n\n\n<li>GPU-heavy image feature pipelines<\/li>\n\n\n\n<li>Specialized image vector databases<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Explainability<\/h3>\n\n\n\n<p>Because the retrieval is based on generated semantic metadata:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Results can be audited<\/li>\n\n\n\n<li>Descriptions can be refined<\/li>\n\n\n\n<li>Prompts can be improved<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">SQL-native Workflow<\/h3>\n\n\n\n<p>Everything remains inside MySQL HeatWave:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Metadata<\/li>\n\n\n\n<li>Embeddings<\/li>\n\n\n\n<li>Similarity search<\/li>\n\n\n\n<li>Ranking logic<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading has-text-align-left\">Architectural Trade-offs &amp; Design Considerations<\/h1>\n\n\n\n<p>Building AI-powered semantic image systems involves several important architectural decisions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Description vs Keywords<\/h2>\n\n\n\n<p>Both representations serve different purposes.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Descriptions<\/h3>\n\n\n\n<p>Descriptions provide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Rich contextual understanding<\/li>\n\n\n\n<li>Better semantic reasoning<\/li>\n\n\n\n<li>Natural language flexibility<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>However:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>They may introduce noise<\/li>\n\n\n\n<li>Longer text may dilute embeddings<\/li>\n<\/ul>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Keywords<\/h3>\n\n\n\n<p>Keywords provide:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Focused semantic signals<\/li>\n\n\n\n<li>Better precision<\/li>\n\n\n\n<li>Faster matching<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>However:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>They lose contextual richness<\/li>\n<\/ul>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Strategy implemented in this article<\/h3>\n\n\n\n<p>A hybrid approach:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Used descriptions for semantic context<\/li>\n\n\n\n<li>Used keywords for precision<\/li>\n\n\n\n<li>Combined both during re-ranking<\/li>\n<\/ul>\n\n\n\n<p>However<\/p>\n\n\n\n<p>I&rsquo;m storing two embeddings doubles vector storage (2 \u00d7 2048 dimensions per image). <br>For very large libraries, consider using only one \u2013 either concatenated or choose the one that performs better on your validation set.<\/p>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Storing Images in the Database vs Object Storage<\/h2>\n\n\n\n<p>Another important design consideration concerns image storage.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Storing Images in MySQL<\/h3>\n\n\n\n<p>Advantages:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Simpler architecture<\/li>\n\n\n\n<li>Centralized governance<\/li>\n\n\n\n<li>Easier transactional consistency<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Disadvantages:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Larger database size increases buffer pool pressure<\/li>\n\n\n\n<li>Backup overhead<\/li>\n\n\n\n<li>Potentially performance impact (queries, replication,&#8230; )<\/li>\n<\/ul>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Storing Images in Object Storage<\/h3>\n\n\n\n<p>Advantages:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Better scalability<\/li>\n\n\n\n<li>Lower storage costs<\/li>\n\n\n\n<li>Better CDN integration<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Disadvantages:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>More complex architecture<\/li>\n\n\n\n<li>Additional security management<\/li>\n<\/ul>\n\n\n\n<div style=\"height:15px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Recommended Hybrid Strategy<\/h3>\n\n\n\n<p>A practical enterprise approach is often:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Store thumbnails (small, e.g., 512\u00d7512) as base64 in MySQL (should be sufficient for vision model analysis)<\/li>\n\n\n\n<li>Store full-resolution images in object storage for later retrieval or user download<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>This enables:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Fast previews<\/li>\n\n\n\n<li>Efficient semantic retrieval<\/li>\n\n\n\n<li>Scalable storage architecture<\/li>\n<\/ul>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Prompt Engineering Matters<\/h2>\n\n\n\n<p>Semantic quality heavily depends on prompts.<\/p>\n\n\n\n<p>Poor prompts generate:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vague descriptions<\/li>\n\n\n\n<li>Weak keywords<\/li>\n\n\n\n<li>Low-quality embeddings<\/li>\n<\/ul>\n\n\n\n<div style=\"height:10px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p>Well-designed prompts improve:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Retrieval quality<\/li>\n\n\n\n<li>Explainability<\/li>\n\n\n\n<li>Evaluation consistency<\/li>\n<\/ul>\n\n\n\n<p>Prompt engineering becomes a critical part of semantic architecture design.<\/p>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h1 class=\"wp-block-heading\">P\u00e9roraison<\/h1>\n\n\n\n<p><strong>MySQL HeatWave GenAI significantly simplifies the implementation of semantic image understanding systems while <strong>substantially lowering the Total Cost of Ownership <\/strong>through the elimination of external infrastructure and fragmented AI pipelines.<\/strong><\/p>\n\n\n\n<p>By combining:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Vision-language models<\/li>\n\n\n\n<li>Text embeddings<\/li>\n\n\n\n<li>Vector search<\/li>\n\n\n\n<li>SQL-native AI routines<\/li>\n<\/ul>\n\n\n\n<p>organizations can build powerful multimodal systems directly inside MySQL HeatWave.<\/p>\n\n\n\n<p>The \u00ab <em><strong>image -&gt; text -&gt; embedding<\/strong><\/em> \u00bb approach presented in this article provides:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Explainability<\/li>\n\n\n\n<li>Operational simplicity<\/li>\n\n\n\n<li>SQL-native integration<\/li>\n\n\n\n<li>Semantic search capabilities<\/li>\n<\/ul>\n\n\n\n<p>Most importantly, it enables architects and developers to build AI systems that remain understandable, debuggable, and governable \u2014 which is often one of the biggest challenges in enterprise AI adoption.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure data-wp-context=\"{&quot;imageId&quot;:&quot;6a063b2ce7a12&quot;}\" data-wp-interactive=\"core\/image\" data-wp-key=\"6a063b2ce7a12\" class=\"aligncenter size-full is-resized wp-lightbox-container\"><img loading=\"lazy\" decoding=\"async\" width=\"770\" height=\"550\" data-wp-class--hide=\"state.isContentHidden\" data-wp-class--show=\"state.isContentVisible\" data-wp-init=\"callbacks.setButtonStyles\" data-wp-on--click=\"actions.showLightbox\" data-wp-on--load=\"callbacks.setButtonStyles\" data-wp-on-window--resize=\"callbacks.setButtonStyles\" src=\"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/09\/rc24-heatwave-logo.gif?fit=770%2C550&amp;ssl=1\" alt=\"\" class=\"wp-image-8340\" style=\"width:400px\"\/><button\n\t\t\tclass=\"lightbox-trigger\"\n\t\t\ttype=\"button\"\n\t\t\taria-haspopup=\"dialog\"\n\t\t\taria-label=\"Agrandir\"\n\t\t\tdata-wp-init=\"callbacks.initTriggerButton\"\n\t\t\tdata-wp-on--click=\"actions.showLightbox\"\n\t\t\tdata-wp-style--right=\"state.imageButtonRight\"\n\t\t\tdata-wp-style--top=\"state.imageButtonTop\"\n\t\t>\n\t\t\t<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"12\" height=\"12\" fill=\"none\" viewBox=\"0 0 12 12\">\n\t\t\t\t<path fill=\"#fff\" d=\"M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z\" \/>\n\t\t\t<\/svg>\n\t\t<\/button><\/figure>\n<\/div>\n\n\n<div style=\"height:100px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Resources<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/dasini.net\/blog\/2025\/09\/30\/ask-your-database-anything-natural-language-to-sql-in-mysql-heatwave\/\" target=\"_blank\" rel=\"noopener\" title=\"Ask Your Database Anything: Natural Language to SQL in MySQL HeatWave\">Ask Your Database Anything: Natural Language to SQL in MySQL HeatWave<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/dasini.net\/blog\/2025\/10\/07\/let-your-ai-dba-assistant-write-your-mysql-queries\/\" target=\"_blank\" rel=\"noopener\" title=\"Let Your AI DBA Assistant Write Your MySQL Queries\">Let Your AI DBA Assistant Write Your MySQL Queries<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hwgenai-nl-sql.html\" target=\"_blank\" rel=\"noopener\" title=\"Querying the Unstructured: Natural Language to SQL for JSON Data\"><\/a><a href=\"https:\/\/dasini.net\/blog\/2025\/10\/14\/querying-the-unstructured-natural-language-to-sql-for-json-data\/\" target=\"_blank\" rel=\"noopener\" title=\"Querying the Unstructured: Natural Language to SQL for JSON Data\">Querying the Unstructured: Natural Language to SQL for JSON Data<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/dev.mysql.com\/doc\/heatwave\/en\/mys-hw-genai-supported-models.html\" target=\"_blank\" rel=\"noopener\" title=\"MySQL HeatWave GenAI Supported Models and Languages\">MySQL HeatWave GenAI Supported Models and Languages<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/dasini.net\/blog\/2025\/02\/11\/building-an-interactive-llm-chatbot-with-heatwave-using-python\/\" target=\"_blank\" rel=\"noopener\" title=\"Building an Interactive LLM Chatbot with HeatWave Using Python&quot;&gt;Building an Interactive LLM Chatbot with HeatWave Using Python\">Building an Interactive LLM Chatbot with HeatWave Using Python\u00a0\u00bb>Building an Interactive LLM Chatbot with HeatWave Using Python<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/dasini.net\/blog\/2025\/03\/13\/build-an-ai-powered-search-engine-with-heatwave-genai-part-1\/\" target=\"_blank\" rel=\"noopener\" title=\"Build an AI-Powered Search Engine with HeatWave GenAI (part 1)\">Build an AI-Powered Search Engine with HeatWave GenAI (part 1)<\/a> \/ (<a href=\"https:\/\/dasini.net\/blog\/2025\/04\/08\/build-an-ai-powered-search-engine-with-heatwave-genai-part-2\/\" target=\"_blank\" rel=\"noopener\" title=\"Build an AI-Powered Search Engine with HeatWave GenAI (part 2)\">part 2<\/a>) \/ (<a href=\"https:\/\/dasini.net\/blog\/2025\/04\/15\/build-an-ai-powered-search-engine-with-heatwave-genai-part-3\/\" target=\"_blank\" rel=\"noopener\" title=\"Build an AI-Powered Search Engine with HeatWave GenAI (part 3)\">part 3<\/a>)<\/li>\n<\/ul>\n\n\n\n<div style=\"height:50px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<div style=\"height:20px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p><a href=\"https:\/\/www.linkedin.com\/groups\/12524512\/\" target=\"_blank\" rel=\"noopener\" title=\"Olivier DASINI on Linkedin\">Follow me on Linkedin<\/a><\/p>\n\n\n\n<p>Watch my videos on my <a href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier's MySQL Channel\">YouTube channel<\/a> and <a href=\"https:\/\/www.youtube.com\/channel\/UC12TulyJsJZHoCmby3Nm3WQ\/?sub_confirmation=1\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Subscribe\">subscribe<\/a>.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/www.slideshare.net\/freshdaz\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier DASINI on Slideshare\">Slideshare account<\/a>.<\/p>\n\n\n\n<p>My <a href=\"https:\/\/speakerdeck.com\/freshdaz\/\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Olivier DASINI on Speaker Deck\">Speaker Deck account<\/a>.<\/p>\n\n\n\n<div style=\"height:25px\" aria-hidden=\"true\" class=\"wp-block-spacer\"><\/div>\n\n\n\n<p class=\"has-vivid-red-color has-text-color\"><strong>Thanks for using HeatWave &amp; MySQL!<\/strong><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Modern AI systems increasingly rely on multimodal data: text, images, documents, audio, and video. Among these modalities, image understanding has become one of the most important capabilities for AI-powered applications.<br \/>\nTraditionally, implementing these capabilities required specialized computer vision infrastructure, external vector databases, custom ML pipelines, and multiple frameworks.<br \/>\nWith MySQL HeatWave GenAI, many of these capabilities can now be implemented directly inside SQL workflows using built-in AI routines.<br \/>\nIn this article, we will build the foundations of a Vision Model Evaluation Assistant using MySQL HeatWave GenAI. The objective is not to create another image classifier, but rather a semantic image understanding platform.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[1702,1740,1713,1694,1716,1719,203,339],"tags":[1704,1758,306,1700,1760,1763,1722,349],"class_list":["post-8533","post","type-post","status-publish","format-standard","hentry","category-ai","category-artificial-intelligence","category-cloud-en","category-heatwave-en","category-howto-en","category-mds-en","category-mysql-en","category-tuto-en","tag-ai","tag-artificial-intelligence","tag-cloud","tag-genai","tag-howto","tag-image","tag-mds-en","tag-tuto-en"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-2dD","jetpack-related-posts":[{"id":6752,"url":"https:\/\/dasini.net\/blog\/2024\/08\/07\/heatwave-genai-your-ai-powered-content-creation-partner\/","url_meta":{"origin":8533,"position":0},"title":"HeatWave GenAI: Your AI-Powered Content Creation Partner","author":"Olivier DASINI","date":"7 ao\u00fbt 2024","format":false,"excerpt":"Generative artificial intelligence (GenAI) is reshaping the content creation landscape. By training on vast datasets, these \"intelligent\" systems can produce new, human-quality content across a multitude of domains. Oracle's HeatWave GenAI (starting with version 9.0.1) is at the forefront of this revolution, offering an integrated platform that combines in-database large\u2026","rel":"","context":"Dans &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/dasini.net\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2024\/07\/hw_product_image.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":7363,"url":"https:\/\/dasini.net\/blog\/2025\/03\/13\/build-an-ai-powered-search-engine-with-heatwave-genai-part-1\/","url_meta":{"origin":8533,"position":1},"title":"Build an AI-Powered Search Engine with HeatWave GenAI (part 1)","author":"Olivier DASINI","date":"13 mars 2025","format":false,"excerpt":"Discover how to build an AI-powered search engine for your applications using HeatWave GenAI. This approach leverages large language models (LLMs) for semantic search, offering a smarter alternative to traditional SQL and full-text search methods. By using embeddings\u2014vector representations of words\u2014the search engine understands context and intent, delivering more relevant\u2026","rel":"","context":"Dans &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/dasini.net\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/03\/HW_GenaI_search_engine.gif?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/03\/HW_GenaI_search_engine.gif?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/03\/HW_GenaI_search_engine.gif?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/03\/HW_GenaI_search_engine.gif?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/03\/HW_GenaI_search_engine.gif?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/03\/HW_GenaI_search_engine.gif?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":8393,"url":"https:\/\/dasini.net\/blog\/2025\/10\/07\/let-your-ai-dba-assistant-write-your-mysql-queries\/","url_meta":{"origin":8533,"position":2},"title":"Let Your AI DBA Assistant Write Your MySQL Queries","author":"Olivier DASINI","date":"7 octobre 2025","format":false,"excerpt":"Having explored the innovative MySQL HeatWave technology that converts Natural Language into SQL (Ask Your Database Anything: Natural Language to SQL in MySQL HeatWave), our next article in this series, dives into a practical use case demonstrating how an AI DBA Assistant can significantly simplify your query generation workflow. In\u2026","rel":"","context":"Dans &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/dasini.net\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/10\/reltime_monitor.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/10\/reltime_monitor.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/10\/reltime_monitor.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2025\/10\/reltime_monitor.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":4872,"url":"https:\/\/dasini.net\/blog\/2021\/08\/31\/discovering-mysql-database-service-episode-5-create-a-mysql-db-system-from-a-mysql-shell-dump\/","url_meta":{"origin":8533,"position":3},"title":"Discovering MySQL Database Service &#8211; Episode 5 &#8211; Create a MySQL DB system from a MySQL Shell dump","author":"Olivier DASINI","date":"31 ao\u00fbt 2021","format":false,"excerpt":"MySQL, the world\u2019s most popular open source database, is available as a managed cloud service in Oracle Cloud Infrastructure (OCI) under the name of MySQL Database Service (MDS). This is the fifth episode of \u201cDiscovering MySQL Database Service\u201c, a series of tutorials where I will show you, step by step,\u2026","rel":"","context":"Dans &quot;Cloud&quot;","block_context":{"text":"Cloud","link":"https:\/\/dasini.net\/blog\/category\/cloud\/"},"img":{"alt_text":"MySQL Database Service","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":7711,"url":"https:\/\/dasini.net\/blog\/2025\/04\/15\/build-an-ai-powered-search-engine-with-heatwave-genai-part-3\/","url_meta":{"origin":8533,"position":4},"title":"Build an AI-Powered Search Engine with HeatWave GenAI (part 3)","author":"Olivier DASINI","date":"15 avril 2025","format":false,"excerpt":"In this latest post, the final part of my series on building an AI-powered search engine with HeatWave GenAI, I dive into enhancing AI-powered search by embedding full article content into HeatWave. By cleaning HTML, chunking content, generating embeddings, and running semantic similarity searches directly within HeatWave, we unlock highly\u2026","rel":"","context":"Dans &quot;AI&quot;","block_context":{"text":"AI","link":"https:\/\/dasini.net\/blog\/category\/ai\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":4719,"url":"https:\/\/dasini.net\/blog\/2021\/08\/10\/discovering-mysql-database-service-episode-2-create-a-compartment\/","url_meta":{"origin":8533,"position":5},"title":"Discovering MySQL Database Service &#8211; Episode 2 &#8211; Create a compartment","author":"Olivier DASINI","date":"10 ao\u00fbt 2021","format":false,"excerpt":"This is the second episode of \u201cDiscovering MySQL Database Service\u201c, a series of tutorials where I will show you, step by step, how to use MySQL Database Service and some other Oracle Cloud Infrastructure services. In the previous episode we've introduced the different components that we will use during this\u2026","rel":"","context":"Dans &quot;Cloud&quot;","block_context":{"text":"Cloud","link":"https:\/\/dasini.net\/blog\/category\/cloud\/"},"img":{"alt_text":"MySQL Database Service","src":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/dasini.net\/blog\/wp-content\/uploads\/2021\/06\/MDS_car_801x600.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/8533","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=8533"}],"version-history":[{"count":236,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/8533\/revisions"}],"predecessor-version":[{"id":8776,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/8533\/revisions\/8776"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=8533"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=8533"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=8533"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}