| |
| title: "Adding a vector store" |
| description: "Learn how to contribute a backend for the vector store in Bifrost" |
| icon: "circle-nodes" |
| |
|
|
| The Vector store in Bifrost is designed to be extensible, allowing support for different vector database backends. This guide outlines the philosophy, architecture, and steps to add support for a new vector database. |
|
|
| This guide will help you add a new custom backend for the vector store. Currently, Bifrost supports Weaviate, Redis and Qdrant. |
|
|
| |
|
|
| We assume you have some idea about how Bifrost works and you have already [set up bifrost for local development](./setting-up-repo). |
|
|
| |
|
|
| The system is built around a few key components: |
|
|
| 1. **`VectorStore` Interface**: This is the heart of the system. It defines all the methods required for vector operations including namespace management, similarity search, CRUD operations, and filtering (e.g., `CreateNamespace`, `GetNearest`, `Add`, `Delete`). Any valid store must implement this interface. |
| 2. **Database-Specific Stores**: Unlike relational stores, vector databases have unique characteristics. Each implementation (e.g., `WeaviateStore`, `RedisStore`) uses the native client library for that database to provide optimal performance. |
| 3. **Configuration Structs**: Each database type has its own configuration struct (e.g., `WeaviateConfig`, `RedisConfig`) that defines connection details and database-specific settings. |
| 4. **Query Abstraction**: The `Query` type provides a common way to express filters across different backends, with each implementation translating to its native query language. |
|
|
| |
|
|
| The vector store is used for semantic search and similarity matching in Bifrost. This enables features like RAG (Retrieval-Augmented Generation) and intelligent document retrieval. Bifrost exposes a single interface (`VectorStore`) for all vector operations. |
|
|
| Any custom backend for vector store should implement the `VectorStore` interface. The interface is defined in [vectorstore/store.go](https://github.com/maximhq/bifrost/blob/main/framework/vectorstore/store.go). |
|
|
| |
|
|
| The `VectorStore` interface includes methods for: |
|
|
| * **Namespace Management**: Create and delete namespaces (collections/indices) |
| * **Health Checks**: Ping to verify connectivity |
| * **Data Operations**: Add, get, and delete vector embeddings with metadata |
| * **Similarity Search**: Find nearest neighbors using vector similarity |
| * **Filtering**: Query with metadata filters and pagination |
| * **Batch Operations**: Retrieve or delete multiple items efficiently |
|
|
| |
|
|
| Unlike the config and log stores which use GORM, vector stores use native database clients. This is because: |
|
|
| * Vector databases have specialized APIs optimized for similarity search |
| * Each database has unique features (e.g., Weaviate's GraphQL, Redis's vector syntax) |
| * Performance is critical for vector operations |
|
|
| You should use the official Go client library for your target vector database. |
|
|
| |
|
|
| When adding a new database, please follow these conventions: |
|
|
| |
| * The main interface and factory method are in `framework/vectorstore/store.go`. |
| * Create a new file for your database implementation, named after the database (e.g., `framework/vectorstore/pinecone.go`). |
|
|
| |
| * Define a constant for your database type in `store.go` following the pattern `VectorStoreType[DatabaseName]` (e.g., `VectorStoreTypeWeaviate`). |
| * Name your config struct as `[DatabaseName]Config` (e.g., `WeaviateConfig`). |
| * Name your store struct as `[DatabaseName]Store` (e.g., `WeaviateStore`). |
| * Name your constructor function as `new[DatabaseName]Store` (e.g., `newWeaviateStore`). |
|
|
| |
|
|
| 1. Add a new constant to the `VectorStoreType` in `store.go`. |
| 2. Define a configuration struct in your new database file that contains all connection parameters (host, API keys, timeout settings, etc.). |
| 3. Create a store struct that holds the database client, configuration, and logger. |
| 4. Implement all methods from the `VectorStore` interface: |
| * Connection and health checks (`Ping`) |
| * Namespace/collection management (`CreateNamespace`, `DeleteNamespace`) |
| * Single and batch retrieval (`GetChunk`, `GetChunks`) |
| * Filtered queries (`GetAll` with pagination) |
| * Similarity search (`GetNearest`) |
| * Add/update operations (`Add`) |
| * Delete operations (`Delete`, `DeleteAll`) |
| * Cleanup (`Close`) |
| 5. Implement query translation logic to convert the generic `Query` type to your database's native filter format. |
| 6. Create a constructor function that initializes the database client and validates connectivity. |
| 7. Update the `NewVectorStore` factory function in `store.go` to handle your new database type. |
| 8. Update the `Config` struct's `UnmarshalJSON` method in `store.go` to properly parse your configuration. |
|
|
| |
|
|
| Each vector database has its own query syntax. You'll need to implement functions to translate the generic `Query` type to your database's format. For example: |
|
|
| * Weaviate uses GraphQL-style filters |
| * Redis uses FT.SEARCH query syntax |
|
|
| Study the existing implementations (`buildWeaviateFilter`, `buildRedisQuery`) for patterns to follow. |
|
|
| |
|
|
| Make sure to properly handle errors during: |
| * Database connection establishment |
| * Client initialization and authentication |
| * Query execution (especially for complex similarity searches) |
| * Namespace creation and deletion |
| * Connection cleanup |
|
|
| |
|
|
| * Test all `VectorStore` interface methods with your backend |
| * Verify similarity search returns results in the correct order |
| * Test filtering with various query operators (Equal, GreaterThan, ContainsAny, etc.) |
| * Ensure pagination works correctly with cursors |
| * Test batch operations with different sizes |
| * Verify namespace isolation (data from one namespace doesn't leak to another) |
| * Consider performance benchmarks for large-scale vector operations |
| |
| ## Getting Help |
| |
| If you need help, please reach out to the Bifrost team on [Discord](https://discord.gg/exN5KAydbU). |