<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <title><![CDATA[Jina AI - Elasticsearch Labs]]></title>
    <description><![CDATA[Articles and tutorials from the Search team at Elastic]]></description>
    <copyright><![CDATA[© 2026. Elasticsearch B.V. All Rights Reserved]]></copyright>
    <image>
      <title><![CDATA[Jina AI - Elasticsearch Labs]]></title>
      <url>https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1121c0bf0e8a6e65/6a88da6340a1841030ef456f/search-labs-thumbnail.png</url>
      <link>https://www.elastic.co/search-labs/blog/category/jina-ai</link>
    </image>
    <link>https://www.elastic.co/search-labs/blog/category/jina-ai</link>
    <atom:link href="https://www.elastic.co/search-labs/rss/category/jina-ai.xml" rel="self" type="application/rss+xml"/>
    <language><![CDATA[en]]></language>
    <lastBuildDate>Mon, 14 Sep 2026 03:12:46 GMT</lastBuildDate>
  <item>
    <title><![CDATA[0.35% trained, 100% competitive: the frozen-tower architecture behind jina-embeddings-v5-omni]]></title>
    <description><![CDATA[The latest jina embeddings model generates multimodal embeddings for text, images, video and audio, competing with models nearly 6x its size on vector search while training just 0.35% of the weights.]]></description>
    <content:encoded><![CDATA[<p><code>jina-embeddings-v5-omni</code> is our latest multimodal embedding model. It generates embeddings for text, image, video, and audio. Among open-weight models that support those modalities, it’s the best-performing under 2 billion parameters. The notable part is how little of it we actually trained. Every encoder tower stayed frozen, and only about 0.35% of the model's weights (projectors and a handful of delimiter tokens) were ever updated during training. We call this architecture pattern <strong>G</strong>eometry-preserving <strong>E</strong>mbeddings via <strong>L</strong>ocked <strong>A</strong>ligned <strong>TO</strong>wers (GELATO). Let's break down each letter of this acronym:</p><ul><li><p><strong>Geometry-preserving Embeddings:</strong> <code>jina-embeddings-v5-omni</code> sits atop the foundation laid by <code>jina-embeddings-v5-text</code>. That original text embedding space is completely unchanged, with its geometry left wholly intact.</p></li><li><p><strong>Locked:</strong> Synonymous with "frozen." All of the towers in this architecture have their weights locked. </p></li><li><p><strong>Aligned:</strong> Aligning the other modalities with the text model's vector space, allowing for cross-modal comparison.</p></li><li><p><strong>TOwers:</strong> Modality component that converts one type of raw input into vectors.</p></li></ul><p>The model comes in two variants: <code>small</code> and <code>nano</code>. The former has more parameters (1.57 billion) than the latter (0.95 billion), but functionally their architectures are nearly identical. For the sake of brevity, we mostly focus on <code>jina-embeddings-v5-omni-small</code> in this article.</p><h2>What are vectors, towers and frozen encoders?</h2><p><code>jina-embeddings-v5-omni</code> relies on three core machine learning (ML) concepts: vectors, towers, and frozen weights. Here's what each means; feel free to skip ahead if you're already familiar with them. </p><h3>How vectors represent data in embedding models</h3><p>How does AI understand abstract concepts? Can a machine comprehend what "ice cream" is? Does it understand that "chocolate fudge" and "rocky road" have more in common with each other than "sorbet"? The answer, surprisingly, is yes. The mechanism that makes it possible is the vector.</p><p>Take a look at this diagram.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0424e9623c929644/6a7c3b16b8c2e6845bbe4875/image10.png" alt="Simplex diagram mapping ice cream flavors as vector coordinates to explain how embedding models represent similarity" /><p>If you tried visualizing a way to organize all ice cream flavors, you may end up with something like this: a simplex (triangle) with three vertices, each representing a base flavor. Each flavor is closer to or farther from each vertex, depending on how much of the corresponding base makes up that particular flavor. Chocolate ice cream is all chocolate, so it hugs the top vertex. Vanilla has a similar affinity for the bottom-left vertex. But cookies and cream is roughly a 50/50 mix, so it's about equidistant from both. Neapolitan blends all three, so it sits at the center of the triangle.</p><p>This is functionally how vectors work. These flavors get funneled into an ML model (more specifically known as an <em>embedding model</em>) that will then generate coordinates for each of these flavors along this simplex. By measuring the distance between coordinates, software can parse how related or unrelated two flavors are. It's easy to see that "chocolate" and "chocolate brownie fudge" are closely related flavors because they sit close to one another, but "strawberry" and "cookies and cream" are far away from each other, so we can infer that they aren’t similar.</p><p>It won't be quite this simple though. Rather than three labeled points, real embeddings run along hundreds or even thousands of dimensions. Nor will they have nice, human-readable labels; the vertex markers are something that only the model understands. The benefit, though, is that we can graph basically <em>anything</em> like this.</p><p>To clarify some jargon: These coordinates = vectors = embeddings. For the rest of this article, we use these terms interchangeably.</p><p>Much like how embeddings go by many different names, so too do the models that create them.</p><h3>What is a tower in multimodal embedding models?</h3><p>The term <em>tower</em> comes from Contrastive Language-Image Pre-training (CLIP), a model released by OpenAI in 2021 that was one of the first to learn a shared embedding space across text and images. In CLIP, each modality is handled by a completely separate model. On an architecture schematic, these models look like towers standing side by side, each taking one type of input and producing vectors in a shared space. The name stuck, and you'll see it used broadly across multimodal ML. </p><p>In the context of <code>jina-embeddings-v5-omni</code>, the word is used a bit more loosely. Its architecture doesn't have true parallel towers in the CLIP sense. All modalities ultimately funnel into a single central text model, rather than sitting as equals beside it. </p><p>With that caveat in place: A <em>tower </em>(or <em>modality component</em>) is a pipeline that converts one type of raw input into vectors. A <em>text tower</em> vectorizes strings, and a <em>vision tower</em> generates image embeddings. An <em>audio tower</em> does the same for sound.</p><h2>Why freeze a tower instead of training it?</h2><p>If we want multimodal capabilities, could we Frankenstein multiple towers that handle each of those inputs together into one model? The issue with this approach is that vectors from different models aren’t intelligible to each other. Images will exist in one vector space and audio in another, for example. This means that we have no ability to compare across different modalities. Think of the vectors outputted from one model as existing in their own language. Let's say our audio tower outputs Spanish and our image tower outputs English. Conceptually, the vectors can be describing the same things, but downstream tools that try to make use of these embeddings are "monolingual," so we're out of luck.</p><p>The CLIP-style approach is to take several towers and train them together, letting them all reshape each other until their outputs agree. It's sort of like having Spanish and English speakers try to communicate for long enough that they eventually all start speaking Spanglish.</p><p>This approach works, but it has a side effect: Towers that you already had working get remodeled in the process. Any embeddings that they produced before are now incompatible with any that are produced by the older version of the tower. If you had a text tower and generated 100 million embeddings with it, you would now need to re-embed all of those strings.</p><p>To combat this issue, you can freeze certain towers. This locks their weights, which are the knobs and dials that influence how they behave. This way, training never changes them. What you train instead is a small projector that <em>translates</em> one tower's output into another tower's language. Many different models train some portion of projectors and towers while leaving some others frozen. What makes <code>jina-embeddings-v5-omni</code>unique is that we froze <em>every</em> encoder and trained only the projectors and delimiter tokens. By the end of this article, you’ll understand exactly how that works.</p><p>You can think of these frozen and trainable components as clusters of neurons or isolated regions of the mind, and the whole embedding model (<code>jina-embeddings-v5-omni</code>) as the entire brain. Between these learning-capable components sit fixed math operations, such as merging, squashing, selecting, and rescaling numbers on their way from one tower to the next. They have no weights, so there’s nothing in them to freeze or train. </p><p>With that groundwork laid, here’s the full architecture.</p><h2>How the jina embeddings multimodal architecture works</h2><p>The architecture routes all modalities through frozen encoders and small trainable projectors into a single shared text embedding space.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt7e1a4560e21a7922/6a7c3b3ccffa6ee67a5e7b27/image6.png" alt="jina-embeddings-v5-omni architecture diagram showing frozen encoders, trainable projectors, and shared text embedding space" /><h2>Why the text tower is the backbone</h2><p>The first thing to notice here is the general flow of data in this diagram. Image, video, and audio inputs all (eventually) end up in the same space as text inputs. Why is the architecture set up like this?</p><p><code>jina-embeddings-v5-omni</code> builds on top of <code>jina-embeddings-v5-text</code>: It retains its text-processing backbone and extends it with pretrained vision and audio components.</p><p>This has two main advantages:</p><ol><li><p>The text model is already state of the art for its size and what it does, and it stays completely untouched. There’s no need to fix what isn't broken. We also don't need to re-embed anything we already embedded with <code>jina-embeddings-v5-text</code>.</p></li><li><p>A single shared vector space is what makes cross-modal search work at all. Because image, audio, and text all resolve to vectors in the same geometry, you can query an image with text, or audio with text, and compare them directly with <em>cosine similarity</em> (a similarity measure based on the angle between two vectors). If each modality lived in its own separate space, those comparisons would be meaningless.</p></li></ol><h2>How vision and audio encoders feed into the text model</h2><p>The first step in building upon the foundation set by <a href="https://huggingface.co/collections/jinaai/jina-embeddings-v5-text">jina-embeddings-v5-text</a> is integrating vision and audio encoders into this architecture. In this case, we use the existing <a href="https://qwen.ai/blog?id=qwen3.5">Qwen3.5</a> vision encoders and the <a href="https://qwen.ai/blog?id=qwen2.5-omni">Qwen2.5-Omni</a> audio encoder, which themselves have been adapted from <a href="https://huggingface.co/docs/transformers/model_doc/siglip2">SigLIP2</a> and <a href="https://huggingface.co/openai/whisper-large-v3">Whisper-large-v3</a>, respectively. They’re ultimately what’s responsible for generating raw vectors for all vision- and audio-based data. The emphasis is on <em>raw</em> here, since much transformation still needs to be done afterward.</p><h2>How the vision encoder processes images</h2><p>In the case of images, we’re borrowing more from Qwen than just the encoder. Additional plumbing inherited from Qwen is attached to the output of the encoder. Let's walk through what comes out of the encoder and how the inherited downstream components transform that output.</p><h3>Vision encoder (frozen)</h3><p>Let's use an image as our primary example, since the visual component of video is basically identical. Take this image of a banana split.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta37c8dee62d6377a/6a7c3b59ef5bef22a14f9b4f/image12.png" alt="Banana split photo used as example input for the jina-embeddings-v5-omni vision encoder" /><p>Rather than generating one single, clean vector embedding for this image, the vision encoder breaks the image up into 14-pixel by 14-pixel sections and generates a tiny <em>patch token</em> (basically a mini-vector) for each of these sections.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1867889b7011a10b/6a7c3b89ef5bef80504f9b53/image8.png" alt="Banana split image divided into 14x14 pixel patches showing how the vision encoder generates patch tokens" /><p>While still inside of the vision encoder, each token looks at every other token that makes up the image and pulls in information from the ones relevant to it, updating its own vector based on that context. This process allows us to preserve fine-grained details. Now, instead of one single vector for the whole image, we have multiple, smaller vectors that represent particulars of the whole dish.</p><h3>LayerNorm (frozen)</h3><p><a href="https://arxiv.org/abs/1607.06450">LayerNorm</a> rescales each patch's numbers so they sit in a consistent range before anything else touches them. It stops some patches from being wildly larger than others and drowning out the rest.</p><h3>2x2 merge </h3><p>We saw in the vision encoder section that we split up the image into small, 14-pixel by 14-pixel squares. However, processing this many patch tokens will become expensive downstream. For this reason, the 2x2 merge operation consolidates four patch tokens into one. The squares are now 28 pixels by 28 pixels. The corresponding patch tokens are similarly consolidated.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt851c4e33cf477e3e/6a7c3ba429138b20673b1555/image4.png" alt="Banana split with 28x28 pixel patches after 2x2 merge reduces token count before the projector" /><h3>fc_vision_1 (frozen) </h3><p><code>fc_vision_1</code> is the first of two matrix multiplies; it mixes the merged patch numbers into a new set. This layer is inherited from Qwen and left as is.</p><h3>GELU </h3><p><a href="https://arxiv.org/abs/1606.08415">Gaussian Error Linear Unit (GELU)</a> is a gate applied to each number. It lets useful signals through and squashes the rest toward zero. It’s the one nonlinear step and is ultimately what lets the two <code>fc_vision</code> layers together learn shapes that a single flat multiply couldn't.</p><h3>fc_vision_2 (trainable) </h3><p>As mentioned earlier, trying to put Qwen image embeddings directly into the same vector space as Jina text embeddings would be like trying to include a Spanish sentence in an English novel. Outside of its native context, its meaning is totally lost.</p><p>That is what the trainable projector <code>fc_vision_2</code> is here to fix. It learns to translate the image embedding into something that <code>jina-embeddings-v5-text</code> can understand. For this reason, you can think of a trainable projector as a translator.</p><p>The emphasis belongs on <em>trainable</em>: This is the first component we’ve encountered in our walkthrough so far that isn’t frozen. Many components of this architecture are frozen, meaning that their weights are locked and never change during training, but <code>fc_vision_2</code> is one of the few parts that actually gets updated, because it has to <em>learn</em> how to translate Qwen's image dimensions into a form that lands meaningfully inside Jina's text space.</p><h3>× 4</h3><p>By now, you may have noticed that <code>fc_vision_2</code> has a "× 4" marked on the bottom, along with <code>fc_audio</code>, both encoders, and the ″Embedding text″ section within <code>jina-embeddings-v5-text</code>. In this case, it represents four different instances of <code>fc_vision_2</code>, each optimized and tuned to one of four slightly different tasks, outlined below.</p><p><strong>Task</strong></p><p><strong>What it facilitates</strong></p><p><strong>Example user input</strong></p><p><strong>Example end result</strong></p><p><strong>Note</strong></p><p>Retrieval</p><p>Finds a similar match for the input (that is, standard Google search)</p><p>"melting ice cream" as a string/text</p><p>Picture of a fallen ice cream cone on asphalt</p><p>
</p><p>Text-matching</p><p>Judges how similar inputs are</p><p>A text string "melting ice cream" and an image of a fallen ice cream cone on asphalt</p><p>Score judging how similar the two inputs are</p><p>The name of this task is a bit of a misnomer. It's called <em>text-matching</em>, but it works for any modality, not only text.</p><p>Clustering</p><p>Groups data into clusters</p><p>A large array of ice cream images</p><p>Lets the user discover natural groups, like "sundaes" and "popsicles"</p><p>
</p><p>Classification</p><p>Places data into predefined buckets</p><p>Two string labels: "melting" and "intact", along with a large array of ice cream images</p><p>Sorts the array of ice cream images into the two provided categories, based on their proximity in vector space to the label embeddings</p><p>
</p><p>To clarify, the "Example end result" column is the takeaway after some additional math and processing happens once the output vector is generated. The point is that  <code>jina-embeddings-v5-omni</code> only generates vectors. Those vectors take on a mildly different form to optimize for the selected task type.</p><p>These task types are also explicitly outlined in the Low-Rank Adaptation (LoRA) component of the architecture diagram, which we'll cover in a moment.</p><h2>How the audio encoder processes sound</h2><p>Before we go any deeper into the trenches of our model architecture, let's back up and see how the audio-oriented path differs and how it stays the same. If you were able to follow along during the vision section, the audio portion will be a breeze. We have no extra inherited plumbing from Qwen this time, only the audio encoder and one trainable projector.</p><h3>Audio encoder (frozen)</h3><p>Before audio can enter the encoder, it needs to be converted into a form that the encoder can work with. Raw audio is a one-dimensional wave, which isn't particularly useful to a neural network on its own. Instead, the audio is first transformed into a <em>mel spectrogram</em>: a 2D representation that maps frequency against time, weighted to emphasize the frequency ranges that the human ear is most sensitive to. Think of it as a visual fingerprint of the sound. Below is a mel spectrogram of a person saying, "I scream, you scream, we all scream for ice cream."</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt3a69dc8ef9bc87a2/6a7c3bc3b59102b0f4eebd49/image5.png" alt="Mel spectrogram of a person saying I scream you scream we all scream for ice cream, used as audio encoder input" /><p>That spectrogram is then sliced into fixed-length 40ms chunks, analogous to how the vision encoder breaks an image into 14×14 pixel-tiles. The encoder then produces one token per chunk.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteec40a3a17212d5e/6a7c3bd829138bb20b3b1559/image3.png" alt="Mel spectrogram sliced into 40ms chunks showing how the audio encoder tokenizes sound for multimodal embeddings" /><p>This matters for the same reason it does in the vision pipeline: Fine-grained detail would otherwise be lost. A single embedding for the full phrase "I scream, you scream, we all scream for ice cream" would smear everything into one blurry vector. Slicing it into short chunks keeps each fragment of sound intact, so the model can later distinguish "scream" from "cream" rather than collapsing them into an average. The same applies to music, animal noises, environmental sounds, and more.</p><h3>fc_audio (trainable)</h3><p>Once the encoder has produced its tokens, <code>fc_audio</code> performs the same translation role that <code>fc_vision_2</code> does for images: It projects each audio token from the encoder's 1280-dimensional output space into <code>jina-embeddings-v5-text</code>’s hidden dimension (1024 for <code>small</code>, 768 for <code>nano</code>). Like <code>fc_vision_2</code>, it carries a "× 4" in the architecture diagram, meaning that there are four instances, each optimized for a specific task type (retrieval, text-matching, clustering, and classification).</p><h3>Delimiters (trainable)</h3><p>We need to convey to <code>jina-embeddings-v5-text</code> that this embedding represents an unexpected modality. We can do this pretty easily with delimiters. In the world of HTML, this looks like:</p>&lt;p&gt; Your text here &lt;/p&gt;<p>The first and last <code>&lt;p&gt;</code> tag conveys that everything in between them is a paragraph element.</p><p>In our case, things are a bit more complicated. For audio, the architecture diagram shows the delimiters as <code>&lt;aud_start&gt;</code> and <code>&lt;aud_end&gt;</code>, but that isn't quite accurate. The delimiters themselves are actually vectors rather than hard-coded strings.</p><p>Each task type has its own pair of delimiter vectors (hence the "4 × special tokens"). These vectors are identical every time rather than being different for each audio embedding. So a task type of retrieval with an audio input type always gets start delimiter vector X and end delimiter vector Y; text-match with audio input always gets a start delimiter vector A and an end delimiter vector B, and so on.</p><p>This is necessary because the <code>Transformer layers</code> component only understands vectors. So, by the time the audio embedding makes its way there, it looks like:</p>&lt;aud_start_vector_delimiter&gt;
&lt;aud_patch_token_1&gt;
&lt;aud_patch_token_2&gt;
&lt;aud_patch_token_3&gt;
...
&lt;aud_end_vector_delimiter&gt;<p>The same pattern applies to images:</p>&lt;vis_start_vector_delimiter&gt;
&lt;vis_patch_token_1&gt;
&lt;vis_patch_token_2&gt;
&lt;vis_patch_token_3&gt;
...
&lt;vis_end_vector_delimiter&gt;<p>Video is where this gets interesting. Up to 32 evenly spaced-out frames are pulled from the video and fed into the vision encoder. </p><p>Rather than producing one delimiter-wrapped segment, each sampled frame gets its own <code>&lt;vis_start&gt;</code> / <code>&lt;vis_end&gt;</code> wrapper, and these per-frame segments are concatenated into one long sequence:</p>&lt;vis_start&gt; [frame 1 patch tokens] &lt;vis_end&gt;
&lt;vis_start&gt; [frame 2 patch tokens] &lt;vis_end&gt;
...
&lt;vis_start&gt; [frame 32 patch tokens] &lt;vis_end&gt;<p>This is what makes multi-frame video work: Rather than averaging frames or treating them separately, the transformer receives the whole video as one token stream, allowing its attention to relate tokens across frames. This means that earlier frames can inform how later ones are interpreted. If the video does have an audio component, it's pulled out and fed into the audio encoder and ultimately prepended to the frame sequence.</p>&lt;aud_start&gt; [audio patch tokens] &lt;aud_end&gt;
&lt;vis_start&gt; [frame 1 patch tokens] &lt;vis_end&gt;
&lt;vis_start&gt; [frame 2 patch tokens] &lt;vis_end&gt;
...<p>The transformer layers component then processes this entire concatenated sequence as a single input.</p><h3>Jina text transformer layers (frozen) </h3><p>We’ve generated patch tokens for our images, videos, and audio files. We’ve also wrapped them inside of vector delimiters, all for the sake of having them understood by these layers. They’ll allow each patch token to examine the other patch tokens and determine whether they need to update themselves based on the surrounding context. I know what you're thinking:</p><p>Didn't we already do this inside of the encoder? We split up the image into 14-pixel by 14-pixel sections and generated patch tokens for each section, and then the encoder updated each patch token based on surrounding context within the same image.</p><p>And you're right! We did. But there's a key difference now.</p><p>Originally, that recontextualization ran on the attention of Qwen's vision encoder. The operation within the <code>Transformer layers</code> runs the frozen Jina text transformer's attention. It’s the same operation with different learned parameters, so it transforms the tokens differently.</p><p>Think of it like a move: The projector is the flight and the moving trucks. It physically relocates you from vision land to text land, landing you in the right city and even the right neighborhood. The transformer's attention is what happens after you've unpacked. You're already home; you spend the next few weeks figuring out exactly where you fit, meeting the neighbors, finding your bearings, and adjusting your exact spot based on who's actually around you. You did the macro move already. This is the micro fine-tuning.</p><p>Lastly, the <code>&lt;vis_end_vector_delimiter&gt;</code> will absorb all the information from the patch tokens it wraps.</p><h3>LoRA (frozen) </h3><p><a href="https://arxiv.org/abs/2106.09685">LoRA</a> is a way of fine-tuning an existing model without completely retraining it. It’s a small set of extra adjustment knobs bolted onto the transformer that nudges its behavior to optimize for one of the specific tasks (such as retrieval or classification).</p><h3>Last-token pooling </h3><p>Since <code>&lt;vis_end_vector_delimiter&gt;</code> absorbed all the other patch tokens into itself, we don't need to consider anything except it, so we throw the rest away. It acts as a stand-alone embedding that represents a summary of the whole.</p><h3>L2 normalization </h3><p><code>&lt;vis_end_vector_delimiter&gt;</code> could be any length now, which is no good. This step shrinks or stretches it so its length is exactly 1, without changing the direction it points. This is tidying so that comparing it to other vectors later is a fair, clean angle comparison. It changes only the vector’s scale, not what it means.</p><h3>Enough about ice cream</h3><p>As we've journeyed our way through <code>jina-embeddings-v5-omni</code>, we’ve been careful to outline which components are frozen and which ones are trainable. By now, you may have noticed that every single tower has been frozen. In fact, only the small projectors (translators) and delimiter tokens have been trainable. We dubbed this architecture pattern GELATO. This makes the entire training process significantly cheaper.</p><p>To be clear, we didn't invent the concept of frozen towers. Prior work on <a href="https://arxiv.org/abs/2111.07991">Locked-image Tuning (LiT)</a>, <a href="https://arxiv.org/abs/2406.04292">VISTA</a>, and <a href="https://arxiv.org/abs/2310.14037">Multi-modAl Retrieval model via Visual modulE pLugin (MARVEL)</a> froze one side or the other. What no one had done before GELATO was push the idea to its limit: text, image, video, and audio all in one model with every encoder frozen. The only trained pieces are a single projector layer per modality and a handful of delimiter tokens.</p><h2>But is it any good?</h2><h3>Benchmark results: jina embeddings vs. other multimodal embedding models</h3><p>There's no point in building out a model and releasing it if you don't even know if it's any good, especially compared to the competition. That's why we have benchmarks and evaluation frameworks. The benchmarks that <code>jina-embeddings-v5-omni</code> was run against are Massive Image Embedding Benchmark (MIEB), Massive Audio Embedding Benchmark (MAEB), Massive Multimodal Embedding Benchmark–Video (MMEB-Video), and Massive Multilingual Text Embedding Benchmark (MMTEB).</p><p>As for the models we compare against, it's important not to make apples and oranges comparisons. For that reason, we’re specifically using open-weight omni-style models with support for the same media types:</p><ul><li><p><a href="https://huggingface.co/collections/LanguageBind/languagebind-model">LanguageBind</a></p></li><li><p><a href="https://huggingface.co/nvidia/omni-embed-nemotron-3b">Omni-Embed-Nemotron-3B</a></p></li><li><p><a href="https://huggingface.co/LCO-Embedding/LCO-Embedding-Omni-3B">LCO-Embedding-Omni-3B</a></p></li><li><p><a href="https://huggingface.co/LCO-Embedding/LCO-Embedding-Omni-7B">LCO-Embedding-Omni-7B</a></p></li></ul><h3>Evaluation</h3><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt73d8f8759a643405/6a7c3c081d23d2a618b4e44d/image1.png" alt=" Benchmark table comparing jina-embeddings-v5-omni against multimodal embedding models on text, image, video and audio" /><p>The table above is sorted by parameter count. Models with the fewest parameters are clustered at the top, and models with the most parameters hug the bottom. This context is important because performance alone isn't the final variable. If a $100 ice cream with gold flakes and the finest dairy milk tastes the same as (or worse than) the average gallon of ice cream that you can buy from your local grocery store, it would be silly to buy it, because you're paying a massive premium for nothing.</p><p>A similar situation is unfolding here. <code>jina-embeddings-v5-omni-small</code> and <code>nano</code> outperform every other model on text, despite ranking low to middle in terms of parameter count.</p><p>Audio performance is strong, as well. <code>jina-embeddings-v5-omni-small</code> and <code>nano</code> beat out all other models except those from LCO, which they both trail by about 2 to 3 points.</p><p>The gap shrinks when considering image performance, particularly with <code>jina-embeddings-v5-omni-small</code>. It beats both <code>LanguageBind</code> and <code>Omni-Embed-Nemotron-3B</code><code>.</code> It lags less than a point behind both LCO models, despite the fact that they have 4.70 billion and 8.93 billion, respectively, compared to Jina’s 1.57 billion.</p><p>Video is the weakest performer for our models, though even in that case <code>jina-embeddings-v5-omni-small</code> still beats <code>Omni-Embed-Nemotron-3B</code>, which has three times as many parameters. Ultimately, when these scores are averaged out, you get the following rankings:</p><p><strong>Model</strong></p><p><strong>Number of parameters (B)</strong></p><p><strong>Average score</strong></p><p><code>LCO-Embedding-Omni-7B</code></p><p>8.93</p><p>54.43</p><p><code>jina-embeddings-v5-omni-small</code></p><p>1.57</p><p>54.04</p><p><code>LCO-Embedding-Omni-3B</code></p><p>4.70</p><p>53.83</p><p><code>jina-embeddings-v5-omni-nano</code></p><p>0.95</p><p>47.49</p><p><code>Omni-Embed-Nemotron-3B</code></p><p>4.70</p><p>41.21</p><p><code>LanguageBind</code> </p><p>1.14</p><p>35.82</p><p><code>LCO-Embedding-Omni-7B</code> has nearly six times the number of parameters as <code>jina-embeddings-v5-omni-small</code> but barely squeaks past it in average performance.</p><p>One benchmark deserves a special callout for anyone building search or retrieval augmented generation (RAG): visual document retrieval, measured on the <a href="https://huggingface.co/vidore">ViDoRe benchmark</a>. </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt0637adcdd0cbe9fe/6a7c3c245751aa67567e250e/image11.png" alt="ViDoRe visual document retrieval scores showing jina-embeddings-v5-omni matching larger models with fewer parameters" /><p>Here, <code>jina-embeddings-v5-omni-small</code> scores 79.25 using only 0.92 billion active text-and-image parameters, ahead of <code>LCO-Embedding-Omni-3B</code> (78.24) and within striking distance of <code>LCO-Embedding-Omni-7B</code> (80.32), a model nearly 10 times its size on that path. <code>nano</code> matches that exact same 79.25 score with just 0.31 billion active parameters. The larger <code>Omni-Embed-Nemotron-3B</code> does take the top spot at 85.64, but it carries roughly five times the active parameters of <code>jina-embeddings-v5-omni-small</code>, so our models remain the most parameter-efficient of the group. If your workload is retrieving pages of documents by their layout and text, this is the number to weigh.</p><h3>Limitations of frozen-tower multimodal embeddings</h3><p>GELATO's frozen-tower design delivers strong results at low training cost, but it comes with trade-offs worth naming plainly. As already mentioned, the most consistent weak spot is video. <code>jina-embeddings-v5-omni-small</code> trails the LCO models on video, and <em>moment retrieval</em> (locating a specific event within a clip) is the weakest subtask of all. This is partly structural, since each frame produces its own token set before everything is concatenated and pooled into a single final embedding. Packing that much information into one embedding means that the early dimensions carry a heavier load, so video embeddings degrade faster than image embeddings when truncated to smaller sizes.</p><p>Audio has its own gap. While retrieval and classification scores are competitive, audio clustering is the weakest audio subtask (6.13 for <code>jina-embeddings-v5-omni-small</code>). </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta4ff53dd4329772f/6a7c3c43f1246402446febad/image13.png" alt=" Detailed benchmark results by task type for jina-embeddings-v5-omni across MIEB, MMEB-Video and MAEB" /><p>Cross-modal audio–text retrieval trails <code>LCO-Omni-7B</code> by 11–15 percentage points, a larger gap than the 6–7 points seen on the image–text (I-T) pair. The <code>fc_audio</code> projector is the natural next target for additional trainable parameters, suggesting the audio–text (A-T) alignment path has more room to grow than the multilayer vision pipeline. </p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltdc303bd9ff664c18/6a7c3cf05751aa08427e2515/image9.png" alt="Five vision ablation configurations testing frozen vs trainable encoders and projectors for multimodal embeddings" /><h3>How multimodal embeddings distribute in vector space</h3><p>We've already discussed performance via benchmarks, but what about how the actual embeddings are distributed in vector space? How does that tangibly differ from model to model?</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt225cf7e9ce7b2f98/6a7c3c570da673645857bd58/image15.png" alt="Three audio ablation configurations showing projector-first training outperforms encoder-first for audio embeddings" /><p>In the above illustration, data from video clips is funneled into each model and graphed in vector space. It’s then compressed down to two dimensions via the <a href="https://arxiv.org/abs/1802.03426">Uniform Manifold Approximation and Projection (UMAP)</a> method for easy visualization. Each modality corresponds to a different component of the video:</p><p><strong>Modality</strong></p><p><strong>Component of the video</strong></p><p>Image</p><p>Frame from the middle of the video</p><p>Video</p><p>The full video</p><p>Audio</p><p>Audio track from the video</p><p>Text</p><p>Description of the video</p><p>Immediately, some interesting patterns stand out.</p><p>Our models and the LCO models seem to have different modalities all mixed together, while <code>LanguageBind</code> and <code>Omni-Embed-Nemotron-3B</code> seem to lean more toward having their embeddings separated by modality.</p><p>Our models and the LCO models exhibit <em>interleaved geometry</em> for these vectors. This means that different modalities aren't clearly separated in vector space, but instead intermingle in similar areas. This is less pronounced with <code>Omni-Embed-Nemotron-3B</code>, since only image and video seem to occupy a similar space.</p><p><code>LanguageBind</code> is fully separated, with different modalities occupying entirely different spaces. This is known as the <em>modality-gap pattern</em>.</p><p>So which one is better? In practice, interleaved geometry tends to be the more useful of the two, and it’s worth noticing that the strongest models in our benchmarks (ours and LCO's) all exhibit it. However, there are trade-offs.</p><p>Interleaved geometry excels at cross-modal retrieval, since everything is jumbled up together in the vector space and, therefore, much closer. It's easier to find a matching picture for the text "strawberry ice cream" when the text and image embeddings sit so close together in vector space.</p><p>When you're trying to do a same-modality task though, the image that was so conveniently within reach is now in the way. However, in practice, this is easily mitigated by metadata filtering on something like a “modality” field. </p><p>No such workaround exists for the issues inherent to models that exhibit the modality-gap pattern. It’s easy to find another video of syrup poured on ice cream, since all the videos are sitting together in isolation. But having modalities confined into clusters like that makes finding an accompanying image much harder.</p><h2>Why this architecture?</h2><p>GELATO gives a lot of performance for very little training. You keep all your towers as they are and train only small projectors and delimiter tokens, which is significantly cheaper than the alternatives. To put concrete numbers on "cheaper": for <code>jina-embeddings-v5-omni-small</code>, training just the vision projector updates 4.20 million parameters instead of the 920.6 million a full fine-tune would touch. At the same 15,000-step budget, that projector-only run finishes about 1.8 times faster and peaks at 7.52 GiB of GPU memory instead of 12.96 GiB. The audio path shows an even wider gap, with projector-only training running 3.2 to 3.9 times faster than full training. But how did we conclude this was the way to go? We used a process known as <em>ablation</em>.</p><p>Ablation is when you remove or change one piece of a system to see how much it actually mattered. Imagine you've been working on an ice cream recipe. Every time you make a tweak, like doubling the milk, swapping brown sugar for white, using vanilla beans instead of extract, or taking out the chocolate chunks, that's ablation.</p><p>Ablation in ML functions much in the same way. It asks whether removing, rearranging, freezing, or unfreezing certain components makes the whole system more, less, or equally as performant. In this case, we’re particularly interested in whether unfreezing certain components, and in what order, may affect performance. We conducted five ablation studies on the <code>Qwen3.5</code> vision stack. The results are measured in mean nDCG@10 (normalized Discounted Cumulative Gain), a standard score for ranking quality where higher is better.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blteebe4f380bb51372/6a7c3c77f6ab872458d15bc2/image7.png" alt=" Cross-modal retrieval metrics for image-text and audio-text pairs across multimodal embedding models" /><p>Overall, nearly every ablation study yielded basically identical results, except for case #3, which performed terribly. Before we explain why, let's look at the equivalent ablation diagram for audio.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt86c48cbf40c279c1/6a7c3c881d23d290d8b4e451/image2.png" alt="UMAP plots comparing interleaved embedding geometry in jina-embeddings-v5-omni vs modality-gap patterns in competitors" /><p>In this instance, ablation case #2 performs the worst. Do you see the commonality between the worst performer here and the worst performer among the vision ablations? Across both modalities, the same rule holds: If you unfreeze the encoder before the projector has been trained, you’ll see worse performance.</p><p>For both modalities, we ultimately chose ablation case #1 for the final architecture. Both had relatively high scores. In vision's case, the configurations that edged out case #1 did so by margins too small to justify their added training stages and extra per-task artifacts. A similar story unfolds for audio, with case #3 beating out case #1 by a small margin but requiring more per-task artifacts.</p><p>Ablation validates the GELATO approach: It's cheaper and nearly identical in quality to train a dedicated translator (rather than the speaker).</p><h2>Summary: why frozen encoders make multimodal embeddings cheaper</h2><p>Rather than expensively retraining multiple towers to achieve multimodal capabilities, GELATO allows us to minimize cost by freezing our already functioning towers and training only small projectors to translate embeddings. These embeddings get funneled into <code>jina-embeddings-v5-text</code>, ultimately allowing all the output vectors to exist in the same, interleaved geometry. We can now compare text, audio, images, and video at a fraction of the cost of the competition. </p><p>Both <code>jina-embeddings-v5-omni-small</code> and <code>jina-embeddings-v5-omni-nano</code> are open-weight for personal use and available now. You can download them from the <a href="https://huggingface.co/jinaai">Jina AI collection on Hugging Face</a> and start generating multimodal embeddings today, or read the <a href="https://arxiv.org/abs/2605.08384">full technical report</a> for the complete set of benchmarks and ablations.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multimodal-embeddings-gelato-jina-v5-omni</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multimodal-embeddings-gelato-jina-v5-omni</guid>
    <category><![CDATA[Jina AI]]></category>
    <category><![CDATA[ML Research]]></category>
    <dc:creator><![CDATA[Jon Avezbaki]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt640f1072281c7143/6a7c3ae7cffa6ef6105e7b23/image14.png" length="0" type="image/png"/>
    <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[One field, every modality: how Elasticsearch's semantic field indexes and searches images, audio, video and PDFs automatically]]></title>
    <description><![CDATA[The semantic field turns images, audio, video, PDFs and text into multimodal embeddings at ingest time. Describe a scene and find the matching image or use a video frame to surface related clips, all from one Elasticsearch field.]]></description>
    <content:encoded><![CDATA[<p>Multimodal search in Elasticsearch now works the same way text search does: define a field, index your content, and query. The <code>semantic</code> field generates embeddings automatically at ingest time for images, audio, video, and PDFs. Every modality lands in one shared vector space, so you can retrieve an image with a text description, match audio to a phrase, or find a video with a still frame, all from a single field. Available in Elasticsearch 9.5 and serverless as a tech preview.</p><h2>The palette takes shape: how multimodal search in Elasticsearch evolved from semantic_text</h2><p>The <code>semantic</code> field is a convergence of several complementary features we've introduced over the past couple of years, bringing them together to create a cohesive multimodal search experience. Each solved an important piece of the semantic search puzzle on its own; together they enable native multimodal search.</p><p>The first brushstroke was <code>semantic_text</code>. Before it, running semantic search meant manually configuring mappings, wiring up ingest pipelines with an ML model, manually chunking content, and generating query-time embeddings yourself. The <code>semantic_text</code> field folds all of that away: it performs inference automatically at ingest time, chunks long documents for you, and simplifies the queries you write against it. <a href="https://www.elastic.co/search-labs/blog/semantic-search-simplified-semantic-text">Introduced in Elasticsearch 8.15</a> and <a href="https://www.elastic.co/search-labs/blog/elasticsearch-semantic-text-ga">released as GA in Elasticsearch 8.18</a>, it has become the foundation for semantic search on the platform.</p><p>Next came <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-omni-all-media-one-index">the model to power multimodal search</a>. <code>jina-embeddings-v5-omni</code> is our family of multimodal embedding models, capable of embedding text, images, video, audio, and PDFs into a shared vector space. Because those embeddings are semantically compatible across modalities, you can store diverse media in a single index and query across all of it at once, such as retrieving an image via a text description or matching audio against a written phrase, all without maintaining a separate pipeline for each content type. For more detailed information about how these embeddings are generated, see the <a href="https://jina.ai/models/jina-embeddings-v5-omni-small/">model documentation</a>.</p><p>We added the <a href="https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-knn-query#query-vector-builders-parameters">embedding query vector builder</a> in Elasticsearch 9.4 to handle multimodal inputs at query time. Query vector builders are general-purpose tools you can use to convert input to a vector at query time as part of your request. For example, we have the <code>text_embedding</code> query vector builder for text-only models and input, and the <code>lookup</code> query vector builder for getting a vector from an existing document. The <code>embedding</code> query vector builder is a new type that works with multimodal models and accepts multimodal input, including text or base64-encoded binaries. This allows you to pose a query in whatever modality fits, and Elasticsearch generates the matching vector on the fly.</p><p>The final piece was multimodal ingest. The <code>semantic_text</code> field brought automatic embedding to text; the <code>semantic</code> field extends that same automatic experience to images, audio, video, and PDFs from ingest through query.</p><h2>Painting the picture: creating an index with the semantic field</h2><p>Let’s create an index with a <code>semantic</code> field. This is as simple as setting the field type to semantic and defining the inference endpoint you want to use:</p>PUT example-index
{
  "mappings": {
    "properties": {
      "my_semantic_field": {
        "type": "semantic",
        "inference_id": ".jina-embeddings-v5-omni-small"
      }
    }
  }
}<p>In this example, we use the .<code>jina-embeddings-v5-omni-small</code> inference endpoint. This is our built-in <code>jina-embeddings-v5-omni</code> inference service, and it is available in all environments with access to the <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service</a> (EIS). This includes:</p><ul><li><p>Serverless.</p></li><li><p>Elastic Cloud Hosted (ECH).</p></li><li><p>Self-managed with <a href="https://www.elastic.co/docs/deploy-manage/cloud-connect">Cloud Connected Mode</a> (CCM).</p></li></ul><h3>Indexing images, audio, video and PDFs</h3><p>To index an image, provide an object with a <code>type</code> of <code>image</code> and a <code>value</code> containing the image as a base64-encoded <a href="https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Schemes/data">data URL</a>:</p>PUT example-index/_doc/example_doc_1
{
  "my_semantic_field": {
    "type": "image",
    "value": "data:image/jpeg;base64,&lt;base64-encoded-image-bytes&gt;"
  }
}<p>Arrays of objects are also accepted, allowing you to index multiple images in a single field value:</p>PUT example-index/_doc/example_doc_2
{
  "my_semantic_field": [
    {
      "type": "image",
      "value": "data:image/jpeg;base64,&lt;base64-encoded-image-bytes&gt;"
    },
    {
      "type": "image",
      "value": "data:image/jpeg;base64,&lt;base64-encoded-image-bytes&gt;"
    }
  ]
}<p>The <code>semantic</code> field also supports text values, just like <code>semantic_text</code>. You can provide such values standalone or intermix them with image values:</p>PUT example-index/_doc/example_doc_3
{
  "my_semantic_field": "a cat on a windowsill"                                                                                                                                                                                                                }

PUT example-index/_doc/example_doc_4
{
  "my_semantic_field": [
    "a cat on a windowsill",
    {
      "type": "image",
      "value": "data:image/jpeg;base64,&lt;base64-encoded-image-bytes&gt;"
    },
    "a dog running in a park"
  ]
}<p>Text values are handled just like they are with <code>semantic_text</code>: long passages are chunked according to the <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/semantic-field-reference#semantic-params">chunking settings configured on either the inference service or field mapping</a>. Multimodal values, such as images, are not chunked. Each multimodal value is represented as one chunk.</p><p>Other modalities are supported as well. Change the type value to match your content’s modality. Currently we support:</p><ul><li><p><code>image</code></p></li><li><p><code>audio</code></p></li><li><p><code>video</code></p></li><li><p><code>pdf</code></p></li></ul><p>For example, to index a video, the request would look like:</p>PUT example-index/_doc/example_doc_5
{
  "my_semantic_field": {
    "type": "video",
    "value": "data:video/mp4;base64,&lt;base64-encoded-video-bytes&gt;"
  }
}<p></p><h3>Image search and cross-modal retrieval with a text query</h3><p>To find multimodal content using a text description, run a <code>match</code> query on the <code>semantic</code> field:</p>GET example-index/_search
{
  "query": {
    "match": {
      "my_semantic_field": "a cat on a windowsill"
    }
  }
}<p>Just like with <code>semantic_text</code>, Elasticsearch automatically generates an embedding for the query text using the inference endpoint associated with the field. That query embedding is used to return semantically similar matches.</p><p>This query pattern enables easy text-to-image search. Just index an image and use a <code>match</code> query to retrieve it via text description! It also works for any other modality: index the multimodal input and search by description to retrieve it.</p><h3>Querying with images, video, and other multimodal inputs</h3><p>We can also search using a multimodal input by using the <code>knn</code> query with an <code>embedding</code> query vector builder. For example, we can search using an image:</p>GET example-index/_search
{
  "query": {
    "knn": {
      "field": "my_semantic_field",
      "query_vector_builder": {
        "embedding": {
          "input": {
            "type": "image",
            "value": "data:image/jpeg;base64,&lt;base64-encoded-image-bytes&gt;"
          }
        }
      }
    }
  }
}<p>The <code>input</code> object format is the same as when providing an image to index: set the <code>type</code> to <code>image</code> and <code>value</code> to a base64-encoded data URL.</p><p>Similar to when querying by text description, Elasticsearch automatically generates an embedding for the query image using the inference endpoint associated with the field. That query embedding is used to return semantically similar matches.</p><p>Just like with indexing, other modalities are supported, but are limited to those supported by your inference endpoint. For example, a search using a video clip would look like:</p>GET example-index/_search
{
  "query": {
    "knn": {
      "field": "my_semantic_field",
      "query_vector_builder": {
        "embedding": {
          "input": {
            "type": "video",
            "value": "data:video/mp4;base64,&lt;base64-encoded-video-bytes&gt;"
          }
        }
      }
    }
  }
}<h2>Extending the composition: highlighting, retrievers, and other semantic field features</h2><p>The <code>semantic</code> field didn't start from a blank canvas. It's built on the same foundation as <code>semantic_text</code>, inheriting its behavior and its ergonomics, and extending them to multimodal content. In practice, that means nearly everything you already know about working with <code>semantic_text</code> carries over unchanged. If you've built with <code>semantic_text</code> before, the <code>semantic</code> field will feel immediately familiar.</p><p>Here’s a selection of the features that come along for the ride. See <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/semantic-field">the documentation</a> for a complete list.</p><h3>Highlighting the best-matching chunks</h3><p>If you index multiple values in a <code>semantic</code> field, you may want to know <em>which</em> value best matches the query. The <code>semantic</code> highlighter can be used to return the most relevant chunks as highlight fragments:</p>GET example-index/_search
{
  "query": {
    "match": {
      "my_semantic_field": "a cat on a windowsill"
    }
  },
  "highlight": {
    "fields": {
      "my_semantic_field": {
        "number_of_fragments": 2,
        "order": "score"
      }
    }
  }
}<p>Setting <code>order</code> to <code>score</code> returns the fragments ranked by relevance, while <code>number_of_fragments</code> caps how many chunks come back. The response looks like:</p>{
  "hits": {
    "hits": [
      {
        "_index": "example-index",
        "_id": "example_doc_4",
        "_source": {...},
        "highlight": {
          "my_semantic_field": [
            "a cat on a windowsill",
            "data:image/jpeg;base64,&lt;base64-encoded-image-bytes&gt;"
          ]
        }
      }
    ]
  }
}<p>Note how highlighted multimodal values are represented using their data URLs.</p><h3>Controlling vector quantisation with index options</h3><p>The <code>semantic</code> field stores its embeddings in an underlying vector field, and <code>index_options</code> lets you control how that vector field is indexed. For example, choosing a non-default quantization strategy:</p>PUT example-index
{
  "mappings": {
    "properties": {
      "my_semantic_field": {
        "type": "semantic",
        "inference_id": ".jina-embeddings-v5-omni-small",
        "index_options": {
          "dense_vector": {
            "type": "int8_hnsw"
          }
        }
      }
    }
  }
}<h3>Multi-field retrievers</h3><p>The <code>semantic</code> field participates in the <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrievers">multi-field query format</a> supported by the <code>linear</code> and <code>rrf</code> retrievers. Rather than hand-writing an inner retriever per field, you supply a single <code>query</code> and a list of <code>fields</code>, mixing lexical fields and semantic fields freely:</p>GET example-index/_search
{
  "retriever": {
    "linear": {
      "query": "a cat on a windowsill",
      "fields": ["title", "my_semantic_field"],
      "normalizer": "minmax"
    }
  }
}<p>The retriever automatically separates lexical fields from semantic fields, queries each group, and normalizes the results so that each group contributes equally to the final ranking, preventing lexical matches from drowning out semantic ones.</p><h3>Cross-cluster search</h3><p>The <code>semantic</code> field supports <a href="https://www.elastic.co/docs/solutions/search/cross-cluster-search">cross-cluster search (CCS)</a>, enabling use of the field in large, multi-cluster deployments. Simply list the indices to query using the standard <code>&lt;cluster&gt;:&lt;index&gt;</code> format:</p>GET example-index,remote-cluster:remote-index/_search
{
  "query": {
    "match": {
      "my_semantic_field": "a cat on a windowsill"
    }
  }
}<p>The fields queried across indices and clusters can use a mix of different inference endpoints that produce different query embeddings. The search request will automatically apply the proper query embedding to each individual field queried.</p><h2>Off the easel, into the world: optimising multimodal embeddings for production</h2><p>When you move multimodal search from experiment to production, the size of your multimodal inputs becomes a practical concern. Multimodal data is supplied as base64-encoded data URLs, and that data is stored in the index. Those strings can grow large in a hurry: a single high-resolution file can balloon into several megabytes of encoded text, which has several side effects:</p><ul><li><p>The index size on disk can increase significantly.</p></li><li><p>Requests and responses containing multimodal data are larger, increasing transmission time and ingress/egress costs.</p></li><li><p>Inference on larger multimodal inputs is slower.</p></li></ul><p>The good news is that you don’t need that much fidelity. Multimodal embedding models reduce each input to a compact representation before generating a vector anyway, so a smaller, lower-fidelity version of a multimodal input (such as a downscaled image or a lower-bitrate audio clip) produces a very similar embedding, and similar search quality, to its full-size original. This also applies to PDF input. PDFs are generally processed visually by multimodal models, so the quality only needs to be good enough to perform operations like image embedding and OCR. Long PDFs should be broken up into chunks of smaller inputs, so the embeddings generated more accurately represent each chunk. Feeding the model small inputs keeps your documents lean, trims index and response sizes, and speeds up ingestion, all without meaningfully affecting relevance. </p><p>Elasticsearch reinforces this practice with a guardrail: the <code>indices.inference.max_binary_input_size</code> cluster setting caps the size of each binary input, defaulting to 1 MB. Any individual value that exceeds the limit is rejected with a clear error, so oversized inputs surface as an actionable problem at index time rather than as silent bloat. This setting is adjustable in self-hosted and ECH through the <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-cluster-put-settings">cluster settings API</a>. It is not adjustable in our serverless offering, where 1 MB is the hard limit for binary sizes.</p><p>When possible, it is also advised to use <a href="https://www.elastic.co/docs/reference/elasticsearch/rest-apis/retrieve-selected-fields#source-filtering">source filtering</a> to exclude <code>semantic</code> fields from responses. For example:</p>GET example-index/_search
{ 
  "_source": {
    "excludes": ["my_semantic_field"]
  },
  "query": {
    "match": {
      "my_semantic_field": "a cat on a windowsill"
    }
  }
}<p>This makes responses smaller, more performant, and easier to parse because multimodal data is not returned with each.</p><h2>Try out the semantic field</h2><p>The <code>semantic</code> field is available in Elasticsearch 9.5 and Serverless. <a href="https://cloud.elastic.co/registration?onboarding_token=search&amp;cta=cloudregistration&amp;tech=trial&amp;plcmt=cross%20module&amp;pg=search-labs">Start a free trial</a> and try it out today.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/semantic-field-multimodal-search-elasticsearch</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/semantic-field-multimodal-search-elasticsearch</guid>
    <category><![CDATA[Vector Database]]></category>
    <category><![CDATA[Index Data]]></category>
    <category><![CDATA[Jina AI]]></category>
    <category><![CDATA[Mappings]]></category>
    <dc:creator><![CDATA[Mike Pellegrini]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltac28de8857eafbc4/6a6f090aca9a724b3c614914/image1.png" length="0" type="image/png"/>
    <pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[56% faster, up to 50% better retrieval performance: What's inside Jina's new 600 million parameter listwise reranker]]></title>
    <description><![CDATA[Jina Reranker 3.5 beats v3 by 50%+ on case law, closes the gap with models 7x its size on legal, medical, and financial benchmarks, and beats them outright on structured data. It's a drop-in replacement for v3, with no API changes.]]></description>
    <content:encoded><![CDATA[<p><code>jina-reranker-v3.5</code> is a 600 million parameter reranker that delivers major gains over its predecessor, <a href="https://jina.ai/models/jina-reranker-v3"><code>jina-reranker-v3</code></a>, on legal retrieval, and closes most of the gap to models seven times its size on legal, medical, and financial reranking. On long documents, it runs up to 56% faster than <code>jina-reranker-v3</code> and scores over 50% higher on case law retrieval. It also beats Qwen3-Reranker-4B on the STaRK structured data benchmark."It’s a drop-in replacement for v3 users and requires no changes to the code that accesses the model.</p><h2>What’s a reranker and how does it work?</h2><p>A <em>reranker </em>is an AI model used near the end of an information retrieval pipeline, after other modules have assembled a short list of candidate matches to a query. It’s trained to order the candidate list from best matching to least. Using a specialized model focused purely on ranking candidate matches can improve result quality dramatically.</p><p>Jina AI’s latest rerankers use a technique called <em>late interaction</em>, where queries and documents are encoded separately into lists of token embeddings that reflect each token’s semantics in context and then compared to each other.</p><p>This is an AI analog of lexical and grammatical disambiguation.</p><p>For example, consider the meaning of the word <em>match </em>in these two sentences:</p><ul><li><p>She looked for a match to light the candle.</p></li><li><p>She looked for a match on Tinder.</p></li></ul><p>The first sentence might be a match for queries about matchboxes; the second for queries about romance.</p><p>Transformer-based models do this kind of in-context disambiguation but bring much richer information into the token embeddings they produce. The word <em>match</em> might have a semantic embedding near to words like <em>fire</em> or <em>illumination</em> in the first sentence, while in the second, it might be closer to <em>smartphone</em> or <em>swipe</em>.</p><p>Late interaction rerankers generate these context-enriched token embeddings for both the query and the candidate documents and then compare them to produce sortable scores. They’re completely agnostic about how candidate match lists are created. The reranker works exactly the same when combined with lexical search schemes, like BM25, AI-driven semantic embeddings-based retrieval, or hybrid and federated search systems that may retrieve multiple candidate lists from different sources or using different algorithms. Of course, the results always depend on the quality of the candidates, so a reranker can’t fix bad first-stage retrieval, but it almost always improves whatever you’ve got.</p><p><code>jina-reranker-v3.5</code> is a <em>listwise</em> reranker using the <a href="https://jina.ai/news/jina-reranker-v3-0-6b-listwise-reranker-for-sota-multilingual-retrieval/#:~:text=query%2Ddocument%20interaction%20%22-,last%20but%20not%20late,-.%22%20It%27s%20%22last"><em>last-but-not-late</em></a> technique developed for <code>jina-reranker-v3</code>. The query and a list of candidate matches are passed into the model together and processed in one pass, returning a numerical score for each candidate. This enables the model to use context information from the query and the full candidate list to make sense of the entire input, producing better results because of the richer information available to it.</p><p><code>jina-reranker-v3</code> proved that listwise rerankers with last-but-not-late interaction can compete with the largest models on general reranking benchmarks. Only <code>jina-reranker-v3.5</code> and models with over four billion parameters beat it on <a href="https://mteb-leaderboard.hf.space/benchmark/MTEB(Multilingual%2C%20v2)">Massive Text Embedding Benchmark (MTEB) reranker tasks</a>. However, this approach places strict limits on candidate list sizes. The query and all candidate matches must fit in the input context window of the model.</p><h2>What problems does Jina Reranker v3.5 solve?</h2><p>Despite having frontier-level performance overall, <code>jina-reranker-v3</code> has some notable performance gaps:</p><h3>Domain-specific text retrieval</h3><p><code>jina-reranker-v3</code> was trained on general text corpora and, as a result, it underperforms on important use cases, particularly:</p><ul><li><p>Legal texts, like case law and contract clauses.</p></li><li><p>Medical literature, like clinical trials and patient records.</p></li><li><p>Financial datasets and other texts full of important numbers.</p></li><li><p>Computer programming and IT documentation.</p></li><li><p>Product catalogs full of technical terminology and specifications.</p></li></ul><h3>Structured data: Tables, JSON, and key-value records</h3><p>Vast quantities of essential, real-world data is encoded in spreadsheets, tables, key-value lists, and structured records, like JSON data. However, rerankers trained purely for textual comparison, like <code>jina-reranker-v3</code>, perform poorly on this kind of data.</p><h3>Compute costs for long candidate lists</h3><p>The self-attention architecture at the core of most text-processing AI models means that memory and compute requirements grow quadratically with the size of its input. This makes <code>jina-reranker-v3</code>, like other AI models, very computationally expensive to run with a full input context window. But, to make the most effective use of the model, we want to put as many match candidates as possible into its input. When it’s at its most useful, it’s also slower and more expensive to run.</p><p>We’ve developed <code>jina-reranker-v3.5</code> specifically to address these issues without reducing its performance on general purpose text retrieval.</p><h2>What’s new in Jina Reranker v3.5?</h2><p><code>jina-reranker-v3.5</code> contains a modified self-attention mechanism that enhances performance, increases processing speed, and reduces the resources required at inference time to process a full input context window. We’ve also introduced a new three-stage self-distillation training process better suited to the sliding-window architecture of large input context models.</p><p>We’ve also curated and used training data focusing on the performance gaps we identified in <code>jina-reranker-v3</code>, including:</p><ul><li><p>Multilingual legal texts drawn from diverse international sources.</p></li><li><p>Medical texts drawn largely from scientific literature and materials used for other AI projects, including a collection of Chinese medical question-answer pairs.</p></li><li><p>Financial industry data, including investment-related question-answer pairs, regulations, and tables with numbers and associated texts.</p></li><li><p>Structured data, especially from ecommerce sources and public corpora of tables.</p></li><li><p>Expanded multilingual and cross-language texts.</p></li></ul><p>For details on the data sources and technical innovations in <code>jina-reranker-v3.5</code>, see <a href="https://arxiv.org/abs/2607.18152">our technical report</a>.</p><h2>How Jina Reranker 3.5 performs on retrieval benchmarks</h2><p>Parameters</p><p>597 million</p><p>Input modalities</p><p>Text only</p><p>Context window size</p><p>131,072 tokens</p><p>Maximum number of candidate matches</p><p>No fixed limit, but all candidates and query must fit in the context window.</p><p>Languages</p><p>Training in 52 languages</p><h3>General text reranking performance (BEIR and MIRACL)</h3><p><code>jina-reranker-v3.5</code> improves on <code>jina-reranker-v3</code>’s performance on general text reranking benchmarks. On the English-language <a href="https://github.com/beir-cellar/beir">Benchmarking Information Retrieval (BEIR) benchmark</a>, the average score has increased enough to surpass the frontier <a href="https://huggingface.co/Qwen/Qwen3-Reranker-4B">Qwen3-Reranker-4B</a> and <a href="https://huggingface.co/Qwen/Qwen3-Reranker-0.6B">0.6B</a> models and Mixedbread AI’s rerankers.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt2be1aaecef5d0cbd/6a6a33f854090e576714707e/52c2c0bd6269881eb4e2716a81442030dbf23458-2048x785.png" alt="Jina Reranker v3.5 BEIR benchmark results compared to Qwen3 and Mixedbread rerankers" /><p>We’ve also improved <code>jina-reranker-v3</code>’s multilingual reranking performance on the Multilingual Information Retrieval Across a Continuum of Languages (MIRACL) benchmark. Only the four billion parameter Qwen3 reranker regularly beats <code>jina-reranker-v3.5</code>’s score.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blta9d9b745a3c23efd/6a6a33f899442c66f1df1d8c/cc9ba1d219b1c77ef0840c86c038088a66b40f6d-2048x785.png" alt="Jina Reranker v3.5 MIRACL multilingual benchmark results across 18 languages" /><h3>Legal, medical, and financial reranking</h3><p>The <a href="https://huggingface.co/blog/rteb">Retrieval Embedding Benchmark (RTEB) suite</a> consists of diverse domain-specific retrieval benchmarks. <code>jina-reranker-v3.5</code> outperforms <code>jina-reranker-v3</code> on all RTEB tasks related to law, medicine, and finance. Only the large Qwen3 reranker, at almost seven times as many parameters, has better average performance in those three domains.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6024d5c8ac1355ac/6a6a33f9b62af41d832635d8/1426abb0397e0b9d7c8115334ca5c4f899fa8fb6-2048x693.png" alt="Jina Reranker v3.5 RTEB domain-specific benchmark results for legal, medical and financial retrieval" /><p>The new model shows particularly strong improvements for legal data, beating <code>jina-reranker-v3</code>’s score by over 50% on case law retrieval tasks.</p><p>Task</p><p>Reranker v3</p><p>Reranker v3.5</p><p>Improvement v3 to v3.5</p><p>AILA-Case</p><p>20.82</p><p>32.55</p><p>+11.73 (56%)</p><p>AILA-Statute</p><p>32.15</p><p>46.16</p><p>+14.01 (44%)</p><p>LegalQuAD</p><p>81.84</p><p>83.09</p><p>+1.25 (1.5%)</p><p>LegalSum</p><p>69.64</p><p>70.99</p><p>+1.33 (1.9%)</p><h3>Structured data reranking (Struct-IR and STaRK benchmarks)</h3><p>We evaluated <code>jina-reranker-v3.5</code>'s structured data reranking on two benchmarks: <a href="https://neurips.cc/virtual/2025/loc/mexico-city/poster/121702">Struct-IR</a> and <a href="https://stark.stanford.edu/">STaRK</a>. Both benchmarks contain AI-generated JSON text data covering a variety of applications, including product records, scientific papers, and biomedical knowledge bases.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1deca80ed81995d5/6a6a33f79b96f21e21baf2be/b847be39e6387c4d4eaf754c5d758fc59fad4349-2048x717.png" alt="Jina Reranker v3.5 structured data benchmark results on Struct-IR and STaRK" /><p><code>jina-reranker-v3.5</code> improves substantially on <code>jina-reranker-v3</code>’s score on the Struct-IR benchmark, once again only exceeded by Qwen3-Reranker-4B. On the STaRK benchmark, <code>jina-reranker-v3.5</code> beats all the other models we tested, of any size.</p><h3>Inference speed: Latency benchmarks for short and long documents</h3><p>The longer the candidate documents get, the more significant the architectural improvements we’ve brought to <code>jina-reranker-v3.5</code> are. To verify this, we used two retrieval datasets distinguished by large differences in the average document length:</p><p>Dataset</p><p>Avg. doc length</p><p>jina-reranker-v3</p><p>jina-reranker-v3.5</p><p>Speedup</p><p>BEIR Natural Questions</p><p>145.5 tokens</p><p>371.1 ms</p><p>305.3 ms</p><p>22%</p><p>RTEB AILAcasedocs</p><p>1,904.0 tokens</p><p>16,064.9 ms</p><p>10,290.9 ms</p><p>56%</p><p><code>jina-reranker-v3.5</code> is significantly faster in both cases. On the Natural Questions benchmark, there’s a 22% speedup compared to <code>jina-reranker-v3</code> with average request latency falling from 371.1 ms to 305.3 ms. Each query from the AILAcasedocs benchmark is much larger (more than 10 times larger on average) so it naturally takes longer to rerank on average: 16,064.9 ms for <code>jina-reranker-v3</code> and 10,290.9 ms for <code>jina-reranker-v3.5</code>. This represents a 56% speedup for the newer model, representing less latency for applications and lower computer costs.</p><h2>When should you use Jina Reranker v3.5?</h2><p>Reranking improves search precision in practically every case, and <code>jina-reranker-v3.5</code> has applications in a wide variety of information retrieval contexts. However, it has some limitations. The table below summarizes our best-practice advice:</p><p>Use case</p><p>Recommendation</p><p>General text retrieval in common international languages</p><p>Use `jina-reranker-v3.5`.</p><p>Legal, financial, and medical domain retrieval</p><p>Use `jina-reranker-v3.5`.</p><p>Semi-structured data, tables, product information texts for ecommerce</p><p>Use `jina-reranker-v3.5`.</p><p>Non-text or mixed-media data</p><p>Use `jina-reranker-m0`, which supports both text and image input.</p><h2>How to use Jina Reranker 3.5 with the Elastic Inference API</h2><p><strong><code>jina-reranker-v3.5</code></strong> is available via the <a href="https://jina.ai/reranker/">Jina API</a> with free tokens to try it out. It’s also available via the <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/inference-api">Elastic Inference API</a> and <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service</a>.</p><p>If you’re already using <strong><code>jina-reranker-v3</code></strong>, all you have to do is change the name of the model in the <code>model</code> field of your request to the Jina API or <code>model_id</code> field when configuring an Elastic Inference API endpoint. The two models have completely identical interfaces.</p><p>You can install <strong><code>jina-reranker-v3.5</code></strong> as a <a href="https://www.elastic.co/search-labs/blog/on-prem-ai-jina-embedding-models">Jina On-Prem container</a> to get a completely self-contained server that runs on your own hardware. The model weights are also available to download for testing and research. Follow the instructions on the <a href="https://huggingface.co/jinaai/jina-reranker-v3.5">model’s page at Hugging Face</a>. In both cases, the model is available under a <a href="https://creativecommons.org/licenses/by-nc/4.0/deed.en">CC BY-NC-4.0 license</a>, so you’re free to try it out for testing, building prototypes, or doing scientific research. For commercial use, please contact Elastic sales.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/jina-reranker-35-legal-medical-structured-data</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/jina-reranker-35-legal-medical-structured-data</guid>
    <category><![CDATA[Jina AI]]></category>
    <category><![CDATA[Relevance]]></category>
    <category><![CDATA[ML Research]]></category>
    <dc:creator><![CDATA[Felix Wang,Scott Martens]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt29bbbf4463c73d8a/6a6a33fa55755baeaa2bd248/a6563ee307cc2d29722c490b043ee736c46974f3-1280x720.png" length="0" type="image/png"/>
    <pubDate>Mon, 27 Jul 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[On-prem in under 5 minutes: Jina embedding models now available for on-prem deployment]]></title>
    <description><![CDATA[All 28 Jina AI models, including rerankers, as ready-to-deploy Docker containers, with zero telemetry and no license server. Drop-in compatible with OpenAI, Cohere, Voyage AI and Elastic Inference Service APIs.]]></description>
    <content:encoded><![CDATA[<p>All 28 Jina AI embedding and reranking models now ship as fully offline Docker containers for on-prem deployment, including <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-omni-all-media-one-index"><code>jina-embeddings-v5-omni</code></a><a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-omni-all-media-one-index"> </a>and <a href="https://www.elastic.co/search-labs/tutorials/jina-tutorial/jina-reranker-v3"><code>jina-reranker-v3</code></a>. Download one, transfer it to an on-premises air-gapped or firewalled system, and local inference is running in under five minutes. The containers are completely self-contained and make no external connections. There’s no call to Hugging Face or any model registry. There’s also no license server or telemetry or logging endpoints. For regulated industries, data sovereignty requirements or environments where internet access is unreliable or simply unavailable, this removes the dependency on third-party AI services. Jina On-Prem supports Elastic Inference Service (EIS), OpenAI, Cohere, Voyage AI, and Gemini API schemas, so existing applications work without code changes.</p><p>The most powerful AI models run on remote cloud installations with access via a web API, meaning that you have to trust your AI service provider for security, service availability, and stable prices. You can’t easily align reasonable demands for reliability, privacy, manageable costs, and good data governance with increasingly powerful, sophisticated, and resource-intensive AI usage.</p><p>Government regulation, court rulings, and business considerations made in someone else’s interest have all recently resulted in restricting access to specific services. And even if you can switch to other services, AI models aren’t components that can just be swapped out whenever you want. Applications that use semantic embeddings depend on having access to the same models at query time as at data ingestion time. To lose access to your embedding model means your search system comes to a halt.</p><p>AI pricing models compound that risk. Recent financial disclosures from major AI vendors give customers good reason to be concerned about potential price hikes. Reliance on products with unpredictable costs adds more risk to capital-intensive AI investments that may not produce clear returns.</p><p>Jina On-Prem is Elastic’s answer to these challenges.</p><h2>Who needs on-premises AI?</h2><p>Local hosting and direct control over your AI models support a variety of technical demands, industry requirements, and business interests.</p><p>Local installation reduces what you pay your AI service providers, but it puts the cost of hardware and reliable access on your organization. Depending on your volume of use, it may simply be cheaper. But there are additional pressing reasons to consider running your own AI. If any of the issues described below concern your enterprise, consider a local AI solution like Jina On-Prem. This list is not exhaustive.</p><p>Use case</p><p>Why on-prem</p><p>Example</p><p>Air-gapped / high-security</p><p>No outbound data transmission; complete network isolation</p><p>Defence, intelligence, classified research</p><p>Regulatory compliance</p><p>Data sovereignty; no cross-border transmission or third-party exposure</p><p>Healthcare (Health Insurance Portability and Accountability Act [HIPAA]), finance, EU enterprises (General Data Protection Regulation [GDPR])</p><p>Latency-critical</p><p>Zero network dependency; no tolerance for connection failures</p><p>Robotics, edge computing, vehicles, ships</p><p>Cost predictability</p><p>Fixed infrastructure cost vs. per-token pricing with uncertain future rates</p><p>High-volume continuous inference workloads</p><p>Liability reduction</p><p>No third-party data exposure; maintains legal privilege and duty of care</p><p>Law firms, government agencies</p><h3>Why air-gapped and firewalled systems need on-prem AI</h3><p>Air-gapped and firewalled systems cannot use external AI APIs. Jina On-Prem runs entirely within your infrastructure with no outbound connections.</p><p>For organizations managing especially sensitive data, security and privacy considerations are paramount. It does little good to invest in protecting your sensitive data if you promptly turn it over to some remote third party that may have insufficient security in place or might be subject to the demands of a foreign government.</p><p>Employees in organizations that handle sensitive data often receive some training in secure data handling, but this isn’t very effective when they all have web browsers that may be open to any page on the internet while they handle that data. Isolation is the most effective security measure available, either through air-gapping or very restrictive firewalls, but that makes it difficult to use external services of any kind.</p><h3>On-prem AI for latency-sensitive and high-availability systems</h3><p>Software as a service and cloud computing represent a compromise between the cost of offering highly accessible, reliable services on your own computers and outsourcing the problem to someone else. But they come with variable latency, outages, and a complete loss of control when things go wrong. AI services aren’t the exception. If your search system goes offline when you can’t access your embedding model, it may no longer look like a good compromise.</p><p>Furthermore, relying on external AI will always involve risks that you can’t easily foresee or manage. Internet access and network latency can degrade without notice, as a result of political events, bad weather, or ships dragging their anchors over underwater fiber-optic cables. Governments can, and recently have, used export bans to suddenly block access to AI models. AI service providers sometimes withdraw models to induce you to switch to newer ones. The flexibility and managed costs of external services have to be balanced against the risks of dependency.</p><h3>On-prem AI for GDPR, HIPAA, and data sovereignty compliance</h3><p>Organizations that collect personal data are subject to increasingly stringent regulations which often differ between jurisdictions and may have contradictory requirements. Notably, <a href="https://www.hhs.gov/hipaa/for-professionals/privacy/laws-regulations/index.html">HIPAA rules</a> place very strict data protections on American healthcare providers, and strong general data protection laws in <a href="https://laws-lois.justice.gc.ca/eng/acts/p-8.6/">Canada</a>, the <a href="https://gdpr-info.eu/">European Union</a>, and <a href="https://www.japaneselawtranslation.go.jp/en/laws/view/4241">many Asian jurisdictions</a> require all enterprises that handle personal information to do so securely and to limit the transmission of that data to other parties or other jurisdictions. These rules can even impose obligations on foreign entities if they have any customers in those jurisdictions. Financial institutions are frequently subject to even stricter rules and bear the same direct liability for information security that they have to protect against other forms of criminal activity.</p><p>Regulatory compliance can be incompatible with third-party AI services, especially if using them involves cross-border data transmission.</p><p>Furthermore, recent events show that rules restricting the physical location of data stores may not be a reliable source of protection when international cloud operators are subject to pressure from foreign governments. Local laws may conflict between jurisdictions, requiring local data storage and processing and making third-party services impossible to use. In some cases, the only solution is to take all the parts of your processes in house, including your AI systems.</p><h3>AI liability risks from third-party data transmission</h3><p>Data protection laws and recognized duties of care toward sensitive data routinely have liability implications, sometimes very severe ones. You can be liable for third-party service providers’ handling of your data. While courts and legal procedures might provide some retrospective protections from insecure service providers, those remedies are not available nor generally effective against national security actors, law enforcement, or criminal hackers.</p><p>For governments, there have already been instances of cross-border cloud service providers releasing sensitive state information to foreign actors.</p><p>But even if you don’t worry about foreign governments or hackers, and if your external AI service providers are themselves secure, just the fact that they’re external can create liabilities.</p><p>For example, in most jurisdictions, lawyers’ communications with their clients enjoy special legal protections, and law offices have strict liabilities when recording or storing this information. In the United States, this “attorney-client privilege” is so famous, it’s central to movie and TV plots. But one of the ways that privilege can be lost is by communicating information with someone who is not privileged, and recent developments suggest that external AI service providers might qualify.</p><p>It’s possible, at least in the United States, that just using third-party AI services over an internet API, like embedding models that provide indexing services, might violate critical confidentiality rules. A law firm might be sued, disciplined, or disbarred just for using externally hosted software, even if no security breach occurs.</p><h3>On-prem AI for offline, edge, and physically isolated systems</h3><p>Computer systems aren’t just isolated for security reasons. For example, moving vehicles cannot rely on internet access for any essential functions. Ships and aircraft have very extensive onboard computer systems that have to function without internet connections and therefore cannot use external AI services. Offshore platforms, remote facilities in wilderness areas, computer services in the Arctic, Antarctic and on small islands without adequate physical connections to global networks are all examples of installations that benefit from locally hosting all the services they need. As AI’s role in enterprise computing grows, these limitations become more important to address.</p><p>Emerging applications of AI to physical systems (robotics and other spatially confined or external-world–focused use cases, like logistics management systems or even supermarket checkouts) may be connected to the global internet, but they have no tolerance for connection failures or spikes in latency. If they rely on an AI system to operate, that AI system needs to be as local and reliable as possible.</p><h2>Who doesn’t need on-premises AI?</h2><p>Remote software services and off-site AI do have benefits. Running AI models can require expensive, power-hungry processors with notoriously short lifespans. Access to high-quality hardware is particularly difficult right now due to market factors and external economic shocks. Under the circumstances, it may make sense to pay by the token to use an external API instead of supporting the steep capital costs of local AI.</p><p>External APIs make the most sense for intermittent users. If you use AI models primarily to batch process data for analysis, rather than running a search system that has to be online all the time, it makes little sense to invest in capital-intensive hardware and local installations.</p><p>Furthermore, when your data processing is already cloud-based, for example, an ecommerce website hosted in the cloud for reliability and accessibility reasons, using AI services located in the same cloud infrastructure may provide a better value for money than introducing your own licensed AI model deployment. You’re already dependent on your cloud service provider, so being dependent on its AI services doesn’t add much risk.</p><p>If your use case sounds like it fits that description, Jina AI models are available on <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">EIS</a>, <a href="https://aws.amazon.com/marketplace/seller-profile?id=seller-stch2ludm6vgy">AWS Marketplace</a>, and the <a href="https://console.cloud.google.com/marketplace/browse?q=jina">Google Cloud Platform</a> specifically to meet your needs.</p><p>The table below summarizes the key factors. Your answer depends on your data, infrastructure and usage pattern.</p><p>Factor</p><p>On-prem favored</p><p>Cloud API favored</p><p>Usage pattern</p><p>Continuous or high-volume inference</p><p>Intermittent or batch processing</p><p>Data sensitivity</p><p>Regulated, sovereign, or classified</p><p>No cross-border or third-party restrictions</p><p>Network environment</p><p>Air-gapped, firewalled, or unreliable</p><p>Stable, always-on internet</p><p>Existing infrastructure</p><p>Own or can procure GPU hardware</p><p>Already cloud-hosted with colocated AI</p><p>Cost model</p><p>Fixed hardware + license; predictable at scale</p><p>Per-token; lower up-front, variable long-term</p><p>Latency tolerance</p><p>None (robotics, edge, real-time)</p><p>Network variability is acceptable</p><p>Operational responsibility</p><p>Your team manages hardware and availability</p><p>Provider manages hardware and updates; you manage integration</p><p>You have to consider the costs and benefits in light of your particular circumstances and use cases, taking into account the issues highlighted in the previous section that apply to you. The cost-benefit analysis will doubtless change over time. We can’t predict the future of the AI industry or hardware prices even in the short term.</p><h2>Introducing Jina On-Prem</h2><p>For users who can benefit from local AI services, we’re introducing <a href="https://github.com/jina-ai/jina-on-prem/wiki/">Jina On-Prem</a>, a fully self-contained installation suite for Jina AI’s high-performance models.</p><p>Jina AI’s models match the accuracy of embedding models <a href="https://mteb-leaderboard.hf.space/benchmark/MTEB(Multilingual%2C%20v2)">many times their size</a>, reducing compute costs, memory footprints, and hardware requirements. This makes them an ideal choice for users who want or need to keep their AI on-premises. Commercial licenses are available with scalable, proportionately priced solutions for use cases of all sizes.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt190865fb3ebde472/6a6a33d0065b162508701ff9/02559ceca556a26c53eb703ae87d421452b27251-1374x1400.png" alt="MMTEB Multilingual v2 leaderboard showing Jina AI embedding model rankings: jina-embeddings-v5-omni-small and jina-embeddings-v5-text-small ranked 13th, jina-embeddings-v5-omni-nano and jina-embeddings-v5-text-nano ranked 19th, competing against models from Microsoft, Google, Tencent, NVIDIA and Qwen" /><h3>What API schemas does Jina On-Prem support?</h3><ul><li><p>Available as a complete collection of dependencies for local installation or as a <a href="https://www.docker.com/">Docker container</a> that you can install and run in minutes.</p></li><li><p>Jina On-Prem installations <em>do not</em> call out to outside systems.</p><ul><li><p>No call to Hugging Face Hub or any model registry (<code>HF_HUB_OFFLINE=1</code> and <code>TRANSFORMERS_OFFLINE=1</code> are baked in).</p></li><li><p>There’s no license server.</p></li><li><p>There are no telemetry or logging endpoints.</p></li></ul></li><li><p>Supports both CPU and GPU hardware, with GPU autodetection.</p></li><li><p>All 28 Jina AI models available, including the latest <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-omni-all-media-one-index"><code>jina-embeddings-v5-omni</code></a> multimodal embedding models and <a href="https://www.elastic.co/search-labs/tutorials/jina-tutorial/jina-reranker-v3"><code>jina-reranker-v3</code></a>.</p></li><li><p>Access via standard AI API schemas: <a href="https://jina.ai/api-dashboard">Jina API</a>, OpenAI, Cohere, Voyage AI, and Gemini. Jina On-Prem is a drop-in solution for applications built on those schemas.</p></li><li><p>Drop-in replacement for models served by the <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">EIS</a>. Jina On-Prem integrates directly with <a href="https://www.elastic.co/blog/deploy-elastic-air-gapped-disconnected-environments">air-gapped Elastic deployments</a>.</p></li></ul><h2>Hardware requirements for Jina AI on-prem models</h2><p>The hardware requirements vary for different Jina models. The table below shows the recommendations for the most recent models using GPU settings. You don’t need anything more powerful than an NVIDIA L4 GPU, although an A100 is recommended for the v5 embedding models. Our latest embedding model currently requires a minimum of 8 GB of VRAM.</p><p>Model</p><p>Minimum VRAM</p><p>Recommended GPU</p><p>jina-embeddings-v5-text-nano</p><p>2 GB</p><p>T4 / L4</p><p>jina-embeddings-v5-text-small</p><p>3 GB</p><p>L4 / A10G</p><p>jina-embeddings-v5-omni-small</p><p>8 GB</p><p>L4 / A10G / A100</p><p>jina-reranker-v3</p><p>3 GB</p><p>L4</p><p>jina-clip-v2</p><p>4 GB</p><p>L4</p><p>jina-code-embeddings-1.5b</p><p>4 GB</p><p>L4</p><p>ReaderLM-v2</p><p>4 GB</p><p>L4</p><p>If you use more than one model at a time, the VRAM requirements will increase. Please see the <a href="https://github.com/jina-ai/jina-on-prem/wiki/Sizing-And-Hardware">Sizing and Hardware page</a> for more information.</p><h2>How to install Jina On-Prem with Docker</h2><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt20265d09e2d8d0f4/6a6a33d1065b162105701ffd/ada9881af407168298b1940f8537ad71a5411c89-1999x1200.png" alt="" /><p>The quickest way to get started is to <a href="https://www.docker.com/get-started/">install Docker</a> (if you haven’t already) and follow the instructions on the <a href="https://github.com/jina-ai/jina-on-prem/wiki/QuickStart">Jina On-Prem Quick Start</a> page.</p><p>There are pre-composed Docker containers for all 28 Jina models. Download one and transfer it to your installation target, and you can have Jina AI models running in under five minutes.</p><p>For multimodal or custom builds, or to download the complete dependency set for installation outside of a container, follow the steps outlined in the <a href="https://github.com/jina-ai/jina-on-prem/wiki/Bundling-Guide">bundling guide</a>.</p><p>Your Jina On-Prem installation supports all Jina API and EIS functionality and embedding generation via OpenAI, Cohere, Voyage AI, and Gemini APIs, so it can integrate into preexisting applications using standard interfaces. See the <a href="https://github.com/jina-ai/jina-on-prem/wiki/API-Reference">API documentation</a> for more information.</p><p>Jina models, including models installed with Jina On-Prem, are available on various licensing terms, with the latest models free for noncommercial use under a <a href="https://creativecommons.org/licenses/by-nc/4.0/deed.en">CC BY-NC 4.0</a> license. To license Jina On-Prem for commercial use, please contact <a href="https://www.elastic.co/contact">Elastic Sales</a>.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/on-prem-ai-jina-embedding-models</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/on-prem-ai-jina-embedding-models</guid>
    <category><![CDATA[Jina AI]]></category>
    <category><![CDATA[Integrations]]></category>
    <dc:creator><![CDATA[Scott Martens]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt17731ab0c6ec66f6/6a6a33d140a4941014ca5c9a/09bc6dac4e6a86c7877f8ed78d68f5d581aeffa9-1999x1200.png" length="0" type="image/png"/>
    <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[A picture is worth 1.5x the words: What we learned benchmarking product search embeddings]]></title>
    <description><![CDATA[We benchmarked two embedding models on 5,000 real products and found that combining image and text beats either alone by up to 50%. Here's the data and the model that won.]]></description>
    <content:encoded><![CDATA[<p>A picture is worth 1.5x the words: What we learned benchmarking product search embeddings</p><p>Combining image and text into one embedding beats either alone, and the gap isn't small. In our tests, averaged image and text embeddings put the correct product in the top spot up to 1.5 times as often as image embeddings alone. We benchmarked 5,000 real apparel and footwear products in English and German across two Jina embedding models, <a href="https://jina.ai/models/jina-clip-v2/"><code>jina-clip-v2</code></a> and <a href="https://jina.ai/models/jina-embeddings-v5-omni-small/"><code>jina-embeddings-v5-omni-small</code></a>, to see which model and which indexing strategy actually wins for ecommerce search. The older, narrower Contrastive Language–Image Pre-training–style (CLIP-style) model beat the newer, more general one, and that wasn't what we expected. This post walks through the data, the method, and what we'd recommend doing with it.</p><h2>jina-clip-v2 vs. jina-embeddings-v5-omni-small: What's different</h2><p>Multimodal embedding models work by generating representative semantic vectors for inputs of different kinds in a single high-dimensional space.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltf638d8046a86a96d/6a6119f95144f70015b98971/9fb7128bc42109876edbe403985a8d621d535ead-1326x973.png" alt="Diagram of a dog and a cat mapped as vectors in a shared embedding space, illustrating how multimodal embeddings represent product similarity" /><p>We used two models that do this:</p><p></p><p>jina-clip-v2</p><p>jina-embeddings-v5-omni-small</p><p>Architecture</p><p>Dual encoder (separate text + image towers)</p><p>Single shared backbone + frozen encoders</p><p>Parameters</p><p>~865M total</p><p>~1.74B total</p><p>Embedding dimensions</p><p>1024</p><p>1024</p><p>Max input</p><p>512×512 images, 8k tokens text</p><p>32k tokens</p><p>Language coverage</p><p>Broad multilingual</p><p>~100 languages</p><p>Modality handling</p><p>Text ↔ image alignment (purpose-built)</p><p>Text, image, audio, video via projectors</p><p><code>jina-clip-v2</code> is a CLIP-style dual encoder: a text tower (Jina XLM-RoBERTa, 561M parameters) and a separate image tower (EVA02-L14, 304M parameters), about 865M parameters in total. The two towers are independently trained but fine-tuned to output to a common semantic space. It produces 1024-dimensional embeddings, handles images up to 512×512 and up to 8k tokens of text, and has broad multilingual support. It has been engineered specifically to support text-to-image, image-to-text, and text-to-text matching.</p><p><code>jina-embeddings-v5-omni-small</code> has a broader scope. It extends the <a href="https://jina.ai/models/jina-embeddings-v5-text-small"><code>jina-embeddings-v5-text</code></a> model to support images, audio, and video by attaching frozen vision and audio encoders to the frozen text backbone. The encoders connect through <em>cross-modal projectors</em>, small trained layers that map each encoder's output into the text model's embedding space. These projectors are the only part of the model to receive additional training. The resulting model produces 1024-dimensional embeddings, supports a 32k-token input context, and covers roughly 100 languages. It encodes queries and documents asymmetrically: a query with the <code>retrieval.query</code> task, a document with <code>retrieval.passage</code>.</p><p>There’s an important functional difference between the two models: <code>jina-clip-v2</code> is really two separate models trained to work together, but <code>jina-embeddings-v5-omni-small</code> uses a single shared backbone that produces embeddings for all its supported media types. Every modality maps into one shared vector space. In principle, it can handle text, images, audio, or video, or combine materials of different media types into one input, yielding one embedding that encompasses all the data. However, there are two important caveats when using <code>jina-embeddings-v5-omni-small</code>: Combining image and text into one input is a documented weak spot for the model, and the Jina API only allows users to embed one modality per request. Theoretically, it can create a joint image and text vector, but in practice, you can’t with the API (and shouldn’t anyway).</p><h2>The ecommerce product dataset we used</h2><p>For this article, we downloaded the <a href="https://www.kaggle.com/datasets/paramaggarwal/fashion-product-images-dataset">Fashion Product Images</a> dataset from Kaggle. It contains roughly 44,000 catalog entries for products from a real fashion retailer, each with a high-resolution photo and structured metadata. We only used the <code>Apparel</code> and <code>Footwear</code> categories (about 30,600 products) and sampled 5,000 from them with a fixed random seed.</p><p>For each product, the dataset contains three records:</p><ul><li><p>Each product is pictured in a 1800×2400 JPEG against a clean background.</p></li><li><p>Metadata with the labels <code>gender</code>, <code>masterCategory</code>, <code>subCategory</code>, <code>articleType</code>, <code>baseColour</code>, <code>season</code>, <code>year</code>, <code>usage</code>, and <code>productDisplayName</code>.</p></li><li><p>A collection of additional informationwith labels like <code>Neckline</code>, <code>Pattern</code>, <code>Sleeve Length</code>, <code>Fit</code>, and <code>Fabric</code>, and a free-text description in English.</p></li></ul><p>For example, item #13885 is labelled "<em>Scullers Men Check Black Shirts</em>," with an accompanying image (see below) and a description that reads <em>"Black and white checked shirt, made of 100% cotton, full length buttoned placket, long sleeves with buttoned cuffs."</em></p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltaaf6af3ebb32e4bc/6a6119fbde9481709fd173c2/fcbc520fecf5f9decda6f6b95054ddae972b9283-1500x1999.png" alt="Product photo of a black and white checked men's shirt used as a sample item in a multimodal product search embeddings benchmark" /><h2>How we generated the search queries</h2><p>We generated our test queries without an AI language model, using rules and substitution lists. </p><p>For each product, we started from its color and article type and added one descriptive modifier, drawn at random from the product’s available metadata: neckline, pattern, sleeve length, length, surface styling, fit, fabric, season, or usage. We then reworded the query by substituting words from a fixed synonym table. This avoids making queries that reuse the catalog's own words. For example, ″<em>t-shirt″</em> becomes ″<em>tee″</em>, ″<em>regular fit″ </em>becomes ″<em>classic cut″</em>, ″<em>printed″</em> becomes ″<em>with graphic design″</em>, ″<em>sleeveless″</em> becomes <em>″no sleeves″</em>. The longest phrase with a synonym was replaced first, so we swapped <em>″sports shoes″</em> rather than <em>″shoes″</em>. Because the pipeline is rule-based and seeded, query production is reproducible and all variation is accounted for. German queries were generated the same way, using a German term table, and then a native speaker corrected them for natural retail phrasing. Some examples:</p># usage / occasion
    "in casual style": "for everyday wear",
    "in formal style": "for the office",
    "in sports style": "for working out",
    "in ethnic style": "in traditional wear",
    "in party style": "for a night out"

# article types
    "t-shirt": "tee",
    "trousers": "pants",
    "sweatshirt": "pullover",
    "sweater": "knit pullover",
    "kurta": "tunic",
    "capris": "cropped pants",
    "track pants": "joggers",
    "innerwear vest": "undershirt",
    "briefs": "underwear"
 
# colours (safe near-equivalents)
    "navy blue": "dark blue",
    "off white": "cream",
    "maroon": "deep red",<p>The German queries used their own term table, mapping the same catalog attributes to natural German retail phrasing (later checked by a native speaker). Some examples:</p># usage / occasion
"casual": "im Freizeit-Stil",
"formal": "im Business-Stil",
"sports": "zum Sport",
"party": "für die Party"

# article types
"heels": "Pumps",
"casual shoes": "Freizeitschuhe",
"track pants": "Jogginghose",
"wallets": "Geldbörse"

# patterns
"checked": "mit Karomuster",
"polka dots": "mit Punkten",
"solid": "unifarben"<h2>The six embedding configurations we tested</h2><p>We tested retrieval in six configurations, using the same text queries in each test condition and the same 5,000 product indexed dataset. For both <code>jina-clip-v2</code> and <code>jina-embeddings-v5-omni-small</code>, we tested three different ways of generating embeddings for indexing:</p><ol><li><p><strong>Image-only. </strong>We generated embeddings from the images alone without any other data.</p></li><li><p><strong>Text-only.</strong> We generated embeddings for the free text descriptions alone.</p></li><li><p><strong>Averaged image and text.</strong> For each product, we generated embeddings for the image and text description separately and then averaged the two vectors into one.</p></li></ol><p>We used the Jina API to generate document and query embeddings for product images and free text descriptions, as shown in the code below. All images were resized to fit into a 512x512px square before processing.</p>import requests

def embed(inputs, model, task=None):
    body = {"model": model, "input": inputs}
    if task:
        body["task"] = task
    response = requests.post(
        "https://api.jina.ai/v1/embeddings",
        headers={"Authorization": f"Bearer {JINA_API_KEY}"},
        json=body, timeout=120,
    )
    response.raise_for_status()
    return [d["embedding"] for d in response.json()["data"]]

# Query example using text
query_vec = embed([{"text": "T-Shirt in Grau für den Herbst"}],
                  "jina-embeddings-v5-omni-small", task="retrieval.query")

# Document example using an image. "
# image_base64" is the resized and base64 encoded PNG.
image_vec = embed([{"image": image_base64}],
                  "jina-embeddings-v5-omni-small", task="retrieval.passage")<p>We combined images and texts by embedding them separately, averaging the two vectors, and then normalizing the result so we can speed up calculating cosines. This works for multimodal models because both embeddings share the same semantic space. The sum of the two vectors is a new vector with the semantic features of both.</p><p>This is very easy to do using the numpy package in Python. We used the code below:</p>import numpy as np

def l2(x):  # includes row-wise L2 normalization
    return x / np.linalg.norm(x, axis=1, keepdims=True)

# image_vecs and text_vecs are embeddings of the same products.
# They share one space, so averaging them is meaningful.
combined = l2((l2(image_vecs) + l2(text_vecs)) / 2)<p>
For this article, we did exact retrieval, calculating the cosine between queries and all 5,000 stored product embeddings. In Elasticsearch, we would use a shortcut to approximate the same result. From the ranked results, we calculate Recall@1, Recall@5, Recall@10, Mean Reciprocal Rank (MRR), and Normalized Discounted Cumulative Gain at position 10 (nDCG@10).</p><p>Each query has exactly one correct answer, so Recall@K is the share of queries whose product lands in the top K. MRR scores the results by how close the correct answer is to the top. nDCG@10 is a standard metric that penalizes putting the best answer lower on the results list.</p><h2>Product search benchmark results</h2><p>The table below is the German cross-lingual run. We evaluated German queries to find products with English descriptions:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt6dbfbca9f7c7884f/6a6119fcf2e1c472a0fd2a2c/3599b15b5a61b5be1de02ae6b8fedd8f1615410b-1500x700.png" alt="Table comparing jina-clip-v2 and jina-embeddings-v5-omni-small on German product search queries, showing Recall@1, Recall@5, Recall@10, MRR and nDCG@10" /><p>Query benchmark results for <code>jina-clip-v2</code> and <code>jina-embeddings-v5-omni-small</code> using German-language text queries and the images and English descriptions of garments.</p><p>The averaged image/text embeddings score the best, both using <code>jina-clip-v2</code> and <code>jina-embeddings-v5-omni-small</code>. Surprisingly, averaged vectors from <code>jina-clip-v2</code> lead the table. It ranks the correct product first about 1.5 times as often as the image-only setup and significantly more often than the text-only setup. Furthermore, it beats every <code>jina-embeddings-v5-omni-small</code> condition. Results for the same tests using English-language queries:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltbb878895472badde/6a6119fdae3a7c168883ef02/5ced60965d12dd3c64961acc92317a74c17fe8eb-1500x700.png" alt="Table comparing jina-clip-v2 and jina-embeddings-v5-omni-small on English product search queries, showing Recall@1, Recall@5, Recall@10, MRR and nDCG@10" /><p>Query benchmark results for <code>jina-clip-v2</code> and <code>jina-embeddings-v5-omni-small</code> using English-language text queries and the images and English descriptions of garments.</p><p>The English run, on the same 5,000 products, tells the same story. The main difference is that the <code>jina-embeddings-v5-omni-small</code> scores are significantly closer to those of <code>jina-clip-v2</code>, although still lower.</p><h3>What the benchmark scores actually mean</h3><p>The relatively low scores in the German and English benchmark tables above are to be expected. This is a real-world dataset full of near duplicates. A search for a <em>"black tee with classic cut"</em> has to sort through dozens of basic black T-shirts, and even on the best ecommerce sites, you would expect a result like this. The important thing to understand is the difference in scores between the different conditions, not their absolute values. Our key finding is that combining text and image embeddings yields better performance than either one alone, highlighting how multimodal AI-driven search can use different information sources to produce better performance than non-multimodal strategies.</p><h3>When a picture is worth a thousand words, and when it isn’t</h3><p>The gain from adding images to text embeddings isn’t evenly distributed. We did a deep dive to see if there was a pattern to the results and discovered a few things:</p><ul><li><p><strong>Images add a lot for visually distinctive items and attributes.</strong> For example, on footwear, image-only retrieval is on par with text-only: 0.029 versus 0.028 for Recall@1. Shoe styles have distinctive shapes, so the picture does the work (image-only 0.029 versus text 0.028). The same holds for visible attributes more broadly (color, pattern, sleeve length), where fusing image and text gives the biggest lift over text-only (0.085 versus 0.073).</p></li><li><p><strong>Images help the least with things the model can’t see.</strong> For example, if we query for fabric types, adding images to embeddings adds next to nothing. Humans and AI models alike struggle to see that something is or isn’t made of linen or polyester or some other fabric type. That information is only in the text description and metadata.</p></li></ul><p>As a rule of thumb, we find that searches for clothing lean more heavily on accurate text descriptions, while footwear leans more on the semantics of images. But in both cases, merging the two embeddings either improves results or doesn’t make them worse. This highlights how use-case–specific considerations drive optimal search strategies.</p><h3>Cross-language queries gain a lot from multimodal embeddings</h3><p>The gap in performance between text-only and combined image and text embeddings using <code>jina-clip-v2</code> is much larger for German queries (0.074 versus 0.065 Recall@1) than for English ones (0.076 versus 0.075). This implies that English queries can take advantage of being in the same language as the product descriptions. Whether that’s due to overlaps in the words or that the model is simply more competent with single-language semantics than cross-language doesn’t matter. But adding images to the text embeddings compensates almost completely for the model’s shortcomings in cross-language retrieval.</p><p>This gap is even larger for <code>jina-embeddings-v5-omni-small</code>. In any kind of cross-language or multilingual context, multimodal embeddings seem to significantly improve retrieval performance.</p><h3>Can AI-generated product descriptions replace human ones?</h3><p>AI-generated descriptions scored worse than human-written ones in our tests. We tried replacing human-authored product descriptions with ones written by <a href="https://jina.ai/models/jina-vlm"><code>jina-vlm</code></a> based on the image. For this test, we used a 1,000-product random subset. The results were much worse than with the original human text. This was what we expected: The automatically generated description was less accurate and less oriented toward the salient features of the product than the human authored one.</p><p>So it turns out that not everyone’s job can be replaced by AI. People who write blurbs for catalogs ought to be safe for now.</p><h2>How should you index your ecommerce data?</h2><p>Our tests aren’t totally scientifically rigorous, but they do offer some insights into the issues you might face if you have similar data. We offer the following as provisional conclusions:</p><ul><li><p><strong>If you have aligned texts and images (and most catalogs do), combine them in your embeddings.</strong> In every case, using a multimodal embedding model like the ones Jina AI by Elastic provides and then averaging the image and text embeddings significantly outperformed all other options. The combination adds no computing costs at inference time but does create additional costs at embedding time. For each product, you’ll need to generate two embeddings and combine them, roughly doubling the cost.</p></li><li><p><strong>Use the right model.</strong> You need to identify a model that supports all the modalities and languages you plan to use. All the inputs have to be embedded in the same semantic vector space or none of this will work. It won’t do to get two single-modality models or multiple language-specific text models, average their outputs, and hope for the best. Jina AI by Elastic currently supports texts in up to 100 languages, including computer code and technical terminology images of all kinds, such as scans and infographics, as well as audio and video data. You can change your mind about your models later, but only if you’re willing to reindex all your data.</p></li><li><p><strong>Whatever you pick, test it on your own data.</strong> The only way to know what the best model is for you, your data, and your use case is to try them out. We were very surprised that our older CLIP-style model outperformed our latest on this dataset, but it was trained almost specifically for this use case. Your data and use case could easily show the opposite. This result is from one catalog, with one style of photography and one kind of query. The ranking between two models can flip with a different domain, image style, or query mix. Run the same sort of benchmark on a sample of your own products before you commit. It’s the only way to know which model really fits your case.</p></li><li><p><strong>Use generated descriptions to fill gaps, not to replace good text. </strong>AI isn’t a replacement for good work done by conscientious people. Replacing human-made descriptions with machine-made ones made results worse. AI should only replace humans when it has to, like when data is missing or needs to be augmented and it’s impractical to have humans fill in the gaps. Yes, we have tools that work in those situations, but they aren’t necessarily good substitutes. They’re OK substitutes, sometimes.</p></li></ul><p><strong>Average your embeddings.</strong> Semantic embeddings are very robust, and averaging them is a relatively cheap solution that doesn’t affect inference-time costs at all. This is a real boon over methods that index each modality separately and require multiple queries to satisfy a single request. But they do require compatible multimodal models.</p><h2>Limitations of this product search benchmark</h2><p>A few things to keep in mind before generalizing too much from this experiment:</p><p>This article doesn’t perfectly match real-world use cases. Human users make messier queries and have more ambiguous matching criteria. The queries we used were generated specifically for this data. A test with actual customer-made queries from system logs would be a better one.</p><p>Embedding averaging isn’t the same as a true joint embedding. Embedding models rely on the different parts of their input to interact in order to extract a semantic representation of the whole. The approach used here is a bit of a hack, one that relies on the robust nature of semantic embedding spaces to get the job done. We expect future models from Jina AI to produce better embeddings by supporting more than one input modality at a time.</p><p>This is one dataset in one domain with distinctive features. Fashion photography is very foreground-focused and the descriptions are attribute-rich. Other kinds of materials, even for ecommerce, may look very different. It’s important to test as much as possible with your own data or something very similar.</p><h2>How to get started with multimodal product search embeddings</h2><p><code>jina-clip-v2</code> and <code>jina-embeddings-v5-omni-small</code> are available through the <a href="https://jina.ai/api-dashboard">Jina API</a>, <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service</a> (EIS), and <a href="https://huggingface.co/jinaai">Hugging Face</a>. The omni models are free to download under a CC-BY-NC-4.0 license and free for noncommercial use, with commercial licensing through Elastic. If you use Elasticsearch, EIS exposes both models through the <code>semantic</code> field type, with non-text media in Base64 encoding.</p><p>The takeaway from this article is intended to be practical and actionable: For product search, a picture and its description aren’t the same signal. Both add information, and you don’t have to pick one. Average your multimodal embeddings, and benchmark the results with your own data to get a good picture of the kinds of results you can expect.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multimodal-embeddings-ecommerce-product-search</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multimodal-embeddings-ecommerce-product-search</guid>
    <category><![CDATA[Vector Database]]></category>
    <category><![CDATA[Relevance]]></category>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Sofia Vasileva]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt93506c893fb19bb9/6a6119fea2ee17d20274edab/b08939addf8cfa92dd0b31211ff0a86511eb582c-1280x720.png" length="0" type="image/png"/>
    <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[How BBQ shrinks Jina v5 embeddings by 29x without losing recall in Elasticsearch]]></title>
    <description><![CDATA[A hands-on test comparing BBQ and float32 vector indices in Elasticsearch, measuring memory, disk and recall@10 across five languages.]]></description>
    <content:encoded><![CDATA[<p><a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">BBQ quantization</a> cuts the memory footprint of <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text">Jina embeddings v5</a> vectors by 29x in Elasticsearch. Recall@10 holds at 0.994 against a full-precision <code>float32</code> baseline. We tested this on a multilingual news corpus across five languages, using <code>jina-embeddings-v5-text-small</code> to build a raw <code>float32</code> index and a <code>bbq_hnsw</code> index from the exact same <a href="https://www.elastic.co/what-is/vector-embedding">vectors</a>. Then we measured memory, disk usage and retrieval quality on both. Disk usage came out nearly identical between the two indices. In-memory footprint is the number that actually decides whether your cluster fits the corpus, and it dropped from 12.71 MB to 0.44 MB for this test set. Jina v5's quantization-aware training is why the recall held.</p><h2>Prerequisites</h2><ul><li><p>Elasticsearch 9.x with <code>jina-embeddings-v5-text-small</code> inference endpoint available.</p></li><li><p>Python 3.10+,</p></li><li><p>Elasticsearch API key,</p></li></ul><h2>What is quantization?</h2><p>An <em>embedding </em>is a list of numbers. By default, each number is a <code>float32</code>, which uses 4 bytes. <em>Quantization </em>stores each number with fewer bits, trading precision for space.</p><p>Like a JPEG, a <em>quantized vector</em> is a smaller, lower-fidelity copy of the original that still gets the job done.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1ddbaed3b3d80b67/6a54faf78f017d26529ee65c/175105f9a5059885aaf92268c2ab70b2e4e3dd6f-519x600.png" alt="Cat photo at decreasing JPEG quality, illustrating the quantization trade-off between size and detail" /><p>Name</p><p>Bytes / dim</p><p>1024-d vector</p><p>Compression</p><p>`Float` (Baseline)</p><p>4</p><p>4096 B</p><p>1x</p><p>`int8`</p><p>1</p><p>1024 B</p><p>4x</p><p>`int4`</p><p>0.5</p><p>512 B</p><p>8x</p><p>`bbq`</p><p>~0.14</p><p>142 B</p><p>~29x</p><h2>What is BBQ?</h2><p>Better Binary Quantization (BBQ) is Elasticsearch's 1-bit quantization mode for dense vectors. Each dimension of the vector is stored as a single bit, plus a few corrective bytes per vector. Then, a rescoring step is applied at query time. This keeps the final retrieval quality close to a full precision search.</p><p>For the math behind each level, see <a href="https://www.elastic.co/search-labs/blog/scalar-quantization-101">Scalar quantization 101</a>, <a href="https://www.elastic.co/search-labs/blog/optimized-scalar-quantization-elasticsearch">Optimized Scalar Quantization</a>, and the <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">BBQ deep dive</a>.</p><h3>How does BBQ preserve search accuracy?</h3><p>Plain 1-bit quantization leads to too high a search quality degradation on its own. BBQ maintains high retrieval quality through three mechanisms:</p><ol><li><p><strong>Asymmetric precision:</strong> Stored vectors use 1 bit per dimension.</p></li><li><p><strong>Corrective factors:</strong> A few floats per vector record the rounding error and correct distances at scoring time.</p></li><li><p><strong>Oversample and rescore:</strong> BBQ scans candidates with the bits and then reranks the top ones with higher precision. Fetching the top 10 means scanning about 30 candidates.</p></li></ol><p>The result is the vectors that are roughly 32x smaller, with retrieval quality close to full precision. In the next section of the article, we’ll measure the memory savings and the recall on a real corpus.</p><h2>How Jina embeddings v5 works</h2><p>Jina embeddings v5 is a multilingual embedding model with quantization-aware training, which makes it a natural fit for BBQ in Elasticsearch: The 1024-dimensional vectors from <code>jina-embeddings-v5-text-small</code> sit above the dimensional floor where binary quantization stays accurate, and the model is trained so that 1-bit quantization loses little quality. Its main features are:</p><ul><li><p><strong>One model for many tasks:</strong> v5 uses small <a href="https://arxiv.org/abs/2106.09685">Low-Rank Adaptation (LoRA) adapters</a> on top of a single base model, one for each task: <em>retrieval</em>, <em>text-matching</em>, <em>clustering</em>, and <em>classification</em>. Elasticsearch <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text#getting-started">picks the right adapter automatically</a> at index and query time.</p></li><li><p><a href="https://arxiv.org/abs/2205.13147"><strong>Matryoshka dimensions:</strong></a> v5 is trained so you can truncate the vector (1024, 512 to 256) and minimize search quality reduction. This is another way to shrink vectors, independent of quantization.</p></li><li><p><strong>Quantization-aware training:</strong> v5 is trained to work with BBQ, so its 1-bit vectors lose little accuracy.</p></li></ul><p>We use <code>jina-embeddings-v5-text-small</code>. This model is available through <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service</a> (EIS) and outputs 1024 dimensions with 32k token context and is multilingual across 93 languages. That puts it above the <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-quantization">384-dimension threshold</a>, below which Elasticsearch no longer defaults to <code>bbq_hnsw</code>.</p><p>Full model details are in the <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text">Jina v5 article on Search Labs</a>.</p><h2>Setting up the BBQ vs. float32 comparison</h2><p>We’ll create two indices: Both share mappings, and what changes is the <code>index_options.type</code> parameter, which tells Elasticsearch how to store the dense vector field (as raw <code>float32</code> HNSW or as 1-bit BBQ):</p><p>Index</p><p>`index_options`</p><p>Loaded into memory</p><p>`vectors-float32`</p><p>`hnsw`</p><p>Raw `float32` with no quantization (baseline)</p><p>`vectors-bbq`</p><p>`bbq_hnsw`</p><p>1-bit BBQ quantization + corrective factors</p><p>We then embed the corpus once with Jina v5, index those same vectors into both, and compare them on disk usage, memory footprint, and recall. You can follow along with the full <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/quantizing-jina-embeddings-v5-bbq/quantization-jina-embeddings.ipynb">supporting blog content notebook</a>.</p><h3>Connect to Elasticsearch</h3>from elasticsearch import Elasticsearch, helpers

es_client = Elasticsearch(
    ELASTICSEARCH_URL, api_key=ELASTICSEARCH_API_KEY, request_timeout=120
)
es_client.info()<h3>Create the two indices</h3>DIMS = 1024
FLOAT_INDEX = "vectors-float32"
BBQ_INDEX = "vectors-bbq"


def create_index(name, index_options):
    if es_client.indices.exists(index=name):
        es_client.indices.delete(index=name)

    es_client.indices.create(
        index=name,
        mappings={
            "properties": {
                "text": {"type": "text"},
                "lang": {"type": "keyword"},
                "embedding": {
                    "type": "dense_vector",
                    "dims": DIMS,
                    "index": True,
                    "similarity": "cosine",
                    "index_options": index_options,
                },
            }
        },
    )


create_index(FLOAT_INDEX, {"type": "hnsw"})       # raw float32 baseline
create_index(BBQ_INDEX,   {"type": "bbq_hnsw"})   # 1-bit BBQ<p><em>Note: In production, you can use </em><a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/semantic-text"><em><code>semantic_text</code></em></a><em> to let Elasticsearch manage the mapping and inference endpoint automatically.</em></p><h3>Point at the Jina v5 inference endpoint</h3><p>We call the model <code>jina-embeddings-v5-text-small</code> directly (no need to create an <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-inference-put">inference endpoint</a>) to turn text into vectors.</p>INFERENCE_ID = ".jina-embeddings-v5-text-small"


def embed(texts, batch_size=16):
    out = []

    for i in range(0, len(texts), batch_size):
        batch = texts[i : i + batch_size]

        try:
            resp = es_client.inference.text_embedding(
                inference_id=INFERENCE_ID, input=batch
            )
        except AttributeError:  # older client versions
            resp = es_client.inference.inference(inference_id=INFERENCE_ID, input=batch)
        out.extend(item["embedding"] for item in resp["text_embedding"])

    return np.array(out, dtype=np.float32)


embed(["hello world"]).shape # testing<p>As result of the test, we got:</p>(1, 1024)<h3>Load a multilingual news dataset</h3><p>We stream real news articles from <a href="https://huggingface.co/datasets/hotchpotch/multilingual_cc_news">hotchpotch/multilingual_cc_news</a>, a parquet mirror of CC-News. We take about 1,000 articles from five languages (around 3,000 docs total), plus a small held-out set of headlines to use as search queries. Using multiple languages also lets Jina v5 show its multilingual strength.</p>from datasets import load_dataset

LANGS = ["en", "de", "ja", "pt", "ru"]
PER_LANG_DOCS = 1000
PER_LANG_QUERIES = 20

docs, queries = [], []
for lang in LANGS:
    ds = load_dataset(
        "hotchpotch/multilingual_cc_news", lang, split="train", streaming=True
    )
    rows = [
        r
        for r in ds.take(PER_LANG_DOCS + PER_LANG_QUERIES)
        if r.get("maintext") and r.get("title")
    ]

    for row in rows[:PER_LANG_DOCS]:
        text = (row["title"] + ". " + row["maintext"]).replace("\n", " ").strip()
        docs.append({"text": text[:1000], "lang": lang})

    for row in rows[PER_LANG_DOCS:]:
        queries.append({"text": row["title"], "lang": lang})  # headlines as queries

print(f"Corpus: {len(docs)} docs | Queries: {len(queries)}")

# RES: Corpus: 3102 docs | Queries: 18<h3>Generate the embeddings and bulk index</h3><p>We embed the corpus a single time and feed those exact vectors into both indices.</p>doc_vectors = embed([d["text"] for d in docs])
query_vectors = embed([q["text"] for q in queries])def index_docs(name):
    actions = (
        {
            "_index": name,
            "_id": i,
            "_source": {
                "text": d["text"],
                "lang": d["lang"],
                "embedding": doc_vectors[i].tolist(),
            },
        }
        for i, d in enumerate(docs)
    )
    helpers.bulk(es_client, actions, refresh=True)


for name in (FLOAT_INDEX, BBQ_INDEX):
    index_docs(name)
    es_client.indices.forcemerge(index=name, max_num_segments=1)
    es_client.indices.refresh(index=name)<p>We <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-forcemerge">force-merge</a> to a single segment so the storage numbers are stable and comparable.</p><h2>Results: Disk versus memory</h2><p>The <a href="https://www.elastic.co/docs/api/doc/elasticsearch/operation/operation-indices-disk-usage">disk usage API</a> reports how many bytes each index spends on vectors (<code>knn_vectors</code>).</p>def vector_disk_bytes(name):
    du = es_client.indices.disk_usage(index=name, run_expensive_tasks=True)
    field = du[name]["fields"]["embedding"]
    knn = field.get("knn_vectors")
    if isinstance(knn, dict):
        return knn["size_in_bytes"]
    return field["knn_vectors_in_bytes"]


float_disk = vector_disk_bytes(FLOAT_INDEX)
bbq_disk = vector_disk_bytes(BBQ_INDEX)

N = len(docs)
float_mem = N * DIMS * 4
bbq_mem = N * (DIMS // 8 + 14)

print(f"On disk   -&gt; float32: {float_disk/1e6:6.2f} MB | BBQ: {bbq_disk/1e6:6.2f} MB")
print(f"In memory -&gt; float32: {float_mem/1e6:6.2f} MB | BBQ: {bbq_mem/1e6:6.2f} MB  ({float_mem/bbq_mem:.0f}x smaller)")<p>Result:</p>On disk   -&gt; float32:  12.80 MB | BBQ:  13.25 MB
In memory -&gt; float32:  12.71 MB | BBQ:   0.44 MB  (29x smaller)<p>On disk, the two indices are about the same size. A quantized index still keeps the raw <code>float32</code> vectors (needed for rescoring and requantization during merges) and adds the 1-bit vectors on top, so BBQ ends up slightly larger on disk.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt480f8d535f7a67cd/6a54faf95beed09a3ec5f836/c54fff3fe10273895d7fc16e3c8f215c3538d717-583x250.png" alt=" Float32 stores near-continuous values; BBQ quantization rounds each dimension to one of two levels" /><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltfc4b17790ac39e76/6a54fafb9eff160936b24e85/5cede02da4a8380ef5420d993f5addac25d925b5-590x249.png" alt="BBQ quantization reduces vector storage from 4,096 bytes to 142 bytes per vector, a 29x reduction" /><p>The real savings is in memory. The HNSW scan only needs the 1-bit vectors in RAM, while the raw floats are read from disk to rescore the top candidates. We size that footprint using the documented <a href="https://www.elastic.co/docs/deploy-manage/production-guidance/optimize-performance/approximate-knn-search">kNN memory formulas</a>: <code>float</code> uses <code>num_vectors × dims × 4</code> and <code>bbq</code> uses <code>num_vectors × (dims/8 + 14)</code>.</p><p>BBQ's extra bytes on disk should match the 1-bit payload we computed for memory. Here, that’s <code>13.25 - 12.80 = 0.45 MB</code> versus the computed <code>0.44 MB</code>. They line up.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb1ae4f838c0b1c44/6a54fafdffefbe0991dd3dea/bf231b0290bb0661d0425384d69cb90d0222b44d-740x440.png" alt="BBQ quantization in Elasticsearch: similar disk usage, but memory drops from 12.7 MB to 0.4 MB" /><h2>Results: Recall</h2><p>To check whether the quantized index returns results similar to the float baseline, we use recall:</p><p><code>recall@k = | BBQ top-k ∩ float32 top-k | / k</code>, averaged over all queries.</p><p>We vary the oversampling factor (<code>num_candidates / k</code>) that’s the number of candidates BBQ scans with 1-bit vectors before reranking the top ones against the original floats to find the lowest value that still matches <code>float32</code>.</p>def search_ids(index, qvec, k=10, num_candidates=10):
    resp = es_client.search(
        index=index,
        size=k,
        _source=False,
        knn={
            "field": "embedding",
            "query_vector": qvec.tolist(),
            "k": k,
            "num_candidates": num_candidates,
        },
    )

    return [h["_id"] for h in resp["hits"]["hits"]]


K = 10

# Ground truth: full-precision float32 with a wide candidate list (~exact)
ground_truth = [
    set(search_ids(FLOAT_INDEX, qv, k=K, num_candidates=2000)) for qv in query_vectors
]

oversamples = [1, 2, 3, 5, 10]
recalls = []
for f in oversamples:
    num_candidates = max(K * f, K)
    hits = 0
    for gt, qv in zip(ground_truth, query_vectors):
        got = set(search_ids(BBQ_INDEX, qv, k=K, num_candidates=num_candidates))
        hits += len(got &amp; gt)
    recalls.append(hits / (len(query_vectors) * K))
    print(f"oversample {f:&gt;2}x -&gt; recall@{K} = {recalls[-1]:.3f}")<p>As a result, we have:</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt96c062ee246abfd4/6a54faff600d773c12e424d3/e8604775a3f9bb47c473f2ac4686b926413bf4ad-640x440.png" alt="Recall@10 for BBQ quantization stays near 0.989 versus float32 across oversample factors 1x to 10x" /><p>BBQ starts at 0.994 recall@10 at 1x oversampling, holds there up to 3x, and then settles at 0.989 at higher factors, meaning it returns at least 98.9% of the same top-10 documents as float32 across all oversampling values. For more on how recall varies across datasets under quantization, see <a href="https://www.elastic.co/search-labs/blog/recall-vector-search-quantization">Fast vs. accurate: Measuring the recall of quantized vector search</a>.</p><h2>BBQ quantization results summary</h2><p>The same vectors, two storage formats, and one experiment:</p><ul><li><p><strong>Disk:</strong> Roughly the same (<code>12.80 MB</code> versus <code>13.25 MB</code>). BBQ keeps the raw floats around for rescoring and merging.</p></li><li><p><strong>Memory:</strong> 29x smaller (<code>12.71 MB</code> versus <code>0.44 MB</code>). This is the number that decides whether your cluster fits the corpus.</p></li><li><p><strong>Recall@10:</strong> <code>0.994</code> at 1x oversampling. Quantization-aware training pays off.</p></li></ul><p>When to enable BBQ: If your dimension count is above the <a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/dense-vector#dense-vector-quantization">384-dim floor</a>, if your vectors are the dominant memory cost, and if you can afford a few extra candidates to rescore. For Jina v5 specifically, the model is trained for it, so the recall hit on most corpora is small.</p><h2>Further reading on BBQ and vector quantization</h2><ul><li><p>Run the full notebook from this article in the <a href="https://github.com/elastic/elasticsearch-labs/blob/main/supporting-blog-content/quantizing-jina-embeddings-v5-bbq/quantization-jina-embeddings.ipynb">supporting blog content repo</a>.</p></li><li><p>For the math behind BBQ, see <a href="https://www.elastic.co/search-labs/blog/better-binary-quantization-lucene-elasticsearch">Better Binary Quantization in Lucene and Elasticsearch</a>.</p></li><li><p>For more on Jina v5's architecture, see <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-text">Jina embeddings v5 on Search Labs</a>.</p></li><li><p>For a broader walkthrough on adopting BBQ, see <a href="https://www.elastic.co/search-labs/blog/bbq-implementation-into-use-case">How to implement BBQ into your use case</a>.</p></li><li><p>For the original research behind BBQ, see the paper <a href="https://arxiv.org/abs/2405.12497">RaBitQ: Quantizing High-Dimensional Vectors with a Theoretical Error Bound for Approximate Nearest Neighbor Search</a>.</p></li></ul>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/bbq-quantization-jina-embeddings-v5</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/bbq-quantization-jina-embeddings-v5</guid>
    <category><![CDATA[Vector Database]]></category>
    <category><![CDATA[Jina AI]]></category>
    <category><![CDATA[ML Research]]></category>
    <dc:creator><![CDATA[Jeffrey Rengifo]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt99fb16c79484a00f/6a54fb02600d7743b9e424d9/43df5ec915eae1b9f1534d3acaf2e58732733d9b-1280x720.png" length="0" type="image/png"/>
    <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[jina-clip-v2 brings text-to-image search across 89 languages to Elasticsearch, no GPU needed]]></title>
    <description><![CDATA[Run multimodal search across 89 languages inside Elasticsearch with jina-clip-v2: one embedding space for text and images, with no separate model infrastructure to manage.]]></description>
    <content:encoded><![CDATA[<p><a href="https://jina.ai/news/jina-clip-v2-multilingual-multimodal-embeddings-for-text-and-images/"><code>jina-clip-v2</code></a> (865M parameters) is now available on <a href="https://www.elastic.co/docs/explore-analyze/elastic-inference/eis">Elastic Inference Service (EIS)</a>: multilingual multimodal embeddings for text and images across 89 languages, running inside Elasticsearch with no separate model hosting or GPU infrastructure to manage.</p><p>Text queries retrieve images, screenshots retrieve documentation, and PDFs, charts, and infographics index into the same vector space. The model supports Matryoshka truncation, so you can drop from 1,024 to 512 or 256 dimensions when storage matters, with minimal quality loss.</p><p><code>jina-clip-v2</code> is one of several Jina embedding models now available on EIS. For workloads that also span video and audio, <a href="https://www.elastic.co/search-labs/blog/jina-embeddings-v5-omni-all-media-one-index"><code>jina-embeddings-v5-omni</code></a> covers all four modalities in a single index: nearly 100 languages and a 0.67B parameter base small enough to run on conventional GPU servers. <code>jina-clip-v2</code> remains the focused option for cross-modal retrieval between text and images.</p><h2>How multimodal search works in jina-clip-v2</h2><p><code>jina-clip-v2</code> is a dual-encoder model where separate text and image encoders produce embeddings in the same vector space. This allows text and images to be retrieved interchangeably. A query like “red sports car” can return matching images, an image can surface relevant product descriptions or documentation, and screenshots can map directly to tickets, dashboards, or logs. This isn’t a stitched pipeline of models. It’s a single, shared embedding space across modalities, combining a multilingual <a href="https://huggingface.co/jinaai/xlm-roberta-flash-implementation">Jina-XLM-RoBERTa</a> text encoder with an EVA02-L vision encoder.</p><h3>Multilingual and document-aware by design</h3><p>Unlike traditional CLIP models that focus primarily on short English captions, <code>jina-clip-v2</code> is trained on multilingual text-text and text-image pairs, across 89 languages, and on visually complex datasets at progressively higher resolutions.</p><p>EIS allows you to run managed models directly inside Elasticsearch. There’s no separate model hosting layer to provision, no GPU infrastructure to manage, and no external embedding service to maintain.</p><p>With <code>jina-clip-v2</code> on EIS, you can:</p><ul><li><p>Generate text and image embeddings where your data already lives.</p></li><li><p>Index multimodal vectors alongside structured and unstructured content.</p></li><li><p>Combine vector search with BM25 using hybrid retrieval.</p></li><li><p>Power multimodal retrieval augmented generation (RAG) pipelines grounded in images and documents.</p></li></ul><h3>How to run multimodal search with jina-clip-v2 on EIS</h3><p>The <code>jina-clip-v2</code> endpoint is preconfigured on Elastic Inference Service. To generate embeddings, call the inference endpoint from the Elasticsearch dev console:</p>POST _inference/embedding/.jina-clip-v2
{
 "input": [
     {
         "content": {
             "type": "image",
             "value": "data:image/jpeg;base64,..."
         }
     },
     {
         "content": {
             "type": "text",
             "value": "Some text to create an embedding"
         }
     }
 ]
}<p>This is the response:</p>{
 "embeddings": [
   {
     "embedding": [
       -0.0189209,
       ...
       0.05419922
     ]
   },
   {
     "embedding": [
       -0.01379395,
       ...
       0.0246582
     ]
   }
 ]
}<h3>Using jina-clip-v2 embeddings in a search query:</h3><h4>Get endpoint config</h4>GET /_inference/embedding/.jina-clip-v2<h4>Basic text request</h4>POST _inference/embedding/.jina-clip-v2
{
  "input": [
    "This is a test"
  ]
}<h4>Multimodal batch (text + image as separate vectors)</h4><p>The example below shows how to send both a text and an image input as separate items, each producing its own embedding:</p>POST _inference/embedding/.jina-clip-v2
{
  "input": [
    { "content": { "type": "text",  "value": "A small blue square" } },
    { "content": { "type": "image", "format": "base64", "value": "&lt;BASE64_IMAGE_DATA&gt;" } }
  ]
}<h4>Create custom endpoint with minimum dimensions</h4>PUT _inference/embedding/jina-clip-v2-64d
{
  "service": "elastic",
  "service_settings": {
    "model_id": "jina-clip-v2",
    "dimensions": 64
  }
}<h2>Multimodal search in Elasticsearch, from text to images to RAG</h2><p>By making <code>jina-clip-v2</code> available on EIS, multimodal search becomes a first-class capability inside Elasticsearch.</p><p>Text and images can be indexed into the same vector space. Queries can retrieve across modalities and languages. Hybrid search can combine lexical precision with multimodal semantics. RAG systems can ground responses in charts, screenshots, and document layouts, not just plain text.</p><p>All Elastic Cloud trials have access to Elastic Inference Service. Try it now on <a href="https://cloud.elastic.co/serverless-registration">Elastic Cloud Serverless</a> or Elastic Cloud Hosted, or use <a href="https://www.elastic.co/search-labs/blog/cloud-connect-elastic-inference-service">EIS via Cloud Connect</a> with your self-managed cluster.</p><p>
</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/multimodal-search-elasticsearch-jina-clip-v2</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/multimodal-search-elasticsearch-jina-clip-v2</guid>
    <category><![CDATA[Jina AI]]></category>
    <category><![CDATA[Hybrid Search]]></category>
    <category><![CDATA[AI Tools ]]></category>
    <dc:creator><![CDATA[Kapil Jadhav,Ranjana Devaji,Brendan Jugan]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb6f656e5a5e8a29e/6a46839e41321c5992fc8348/c875531c44d7778e165c403221a9580d3739ccbf-1672x941.png" length="0" type="image/png"/>
    <pubDate>Tue, 23 Jun 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Small model, big benchmarks: how Jina-VLM beat the competition at 2.4B and what ICLR told us is coming next]]></title>
    <description><![CDATA[Jina-VLM is a 2.4B open multilingual VLM leading VQA benchmarks across 29 languages. Plus: five days of ICLR 2026 takeaways on RLVR, sparse embeddings and retrieval.]]></description>
    <content:encoded><![CDATA[<p>Jina-VLM is a 2.4B-parameter vision-language model that currently leads open 2B-scale models on multilingual VQA benchmarks (MMMB and Multilingual MMBench) across 29 languages. It pairs a SigLIP2 vision encoder with a Qwen3 language decoder and handles arbitrary-resolution inputs without sacrificing token efficiency. Jina by Elastic engineers presented the model at the DATA-FM workshop at ICLR 2026 in Rio. This post covers the architecture, the training approach and what five days at the conference told us about where retrieval, embeddings and reasoning are headed.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt904a5d6c185bda3a/6a4695ca4887b899aa4248ef/c44a895e29152640ee1fe82fb2b5a9ddeb82bb8b-1999x1125.png" alt="Andreas Koukounas (left) and Georgios Mastrapas (right) presenting Jina-VLM at the poster session." /><p><a href="https://jina.ai/models/jina-vlm/"><strong>jina-vlm</strong></a> is a 2.4B-parameter vision-language model that pairs a SigLIP2 vision encoder with a Qwen3 language decoder, using attention pooling over image tiles for token-efficient handling of arbitrary-resolution inputs. Beyond the model itself, the paper's main contribution is its “leave-one-out” ablative data-mixture: By removing one task, domain, modality, or language category at a time during training, you can figure out which slices of data are significant or redundant, and whether learning in one domain transfers to others. The result is a compact model that, despite its size, achieves state-of-the-art multilingual VQA performance.</p><p>Rio delivered everything you'd hope for: warm, sunny beach weather, the easy walk between Copacabana and Ipanema, the view from Christ the Redeemer, the colors of Escadaria Selarón. A welcome contrast to a still-chilly European spring.</p><img src="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/bltb5061331fe59ab44/6a4695cdcbd14e5302a12bf5/537af5b77e73da88cfdaccda6c6a42c2541dd054-1100x1100.png" alt="Gallery of photos from Rio de Janeiro" /><h2>What was trending at ICLR 2026: RLVR, test-time compute and retrieval</h2><p>Conferences like ICLR give everyone a chance to take the field’s pulse and find out what’s hot, what’s not, and what’s coming up. After a few days of walking the aisles at the poster sessions and dropping in on oral sessions, you start to get a sense for things. You start to see the same words on poster after poster, and you notice which sessions are the most crowded.</p><p>Here are a few things we picked up on:</p><p></p><p><strong>Reinforcement Learning with Verifiable Rewards (RLVR) is now the dominant paradigm for post-training refinement. </strong>Almost every reasoning-focused poster we stopped at was using some form of <em>Group Relative Policy Optimization</em> (GRPO) for math correctness, code execution, and formal-logic checks, rather than <em>Reinforcement Learning from Human Feedback</em> (RLHF). <em>Direct Preference Optimization</em> (DPO) fine-tuning, which felt like the default a year ago, was conspicuously rare. It makes sense: If you can use code to check for correctness, you no longer need to get annotated data and the training loop goes much faster.</p><p></p><p><strong>Test-time compute has stopped being a curiosity and become a design problem.</strong> <em>Test-time compute</em> – the time a system spends generating a response – is an increasingly important study variable. Papers now measure it as part of their experimental setup and developers try to optimize for it. Models are now built with the expectation that inference will be expensive and clever, not just a single forward pass through a neural network.</p><p></p><p><strong>Vision-Language Models (VLMs) are everywhere, and Vision-Language-Action models (VLAs) are not far behind</strong>. A big chunk of the conference was about how to make multimodal AI work better, like better tokenization for images, better positional encodings for non-text media, and more efficient ways to compress visual information before it overwhelms your model. Vision-Language-Action models that extend multimodal AI recipes to robotics and embodied agents are no longer niche research. They brought in the crowds at their presentations and hosted vibrant debates.</p><p></p><p><strong>Reports of the death of State-Space Models (SSMs) have been greatly exaggerated</strong>. Attention models still dominate AI, but Mamba, SSM variants and recurrent neural networks still draw attention and research, both as full replacements for Transformers and as components inside hybrid attention-based stacks. Whether they'll ever genuinely displace Transformers is an open question, but the line of research is alive and well.</p><p></p><p><strong>Agentic AI safety is taken very seriously.</strong> A lot of papers and presentations discussed problems like machine unlearning and jailbreaking, and some of the most interesting work was on prompt injection through agentic tool use, like when a model dutifully follows instructions hidden in a webpage or an API response it just fetched. A repeated, slightly unsettling observation: models that follow instructions <em>better </em>tend to be <em>more</em> vulnerable to this kind of attack, not less. This capability-vulnerability tension is going to define a lot of the next few years of safety research.</p><p></p><p><strong>Hallucination and factuality are increasingly framed as retrieval problems</strong>. Several talks made that point explicitly: A generative model that has to invent facts will inevitably hallucinate them, while a model that retrieves information can ground its responses in verifiable ways. That framing is, of course, exactly the bet that search AI engineers have been making all along.</p><p></p><h2>ICLR 2026 invited talks: hidden universe imaging and open AI development</h2><p>Two of the invited talks stood out to us, albeit for very different reasons:</p><h3><a href="https://iclr.cc/virtual/2026/invited-talk/10020868">Images of the Hidden Universe</a></h3><p></p><p><a href="https://en.wikipedia.org/wiki/Katie_Bouman">Katie Bouman</a> presented a tour of how physics, prior knowledge, and machine learning combine to reconstruct information that the universe never gives us directly, like the silhouettes of supermassive black holes and the invisible dark matter structures. She walked us through the <a href="https://eventhorizontelescope.org/blog/astronomers-reveal-first-image-black-hole-heart-our-galaxy">Event Horizon Telescope's imaging of M87 and Sagittarius A</a>, building images up from indirect and incomplete radio measurements, and then extended the same machinery to mapping dark matter through gravitational lensing.</p><p><a href="https://iclr.cc/virtual/2026/invited-talk/10020868">This talk</a> was a useful reminder of why machine learning matters outside the LLM bubble. The more you already know, the more you can learn from a little bit more information. This principle generalizes beyond astronomy to knowledge in general, and to machine learning in particular. Any decision system that uses sparse, noisy observations is confronted with it.</p><p>_____________________________________________________________________________________</p><h3><a href="https://iclr.cc/virtual/2026/invited-talk/10020867">Marin: Open Development of Frontier AI</a></h3><p></p><p><a href="https://en.wikipedia.org/wiki/Percy_Liang">Percy Liang</a> opened his presentation with a blunt observation: As AI capabilities skyrocket, openness plummets. His response is <a href="https://marin.community/"><strong>Marin</strong></a>, a platform for community-driven AI research where every experiment is open, every suggestion or discussion is on public fora, and anyone can review or rerun a result.</p><p>What makes Marin interesting isn't just creating open weight models - plenty of projects do that - but creating an <em>open process </em>for making models. Project pre-registration, peer review, and reproducibility have long been part of the natural sciences, and Marin attempts to maintain that tradition for AI. Model training is treated as a matter of public scientific record.</p><p><a href="https://iclr.cc/virtual/2026/invited-talk/10020867">The talk</a> presented concrete scientific results from this approach (optimizer findings and scaling-law results), suggesting that community-scale science isn't just an aspiration but a workable methodology.</p><p>_____________________________________________________________________________________</p><p>Bouman and Liang made a pleasingly complementary pair: one a reminder of how much ML has to offer the world outside ML, the other a challenge to how the field organizes itself.</p><p></p><h2>ICLR 2026 research highlights: embedding models, retrievers and sparse representations</h2><p>We attended many oral presentations and poster sessions. The papers below stood out because of their potential to impact how we make and use embedding models.</p><h3>Rethinking pretraining for representations</h3><p>Decoder-only models have dominated the LLM leaderboards for years, but one paper makes a case for encoder models.</p><p><a href="https://arxiv.org/abs/2507.11412"><em>Seq vs Seq: An Open Suite of Paired Encoders and Decoders</em></a> does a repeatable, open-data, architecture-controlled comparison of encoder-only and decoder-only models trained identically. They used the same data, same architecture, same training recipe, and differed only in their training paradigms: <em>Bidirectional Masked Language Modeling</em> (MLM), typically associated with encoders, vs. <em>Causal Language Modeling</em> (CLM), usually used in decoders. Their results confirm prior findings that encoders excel at classification and retrieval while decoders excel at generation. A key finding is that cross-objective continuous pretraining does not close the performance gap between the encoders and decoders. A 400M parameter encoder beats a 1B parameter decoder in classification and retrieval, and vice versa for generative tasks. All artifacts including data, checkpoints, and code are open-sourced.</p><p>Their study delivers a definitive empirical finding for the AI community: Encoder-only pretraining is substantially more efficient for classification and retrieval tasks than adapting decoders to act like encoders, even with post-training on high-quality data. This challenges the recent trend of adapting large decoder LLMs (like LLM2Vec) for embedding tasks. Dedicated encoder pretraining from scratch remains the most reliable path to strong retrieval performance. Additionally, the public release of 200+ checkpoints with batch-ordered training data makes their work an invaluable resource for studying how retrieval-relevant representations emerge during training and how they scale with parameter count and tokens.</p><h3>New paradigms for training retrievers and embedders</h3><p><a href="https://arxiv.org/abs/2506.16552"><em>Revela: Dense Retriever Learning via Language Modeling</em></a> reframes dense retriever training as a language modeling problem. Rather than using supervised training with query-document pairs, it trains a retriever model jointly with a language model by conditioning next-token prediction on all the other documents in the batch. This innovative <em>in-batch attention mechanism</em> modifies the model’s Transformer blocks by injecting the similarity scores of documents in each batch into the cross-document attention weights. Training is done on raw text, without query-document pairs, hard negatives, or synthetic data generation. The resulting 3B parameter model outperforms E5-Mistral-7B-Instruct (with 7B parameters) as well as proprietary closed-weight embedding models like OpenAI, Cohere, and Voyage. On retrieval benchmarks, it matches E5 despite using roughly 1000 times less training data and approximately 10 times less compute.</p><p>This demonstrates that next-token prediction can still serve as an effective training objective for high-quality dense retrieval AI. This is important because plain text data – what you need for next-token prediction – is widespread and inexpensive and this paper shows that it’s all you need to train competitive embedding models.</p><p><a href="https://arxiv.org/abs/2509.24291"><em>Let LLMs Speak Embedding Languages: Generative Text Embeddings via Iterative Contrastive Refinement</em></a>advances the proposition that LLMs should learn to "speak an embedding language," i.e., generate sequences of “soft tokens” optimized for semantic representation rather than human readability. They outline innovative loss functions and objectives in support of this goal, and show that the resulting models have very competitive performance, while generating only a handful of additional tokens.They also show that generating more tokens at inference time steadily improves embedding quality in a way analogous to chain-of-thought scaling in reasoning LLMs. KV-caching reduces the computational overhead of the generation process to within 1.1 times that of standard single-pass embedding models. This approach represents a new paradigm for representation learning, complementary to encoder-only and single-pass approaches.</p><p><a href="https://arxiv.org/abs/2603.03389"><em>Towards Improved Sentence Representations using Token Graphs</em></a> frames the problem of generating embeddings for sentences from token-level representations as a relational learning problem rather than a compression problem. Instead of pooling tokens, it uses a supplementary neural network that processes a dynamically constructed graph made from output token similarities. This added network is compact, with very few trainable parameters, and can be implemented without doing any additional training on the main language model. The result is competitive with current frontier models.</p><p>This approach can be dropped into any language model at a very reasonable additional training cost, giving it immediate practical significance. Furthermore, the resulting models hold up well in the presence of noise, a known problem, especially for long-context models.</p><h3>Sparse and ultra-efficient embeddings</h3><p><a href="https://arxiv.org/abs/2505.12260"><em>LightRetriever: A LLM-based Text Retrieval Architecture with Extremely Faster Query Inference</em></a> introduces an asymmetric dual-encoder architecture for embeddings-based retrieval in which the query encoder is much smaller and faster than the document one. The key insight is that while document embeddings benefit from the modeling power of a large language model, query embeddings are much less demanding. During training, they propose to learn per-token query embeddings, then, at query time, those embeddings are retrieved and averaged to produce a full query embedding. Documents must still be encoded at storage time using a potentially large encoder, but there is no need to invoke an embedding model at query time at all. The result retains approximately 95% of the performance of the query encoder it replaced. This has immediate implications for computational constrained, time-sensitive, or resource-efficient text information retrieval systems.</p><p><a href="https://arxiv.org/abs/2602.05735"><em>CSRv2: Unlocking Ultra-Sparse Embeddings</em></a> addresses the computational cost of embeddings-based retrieval using dense, high-dimensional vectors. It tackles that cost with <em>Contrastive Sparse Representation</em> (CSR), which maps dense vectors into a much higher-dimensional space where only a few vector entries are non-zero, so that search can use highly efficient sparse-vector search techniques like inverted-indexes.</p><p>CSR approaches tend to break down when the number of dimensions with non-zero values becomes very low. This paper addresses this problem with an innovative training approach that makes ultra-sparse representations viable, opening up the possibility of much faster, less computationally demanding retrieval without loss of accuracy.</p><h3>Multi-step and multimodal retrieval</h3><p><a href="https://arxiv.org/abs/2511.07328"><em>Q-RAG: Long-Context Multi-Step Retrieval via Value-Based Embedder Training</em></a> frames the problem of multi-step retrieval-augmented generation (RAG) in terms of optimizing the embeddings used in RAG search. RAG systems are typically based on a single retrieval step: Input to an LLM becomes a query to a vector store, and a selection of the results are presented to the LLM as a basis for composing a response. However, agentic approaches that involve multi-step interactions between the LLM and vector store can improve RAG performance significantly, especially for large input contexts that might contain millions of tokens. This paper seeks to optimize the embedding model used for retrieval to better support this usage scenario with <em>Reinforcement Learning with Verifiable Rewards</em> (RLVR).</p><p>This paper is one of the more elegant intersections of two of the conference's biggest themes — RLVR and retrieval — and it gives a glimpse of what retrieval looks like when it has to operate inside an agentic loop, not just before one.</p><h3>Foundations and evaluation</h3><p><a href="https://arxiv.org/abs/2510.10062"><em>HUME: Measuring the Human-Model Performance Gap in Text Embedding Tasks</em></a> undertakes the unusual task of systematically measuring human performance on the <em>Massive Text Embedding Benchmark</em> (MTEB), the most widely used benchmark for embeddings-based information retrieval. Using 16 datasets in 5 languages, they find that average human retrieval accuracy is 77.6%, while the best embedding models currently score over 80%. However, this performance gap is uneven. Models may outperform humans on standard tasks but fall apart when faced with low-resource languages, where human intuition still holds a significant lead.</p><p>This paper also shows that "superhuman" scores on low-agreement tasks are mostly artifacts of fitting noise, not genuine capability. This underlines the problem of our current suite of embedding benchmarks: New models are not improving benchmark performance very much. To make progress, we need new, harder challenges and a total rethink of how we evaluate models.</p><h3>Training dynamics for foundation models</h3><p><a href="https://arxiv.org/abs/2511.18903"><em>How Learning Rate Decay Wastes Your Best Data in Curriculum-Based LLM Pretraining</em></a> identifies a significant but underexplored problem in AI model training. Large training sets can create a problem with models forgetting things that they’ve learned as they’re presented with more data. Curriculum-based pretraining — sorting data from low to high quality — should help, but in practice the results have been disappointing. The reason, the authors argue, is that the model encounters the highest-quality data late in the training schedule when the learning rate is at its lowest. Its gradient contribution is therefore greatly reduced. They confirm that hypothesis empirically by showing that curriculum training significantly beats random shuffling if training uses a constant learning rate.</p><p>They propose two simple strategies to fix this: Let the learning rate decay more slowly, or replace learning rate decay with weight-averaging over the multiple final checkpoints. Combining the two yields a 1.64% average benchmark improvement over standard practices with no additional data refinement. The broader message - that data composition and optimization schedule need to be co-designed - applies well beyond pretraining, and is a useful frame for embedding training too.</p><h2>What ICLR 2026 means for retrieval and embedding research</h2><p>Science has always been conducted through print and publication, but in-person conferences are still the only way to put people together in a room. Over five days, we met a steady stream of researchers from very different backgrounds — academia and industry, large labs and small startups, half a dozen countries — and conversations ranged from research trends to philosophical questions that have haunted AI from the beginning. Are LLMs really reasoning, or are they doing something more like very high-dimensional memorization with interpolation? Where exactly is the line, and does it matter for what we can build on top of them?</p><p>These conversations rarely produce answers, but they sharpen the questions, which is most of what good research is.</p><p>For the information retrieval work we do at Jina by Elastic, the future looks bright. Retrieval, long relegated to merely applied research, is increasingly recognized as the engine for keeping language models grounded. Better encoders, better embedding training paradigms, sparser representations, and retrieval that operates at the core of reasoning loops – these things matter to us all. What we saw and heard at ICLR 2026 convinces us that this is where a meaningful share of the next round of progress will come from.</p><p>We're already looking forward to seeing where the field is next year.</p><p>
</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/jina-vlm-multilingual-vqa-iclr-2026</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/jina-vlm-multilingual-vqa-iclr-2026</guid>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Andreas Koukounas,Georgios Mastrapas,Scott Martens]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt14665f5adef8d917/6a4695c72d406b3bb9ba2bb2/3668b433275c8d75fbc0729346123ea87307d012-1999x1125.png" length="0" type="image/png"/>
    <pubDate>Wed, 27 May 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[Jina embeddings v3 now available on Gemini Enterprise Agent Platform Model Garden]]></title>
    <description><![CDATA[Jina search foundation model, jina-embeddings-v3, is now self-deployable on Gemini Enterprise Agent Platform Model Garden, with more to follow. Run jina-embeddings-v3 on a single L4 GPU inside your own VPC.]]></description>
    <content:encoded><![CDATA[<p>Today we’re launching <code>jina-embeddings-v3</code>, the first Jina search foundation model to be available on <a href="https://console.cloud.google.com/vertex-ai/publishers/jinaai/model-garden/jina-embeddings-v3">Gemini Enterprise Agent Platform Model</a><a href="https://console.cloud.google.com/vertex-ai/publishers/jinaai/model-garden/jina-embeddings-v3"> Garden</a> as a self-deployable partner model. <em>Self-deployment</em> means the model runs on GPU instances inside your Google Cloud project and Virtual Private Cloud (VPC). No external API calls, no per-token metering, no rate limits.</p><p>With this integration, Elasticsearch users gain a new deployment option that keeps data inside their security perimeter, delivers predictable infrastructure costs, and runs natively on Google Cloud. At the same time, the broader Google Cloud ecosystem gains access to Jina's purpose-built, state-of-the-art search and retrieval models.</p><p>This is the first stage of a broader rollout. Together with the models coming next, the lineup will form a complete retrieval stack: Embed your data, embed queries, retrieve and rerank candidates, and extend search to images with multimodal embeddings, all on infrastructure you control. You can start today with <code>jina-embeddings-v3</code>, the model already powering production search pipelines across the Elasticsearch ecosystem via Elastic Inference Service (EIS).</p><p>Model</p><p>Type</p><p>Parameters</p><p>Key capability</p><p>Status on Model Garden</p><p>`jina-embeddings-v3`</p><p>Text embedding</p><p>572M</p><p>Proven multilingual workhorse, 8K context, 1024 dim output, truncatable to 32</p><p>Available now</p><p>`jina-embeddings-v5-text-small`</p><p>Text embedding</p><p>677M</p><p>State-of-the-art sub-1B multilingual, 32K context, 1024 dim output, truncatable to 32</p><p>Coming soon</p><p>`jina-embeddings-v5-text-nano`</p><p>Text embedding</p><p>239M</p><p>Best-in-class under 500M params, 8K context, 768 dim output, truncatable to 32</p><p>Coming soon</p><p>`jina-reranker-v3`</p><p>Reranker</p><p>600M</p><p>Listwise reranker, 131K context, up to 64 documents</p><p>Coming soon</p><p>`jina-clip-v2`</p><p>Multimodal embedding</p><p>900M</p><p>Text + image in shared space, 89 languages, and 8K text context, 512×512 images</p><p>Coming soon</p><p>Every model runs on a single NVIDIA L4 (24 GB), the most cost-efficient GPU tier on Google Cloud. Most other embedding models on Google Cloud Model Garden require an A100 80 GB or H100, roughly three times the per-hour instance cost before you even start counting tokens.</p><p>No additional commercial license is required when deployed through Vertex AI.</p><h2><strong>Why Model Garden?</strong></h2><p>Why deploy through Model Garden instead of hitting an API? It comes down to three things: control, cost, and context.</p><h3>Your data never leaves the house</h3><p>The biggest draw for most developers is the self-deploy architecture. When you deploy a Jina model through Model Garden, the weights run on GPU instances inside your own Google Cloud project and your own VPC. This is a game-changer for anyone working in industries with data security concerns, like finance or healthcare. Because there are no external API calls, your sensitive data stays within your security perimeter.</p><h3>Scaling with prediction</h3><p>Instead of paying every time you embed a sentence or rerank a document, you pay a flat hourly instance cost. And because every Jina model can run on a single NVIDIA L4, the most affordable GPU tier on Google Cloud, the barrier to entry is low. Whether you process a thousand requests or a billion, your infrastructure bill stays predictable. This is a setup that actually rewards you for growing your traffic rather than taxing you for it.</p><h3>Everything under one roof</h3><p>If your data is already sitting in Elasticsearch on Google Cloud, BigQuery, or Cloud Storage, it makes sense to keep your inference engines nearby. By deploying through Model Garden, Jina search foundation models inherit all the enterprise features you are already using: identity and access management (IAM) for access control, unified billing on your existing Google Cloud invoice, and the ability to plug into Vertex AI Pipelines for machine learning operations (MLOps) workflows.</p><p>While the Jina AI Cloud API and Elastic Cloud offer the fastest path for bursty traffic or existing search workflows, Model Garden is ideal for enterprise applications requiring strict data security and predictable costs at scale. Elastic wants to meet you where you are.</p><h2><strong>Jina AI models</strong></h2><h3><strong>jina-embeddings-v3</strong></h3><p>Our proven multilingual embedding model with 572M parameters and 8K token context. Scores 65.5 on Massive Text Embedding Benchmark (MTEB) English. Supports five task-specific Low-Rank Adaptation (LoRA) adapters (retrieval query/passage, text-matching, classification, clustering) and Matryoshka truncation from 1024 to 64 dimensions. Already widely adopted across the Elasticsearch ecosystem via EIS.</p><p>We’re leading with v3 because many production systems already depend on it. If you’re migrating a v3-based pipeline to Google Cloud, you can now run the same model natively without changing your embedding dimensions or reindexing.</p><h3><strong>jina-embeddings-v5-text (small and nano)</strong></h3><p>Our fifth-generation text embedding models, released February 2026, achieve top-tier performance, competing with models many times their size.</p><p><code>v5-text-small</code> (677M) scores 67.0 on the Multilingual MTEB (MMTEB) benchmark suite, encompassing 131 tasks of nine task types, and 71.7 on the MTEB English benchmark. It’s the strongest sub-1B multilingual embedding model on the MTEB Leaderboard.</p><p><code>v5-text-nano</code> (239M) scores 65.5 on MMTEB. No other model under 500M parameters reaches this level. At less than half the size of most comparable models, it’s the natural choice for edge and latency-sensitive deployments.</p><p>Both models support:</p><ul><li><p><strong>Four task-specific LoRA adapters:</strong> Retrieval, text-matching, classification, clustering. Selecting an appropriate adapter via <code>task</code> parameter at inference time.</p></li><li><p><strong>Matryoshka dimension truncation:</strong> Reduce embedding dimensions from 1024 (or 768 for nano) down to 32. Quality loss is minimal at moderate truncation (for example, 256 dims). Halving dimensions roughly halves storage.</p></li><li><p><strong>Binary quantization:</strong> Compress 1024-dim embeddings from 2KB to 128 bytes with binarization. Special training makes this compression minimal losses.</p></li><li><p><strong>Multilingual: </strong>119 languages (small) and 93 (nano).</p></li></ul><h3><strong>jina-reranker-v3</strong></h3><p>A 0.6B parameter multilingual listwise reranker built using a <em>last but not late interaction</em> architecture. The query and up to 64 candidate matches are entered into a single 131K-token context window, and the model performs cross-document comparison before scoring. Jina Reranker v3 achieves 61.94 nDCG@10 on BEIR, outperforming the model being 6× smaller in size.This is fundamentally different from pointwise rerankers that score each document in isolation, producing better results, especially for passage retrieval from single documents.</p><h3><strong>jina-clip-v2</strong></h3><p>A 0.9B multimodal, multilingual embedding model that maps text and images into a shared 1024-dimensional space. It supports:</p><ul><li><p><strong>89 languages</strong> for text-image retrieval.</p></li><li><p><strong>512×512 image resolution.</strong></p></li><li><p><strong>8K token text input.</strong></p></li><li><p><strong>Matryoshka truncation</strong> from 1024 to 64 dimensions for both modalities.</p></li></ul><p>Highly competitive on image-to-text benchmarks, including multilingual tasks.</p><h2><strong>Getting started</strong></h2><p>Jina Embeddings v3 is live on Model Garden today. Here’s how to get it running.</p><p>You need a Google Cloud project with the Vertex AI API enabled and enough GPU quota for at least one g2-standard-8 instance (NVIDIA L4). If you’re new to Google Cloud, <a href="https://cloud.google.com/vertex-ai/docs/start/cloud-environment">start with the setup guide.</a></p><p><a href="https://console.cloud.google.com/vertex-ai/publishers/jinaai/model-garden/jina-embeddings-v3">The Model Garden page for Jina Embeddings v3</a> walks you through the full flow: Upload the model, create an endpoint, pick your machine type, and deploy. Open it in your own project, and follow the guided steps. A100 and H100 machines are also available where region and quota allow, but L4 is all you need to start.</p><p>From click to first embedding, the whole process takes a few minutes.</p><h2><strong>What comes next</strong></h2><p>Jina Embeddings v3 is the starting point. In the coming weeks, we’ll bring the rest of the Jina retrieval stack to Model Garden: v5 text embeddings (small and nano), jina-reranker-v3, and jina-clip-v2 for multimodal search. All will run on a single L4 GPU with the same self-deploy model.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/jina-embeddings-v3-gemini-enterprise-model-garden</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/jina-embeddings-v3-gemini-enterprise-model-garden</guid>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Sa Zhang]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt1d9669e8c7a62bf6/6a170ee7a929cf0371ae0a87/42f72633f1e5453dbfd47730b5f776429f9f633e-721x420.png" length="0" type="image/png"/>
    <pubDate>Wed, 22 Apr 2026 00:00:00 GMT</pubDate>
  </item>
  <item>
    <title><![CDATA[jina-embeddings-v3 is now available on Elastic Inference Service]]></title>
    <description><![CDATA[Introducing jina-embeddings-v3 on Elastic Inference Service (EIS) and explaining how to get started.]]></description>
    <content:encoded><![CDATA[<p>Today, we are excited to introduce <a href="https://jina.ai/news/jina-embeddings-v3-a-frontier-multilingual-embedding-model/"><code>jina-embeddings-v3</code></a> on Elastic Inference Service (EIS), enabling fast multilingual dense retrieval directly into Elasticsearch. Jina-embeddings-v3 is the first Jina AI model available on EIS, with many more to come soon.</p><p>Jina AI, <a href="https://www.elastic.co/blog/elastic-jina-ai">which recently joined Elastic via acquisition</a>, is a leader in open-source multilingual and multimodal embeddings, rerankers, and small language models. Jina brings deep expertise in <a href="https://www.elastic.co/search-labs/blog/jina-models-elasticsearch-guide">search foundation models</a> that help developers build high-quality retrieval and RAG systems across text, images, code, and long multilingual content.</p><p><a href="https://www.elastic.co/blog/elastic-inference-service">Elastic Inference Service</a> (EIS) makes it easy for developers to add fast, high-quality, and reliable semantic retrieval for search, RAG, and agentic applications with predictable, consumption-based pricing. EIS offers fully-managed GPU-powered inference with ready-to-use models, no additional setup or hosting complexity required.</p><p><code>jina-embeddings-v3</code> supports high-quality multilingual retrieval with long-context reasoning and task-tuned modes for RAG and agents. It provides developers fast dense embeddings across a broad range of languages without the operational overhead.</p><h2>Why jina-embeddings-v3?</h2><p><code>jina-embeddings-v3</code> is a text embedding model that supports 32 languages and up to 8192-token context, high relevance at lower cost, and GPU-powered inference through EIS.</p><h3><strong>Key capabilities</strong></h3><ul><li><p><strong>Multilinguality</strong>: Closes the language gap and aligns meaning across 32 languages, including Arabic, Bengali, Chinese, Danish, Dutch, English, Finnish, French, Georgian, German, Greek, Hindi, Indonesian, Italian, Japanese, Korean, Latvian, Norwegian, Polish, Portuguese, Romanian, Russian, Slovak, Spanish, Swedish, Thai, Turkish, Ukrainian, Urdu, and Vietnamese.</p></li><li><p><strong>Parameter-efficiency</strong>: <a href="https://jina.ai/news/jina-embeddings-v3-a-frontier-multilingual-embedding-model/">Delivers higher performance</a> with only 570M parameters, achieving comparable performance to much larger LLM-based embeddings at lower costs.</p></li><li><p><strong>Dimensionality control</strong>: Default in 1024 dimensions, and with Matryoshka representation support, it lets developers dial the embedding size all the way down to 32 dimensions, giving flexibility to balance accuracy, latency, and storage based on your needs.</p></li><li><p><strong>Task-specific optimization</strong>: Features task-specific Low-Rank Adaptation (LoRA) adapters, enabling it to generate high-quality embeddings for various tasks including query-document retrieval, clustering, classification, and text matching.</p></li></ul><h2><strong>Get started</strong></h2>POST _inference/text_embedding/.jina-embeddings-v3
{
  "input": ["Rocky Mountain National Park"],
  "input_type": "ingest"
}<p>The response:</p>{
  "text_embedding": [
    {
      "embedding": [
        -0.06678891,
        -0.0073341704,
        0.011903269,
        -0.041797,
      ...
      ]
    }
  ]
}<h2>What’s next</h2><p>Alongside these new models, EIS continues to evolve to support more users and simplify semantic search across environments.</p><p><strong>Cloud Connect for EIS: </strong><a href="https://www.elastic.co/docs/deploy-manage/cloud-connect">Cloud Connect</a> for EIS will soon bring EIS to self-managed environments, reducing operational overhead and enabling hybrid architectures and scaling where it works best for you.</p><p><strong>semantic_text defaults to jina-embeddings-v3 on EIS: </strong><a href="https://www.elastic.co/docs/reference/elasticsearch/mapping-reference/semantic-text"><code>semantic_text</code></a> currently uses ELSER as the embeddings model behind the scenes, but will default to the <code>jina-embeddings-v3</code> endpoint on EIS in the near future. This change will provide built-in inference at ingestion time, making it easier to adopt multilingual search without additional configuration.</p><p><strong>More models: </strong>We’re expanding the EIS model catalog to meet the rising inference demands of our customers. In the coming months, we’ll introduce new models that support an even broader set of search and inference workloads. Hot on the heels of <code>jina-embeddings-v3</code>, the next models to follow are <a href="https://jina.ai/models/jina-reranker-v2-base-multilingual/"><code>jina-reranker-v2-base-multilingual</code></a>and <a href="https://jina.ai/news/jina-reranker-v3-0-6b-listwise-reranker-for-sota-multilingual-retrieval/"><code>jina-reranker-v3</code></a>. Both Jina AI models greatly improve precision through multilingual reranking for RAG and AI agents.</p><h2>Conclusion</h2><p>With <code>jina-embeddings-v3</code> on EIS, you can build multilingual, high-precision retrieval pipelines without managing models, GPUs, or infrastructure. You get fast dense retrieval and tight integration with Elasticsearch’s relevance stack, all in one platform.</p><p>Whether you are building global RAG systems, search, or agentic workflows that need reliable context, Elastic now gives you a high-performance model out-of-the-box, and the operational simplicity to move from prototype to production with confidence.</p><p>All Elastic Cloud trials have access to the Elastic Inference Service. <a href="https://www.elastic.co/cloud/serverless">Try it now </a>on Elastic Cloud Serverless and Elastic Cloud Hosted.</p>]]></content:encoded>
    <link>https://www.elastic.co/search-labs/blog/jina-embeddings-v3-elastic-inference-service</link>
    <guid isPermaLink="true">https://www.elastic.co/search-labs/blog/jina-embeddings-v3-elastic-inference-service</guid>
    <category><![CDATA[Jina AI]]></category>
    <dc:creator><![CDATA[Sean Handley,Ranjana Devaji,Brendan Jugan]]></dc:creator>
    <enclosure url="https://static-www.elastic.co/v3/assets/bltefdd0b53724fa2ce/blt763e299d97823861/6a170c16961e698842c4cf54/9bb1c96c697d8d48b764bee487a73a6cae130d0d-720x420.jpg" length="0" type="image/jpeg"/>
    <pubDate>Mon, 12 Jan 2026 00:00:00 GMT</pubDate>
  </item>
  </channel>
</rss>