Files
lancedb/docs/web/embedding/index.mdx
T
Jack YeandBrendan Clement 47b7babc08 docs: bring the open-source documentation into this repository (#4122)
Move the public website pages into `docs/web` beside the SDK, with
shared navigation and executable example sources in `docs/web-tests`.
The combined website is assembled by
[lancedb/docs#355](https://github.com/lancedb/docs/pull/355), with six
Enterprise replacements from
[lancedb/sophon#7681](https://github.com/lancedb/sophon/pull/7681).

This includes Function guidance, runnable Quickstarts, regenerated
snippets, production contact/demo fixes, the legacy SQL route, and the
LeRobot redirect. LeRobot remains attributed to Geneva; all 34 Geneva
pages remain in the docs repository until Function officially launches.

Materialized-view guidance follows the full rebuild refresh introduced
by #4373: local refresh writes the complete result, has no `full`
argument, supports `source_version`, and no longer requires stable row
IDs. Deployment SQL refresh options and stable-ID setup are qualified by
version/configuration. Function input guidance distinguishes ordinary
stored columns from computed inputs supported by newer deployments.

**Validation:** independently accepted local checks include 95 Python
tests (real Enterprise excluded), eight TypeScript tests, Rust
Quickstart, snippet parity, typos, deterministic assembly, Mint
validation and links/anchors/redirects. The combined baseline retains
all 181 production routes and 17 legacy redirects. Examples ran locally
against source-built Python SDK 0.40.0b13; existing GitHub workflows do
not run `docs/web-tests`. New main at `069b2f7d` is 0.41.0b0 and adds
computed Function inputs; that SDK was not exercised by the accepted
tests. Latest prose corrections receive focused site validation.

**Merge/rollout:** merge this and #7681 before #355's combined CI, which
reads producer `main`. This is migration infrastructure: section
overlays, source-owned skills and automatic versioned paired releases
remain follow-ups. The current manual publisher is transitional. Hosted
validation, a supported SDK/Enterprise release pair and a real
Enterprise walkthrough remain pending.

Production Mintlify watches `lancedb/docs:deploy-freeze`, directory
`docs`; preserve that source through review. The separate SDK GitHub
Pages reference workflow rebuilds on main merges.

**Updated-head CI (9a50f8db):**
[Typos](https://github.com/lancedb/lancedb/actions/runs/37654185443/job/112904990558),
[PR
title](https://github.com/lancedb/lancedb/actions/runs/37654179507/job/112904974595)
and
[Aikido](https://app.aikido.dev/featurebranch/scan/215386145?groupId=74229)
pass. Critical findings in the example lockfiles were patched: all Sharp
copies use 0.35.5, protobufjs 7.6.6, tar 7.5.22, quinn-proto 0.11.19,
zerovec 0.11.8 and zerovec-derive 0.11.6. The SDK's product dependencies
are unchanged. The revised lockfiles pass eight TypeScript examples,
HuggingFace decode/resize/crop/rescale/normalize plus AVIF roundtrip,
and Rust Quickstart. Aikido passing does not mean every advisory is
cleared; npm still reports 29 high and five moderate advisories in the
example dependency graph. No scanner bypass or suppression was added.

The Function prose correction passes combined/standalone Mint,
deterministic assembly, routes and assets. The revised 325-file site
checksum is
`175bec06864abb400dd292e667ba93448c0479b8359fd7bf6146afabf9040647`. This
PR remains open for independent review; further merges are on hold.

---------

Co-authored-by: Brendan Clement <brendan.clement@lancedb.com>
2026-10-07 11:15:00 -07:00

240 lines
9.9 KiB
Plaintext

---
title: "Managing Embeddings"
sidebarTitle: "Managing Embeddings"
description: "Use the embedding API in LanceDB -- registry, functions, schemas, and multi-language SDK support."
icon: "bars"
---
import {
PyOpenaiEmbeddings,
PyCreateEmbeddingFunction,
PyManualQuerySearch,
PyEmbeddingFunction,
PyRegisterDevice,
PyRegisterSecret,
TsOpenaiEmbeddings,
TsCreateEmbeddingFunction,
TsManualQuerySearch,
TsEmbeddingFunction,
TsRegisterModelFallback,
TsRegisterSecret,
RsOpenaiEmbeddings,
RsCreateEmbeddingFunction,
RsManualQuerySearch,
RsEmbeddingFunction,
} from '/snippets/embedding.mdx';
Modern machine learning models can be trained to convert raw data into embeddings, which are vectors
of floating point numbers. The position of an embedding in vector space captures the semantics of
the data, so vectors that are close to each other are considered similar.
LanceDB provides an embedding function registry in OSS as well as its Enterprise versions
([see below](#embeddings-in-lancedb-enterprise))
that automatically generates vector embeddings during data ingestion. Automatic query-time embedding
generation is available in LanceDB OSS, with SDK-specific query ergonomics. The API abstracts
embedding generation, allowing you to focus on your application logic.
## Embedding Registry {#embedding-registry}
You can get a supported embedding function from the registry, and then use it in your table schema.
Once configured, the embedding function will automatically generate embeddings when you insert data
into the table. Query-time behavior depends on SDK: Python/TypeScript can query with text directly,
while Rust examples typically compute query embeddings explicitly before vector search.
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{PyOpenaiEmbeddings}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsOpenaiEmbeddings}
</CodeBlock>
<CodeBlock filename="Rust" language="rust" icon="rust">
{RsOpenaiEmbeddings}
</CodeBlock>
</CodeGroup>
### Using an embedding function {#using-an-embedding-function}
Create an embedding function before you attach it to table or schema metadata. Python and TypeScript fetch
provider implementations from the embedding registry, while Rust constructs the provider embedding function
directly and registers it on the connection before using it in an `EmbeddingDefinition`.
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{PyCreateEmbeddingFunction}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsCreateEmbeddingFunction}
</CodeBlock>
<CodeBlock filename="Rust" language="rust" icon="rust">
{RsCreateEmbeddingFunction}
</CodeBlock>
</CodeGroup>
Provider configuration is SDK-specific, so copy the option names from the provider page for the SDK you use.
For example, the OpenAI model is selected with `name` in Python, `model` in TypeScript, and the model argument
to `OpenAIEmbeddingFunction::new_with_model` in Rust.
| Concept | Python | TypeScript | Rust |
| --- | --- | --- | --- |
| Model | `name="text-embedding-3-small"` | `{ model: "text-embedding-3-small" }` | `new_with_model(api_key, "text-embedding-3-small")` |
| Retry count | `max_retries=7` | Provider/client-specific | Provider/client-specific |
| API key | `api_key="..."`, environment variables, or `$var:` | `apiKey: "..."`, environment variables, or `$var:` | Constructor argument or environment variable |
| Device | Provider-specific, for example `device="cuda"` | Provider-specific | Provider-specific |
When ingesting data with an embedding definition, LanceDB only computes the vector column if that
column is missing from the incoming batch or present but entirely null. If you provide any non-null
values in the vector column, LanceDB treats the column as user-supplied and does not backfill the
remaining rows in that batch.
For reusable runtime configuration, the registry also supports `$var:` placeholders in embedding-function config.
This is useful for provider secrets and environment-specific settings in Python and TypeScript.
- Python uses `registry.set_var(...)`.
- TypeScript uses `registry.setVar(...)`.
- You can provide a fallback with `$var:name:default`.
- Sensitive values such as API keys should be passed through registry variables instead of hardcoding them in config.
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{PyRegisterSecret}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsRegisterSecret}
</CodeBlock>
</CodeGroup>
For non-sensitive settings such as inference device selection, you can also use a default fallback:
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{PyRegisterDevice}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsRegisterModelFallback}
</CodeBlock>
</CodeGroup>
Find the full list of arguments for each provider in the [integrations](/integrations/embedding) section.
## Multiple embedding columns {#multiple-embedding-columns}
A single table can include more than one embedding definition when you want to store multiple semantic views
of the same data, or generate embeddings from different source columns. In practice, each embedding definition
maps one source column to one vector column, and the table schema can contain multiple such pairs.
The exact setup differs by SDK, but the underlying pattern is the same: define a distinct source/vector pair
for each embedding function you want applied during ingest.
In TypeScript, automatic query embedding currently uses the first embedding function stored in the
table metadata. If a table has multiple embedding definitions and you need to query a specific vector
column, compute the query embedding explicitly and pass the vector to the search builder.
## Embedding model providers {#embedding-model-providers}
LanceDB supports most popular embedding providers.
### Text embeddings {#text-embeddings}
| Provider | Model ID | Default Model |
|----------|----------|---------------|
| OpenAI | `openai` | `text-embedding-ada-002` |
| Sentence Transformers | `sentence-transformers` | `all-MiniLM-L6-v2` |
| Hugging Face | `huggingface` | `colbert-ir/colbertv2.0` |
| Cohere | `cohere` | `embed-english-v3.0` |
| ... | ... | ... |
### Multimodal embedding {#multimodal-embedding}
| Provider | Model ID | Supported Inputs |
|----------|----------|------------------|
| OpenCLIP | `open-clip` | Text, Images |
| ImageBind | `imagebind` | Text, Images, Audio, Video |
| ... | ... | ... |
You can find all supported embedding models in the [integrations](/integrations/embedding) section.
## Embeddings in LanceDB Enterprise {#embeddings-in-lancedb-enterprise}
<Badge color="red">Enterprise</Badge>
In LanceDB Enterprise, embedding generation during data ingestion is client-side and the resulting vectors are
stored on the remote table.
<Info>
The Enterprise server does not currently generate embeddings from query text on its own. Any automatic
query-time embedding happens on the client side.
</Info>
### How string queries are interpreted {#how-string-queries-are-interpreted}
For the Python remote client, `table.search("hello")` can take two different paths:
- If the selected vector column has embedding metadata
(i.e., the table schema stores the source-column, vector-column, and
embedding-function mapping created from fields like `SourceField()` and
`VectorField()` during table creation), then the embeddings are computed in the Python client process.
The client uses the same local LanceDB embedding registry used by OSS tables to
reconstruct the embedding function from schema metadata, compute the query vector in
the client process, and send that vector to Enterprise for search.
```python
result = table.search("hello").limit(1).to_list()
# The Python client computes the query embedding locally, then sends a vector search.
```
- If the table does not have embedding metadata for that search, `table.search("hello")` in `auto` mode is
treated as an FTS query instead.
```python
result = table.search("hello").limit(5).to_list()
# In auto mode this is treated as an FTS query, not a vector query.
```
If you want explicit vector or hybrid behavior and the client cannot resolve an embedding function from the
table metadata, generate the query embedding yourself and pass the vector directly.
TypeScript has a similar string-query distinction in `auto` mode: if no embedding providers have been
registered in the process, `search("text")` falls back to FTS. Once an embedding provider has been
imported and registered, the client expects table embedding metadata for automatic vector search and
raises an error if the table has none.
The manual query-embedding flow below works across Enterprise SDKs and is an explicit path you can use when you
want full control over query-time behavior.
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{PyManualQuerySearch}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsManualQuerySearch}
</CodeBlock>
<CodeBlock filename="Rust" language="rust" icon="rust">
{RsManualQuerySearch}
</CodeBlock>
</CodeGroup>
## Custom Embedding Functions {#custom-embedding-functions}
You can always implement your own embedding function:
- Python/TypeScript: subclass `TextEmbeddingFunction` (text) or `EmbeddingFunction` (multimodal).
- Rust: implement the `EmbeddingFunction` trait.
<CodeGroup>
<CodeBlock filename="Python" language="python" icon="python">
{PyEmbeddingFunction}
</CodeBlock>
<CodeBlock filename="TypeScript" language="typescript" icon="square-js">
{TsEmbeddingFunction}
</CodeBlock>
<CodeBlock filename="Rust" language="rust" icon="rust">
{RsEmbeddingFunction}
</CodeBlock>
</CodeGroup>