Skip to content

Embeddings

POST /embeddings

Generate dense vector representations of text. Use embeddings for semantic search, clustering, classification, and RAG (retrieval-augmented generation).

Request

{
  "model": "qwen3-vl-embedding-8b",
  "input": "The transformer architecture uses self-attention mechanisms."
}

Batch inputs (list of strings):

{
  "model": "qwen3-vl-embedding-8b",
  "input": [
    "Self-supervised learning reduces labelling requirements.",
    "Contrastive learning pulls similar examples together in embedding space."
  ]
}

Response

{
  "object": "list",
  "data": [{
    "object": "embedding",
    "index": 0,
    "embedding": [0.0012, -0.0034, ...]
  }],
  "model": "qwen3-vl-embedding-8b",
  "usage": {"prompt_tokens": 12, "total_tokens": 12}
}

Python example

import numpy as np
from openai import OpenAI
import os

client = OpenAI(
    base_url=os.environ["PAIS_API_BASE"],
    api_key=os.environ["PAIS_API_KEY"],
)

def embed(texts: list[str]) -> np.ndarray:
    response = client.embeddings.create(
        model="qwen3-vl-embedding-8b",
        input=texts,
    )
    return np.array([d.embedding for d in response.data])

# Semantic similarity
abstracts = [
    "We present a novel method for protein structure prediction...",
    "A deep learning approach to climate modelling...",
    "Contrastive learning for biomedical text...",
]
query = "machine learning for biology"

vecs = embed(abstracts + [query])
doc_vecs, q_vec = vecs[:-1], vecs[-1]

# Cosine similarity
similarities = doc_vecs @ q_vec / (
    np.linalg.norm(doc_vecs, axis=1) * np.linalg.norm(q_vec)
)
ranked = sorted(zip(similarities, abstracts), reverse=True)
for score, text in ranked:
    print(f"{score:.3f}  {text[:60]}...")

Embedding model details

Property Value
Model Qwen3-VL-Embedding-8B (ColQwen3)
Serving vLLM, pooler endpoint /pooling
Vector dimension Check with len(response.data[0].embedding)
Max input tokens ~8192 tokens
Suitable for Dense retrieval, semantic search, clustering

Batch efficiently

Embedding is GPU-bound. Batching multiple texts in a single request is significantly more efficient than one request per text. Aim for batches of 16–64 strings.

Downstream usage

See RAG over Research Papers for a complete worked example using embeddings with a vector store.