Relative Anchor Translation: zero-shot embedding space translation via similarity profiles
Project description
RAT — Relative Anchor Translation
Zero-shot embedding space translation using relative distances to shared anchors. No additional training required.
Install
pip install rat-embed # core (numpy only)
pip install "rat-embed[models]" # + sentence-transformers for fit()
pip install "rat-embed[dev]" # + pytest, ruff
Quick Start
import numpy as np
from rat import RATranslator
# 1. Prepare anchor embeddings from both models (K anchors, L2-normalized)
anchor_a = ... # (K, D_a) from model A
anchor_b = ... # (K, D_b) from model B
# 2. Fit the translator
translator = RATranslator(kernel="poly").fit_embeddings(anchor_a, anchor_b)
# 3. Transform & retrieve
query_emb = ... # (N, D_a) from model A
db_emb = ... # (M, D_b) from model B
results = translator.retrieve(query_emb, db_emb, top_k=10)
# results["indices"] → (N, 10) nearest neighbor indices
# results["scores"] → (N, 10) cosine similarity scores
Or transform individually for more control:
q_rel = translator.transform(query_emb, "a") # query side (no z-score)
d_rel = translator.transform(db_emb, "b") # db side (z-score applied)
d_rel = translator.transform(db_emb, "b", role="query") # override: skip z-score
Note: For cross-family model pairs (e.g., MiniLM → BGE), use
normalize="always"when constructing the translator. The default"auto"mode may skip z-score normalization for some models where it would actually help in cross-model scenarios.
Advanced: RATHub (multi-model)
from rat import RATHub
hub = RATHub(kernel="poly")
hub.set_anchors("minilm", anchor_minilm) # (K, 384)
hub.set_anchors("e5", anchor_e5) # (K, 1024)
hub.set_anchors("bge", anchor_bge) # (K, 384)
# Transform from any model
q = hub.transform("minilm", query_emb, role="query")
d = hub.transform("e5", db_emb, role="db")
# Or use retrieve directly
results = hub.retrieve(query_emb, db_emb, "minilm", "e5", top_k=10)
Important: All models must use anchors from the same texts in the same order. Select anchor indices once (e.g., via FPS on one model), then use those indices for every model.
Multi-DB search
Search across multiple databases built with different models:
results = hub.retrieve_multi(
query_emb,
databases=[
(db1_emb, "bge"), # BGE database
(db2_emb, "minilm"), # MiniLM database
(db3_emb, "e5"), # E5 database
],
query_model="bge",
top_k=10,
)
# results["indices"] → (N, 10) global indices
# results["scores"] → (N, 10) normalized scores
# results["db_labels"] → (N, 10) which DB each result came from (0, 1, 2)
retrieve_multi uses per-database score normalization internally to make
scores comparable across databases. Do not vstack relative representations
from different models — their score scales differ.
Paper
See the Zenodo record for the full experiment report.
Experiment reproduction code is in experiments/ (unchanged from the original research).
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file rat_embed-0.3.0.tar.gz.
File metadata
- Download URL: rat_embed-0.3.0.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24e2d4b6e6a91fc920164d61288baea60a0d0bc50ba294889ca3fb4673e92da7
|
|
| MD5 |
adddffe55e069adc4851b562b0d5d1c2
|
|
| BLAKE2b-256 |
5c30ae0c98a66a20f4d2bc80f1b9145b2c322781437bd5370c91d26060547f0b
|
File details
Details for the file rat_embed-0.3.0-py3-none-any.whl.
File metadata
- Download URL: rat_embed-0.3.0-py3-none-any.whl
- Upload date:
- Size: 13.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
79d4f540eab9a87324111d546777da45c9325357797895dae6d3e5e1075fdd2b
|
|
| MD5 |
8d6d3ca85c7567ba18508b5c09377f1d
|
|
| BLAKE2b-256 |
cfd8b5de6b9bfd2b50889e2f5b399f205be5acb1a7e13dfa68ccbca0d0c7cbf9
|