This model is a lightweight multimodal embedding model for text, image, and audio retrieval. It is designed for deployments that need a shared multimodal semantic space but prefer a smaller and cheaper model than the large tri-encoder release.
It is best suited for retrieval, routing, and similarity workloads rather than generative chat, captioning, or instruction following.
Small multimodal embeddings are useful when an agent runtime needs frequent low-cost similarity checks over mixed content.
1import os
2
3import torch
4import torch.nn as nn
5import torch.nn.functional as F
6from modelscope import snapshot_download
7from transformers import AutoModel, AutoTokenizer, SiglipModel, SiglipProcessor, WhisperFeatureExtractor, WhisperModel
8
9
10class MultiModalEmbedder(nn.Module):
11 def __init__(self):
12 super().__init__()
13 self.text_tokenizer = AutoTokenizer.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
14 self.text_encoder = AutoModel.from_pretrained("sentence-transformers/all-MiniLM-L6-v2")
15
16 self.image_processor = SiglipProcessor.from_pretrained("google/siglip-base-patch16-512")
17 self.image_encoder = SiglipModel.from_pretrained("google/siglip-base-patch16-512").vision_model
18 self.image_proj = nn.Linear(768, 384)
19
20 self.audio_processor = WhisperFeatureExtractor.from_pretrained("openai/whisper-tiny")
21 self.audio_encoder = WhisperModel.from_pretrained("openai/whisper-tiny").encoder
22
23 def encode_text(self, texts):
24 if isinstance(texts, str):
25 texts = [texts]
26 inputs = self.text_tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
27 inputs = {key: value.to(next(self.parameters()).device) for key, value in inputs.items()}
28 outputs = self.text_encoder(**inputs)
29 embeddings = outputs.last_hidden_state.mean(dim=1)
30 return F.normalize(embeddings, p=2, dim=-1)
31
32 def encode_image(self, images):
33 inputs = self.image_processor(images=images, return_tensors="pt")
34 inputs = {key: value.to(next(self.parameters()).device) for key, value in inputs.items()}
35 outputs = self.image_encoder(**inputs)
36 embeddings = self.image_proj(outputs.pooler_output)
37 return F.normalize(embeddings, p=2, dim=-1)
38
39 def encode_audio(self, waveform):
40 if isinstance(waveform, torch.Tensor):
41 waveform = waveform.squeeze().cpu().numpy()
42 inputs = self.audio_processor(waveform, sampling_rate=16000, return_tensors="pt")
43 inputs = {key: value.to(next(self.parameters()).device) for key, value in inputs.items()}
44 outputs = self.audio_encoder(**inputs)
45 embeddings = outputs.last_hidden_state.mean(dim=1)
46 return F.normalize(embeddings, p=2, dim=-1)
47
48
49repo_id = "agentic-intelligence-lab/elephant-embeddings-v1-multimodal-small"
50local_dir = snapshot_download(repo_id)
51
52model = MultiModalEmbedder()
53state_dict = torch.load(os.path.join(local_dir, "model.pt"), map_location="cpu", weights_only=False)
54
55model.text_encoder.load_state_dict({
56 key.replace("text_encoder.encoder.", ""): value
57 for key, value in state_dict.items()
58 if key.startswith("text_encoder.encoder.")
59})
60model.image_encoder.load_state_dict({
61 key.replace("image_encoder.vision_encoder.", ""): value
62 for key, value in state_dict.items()
63 if key.startswith("image_encoder.vision_encoder.")
64})
65model.image_proj.load_state_dict({
66 key.replace("image_encoder.projection.", ""): value
67 for key, value in state_dict.items()
68 if key.startswith("image_encoder.projection.")
69})
70model.audio_encoder.load_state_dict({
71 key.replace("audio_encoder.encoder.", ""): value
72 for key, value in state_dict.items()
73 if key.startswith("audio_encoder.encoder.")
74})
75
76model.eval()
77
78texts = ["A refund request", "A screenshot of a login failure"]
79text_embeddings = model.encode_text(texts)
80print(text_embeddings.shape) # [2, 384]
1full_emb = model.encode_text("A billing support request") # [1, 384]
2
3emb_256 = F.normalize(full_emb[:, :256], p=2, dim=-1)
4emb_128 = F.normalize(full_emb[:, :128], p=2, dim=-1)
5emb_64 = F.normalize(full_emb[:, :64], p=2, dim=-1)
1@misc{elephant-embeddings-v1-multimodal-small,
2 title={Elephant Embeddings V1 Multimodal Small},
3 author={Agentic Intelligence Lab},
4 year={2026},
5 url={https://modelscope.cn/models/agentic-intelligence-lab/elephant-embeddings-v1-multimodal-small}
6}