# barrel_embed **Lightweight embedding generation for Erlang with 14 provider backends** [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Version](https://img.shields.io/badge/Version-2.3.0-green.svg)]() [Documentation](https://barrel-db.eu/docs/lib/embed/) | [Examples](./examples) | [barrel-db.eu](https://barrel-db.eu)

A standalone library for generating text and image embeddings with multiple provider backends and automatic fallback support.

Features

  • Multiple embedding providers with automatic fallback
  • Provider chain configuration for high availability
  • Batch embedding with configurable chunk size
  • Python integration via async port server (no NIF dependency)
  • Sparse, multi-vector, and cross-modal embeddings

Providers

ProviderTypeRequirementsDescription
localDensePython + sentence-transformersLocal CPU inference
ollamaDenseOllama serverLocal Ollama API
fastembedDensePython + fastembedONNX-based, lighter than sentence-transformers
openaiDenseAPI keyOpenAI Embeddings API
cohereDenseAPI keyCohere Embed API with input type optimization
voyageDenseAPI keyVoyage AI for RAG and domain-specific embeddings
jinaDenseAPI keyJina AI, 8K context, free tier
mistralDenseAPI keyMistral AI, EU data residency
azureDenseAzure subscriptionAzure OpenAI for enterprise compliance
bedrockDenseAWS credentialsAWS Bedrock (Titan, Cohere models)
vertexDenseGCP projectGoogle Vertex AI
spladeSparsePython + transformers + torchNeural sparse embeddings for hybrid search
colbertMulti-vectorPython + transformers + torchToken-level embeddings for fine-grained matching
clipCross-modalPython + transformers + torch + pillowImage/text embeddings in same space

Installation

Add to your rebar.config:

{deps, [
    {barrel_embed, "~> 2.3"}
]}.

Note: Local Python providers require Python 3.9+ installed on your system.

Quick Start

%% Initialize with a single provider
{ok, State} = barrel_embed:init(#{
    embedder => {ollama, #{
        url => <<"http://localhost:11434">>,
        model => <<"nomic-embed-text">>
    }}
}).

%% Generate embedding
{ok, Vector} = barrel_embed:embed(<<"Hello world">>, State).

%% Batch embedding
{ok, Vectors} = barrel_embed:embed_batch([<<"text1">>, <<" text2">>], State).

Configuration

Single Provider

%% Ollama (recommended for local deployment)
#{embedder => {ollama, #{
    url => <<"http://localhost:11434">>,
    model => <<"nomic-embed-text">>
}}}

%% Local Python (sentence-transformers)
#{embedder => {local, #{
    python => "python3",
    model => "BAAI/bge-base-en-v1.5"
}}}

%% OpenAI
#{embedder => {openai, #{
    api_key => <<"sk-...">>,  %% or set OPENAI_API_KEY env var
    model => <<"text-embedding-3-small">>
}}}

%% FastEmbed (ONNX, lighter)
#{embedder => {fastembed, #{
    model => "BAAI/bge-small-en-v1.5"
}}}

Provider Chain (Fallback)

#{embedder => [
    {ollama, #{url => <<"http://localhost:11434">>}},
    {openai, #{api_key => <<"sk-...">>}},
    {local, #{}}  %% fallback to CPU
]}

Custom Dimensions and Batch Size

#{
    embedder => {local, #{}},
    dimensions => 768,
    batch_size => 64
}

Ollama Example

First, install Ollama and pull an embedding model:

# Install Ollama (macOS)
brew install ollama

# Start Ollama server
ollama serve

# Pull embedding model
ollama pull nomic-embed-text

Then use in Erlang:

%% Start the application
application:ensure_all_started(barrel_embed).

%% Initialize with Ollama
{ok, State} = barrel_embed:init(#{
    embedder => {ollama, #{
        url => <<"http://localhost:11434">>,
        model => <<"nomic-embed-text">>
    }},
    dimensions => 768
}).

%% Generate embeddings
{ok, Vec1} = barrel_embed:embed(<<"The quick brown fox">>, State).
{ok, Vec2} = barrel_embed:embed(<<"A fast auburn canine">>, State).

%% Calculate cosine similarity
Dot = lists:sum(lists:zipwith(fun(A, B) -> A * B end, Vec1, Vec2)).
Norm1 = math:sqrt(lists:sum([X * X || X <- Vec1])).
Norm2 = math:sqrt(lists:sum([X * X || X <- Vec2])).
Similarity = Dot / (Norm1 * Norm2).
%% => ~0.85 (semantically similar)

Specialized APIs

SPLADE Sparse Embeddings

{ok, State} = barrel_embed:init(#{embedder => {splade, #{}}}).

%% Get sparse vector (indices + values)
{ok, #{indices := Indices, values := Values}} =
    barrel_embed_splade:embed_sparse(<<"query text">>, Config).

ColBERT Multi-Vector Embeddings

{ok, State} = barrel_embed:init(#{embedder => {colbert, #{}}}).

%% Get token-level vectors
{ok, TokenVectors} = barrel_embed_colbert:embed_multi(<<"document">>, Config).

%% Calculate MaxSim score
Score = barrel_embed_colbert:maxsim_score(QueryVecs, DocVecs).

CLIP Image Embeddings

{ok, State} = barrel_embed:init(#{embedder => {clip, #{}}}).

%% Embed image (base64-encoded)
{ok, ImageVec} = barrel_embed_clip:embed_image(ImageBase64, Config).

%% Embed text (same vector space as images)
{ok, TextVec} = barrel_embed_clip:embed(<<"a photo of a cat">>, Config).

%% Now ImageVec and TextVec can be compared with cosine similarity

API Reference

barrel_embed

FunctionDescription
init(Config)Initialize embedding state
embed(Text, State)Generate embedding for single text
embed_batch(Texts, State)Generate embeddings for multiple texts
embed_batch(Texts, Opts, State)Batch embed with options
dimension(State)Get embedding dimension
info(State)Get provider information

Application Configuration

barrel_embed creates and manages its own Python virtualenv automatically on startup (default location: priv/barrel_embed/.venv). Configure a custom location in sys.config:

%% sys.config
[
    {barrel_embed, [
        {venv_dir, "/path/to/.venv"}  %% Optional: custom venv location
    ]}
].

Python Setup

Managed Virtualenv (Default)

No manual setup is required. barrel_embed creates the venv on application start and installs each provider's dependencies the first time it is used:

%% Venv created and configured automatically
{ok, State} = barrel_embed:init(#{
    embedder => {local, #{
        model => "BAAI/bge-base-en-v1.5"
    }}
}).

See venv-setup for the full venv management API.

Manual Installation

Install based on providers used:

# For local provider
pip install sentence-transformers

# For fastembed provider
pip install fastembed

# For splade/colbert providers
pip install transformers torch

# For clip provider
pip install transformers torch pillow

See venv-setup for detailed virtualenv instructions.

Support

ChannelFor
GitHub IssuesBug reports, feature requests
EmailCommercial inquiries

License

Apache-2.0. See LICENSE for details.


Built by Enki Multimedia | barrel-db.eu