Search & Retrieval
Best Embedding Models for Multimodal Search in 2026: Leaderboard of Measured Retrieval Quality, Speed, and Price
A multimodal embedding model maps images and text into one vector space so a text query can retrieve images (and vice versa). Every vendor publishes its own benchmark numbers on its own terms; this list runs eight models through one scorer on one dataset and publishes the raw metadata, the dataset manifest, and the code.
The task is text-to-image retrieval: for each of 1,000 MS-COCO val2017 images, its first human-written caption is the query, and the model must rank the matching image above the other 999. Recall@k is the share of queries whose correct image lands in the top k; MRR is the mean of 1/rank. Higher is better for both.
Echosaw does not sell an embedding model. We use models like these to build visual and transcript search over our users' media libraries, which is why we ran the test.
- Tested
- September 10, 2026
- Last updated
- September 10, 2026
- Tested by
- Devin (AI engineer, Echosaw)
- Reviewed by
- Matthew Simpson
Quick answer
- 1Cohere Embed 4Measured
Best for highest retrieval quality on mixed image, text, and document collections.
- 2
Best for AWS-native image search at the lowest hosted price.
- 3SigLIP 2 Base (patch16-256)Measured
Best for self-hosted image search where you want the best quality per CPU second.
- 4SigLIP 2 SO400M (patch16-256)Measured
Best for best open-weight retrieval quality when you have a GPU.
- 5
Best for one embedding space across video, audio, documents, images, and text on AWS.
- 6Jina CLIP v2Measured
Best for multilingual image-text retrieval with tunable vector size, via API or non-commercial self-hosting.
- 7CLIP ViT-L/14Measured
Best for drop-in upgrade for existing CLIP pipelines that need better recall without changing tooling.
- 8CLIP ViT-B/32Measured
Best for fastest possible CPU embedding when recall matters less than throughput.
Measured results
8 of 8 entries were run on the same input. Entries marked doc-verified were not run and are excluded from this table.
| Tool | Version tested | Recall@1 | Recall@5 | Recall@10 | MRR | Throughput |
|---|---|---|---|---|---|---|
| Cohere Embed 4 | cohere.embed-v4:0 via Amazon Bedrock, us-east-1, 1,024 dimensions | 77.4% | 96.2% | 98.8% | 0.856median rank 1 | 2.0 img/s, 63.5 q/ssequential Bedrock calls |
| Amazon Titan Multimodal Embeddings G1 | amazon.titan-embed-image-v1 via Amazon Bedrock, us-east-1, 1,024 dimensions | 73.1% | 93.6% | 97.1% | 0.820median rank 1 | 4.6 img/s, 5.9 q/ssequential Bedrock calls |
| SigLIP 2 Base (patch16-256) | google/siglip2-base-patch16-256, transformers 5.17, CPU fp32 | 63.6% | 89.8% | 94.1% | 0.747median rank 1 | 5.7 img/s, 31.4 q/s2-vCPU CPU host |
| SigLIP 2 SO400M (patch16-256) | google/siglip2-so400m-patch16-256, transformers 5.17, CPU fp32 | 65.8% | 89.8% | 95.8% | 0.761median rank 1 | 1.4 img/s, 6.6 q/s2-vCPU CPU host |
| Amazon Nova Multimodal Embeddings | amazon.nova-2-multimodal-embeddings-v1:0 via Amazon Bedrock, us-east-1, 1,024 dimensions | 63.8% | 88.9% | 94.2% | 0.747median rank 1 | 2.3 img/s, 3.8 q/ssequential Bedrock calls |
| Jina CLIP v2 | jinaai/jina-clip-v2, transformers 4.49 (trust_remote_code), CPU fp32, 1,024 dimensions | 57.9% | 85.5% | 93.6% | 0.704median rank 1 | 0.2 img/s, 2.7 q/s2-vCPU CPU host, batch 4 |
| CLIP ViT-L/14 | open_clip 3.3.0 ViT-L-14/openai, CPU fp32, 768 dimensions | 51.4% | 81.5% | 90.8% | 0.647median rank 1 | 1.7 img/s, 18.6 q/s2-vCPU CPU host |
| CLIP ViT-B/32 | open_clip 3.3.0 ViT-B-32/openai, CPU fp32, 512 dimensions | 47.0% | 77.1% | 88.0% | 0.603median rank 2 | 30.5 img/s, 51.9 q/s2-vCPU CPU host |
How we evaluated
Each model embedded the same 1,000 images and 1,000 captions. Open-weight models (CLIP, SigLIP 2, Jina CLIP v2) ran locally in fp32 on a 2-vCPU CPU host with no GPU; hosted models (Titan, Cohere, Nova) were called through Amazon Bedrock in us-east-1 from the same host, one item per request. Images were sent at native resolution (the model or service applies its own resize).
Vectors were L2-normalised and scored by cosine similarity. For each caption the rank of its paired image among all 1,000 images gives Recall@1/5/10, mean reciprocal rank, and median rank. The scorer is the same 40-line script for every model.
Throughput is images per second and queries (captions) per second over the whole run including network time for hosted models. Local figures reflect a CPU-only host and will be far higher on a GPU; hosted figures reflect sequential single-item calls, not batched or parallel usage.
Pricing is the on-demand list price on each vendor's public pricing page on the test date. Open-weight models are free to run; their cost is compute. Ranking is by the weighted rubric below and is not a pure sort on any one column.
Dataset
MS-COCO val2017, 1,000-image sample — 1,000 images drawn from the 5,000-image val2017 split with a fixed seed (20260910), each paired with its first caption in annotation-ID order. Image IDs, captions, and source URLs are in queries.json in the published results; build_dataset.py regenerates the sample and downloads the images. License: COCO annotations CC BY 4.0; images under their individual Flickr licences (IDs recorded per item).
Harness and raw output: /curated-lists/harness/embeddings/
Ranking rubric
- Retrieval quality45%
- Recall@1, Recall@5, Recall@10, and MRR on the 1,000-pair COCO text-to-image task.
- Price20%
- List price per image and per text token for hosted models; compute cost for open weights.
- Speed15%
- Measured images and queries per second on our host, weighted for what a production deployment (GPU or batched API) would see.
- Deployment and licence fit20%
- Commercial-use licence, hosting options, supported modalities, and output-dimension flexibility.
The rankings
Cohere · Best for highest retrieval quality on mixed image, text, and document collections
Best score on every quality metric in the test by a clear margin: 77.4% Recall@1 and 98.8% Recall@10.
Strengths
- 77.4% Recall@1 and 0.856 MRR, 4.3 points and 0.036 ahead of the runner-up; only 12 of 1,000 queries missed the top ten.
- Handles text, images, and mixed text-plus-image documents (PDF pages, slides) in one embedding space, with a 128K-token context.
- Matryoshka output at 256, 512, 1,024, or 1,536 dimensions, so index size is tunable without re-embedding.
- Available through Amazon Bedrock, Azure, and Cohere's own API; fastest text embedding measured (63.5 queries/s).
Limitations
- Most expensive hosted option per image: $0.47 per million image tokens against $0.12 per million text tokens.
- Image embedding through Bedrock averaged 0.5 s per call (2.0 images/s sequential); batch or parallel calls are needed for large libraries.
- Closed weights; no self-hosting outside a vendor cloud.
Pricing: $0.12 per 1M text tokens; $0.47 per 1M image tokens (Cohere list price)
Amazon Web Services · Best for AWS-native image search at the lowest hosted price
Second-best quality (73.1% Recall@1) at a flat $0.00006 per image, the cheapest hosted rate measured.
Strengths
- 73.1% Recall@1 and 97.1% Recall@10, within 4 points of Cohere and well ahead of every open-weight model tested.
- $0.00006 per image and $0.0001 per 1K text tokens on demand; embedding our 1,000 images cost about six cents. Batch inference halves both rates.
- Fastest hosted image embedding measured (4.6 images/s sequential) and 256/384/1,024-dimension output options.
- Same IAM, VPC endpoints, and billing as the rest of an AWS stack; no separate vendor account.
Limitations
- Image and text only; no video, audio, or document-page input.
- Text embedding was slow through Bedrock in our run (5.9 queries/s).
- Only available in AWS; closed weights.
Pricing: $0.00006/image, $0.0001 per 1K text tokens on demand; batch $0.00003/image (Bedrock list price)
Google · Best for self-hosted image search where you want the best quality per CPU second
Best open-weight quality-to-compute ratio: 63.6% Recall@1 at 5.7 images/s on CPU, four times the speed of the larger SigLIP 2 model for a 2-point quality gap.
Strengths
- 63.6% Recall@1 and 94.1% Recall@10, matching Amazon Nova and 12 to 17 points above the original CLIP models.
- Apache-2.0 licence: commercial use and self-hosting without restriction.
- 375M parameters and 768-dimension output; ran at 5.7 images/s and 31 queries/s on two CPU cores, the only high-quality model here that is practical on CPU.
- Multilingual text encoder; loads through Hugging Face transformers with no custom code.
Limitations
- 256-pixel input loses fine detail on dense or text-heavy images.
- Image and text only.
- You run the inference; no hosted API from Google for this checkpoint.
Pricing: Free (open weights, Apache-2.0); compute cost only
Google · Best for best open-weight retrieval quality when you have a GPU
Highest Recall@1 of any open-weight model tested (65.8%), under a permissive licence.
Strengths
- 65.8% Recall@1, 95.8% Recall@10, and 0.761 MRR, the best open-weight figures in the test and above Amazon Nova on every metric.
- Apache-2.0 licence; 1,152-dimension output.
- Same loader and preprocessing as SigLIP 2 Base, so upgrading is a checkpoint swap.
Limitations
- 1.1B parameters: 1.4 images/s on our CPU host, four times slower than SigLIP 2 Base for a 2.2-point Recall@1 gain. Plan on a GPU.
- 256-pixel input; the 384- and 512-pixel variants cost more compute again.
- Image and text only; self-host only.
Pricing: Free (open weights, Apache-2.0); compute cost only
Amazon Web Services · Best for one embedding space across video, audio, documents, images, and text on AWS
The only model tested whose documented inputs extend beyond image and text; on the image task it ties SigLIP 2 Base.
Strengths
- 63.8% Recall@1 and 0.747 MRR, level with SigLIP 2 Base and ahead of both CLIP models and Jina.
- Same $0.00006 per image list price as Titan, with batch pricing at half that.
- AWS documents text, document, image, video, and audio input for this model, so one index can span a mixed media library.
Limitations
- Slowest hosted text embedding in the test (3.8 queries/s sequential) and 2.3 images/s.
- 10 points behind Titan on Recall@1 at the same image price; for image-only search Titan is the better buy.
- AWS-only; closed weights. Video and audio inputs were not part of this benchmark.
Pricing: $0.00006/image, $0.000135 per 1K text tokens on demand; batch $0.00003/image (Bedrock list price)
Jina AI · Best for multilingual image-text retrieval with tunable vector size, via API or non-commercial self-hosting
Mid-table quality (57.9% Recall@1) with 89-language text support and Matryoshka output from 64 to 1,024 dimensions.
Strengths
- 57.9% Recall@1 and 93.6% Recall@10, 6 to 11 points above the original CLIP models.
- 512-pixel image input, the highest resolution of the open models tested.
- Matryoshka embeddings truncate cleanly to 64 dimensions for small indexes; the same model also serves as a text-only embedder.
- Hosted through Jina's Embeddings API at $0.05 per million tokens, and through cloud marketplaces for commercial use.
Limitations
- Weights are CC BY-NC 4.0: self-hosting is non-commercial only. Commercial use requires the API or a marketplace licence.
- Slowest model in the test on CPU by a wide margin: 0.2 images/s (68 minutes for 1,000 images) and 2.7 queries/s. The 512-pixel input and 0.9B parameters need a GPU.
- Requires trust_remote_code and an older transformers release (4.x); the custom code did not load under transformers 5.
- A 600x600 image is billed at roughly 16,000 tokens on the API, so per-image API cost is around $0.0008, thirteen times Titan's rate.
Pricing: Open weights CC BY-NC 4.0 (non-commercial); API $0.05 per 1M tokens, about 16K tokens per 600x600 image
OpenAI (via OpenCLIP) · Best for drop-in upgrade for existing CLIP pipelines that need better recall without changing tooling
The 2021 reference model at its largest size: 51.4% Recall@1, 4 points above ViT-B/32 at eighteen times the compute.
Strengths
- 51.4% Recall@1 and 90.8% Recall@10; MIT-licensed weights with the broadest ecosystem support of any model here.
- Loads with a single open_clip call; hundreds of fine-tuned variants share the same interface.
Limitations
- Beaten on every metric by every 2024-25 model in the test, including SigLIP 2 Base at three times the speed.
- 1.7 images/s on CPU (572 s for 1,000 images).
- 224-pixel input and English-only text encoder.
Pricing: Free (open weights, MIT); compute cost only
OpenAI (via OpenCLIP) · Best for fastest possible CPU embedding when recall matters less than throughput
Fastest model measured by a factor of five (30.5 images/s on CPU) and the lowest retrieval quality (47.0% Recall@1).
Strengths
- 30.5 images/s and 51.9 queries/s on two CPU cores; embedded the whole dataset in 52 s.
- 512-dimension vectors, the smallest default index footprint in the test; MIT licence.
Limitations
- 47.0% Recall@1 and a median rank of 2, the only model that did not put the correct image first for at least half the queries.
- 88.0% Recall@10, 6 points below SigLIP 2 Base, which is only five times slower and still CPU-viable.
- 224-pixel input and English-only text encoder.
Pricing: Free (open weights, MIT); compute cost only
Frequently asked questions
- Which embedding model is best for image search?
- On our 1,000-pair MS-COCO text-to-image test, Cohere Embed 4 scored highest (77.4% Recall@1, 98.8% Recall@10), followed by Amazon Titan Multimodal Embeddings (73.1% / 97.1%). Among open-weight models, SigLIP 2 SO400M led (65.8% / 95.8%), with SigLIP 2 Base two points behind at a quarter of the compute.
- CLIP vs SigLIP 2: is CLIP still worth using?
- Not for new retrieval systems. The original CLIP ViT-B/32 and ViT-L/14 scored 47.0% and 51.4% Recall@1; every 2024-25 model tested scored 57.9% or better. SigLIP 2 Base is a direct open-weight replacement: 12 points better than ViT-B/32 at one-fifth the speed, and 12 points better than ViT-L/14 at three times the speed.
- Which open-source embedding models performed best?
- SigLIP 2 SO400M (Apache-2.0) led the open-weight models with 65.8% Recall@1, 95.8% Recall@10, and 0.761 MRR, followed by SigLIP 2 Base (Apache-2.0) at 63.6% / 94.1%, which ran four times faster on CPU (5.7 images/s) for a 2.2-point gap. Jina CLIP v2 scored 57.9% Recall@1 but its weights are CC BY-NC 4.0. The original OpenAI CLIP ViT-L/14 and ViT-B/32 (MIT) trailed at 51.4% and 47.0%. The hosted Cohere Embed 4 and Amazon Titan still scored higher (77.4% and 73.1%), so the best open-weight model gives up about 12 points of Recall@1 for free licensing and self-hosting.
- Which multimodal embedding model is cheapest?
- Open-weight models (SigLIP 2, CLIP) are free to run; their cost is your compute. Among hosted models, Amazon Titan and Nova list $0.00006 per image on demand (about $60 per million images) and half that in batch. Cohere Embed 4 bills $0.47 per million image tokens; Jina's API bills about 16,000 tokens per 600x600 image at $0.05 per million tokens, roughly $0.0008 per image.
- Can I use Jina CLIP v2 commercially?
- The open weights are licensed CC BY-NC 4.0, which excludes commercial use. Jina offers the same model commercially through its Embeddings API and cloud marketplace listings. SigLIP 2 (Apache-2.0) and OpenAI CLIP (MIT) have no such restriction.
- Why are the throughput numbers so low?
- Local models ran in fp32 on a 2-vCPU CPU host with no GPU, and hosted models were called one item at a time to measure like for like. A single GPU typically embeds hundreds of images per second with these models, and Bedrock supports batch inference. Treat the throughput column as a relative ordering, not a capacity plan.
- How can I reproduce these results?
- The dataset builder (build_dataset.py), model runner (run.py), scorer (score.py), the dataset manifest (queries.json), and the per-model run metadata and scores are published at echosaw.com/curated-lists/harness/embeddings/. Build the dataset, set AWS credentials for the Bedrock models, run run.py for each provider, then score.py. Our credentials are not included; raw vectors are omitted for size but are regenerated by run.py.