mirror of
https://github.com/lancedb/lancedb.git
synced 2026-10-16 08:42:29 +00:00
This PR is part of the documentation revamp. Once the full set of PRs is merged, we’ll publish the combined site to staging for review before updating docs.lancedb.com. Ingestion, search and integration examples are incomplete or inconsistent across languages, and some guidance misstates SDK behavior. This brings the guides and their example sources together. It includes complete Python, TypeScript and Rust workflows, isolated provider and reranker examples, the Superlinked corrections, and guidance on retries that can duplicate writes. Stacked on #4491. Each MDX file has one PR owner. Rebase onto main after #4491 is squash-merged. Local assembly, Mint validation and link checks pass. Example code is unchanged from the previously validated package. Publication stays held through integration.
356 lines
11 KiB
Python
356 lines
11 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright The LanceDB Authors
|
|
|
|
"""Reader examples with explicit placeholders.
|
|
|
|
These functions are documentation source. test_provider_examples.py runs the
|
|
reranker examples offline, with stand-ins for the model and the provider, to
|
|
check that each one writes only to its own new directory. Corresponding opt-in
|
|
integration tests remain in test_integrations.py and retain real credential
|
|
loading. Replace placeholders before running these examples.
|
|
"""
|
|
|
|
|
|
def embedding_ibm_usage():
|
|
# --8<-- [start:embedding_ibm_usage]
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import EmbeddingFunctionRegistry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
|
|
registry = EmbeddingFunctionRegistry.get_instance()
|
|
registry.set_var("watsonx-api-key", "your-api-key")
|
|
watsonx_embed = registry.get("watsonx").create(
|
|
name="ibm/slate-125m-english-rtrvr",
|
|
api_key="$var:watsonx-api-key",
|
|
project_id="your-project-id",
|
|
)
|
|
|
|
class TextModel(LanceModel):
|
|
text: str = watsonx_embed.SourceField()
|
|
vector: Vector(watsonx_embed.ndims()) = watsonx_embed.VectorField()
|
|
|
|
data = [
|
|
{"text": "hello world"},
|
|
{"text": "goodbye world"},
|
|
]
|
|
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "watsonx-demo"))
|
|
tbl = db.create_table("watsonx_test", schema=TextModel, mode="overwrite")
|
|
tbl.add(data)
|
|
|
|
rs = tbl.search("hello").limit(1).to_pandas()
|
|
print(rs.head())
|
|
# --8<-- [end:embedding_ibm_usage]
|
|
|
|
|
|
def embedding_jina_text():
|
|
# --8<-- [start:embedding_jina_text]
|
|
import os
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import EmbeddingFunctionRegistry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
|
|
os.environ["JINA_API_KEY"] = "your-api-key"
|
|
|
|
jina_embed = (
|
|
EmbeddingFunctionRegistry.get_instance()
|
|
.get("jina")
|
|
.create(name="jina-embeddings-v2-base-en")
|
|
)
|
|
|
|
class TextModel(LanceModel):
|
|
text: str = jina_embed.SourceField()
|
|
vector: Vector(jina_embed.ndims()) = jina_embed.VectorField()
|
|
|
|
data = [{"text": "hello world"}, {"text": "goodbye world"}]
|
|
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "jina-text"))
|
|
tbl = db.create_table("test", schema=TextModel, mode="overwrite")
|
|
|
|
tbl.add(data)
|
|
# --8<-- [end:embedding_jina_text]
|
|
|
|
|
|
def embedding_jina_multimodal():
|
|
# --8<-- [start:embedding_jina_multimodal]
|
|
import os
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
import pandas as pd
|
|
import requests
|
|
from lancedb.embeddings import get_registry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
|
|
os.environ["JINA_API_KEY"] = "your-api-key"
|
|
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "jina-images"))
|
|
func = get_registry().get("jina").create()
|
|
|
|
class Images(LanceModel):
|
|
label: str
|
|
image_uri: str = func.SourceField()
|
|
image_bytes: bytes = func.SourceField()
|
|
vector: Vector(func.ndims()) = func.VectorField()
|
|
vec_from_bytes: Vector(func.ndims()) = func.VectorField()
|
|
|
|
table = db.create_table("images", schema=Images)
|
|
labels = ["cat", "cat", "dog", "dog", "horse", "horse"]
|
|
uris = [
|
|
"http://farm1.staticflickr.com/53/167798175_7c7845bbbd_z.jpg",
|
|
"http://farm1.staticflickr.com/134/332220238_da527d8140_z.jpg",
|
|
"http://farm9.staticflickr.com/8387/8602747737_2e5c2a45d4_z.jpg",
|
|
"http://farm5.staticflickr.com/4092/5017326486_1f46057f5f_z.jpg",
|
|
"http://farm9.staticflickr.com/8216/8434969557_d37882c42d_z.jpg",
|
|
"http://farm6.staticflickr.com/5142/5835678453_4f3a4edb45_z.jpg",
|
|
]
|
|
image_bytes = [requests.get(uri).content for uri in uris]
|
|
table.add(
|
|
pd.DataFrame({"label": labels, "image_uri": uris, "image_bytes": image_bytes})
|
|
)
|
|
# --8<-- [end:embedding_jina_multimodal]
|
|
|
|
|
|
def reranking_cohere_usage():
|
|
# --8<-- [start:reranking_cohere_usage]
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import get_registry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
from lancedb.rerankers import CohereReranker
|
|
|
|
embedder = get_registry().get("sentence-transformers").create()
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "cohere-rerank"))
|
|
|
|
class Schema(LanceModel):
|
|
text: str = embedder.SourceField()
|
|
vector: Vector(embedder.ndims()) = embedder.VectorField()
|
|
|
|
data = [
|
|
{"text": "hello world"},
|
|
{"text": "goodbye world"},
|
|
]
|
|
tbl = db.create_table("test", schema=Schema)
|
|
tbl.add(data)
|
|
reranker = CohereReranker(api_key="your-api-key")
|
|
|
|
# Run vector search with a reranker
|
|
vector_results = tbl.search("hello").rerank(reranker=reranker).to_list()
|
|
print(vector_results)
|
|
|
|
# Build the full-text index before either FTS or hybrid search.
|
|
tbl.create_fts_index("text", replace=True)
|
|
|
|
# Run FTS search with a reranker
|
|
fts_results = (
|
|
tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(fts_results)
|
|
|
|
# Run hybrid search with a reranker
|
|
hybrid_results = (
|
|
tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(hybrid_results)
|
|
# --8<-- [end:reranking_cohere_usage]
|
|
|
|
|
|
def reranking_jina_usage():
|
|
# --8<-- [start:reranking_jina_usage]
|
|
import os
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import get_registry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
from lancedb.rerankers import JinaReranker
|
|
|
|
os.environ["JINA_API_KEY"] = "your-api-key"
|
|
embedder = get_registry().get("jina").create()
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "jina-rerank"))
|
|
|
|
class Schema(LanceModel):
|
|
text: str = embedder.SourceField()
|
|
vector: Vector(embedder.ndims()) = embedder.VectorField()
|
|
|
|
data = [
|
|
{"text": "hello world"},
|
|
{"text": "goodbye world"},
|
|
]
|
|
tbl = db.create_table("test", schema=Schema)
|
|
tbl.add(data)
|
|
reranker = JinaReranker(api_key="your-api-key")
|
|
|
|
# Run vector search with a reranker
|
|
vector_results = tbl.search("hello").rerank(reranker=reranker).to_list()
|
|
print(vector_results)
|
|
|
|
# Build the full-text index before either FTS or hybrid search.
|
|
tbl.create_fts_index("text", replace=True)
|
|
|
|
# Run FTS search with a reranker
|
|
fts_results = (
|
|
tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(fts_results)
|
|
|
|
# Run hybrid search with a reranker
|
|
hybrid_results = (
|
|
tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(hybrid_results)
|
|
# --8<-- [end:reranking_jina_usage]
|
|
|
|
|
|
def reranking_watsonx_usage():
|
|
# --8<-- [start:reranking_watsonx_usage]
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import get_registry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
from lancedb.rerankers import WatsonxReranker
|
|
|
|
embedder = get_registry().get("sentence-transformers").create()
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "watsonx-rerank"))
|
|
|
|
class Schema(LanceModel):
|
|
text: str = embedder.SourceField()
|
|
vector: Vector(embedder.ndims()) = embedder.VectorField()
|
|
|
|
data = [
|
|
{"text": "hello world"},
|
|
{"text": "goodbye world"},
|
|
]
|
|
tbl = db.create_table("test", schema=Schema)
|
|
tbl.add(data)
|
|
|
|
# Supply your API key and project ID (or use space_id instead of project_id).
|
|
reranker = WatsonxReranker(
|
|
api_key="your-api-key",
|
|
project_id="your-project-id",
|
|
)
|
|
|
|
# Run vector search with a reranker
|
|
vector_results = tbl.search("hello").rerank(reranker=reranker).to_list()
|
|
print(vector_results)
|
|
|
|
# Build the full-text index before either FTS or hybrid search.
|
|
tbl.create_fts_index("text", replace=True)
|
|
|
|
# Run FTS search with a reranker
|
|
fts_results = (
|
|
tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(fts_results)
|
|
|
|
# Run hybrid search with a reranker
|
|
hybrid_results = (
|
|
tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(hybrid_results)
|
|
# --8<-- [end:reranking_watsonx_usage]
|
|
|
|
|
|
def reranking_openai_usage():
|
|
# --8<-- [start:reranking_openai_usage]
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import get_registry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
from lancedb.rerankers import OpenaiReranker
|
|
|
|
embedder = get_registry().get("sentence-transformers").create()
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "openai-rerank"))
|
|
|
|
class Schema(LanceModel):
|
|
text: str = embedder.SourceField()
|
|
vector: Vector(embedder.ndims()) = embedder.VectorField()
|
|
|
|
data = [
|
|
{"text": "hello world"},
|
|
{"text": "goodbye world"},
|
|
]
|
|
tbl = db.create_table("test", schema=Schema)
|
|
tbl.add(data)
|
|
reranker = OpenaiReranker(api_key="your-api-key")
|
|
|
|
# Run vector search with a reranker
|
|
vector_results = tbl.search("hello").rerank(reranker=reranker).to_list()
|
|
print(vector_results)
|
|
|
|
# Build the full-text index before either FTS or hybrid search.
|
|
tbl.create_fts_index("text", replace=True)
|
|
|
|
# Run FTS search with a reranker
|
|
fts_results = (
|
|
tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(fts_results)
|
|
|
|
# Run hybrid search with a reranker
|
|
hybrid_results = (
|
|
tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(hybrid_results)
|
|
# --8<-- [end:reranking_openai_usage]
|
|
|
|
|
|
def reranking_voyageai_usage():
|
|
# --8<-- [start:reranking_voyageai_usage]
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import lancedb
|
|
from lancedb.embeddings import get_registry
|
|
from lancedb.pydantic import LanceModel, Vector
|
|
from lancedb.rerankers import VoyageAIReranker
|
|
|
|
embedder = get_registry().get("sentence-transformers").create()
|
|
db = lancedb.connect(str(Path(tempfile.mkdtemp()) / "voyageai-rerank"))
|
|
|
|
class Schema(LanceModel):
|
|
text: str = embedder.SourceField()
|
|
vector: Vector(embedder.ndims()) = embedder.VectorField()
|
|
|
|
data = [
|
|
{"text": "hello world"},
|
|
{"text": "goodbye world"},
|
|
]
|
|
tbl = db.create_table("test", schema=Schema)
|
|
tbl.add(data)
|
|
reranker = VoyageAIReranker(api_key="your-api-key", model_name="rerank-2")
|
|
|
|
# Run vector search with a reranker
|
|
vector_results = tbl.search("hello").rerank(reranker=reranker).to_list()
|
|
print(vector_results)
|
|
|
|
# Build the full-text index before either FTS or hybrid search.
|
|
tbl.create_fts_index("text", replace=True)
|
|
|
|
# Run FTS search with a reranker
|
|
fts_results = (
|
|
tbl.search("hello", query_type="fts").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(fts_results)
|
|
|
|
# Run hybrid search with a reranker
|
|
hybrid_results = (
|
|
tbl.search("hello", query_type="hybrid").rerank(reranker=reranker).to_list()
|
|
)
|
|
print(hybrid_results)
|
|
# --8<-- [end:reranking_voyageai_usage]
|