diff --git a/_includes/embedding-model-providers.mdx b/_includes/embedding-model-providers.mdx new file mode 100644 index 00000000..0bb4bbf2 --- /dev/null +++ b/_includes/embedding-model-providers.mdx @@ -0,0 +1,23 @@ +If you prefer a different model provider integration, or prefer to import your own vectors, see one of the following guides: + +import CardsSection from "/src/components/CardsSection"; +import styles from "/src/components/CardsSection/styles.module.scss"; + +export const specificGuidesData = [ + { + title: "Prefer a different model provider?", + description: + "See the embedding model providers page for information on other available vectorizers, such as AWS, Cohere, Google, and many more.", + link: "/weaviate/model-providers", + icon: "fas fa-puzzle-piece", // Icon representing data management + }, + { + title: "You have precomputed embeddings?", + description: + "If you prefer to add custom vectors yourself along with the object data, see the Bring Your Own Vectors starter guide.", + link: "/weaviate/starter-guides/custom-vectors", + icon: "fas fa-project-diagram", // Icon representing vector relationships/structure + }, +]; + + diff --git a/docs/cloud/quickstart.mdx b/docs/cloud/quickstart.mdx index 934a1baf..91fe665d 100644 --- a/docs/cloud/quickstart.mdx +++ b/docs/cloud/quickstart.mdx @@ -214,16 +214,6 @@ import CreateCollection from '/_includes/code/quickstart/quickstart.create_colle Run this code to create the collection to which you can add data. -:::info What models are being used? - -You can optionally specify the model in the collection definition. As we did not specify models in the collection definition above, these integrations will use the Weaviate-defined default models. - -
- -See the [model providers integration](/weaviate/model-providers/index.md) section for more information. - -::: - ### 2.2 Load the data We can now add data to our collection. diff --git a/docs/weaviate/concepts/data.md b/docs/weaviate/concepts/data.md index c1f118b4..629788e5 100644 --- a/docs/weaviate/concepts/data.md +++ b/docs/weaviate/concepts/data.md @@ -268,11 +268,11 @@ import MultiVectorSupport from '/_includes/multi-vector-support.mdx'; A named vector can be added to an existing collection definition after collection creation. This allows you to add new vector representations for objects without having to delete and recreate the collection. -When you add a new named vector to an existing collection definition, it's important to understand that **existing objects' new named vector will remain unpopulated**. Only objects created or updated after the named vector addition will receive these new vector embeddings. +When you add a new named vector to an existing collection definition, it's important to understand that **existing objects' new named vector will remain unpopulated**. Only objects created after the named vector addition will receive these new vector embeddings. This prevents any unintended side effects, such as incurring large vectorization time or costs for all existing objects in a collection. -If you want to populate the new named vector for existing objects, update the object with the existing object UUID and vectors. This will trigger the vectorization process for the new named vector. +If you want to populate the new named vector for existing objects, delete and reinsert the objects manually. This will trigger the vectorization process for the new named vector. diff --git a/docs/weaviate/manage-collections/vector-config.mdx b/docs/weaviate/manage-collections/vector-config.mdx index e23775a5..ddf6e102 100644 --- a/docs/weaviate/manage-collections/vector-config.mdx +++ b/docs/weaviate/manage-collections/vector-config.mdx @@ -212,7 +212,9 @@ Named vectors can be added to existing collection definitions with named vectors :::caution Objects aren't automatically revectorized -Adding a new named vector to the collection definition [won't trigger vectorization for existing objects](../concepts/data.md#adding-a-named-vector-after-collection-creation). Only new or updated objects will receive embeddings for the newly added named vector definition. + +Adding a new vector to the collection definition [won't trigger vectorization for existing objects](../concepts/data.md#adding-a-named-vector-after-collection-creation). Only objects created after the vector addition will receive these new vector embeddings. + ::: ## Define multi-vector embeddings (e.g. ColBERT, ColPali) diff --git a/docs/weaviate/quickstart/index.md b/docs/weaviate/quickstart/index.md index 1fec0001..d63897a6 100644 --- a/docs/weaviate/quickstart/index.md +++ b/docs/weaviate/quickstart/index.md @@ -137,7 +137,7 @@ You can retrieve them both from the [WCD console](https://console.weaviate.cloud :::note -New clusters with Weaviate version `v1.30` (or later) have [RBAC (Role-Based Access Control)](/weaviate/configuration/rbac/index.mdx) enabled by default. These clusters don't come with API keys, you will need to create an API key yourself and assign it a role (`admin`, `viewer` or a custom role). +New clusters with Weaviate version `v1.30` (or later) have [RBAC (Role-Based Access Control)](/weaviate/configuration/rbac/index.mdx) enabled by default. These clusters don't come with API keys, you will need to create an API key yourself and assign it a role (`admin`, `viewer` or a custom role). ::: @@ -200,43 +200,11 @@ import CreateCollection from '/\_includes/code/quickstart/quickstart.create_coll Run this code to create the collection to which you can add data. -:::info What models are being used? - -You can optionally specify the model in the collection definition. As we did not specify models in the collection definition above, these integrations will use the Weaviate-defined default models. -
- -See the [model providers integration](../model-providers/index.md) section for more information. - -::: +import ModelProvider from '/\_includes/embedding-model-providers.mdx'
Do you prefer a different setup? - -Weaviate is very flexible. If you prefer a different model provider integration, or prefer to import your own vectors, see one of the following guides: - -
-
-
-
-

Prefer a different model provider?

-
-
- See this section for information on how to user another provider, such as AWS, Cohere, Google, and many more. -
-
-
-
-
-
-

Want to specify object vectors?

-
-
- If you prefer to add vectors yourself along with the object data, see Starter Guide: Bring Your Own Vectors. -
-
-
-
- +
### 2.2 Add objects @@ -405,7 +373,7 @@ flowchart LR style sg3 fill:#ffffff,stroke:#130C49,stroke-width:2px,color:#130C49 ``` -The following example combines the same search (for `biology`) with a prompt to generate a tweet. +The following example combines the same search (for `biology`) with a prompt to generate a tweet. import QueryRAG from '/\_includes/code/quickstart/quickstart.query.rag.mdx' diff --git a/docs/weaviate/quickstart/local.md b/docs/weaviate/quickstart/local.md index 11b1744a..8bb5d401 100644 --- a/docs/weaviate/quickstart/local.md +++ b/docs/weaviate/quickstart/local.md @@ -168,34 +168,11 @@ import CreateCollection from '/_includes/code/quickstart/local.quickstart.create Run this code to create the collection to which you can add data. +import ModelProvider from '/\_includes/embedding-model-providers.mdx' +
Do you prefer a different setup? - -Weaviate is very flexible. If you prefer a different model provider integration, or prefer to import your own vectors, see one of the following guides: - -
-
-
-
-

Prefer a different model provider?

-
-
- See this section for information on how to user another provider, such as AWS, Cohere, Google, and many more. -
-
-
-
-
-
-

Want to specify object vectors?

-
-
- If you prefer to add vectors yourself along with the object data, see Starter Guide: Bring Your Own Vectors. -
-
-
-
- +
### 2.2 Add objects diff --git a/docs/weaviate/tutorials/_includes/add_new_vector.png b/docs/weaviate/tutorials/_includes/add_new_vector.png new file mode 100644 index 00000000..8547d73b Binary files /dev/null and b/docs/weaviate/tutorials/_includes/add_new_vector.png differ diff --git a/docs/weaviate/tutorials/_includes/switch-vectorizer-collection-alias.png b/docs/weaviate/tutorials/_includes/switch-vectorizer-collection-alias.png new file mode 100644 index 00000000..28c603a5 Binary files /dev/null and b/docs/weaviate/tutorials/_includes/switch-vectorizer-collection-alias.png differ diff --git a/docs/weaviate/tutorials/_includes/vectorizer-migration.py b/docs/weaviate/tutorials/_includes/vectorizer-migration.py new file mode 100644 index 00000000..5d466008 --- /dev/null +++ b/docs/weaviate/tutorials/_includes/vectorizer-migration.py @@ -0,0 +1,303 @@ +# START ImportEcommerceData +from datasets import load_dataset + + +def load_ecommerce_data(): + """ + Load the Weaviate ECommerce dataset from Hugging Face. + This dataset contains clothing items with pre-computed vectors. + """ + # Load the dataset from Hugging Face + dataset = load_dataset( + "weaviate/agents", "query-agent-ecommerce", split="train", streaming=True + ) + + # Convert to list for easier handling + # Note: Limited to 100 items for demo purposes + # In production, process the full dataset or use batching + ecommerce_data = [] + for i, item in enumerate(dataset): + if i >= 10: + break + ecommerce_data.append( + {"properties": item["properties"], "vector": item["vector"]} + ) + + return ecommerce_data + + +# Load the data once for use in examples +ecommerce_data = load_ecommerce_data() +print(f"Loaded {len(ecommerce_data)} items from ECommerce dataset") +# END ImportEcommerceData + +# ============================================ +# SHARED SETUP: STEPS 1-4 +# ============================================ + +# START Method1Connect +# Connect to Weaviate Cloud +import os +import weaviate +from weaviate.auth import Auth + +# Best practice: store your credentials in environment variables +weaviate_url = os.environ["WEAVIATE_URL"] +weaviate_api_key = os.environ["WEAVIATE_API_KEY"] + +client = weaviate.connect_to_weaviate_cloud( + cluster_url=weaviate_url, + auth_credentials=Auth.api_key(weaviate_api_key), +) + +print(client.is_ready()) # Should print: `True` +# END Method1Connect + +client.collections.delete("ECommerceProducts") # Clean up if exists + +# START Method1CreateCollection +from weaviate.classes.config import Configure, DataType, Property + +# Create collection with original vector configuration +products = client.collections.create( + name="ECommerceProducts", + vector_config=[ + Configure.Vectors.text2vec_weaviate( + name="original_vector", # Name for existing vectors + ) + ], + properties=[ + Property(name="category", data_type=DataType.TEXT), + Property(name="name", data_type=DataType.TEXT), + Property(name="description", data_type=DataType.TEXT), + Property(name="price", data_type=DataType.NUMBER), + ], +) +# END Method1CreateCollection + +# START Method1ImportData +# Import data with existing vectors +products = client.collections.use("ECommerceProducts") + +with products.batch.fixed_size(batch_size=200) as batch: + for item in ecommerce_data: + batch.add_object( + properties=item["properties"], + vector={"original_vector": item["vector"]}, + ) + +failed_objects = products.batch.failed_objects +if failed_objects: + print(f"Number of failed imports: {len(failed_objects)}") +else: + print(f"Successfully imported {len(ecommerce_data)} products with original vectors") +# END Method1ImportData + +# START Method1QueryOriginal +# Query using original vectors +products = client.collections.use("ECommerceProducts") + +# For the demo get the first item's vector and search for +query_vector = ecommerce_data[0]["vector"] + +results = products.query.near_vector( + near_vector=query_vector, + target_vector="original_vector", # Specify which vector to search + limit=3, + return_properties=["name", "description", "price", "category"], +) + +print("Search results with original vectors:") +for obj in results.objects: + print( + f"- {obj.properties['name']} ({obj.properties['category']}): ${obj.properties['price']}" + ) +# END Method1QueryOriginal + +# ============================================ +# METHOD 1: NEW VECTORS MIGRATION +# ============================================ + +# START Method1AddNewVector +# Add a new vector with Weaviate Embeddings vectorizer +from weaviate.classes.config import Configure + +# Add new vector configuration to existing collection +products.config.add_vector( + vector_config=Configure.Vectors.text2vec_weaviate( # Add new Weaviate Embeddings vector + name="new_vector", + source_properties=["name", "description"], # Properties to vectorize + ), +) + +print("Added new Weaviate Embeddings vector to collection") +# END Method1AddNewVector + +# START Method1TriggerVectorization +# Re-insert all objects to trigger vectorization with new vectorizer +from weaviate.classes.query import Filter + +products = client.collections.use("ECommerceProducts") + +# Fetch all object UUIDs to delete them +all_objects = products.query.fetch_objects().objects +products.data.delete_many( + where=Filter.by_id().contains_any([obj.uuid for obj in all_objects]) +) + +# Insert all objects into the collection to re-calculate the vector embeddings +# for the new vector "new_vector" +with products.batch.fixed_size(batch_size=200) as batch: + for item in ecommerce_data: + batch.add_object( + properties=item["properties"], + vector={"original_vector": item["vector"]}, + ) + +print(f"Triggered vectorization for all objects") +# END Method1TriggerVectorization + +# Update each object to trigger vectorization +# We're adding a new property to trigger re-vectorization +# products.config.add_property(Property(name="vectorized", data_type=DataType.BOOL)) +# update_count = 0 +# for obj in all_objects: +# # Update with no changes to trigger vectorization +# products.data.update( +# uuid=obj.uuid, +# properties={"vectorized": True}, # Set new property +# ) +# update_count += 1 + +# START Method1QueryNewVector +# Query using the new Weaviate Embeddings vector +products = client.collections.use("ECommerceProducts") + +# Now we can use text search with the new vector +results = products.query.near_text( + query="comfortable athletic wear", + target_vector="new_vector", # Use the new vector + limit=3, + return_properties=["name", "description", "price", "category"], +) + +print("\nSearch results with Weaviate Embeddings:") +for obj in results.objects: + print( + f"- {obj.properties['name']} ({obj.properties['category']}): ${obj.properties['price']}" + ) +# END Method1QueryNewVector + +assert len(results.objects) == 3 +# ============================================ +# METHOD 2: COLLECTION ALIASES MIGRATION +# ============================================ + +# For Method 2, we start with the same collection from Steps 1-4 +client.alias.delete(alias_name="ECommerceProduction") # Clean up if exists + +# START Method2CreateAlias +# Create an alias pointing to the current production collection +client.alias.create( + alias_name="ECommerceProduction", target_collection="ECommerceProducts" +) +# END Method2CreateAlias + +# START Method2QueryAlias +# Your application always uses the alias name +products = client.collections.use("ECommerceProduction") + +# Query using the alias (currently points to ECommerceProducts) +# Use a vector from our dataset as query +query_vector = ecommerce_data[0]["vector"] + +results = products.query.near_vector( + near_vector=query_vector, + target_vector=["original_vector"], + limit=3, + return_properties=["name", "price"], +) + +print("Query results via alias:") +for obj in results.objects: + print(f"{obj.properties['name']}: ${obj.properties['price']}") +# END Method2QueryAlias + +# START Method2CreateNew +from weaviate.classes.config import Configure, DataType, Property + +# Create new collection with Weaviate Embeddings vectorizer +client.collections.delete("ECommerce_v2") # Clean up if exists + +products_v2 = client.collections.create( + name="ECommerce_v2", + vector_config=Configure.Vectors.text2vec_weaviate( + name="new_vector", + source_properties=["name", "description"], # Properties to vectorize + ), + properties=[ + Property(name="category", data_type=DataType.TEXT), + Property(name="name", data_type=DataType.TEXT), + Property(name="description", data_type=DataType.TEXT), + Property(name="price", data_type=DataType.NUMBER), + ], +) + +print("Created ECommerce_v2 with Weaviate Embeddings") +# END Method2CreateNew + +# START Method2MigrateData +# Migrate data to new collection (vectors will be auto-generated) +products_v1 = client.collections.use("ECommerceProducts") +products_v2 = client.collections.use("ECommerce_v2") + +# Fetch all data from v1 +all_products = products_v1.query.fetch_objects(limit=10000).objects + +# Import to v2 (without vectors - they'll be auto-generated) +with products_v2.batch.fixed_size(batch_size=200) as batch: + for obj in all_products: + batch.add_object( + properties=obj.properties + # No vector provided - Weaviate Embeddings will generate it + ) + +failed_objects = products_v2.batch.failed_objects +if failed_objects: + print(f"Number of failed migrations: {len(failed_objects)}") +else: + print(f"Migrated {len(all_products)} products to ECommerce_v2") +# END Method2MigrateData + +# START Method2SwitchAlias +# Switch the alias to the new collection (instant switch!) +client.alias.update( + alias_name="ECommerceProduction", new_target_collection="ECommerce_v2" +) + +print("Switched alias 'ECommerceProduction' -> 'ECommerce_v2'") + +# Now queries using the alias automatically use the new collection +products = client.collections.use("ECommerceProduction") + +results = products.query.near_text( + query="comfortable athletic wear", + target_vector="new_vector", + limit=3, + return_properties=["name", "price", "category"], +) + +print("\nQuery results after switch (now using Weaviate Embeddings):") +for obj in results.objects: + print( + f"- {obj.properties['name']} ({obj.properties['category']}): ${obj.properties['price']}" + ) +# END Method2SwitchAlias + +# START Method2Cleanup +# Optional: delete old collection if no longer needed +client.collections.delete("ECommerceProducts") +# END Method2Cleanup + +# Cleanup +client.close() diff --git a/docs/weaviate/tutorials/vectorizer-migration.mdx b/docs/weaviate/tutorials/vectorizer-migration.mdx new file mode 100644 index 00000000..fb8629f5 --- /dev/null +++ b/docs/weaviate/tutorials/vectorizer-migration.mdx @@ -0,0 +1,304 @@ +--- +title: Switching vectorizers +description: Learn two approaches to migrate from one vectorizer to another in Weaviate without service interruption +image: og/docs/tutorials.jpg +# tags: ['migration', 'vectorizers', 'embeddings', 'aliases'] +--- + +import Tabs from "@theme/Tabs"; +import TabItem from "@theme/TabItem"; +import FilteredTextBlock from "@site/src/components/Documentation/FilteredTextBlock"; +import PyCode from "!!raw-loader!/docs/weaviate/tutorials/_includes/vectorizer-migration.py"; + +# Switching vectorizers in Weaviate + +This tutorial demonstrates two methods for migrating a Weaviate collection to a new vectorizer (embedding model) with minimal disruption to ongoing services. These techniques are helpful for scenarios such as model upgrades, provider changes, or performance optimization. + +## Prerequisites + +Before starting this tutorial, ensure you have: + +- A [Weaviate Cloud](https://console.weaviate.cloud) instance (version `v1.32` or newer) +- Python 3.8+ installed +- Required Python packages installed: + ```bash + pip install weaviate-client datasets + ``` +- Environment variables set for your Weaviate Cloud credentials: + ```bash + export WEAVIATE_URL="your-weaviate-cloud-url" + export WEAVIATE_API_KEY="your-api-key" + ``` +- Basic familiarity with Weaviate collections and vector search + +:::tip Get started with Weaviate Cloud + +Sign up for a free Weaviate Cloud sandbox at [console.weaviate.cloud](https://console.weaviate.cloud) + +::: + +## Introduction + +In a production environment, you might need to change your embedding model for several reasons. You may want to adopt a newer model for **performance improvements** like better search accuracy, or switch models due to the **deprecation** of your current model. + +There are three basic steps when it comes to switching embedding models: + +1. **Baseline performance analysis** Select a representative subset of the data. Using the existing embedding model, calculate a baseline for query/search accuracy. This metric will serve as the benchmark for comparison. + +2. **New model evaluation** Generate new vector embeddings for the identical data sample using the updated model. Re-calculate the query/search accuracy using these new embeddings. + +3. **Decision & deployment** Compare the accuracy results from the new model against the established baseline. If the new embeddings demonstrate a clear improvement in performance, proceed with deploying the updated model system-wide. + +This tutorial demonstrates two approaches for switching vectorizers in your application: + +- [**Method A: Collection aliases**](#method-a-collection-aliases-migration) + This approach uses aliases to instantly switch between separate collections. It's perfect for a complete model replacement, minimizing risk and providing an immediate rollback option. +- [**Method B: Adding new vectors**](#method-b-add-new-vector) + This method allows multiple vectors per data object within a single collection. It's ideal for testing new models alongside existing ones. + +:::tip + +For most production use cases, **we recommend using collection aliases** for a seamless and reversible migration. + +::: + +## Step 0: Create a demo collection (optional) + +If you want to follow this tutorial locally and execute the code snippets, you can check out the collapsible element below for steps on how to create a collection and import a demo dataset with precomputed vector embeddings. + +
+Step 0: Setup a collection and populate it with demo data + +#### Step 0.1: Connect to Weaviate Cloud + +First, establish a connection to your Weaviate Cloud instance: + + + +#### Step 0.2: Create a collection + +Create a collection that accepts self-provided vectors. We will use the existing embeddings from the [HuggingFace e-commerce dataset](https://huggingface.co/datasets/weaviate/agents/viewer/query-agent-ecommerce): + + + +#### Step 0.3: Import data + +We'll use the Weaviate ECommerce dataset from Hugging Face, which contains clothing items with pre-computed embeddings. This dataset represents a real-world scenario where you have existing vector embeddings that need migration. + +The dataset includes: + +- Product information (name, description, category, price, brand, etc.) +- Pre-computed 768-dimensional vectors + + + +Import your e-commerce data along with the pre-computed vectors: + + + +#### Step 0.4: Query with original vectors + +Verify that searches work with your original vectors: + + + +
+ +## Method A: Collection aliases migration + +Collection aliases allow instant switching between collections with different vectorizers. Instead of using a collection name in your application, you use the collection alias instead. One you create a new collection with a different embedding mode, you can update the alias to point to the new collection. Now, all of the queries using the alias will be performed with the new vector embeddings. + +### Step 1: Create collection alias and query using alias + +Create an alias that your application will use: + + + +Your application should always use the alias: + + + +### Step 2: Create new collection with Weaviate Embeddings + +Create a new collection using the Weaviate Embeddings vectorizer: + + + +
+ Choose a different embedding model + +
+ +### Step 3: Migrate data to new collection + +Copy data to the new collection (vectors will be auto-generated): + + + +### Step 4: Switch the alias and query using alias + +Update the alias to point to the new collection: + + + +After verification, remove the old collection: + + + +--- + +## Method B: Add new vector + +Weaviate allows you to have multiple vector representations in the same collection. Once a new vector is created and all the objects in the database are vectorized, you can use the new vector instead of the original one. + +### Step 1: Add new vector with Weaviate Embeddings + +Add a new vector using Weaviate's built-in embedding service [Weaviate Embeddings](https://www.google.com/search?q=/cloud/embeddings): + + + +import ModelProvider from "/_includes/embedding-model-providers.mdx"; + +
+ Choose a different embedding model + +
+ +### Step 2: Trigger vectorization + +To trigger vectorization with the new embedding model, you will need to delete and reinsert the objects in question. We are going to delete and insert the whole dataset. + + + +### Step 3: Query with the new vector + +Now you can query using the new vector: + + + +### Step 4: Cleanup and important considerations + +A critical point to remember is that you **cannot delete a named vector** from a collection once it has been added. Both the original and new vectors will coexist for each object. + +This means your **storage usage for this collection will permanently increase**. Due to this limitation, adding new vectors best suited for temporary testing or when a permanent increase in storage is acceptable, rather than for production migrations where a clean state is needed. + +--- + +## Choosing the right method + +:::tip Recommendation: Use collection aliases for production + +While both methods achieve the goal of switching vectorizers, **we strongly recommend using collection aliases for production migrations**. This approach provides a reversible and efficient way to upgrade your embedding models without long-term side effects like increased storage. + +::: + +### Method A: Collection aliases (Recommended) + +- **Zero-downtime switch**: Instantly redirect application traffic to the new collection. +- **Instant rollback**: If issues arise, you can immediately switch the alias back to the old collection. +- **Clean architecture**: Old and new models are completely isolated in separate collections. +- **No storage overhead**: After migration, the old collection can be deleted, reclaiming all its storage space. + +### Method B: Adding a new vector + +- **Good for experimentation**: Useful for quickly comparing model performance within a single dataset. +- **Permanent storage increase**: The old vector **cannot be deleted**, leading to a larger collection size and higher costs. +- **No simple rollback**: Reverting requires application-level changes to specify the old vector name in every query. + +## Best practices + +1. **Test thoroughly**: Always test the new vectorizer with a subset of data first. +2. **Monitor quality**: Compare search results between old and new models. +3. **Plan for rollback**: Keep the old setup available until you're confident. The alias method makes it easy to rollback. +4. **Consider costs**: Different vectorizers have different pricing models. Remember that adding new vectors will increase your storage costs. +5. **Document changes**: Track which model versions and configurations you're using. + +## Summary + +This tutorial demonstrated two powerful approaches for migrating vectorizers in Weaviate: + +- **Collection aliases**: Best for instant, zero-downtime switching between collections with different vectorizers. +- **Adding new vectors**: Creating new vector embeddings in an existing collection, best for experimentation. + +For production environments, the **collection alias method is the preferred approach** due to its safety, flexibility, and clean rollback capabilities. + +## Further resources + +- [Manage collections: Collection aliases](https://www.google.com/search?q=../manage-collections/collection-aliases.mdx) +- [Manage collection: Add new vectors](https://www.google.com/search?q=../manage-collections/vector-config.mdx%23add-new-named-vectors) + +## Questions and feedback + +import DocsFeedback from "/_includes/docs-feedback.mdx"; + + diff --git a/sidebars.js b/sidebars.js index 446e4244..d4d8065c 100644 --- a/sidebars.js +++ b/sidebars.js @@ -528,6 +528,7 @@ const sidebars = { }, items: [ "weaviate/tutorials/multi-vector-embeddings", + "weaviate/tutorials/vectorizer-migration", "weaviate/tutorials/import", "weaviate/tutorials/collection-aliases", "weaviate/tutorials/cross-references",