Overview
Zvec provides integration with Alibaba Cloud’s DashScope service and Qwen models for:
- Dense embeddings:
QwenDenseEmbedding - Semantic text embeddings
- Sparse embeddings:
QwenSparseEmbedding - Keyword-weighted vectors for lexical matching
- Reranking:
QwenReRanker - Cross-encoder based semantic reranking
Installation
Authentication
Set your DashScope API key as an environment variable:
export DASHSCOPE_API_KEY="your-api-key"
Alternatively, pass the API key directly to the constructor:
emb_func = QwenDenseEmbedding(dimension=1024, api_key="your-api-key")
Obtain your API key from DashScope Console.
Dense Embeddings
Basic Usage
from zvec.extension import QwenDenseEmbedding
import os
os.environ["DASHSCOPE_API_KEY"] = "your-api-key"
# Initialize with desired dimension
emb_func = QwenDenseEmbedding(dimension=1024)
vector = emb_func.embed("Hello, world!")
print(f"Dimension: {len(vector)}")
# Output: Dimension: 1024
Model Selection
# Using specific model
emb_func = QwenDenseEmbedding(
dimension=512,
model="text-embedding-v3",
api_key="your-api-key"
)
vector = emb_func.embed("Machine learning is fascinating")
Available models:
text-embedding-v4 (default)
text-embedding-v3
text-embedding-v2
text-embedding-v1
Asymmetric Retrieval
Optimize embeddings for query-document matching:
# For search queries
query_emb = QwenDenseEmbedding(
dimension=1024,
text_type="query"
)
query_vector = query_emb.embed("What is machine learning?")
# For document embeddings
doc_emb = QwenDenseEmbedding(
dimension=1024,
text_type="document"
)
doc_vector = doc_emb.embed(
"Machine learning is a subset of artificial intelligence..."
)
Sparse Embeddings
Basic Usage
Sparse embeddings are ideal for keyword-based search and hybrid retrieval:
from zvec.extension import QwenSparseEmbedding
# For query embedding
query_emb = QwenSparseEmbedding(
dimension=1024,
encoding_type="query"
)
query_vec = query_emb.embed("machine learning")
print(f"Type: {type(query_vec)}")
print(f"Non-zero dimensions: {len(query_vec)}")
# Output: Type: <class 'dict'>
# Output: Non-zero dimensions: 156
Asymmetric Sparse Retrieval
# Query embedding
query_emb = QwenSparseEmbedding(
dimension=1024,
encoding_type="query"
)
query_vec = query_emb.embed("what causes aging fast")
# Document embedding
doc_emb = QwenSparseEmbedding(
dimension=1024,
encoding_type="document"
)
doc_vec = doc_emb.embed(
"UV-A light causes tanning, skin aging, and cataracts..."
)
# Calculate similarity (dot product)
similarity = sum(
query_vec.get(k, 0) * doc_vec.get(k, 0)
for k in set(query_vec) | set(doc_vec)
)
Hybrid Retrieval
Combine dense and sparse embeddings for best retrieval performance:
from zvec.extension import QwenDenseEmbedding, QwenSparseEmbedding
dense_emb = QwenDenseEmbedding(dimension=1024)
sparse_emb = QwenSparseEmbedding(dimension=1024)
query = "deep learning neural networks"
dense_vec = dense_emb.embed(query) # [0.1, -0.3, 0.5, ...]
sparse_vec = sparse_emb.embed(query) # {12: 0.8, 45: 1.2, ...}
Reranking
Basic Usage
from zvec.extension import QwenReRanker
from zvec import Collection
# Initialize reranker
reranker = QwenReRanker(
query="machine learning algorithms",
topn=5,
rerank_field="content",
model="gte-rerank-v2",
api_key="your-api-key"
)
# Use in collection query
results = collection.query(
data={"vector": [query_vector]},
reranker=reranker,
topk=20 # Retrieve 20, rerank to top 5
)
Configuration Options
reranker = QwenReRanker(
query="What is machine learning?", # Required
topn=10, # Number of results to return
rerank_field="content", # Document field to rerank
model="gte-rerank-v2", # Rerank model
api_key="your-api-key" # API key
)
Using with Zvec Collections
Dense Embeddings
from zvec import Collection, DataType
from zvec.extension import QwenDenseEmbedding
emb_func = QwenDenseEmbedding(dimension=1024)
collection = Collection(name="documents")
collection.create_field("id", DataType.INT64, is_primary=True)
collection.create_field("text", DataType.VARCHAR, max_length=512)
collection.create_field(
name="vector",
dtype=DataType.VECTOR_FP32,
dimension=1024,
embedding_function=emb_func
)
collection.create()
# Insert data - embeddings generated automatically
collection.insert([
{"id": 1, "text": "Introduction to machine learning"},
{"id": 2, "text": "Deep learning with neural networks"}
])
# Query with automatic embedding
results = collection.query(
data={"vector": ["machine learning algorithms"]},
output_fields=["id", "text"],
topk=2
)
Sparse Embeddings
from zvec import Collection, DataType
from zvec.extension import QwenSparseEmbedding
sparse_func = QwenSparseEmbedding(
dimension=1024,
encoding_type="document"
)
collection = Collection(name="documents")
collection.create_field("id", DataType.INT64, is_primary=True)
collection.create_field("text", DataType.VARCHAR, max_length=512)
collection.create_field(
name="sparse_vector",
dtype=DataType.VECTOR_SPARSE_FP32,
dimension=1024,
embedding_function=sparse_func
)
collection.create()
Error Handling
try:
emb_func = QwenDenseEmbedding(dimension=1024)
emb_func.embed("") # Empty string
except ValueError as e:
print(f"Error: {e}")
# Output: Error: Input text cannot be empty or whitespace only
try:
emb_func.embed(123) # Non-string input
except TypeError as e:
print(f"Error: {e}")
# Output: Error: Expected 'input' to be str, got int
QwenDenseEmbedding Configuration
Desired output embedding dimension (e.g., 512, 1024, 1536)
model
string
default:"text-embedding-v4"
DashScope embedding model identifier
DashScope API authentication key. If None, reads from DASHSCOPE_API_KEY environment variable
Text role for asymmetric retrieval: "query" or "document"
QwenSparseEmbedding Configuration
Desired output embedding dimension
model
string
default:"text-embedding-v4"
DashScope embedding model identifier
DashScope API authentication key
Encoding type: "query" or "document"
QwenReRanker Configuration
Query text for semantic re-ranking
Maximum number of documents to return after re-ranking
Document field name to use as re-ranking input text
model
string
default:"gte-rerank-v2"
DashScope re-ranking model identifier
DashScope API authentication key
Notes
- Results are cached (LRU cache, maxsize=10) to reduce API calls
- API usage may incur costs based on your DashScope subscription plan
- Network connectivity to DashScope API endpoints is required
- Sparse vectors store only non-zero dimensions for efficiency
- For detailed API specifications, see DashScope Documentation
See Also