Skip to main content
Arcanflows

Embeddings

Understand how embeddings work and configure embedding models for your knowledge base.

Overview

Embeddings are numerical representations of text that capture semantic meaning. They enable your AI agent to find relevant information based on meaning, not just keyword matching.

How Embeddings Work

┌─────────────────────────────────────────────────────────┐
│                    Text Input                            │
│  "How do I reset my password?"                          │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│                  Embedding Model                         │
│  (Transforms text into numerical vector)                │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│              Vector (1536 dimensions)                    │
│  [0.023, -0.041, 0.089, ..., 0.012]                     │
└─────────────────────────────────────────────────────────┘
                           │
                           ▼
┌─────────────────────────────────────────────────────────┐
│              Similarity Search                           │
│  Find chunks with similar vectors                        │
└─────────────────────────────────────────────────────────┘

Supported Embedding Models

OpenAI Models

ModelDimensionsMax TokensCostQuality
text-embedding-3-large30728191$$$Best
text-embedding-3-small15368191$Good
text-embedding-ada-00215368191$Good

Configuration:

json
{
  "embeddings": {
    "provider": "openai",
    "model": "text-embedding-3-small",
    "dimensions": 1536
  }
}

Anthropic/Voyage Models

ModelDimensionsMax TokensCostQuality
voyage-large-2153616000$$Excellent
voyage-code-2153616000$$Best for code
voyage-lite-0210244000$Good

Configuration:

json
{
  "embeddings": {
    "provider": "voyage",
    "model": "voyage-large-2",
    "dimensions": 1536
  }
}

Cohere Models

ModelDimensionsMax TokensCostQuality
embed-english-v3.01024512$$Excellent
embed-multilingual-v3.01024512$$Best multilingual
embed-english-light-v3.0384512$Good

Configuration:

json
{
  "embeddings": {
    "provider": "cohere",
    "model": "embed-english-v3.0",
    "dimensions": 1024
  }
}

Local Models (Ollama)

ModelDimensionsQualityNotes
nomic-embed-text768GoodFast, lightweight
mxbai-embed-large1024ExcellentHigh quality
all-minilm384ModerateVery fast

Configuration:

json
{
  "embeddings": {
    "provider": "ollama",
    "model": "nomic-embed-text",
    "base_url": "http://localhost:11434",
    "dimensions": 768
  }
}

Model Selection Guide

By Use Case

Use CaseRecommended ModelWhy
General knowledgetext-embedding-3-smallGood balance of cost/quality
Technical docsvoyage-code-2Optimized for code/technical
Multilingualembed-multilingual-v3.0Best cross-language support
High accuracytext-embedding-3-largeHighest quality
Cost-sensitiveall-minilm (local)No API costs
Privacy-focusednomic-embed-text (local)Data stays on-premise

By Budget

BudgetModelMonthly Cost (1M tokens)
FreeLocal models$0 (compute only)
Lowtext-embedding-3-small~$2
Mediumtext-embedding-3-large~$13
Enterprisevoyage-large-2~$12

Configuring Embeddings

Via UI

  1. Go to Agents → Select agent → Knowledge Base
  2. Click SettingsEmbedding Model
  3. Select provider and model
  4. Click Save (existing documents will be re-embedded)

Via API

bash
curl -X PATCH "https://api.arcanflows.com/api/v1/agents/{agent_id}/knowledge/settings" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "embeddings": {
      "provider": "openai",
      "model": "text-embedding-3-small",
      "dimensions": 1536,
      "batch_size": 100
    }
  }'

Vector Storage

Supported Vector Databases

Arcanflows supports multiple vector storage backends:

DatabaseTypeBest For
pgvectorPostgreSQL extensionDefault, integrated
PineconeManaged serviceLarge scale, production
QdrantSelf-hosted/managedHigh performance
WeaviateSelf-hosted/managedHybrid search
ChromaDBEmbeddedDevelopment, small scale

Default Configuration (pgvector)

json
{
  "vector_store": {
    "type": "pgvector",
    "index_type": "ivfflat",
    "lists": 100,
    "probes": 10
  }
}

Index Types

IndexSpeedRecallMemoryBest For
FlatSlow100%HighSmall datasets
IVFFlatFast~95%MediumGeneral use
HNSWVery fast~99%HighLarge datasets

Distance Metrics

MetricFormulaUse Case
Cosine1 - cos(θ)Most common, normalized
EuclideanL2 distanceRaw distances
Dot Producta · bWhen magnitudes matter

Default: Cosine similarity

Search Configuration

json
{
  "search": {
    "metric": "cosine",
    "top_k": 5,
    "score_threshold": 0.7,
    "rerank": true,
    "rerank_model": "cross-encoder"
  }
}
ParameterDescriptionDefault
top_kNumber of results to return5
score_thresholdMinimum similarity score0.7
rerankUse reranking modelfalse

Retrieval Strategies

python
# Pseudocode
results = vector_store.similarity_search(
    query_embedding,
    k=5,
    threshold=0.7
)

Hybrid Search (Vector + Keyword)

Combines semantic and keyword search:

json
{
  "search": {
    "type": "hybrid",
    "vector_weight": 0.7,
    "keyword_weight": 0.3,
    "keyword_method": "bm25"
  }
}

Benefits:

  • Better for exact matches (names, codes)
  • Handles both semantic and keyword queries
  • More robust retrieval

Reranking

Apply a second-stage model to improve results:

json
{
  "search": {
    "rerank": true,
    "rerank_model": "cohere-rerank-english-v2.0",
    "rerank_top_n": 10,
    "final_top_k": 3
  }
}

How it works:

  1. Retrieve top 10 candidates via vector search
  2. Rerank using cross-encoder model
  3. Return top 3 reranked results

Maximal Marginal Relevance (MMR)

Diversifies results to reduce redundancy:

json
{
  "search": {
    "type": "mmr",
    "lambda": 0.5,
    "fetch_k": 20,
    "final_k": 5
  }
}
ParameterDescription
lambdaBalance relevance (1.0) vs diversity (0.0)
fetch_kCandidates to fetch
final_kFinal results after MMR

Embedding Best Practices

1. Consistent Models

Use the same embedding model for documents and queries:

Documents: text-embedding-3-small → vectors
Queries: text-embedding-3-small → vectors  ✓

Documents: text-embedding-3-small → vectors
Queries: text-embedding-ada-002 → vectors  ✗

2. Preprocessing

Clean text before embedding:

python
def preprocess(text):
    # Remove extra whitespace
    text = ' '.join(text.split())
    # Remove special characters (optional)
    text = text.replace('\n', ' ')
    # Truncate to model max length
    text = text[:8000]
    return text

3. Query Enhancement

Improve query embeddings:

json
{
  "query_enhancement": {
    "expand_query": true,
    "add_context": true,
    "hypothetical_answer": false
  }
}

HyDE (Hypothetical Document Embedding):

  1. Generate hypothetical answer to query
  2. Embed the hypothetical answer
  3. Search for similar real documents

4. Monitoring

Track embedding performance:

MetricDescriptionTarget
Avg similarity scoreQuery-result similarity> 0.75
Result diversityUnique topics in results> 0.5
LatencySearch time< 200ms
Recall@kRelevant in top k> 0.9

API Reference

Generate Embedding

bash
curl -X POST "https://api.arcanflows.com/api/v1/embeddings" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "input": "How do I reset my password?",
    "model": "text-embedding-3-small"
  }'

Response:

json
{
  "embedding": [0.023, -0.041, 0.089, ...],
  "dimensions": 1536,
  "tokens_used": 8
}

Search Knowledge Base

bash
curl -X POST "https://api.arcanflows.com/api/v1/agents/{agent_id}/knowledge/search" \
  -H "X-API-Key: your_api_key" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "password reset process",
    "top_k": 5,
    "threshold": 0.7,
    "include_metadata": true
  }'

Troubleshooting

Low similarity scores

  • Check embedding model consistency
  • Improve chunk quality
  • Try hybrid search

Irrelevant results

  • Lower score threshold
  • Enable reranking
  • Add keyword search component
  • Add vector index (HNSW)
  • Reduce top_k
  • Optimize chunk sizes

High costs

  • Switch to smaller embedding model
  • Batch embedding requests
  • Use local models for development