SurrealDB Vector Database
Use SurrealDB as a vector database for your Knowledge Base.
Setup
1docker run --rm \2 --pull always \3 -p 8000:8000 \4 surrealdb/surrealdb:latest \5 start \6 --user root \7 --pass rootor
1./cookbook/scripts/run_surrealdb.shExample
1from kern.agent import Agent2from kern.knowledge.embedder.openai import OpenAIEmbedder3from kern.knowledge.knowledge import Knowledge4from kern.vectordb.surrealdb import SurrealDb5from surrealdb import Surreal67# SurrealDB connection parameters8SURREALDB_URL = "ws://localhost:8000"9SURREALDB_USER = "root"10SURREALDB_PASSWORD = "root"11SURREALDB_NAMESPACE = "test"12SURREALDB_DATABASE = "test"1314# Create a client15client = Surreal(url=SURREALDB_URL)16client.signin({"username": SURREALDB_USER, "password": SURREALDB_PASSWORD})17client.use(namespace=SURREALDB_NAMESPACE, database=SURREALDB_DATABASE)1819surrealdb = SurrealDb(20 client=client,21 collection="recipes", # Collection name for storing documents22 efc=150, # HNSW construction time/accuracy trade-off23 m=12, # HNSW max number of connections per element24 search_ef=40, # HNSW search time/accuracy trade-off25)2627def sync_demo():28 """Demonstrate synchronous usage of SurrealDb"""29 knowledge_base = Knowledge(30 vector_db=surrealdb,31 embedder=OpenAIEmbedder(),32 )3334 # Load data synchronously35 knowledge_base.insert(36 url="https://kern-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"37 )3839 # Create agent and query synchronously40 agent = Agent(knowledge=knowledge_base)41 agent.print_response(42 "What are the 3 categories of Thai SELECT is given to restaurants overseas?",43 markdown=True,44 )4546if __name__ == "__main__":47 # Run synchronous demo48 print("Running synchronous demo...")49 sync_demo()Async Support ⚡
SurrealDB also supports asynchronous operations, enabling concurrency and leading to better performance.
1import asyncio23from kern.agent import Agent4from kern.knowledge.embedder.openai import OpenAIEmbedder5from kern.knowledge.knowledge import Knowledge6from kern.vectordb.surrealdb import SurrealDb7from surrealdb import AsyncSurreal89# SurrealDB connection parameters10SURREALDB_URL = "ws://localhost:8000"11SURREALDB_USER = "root"12SURREALDB_PASSWORD = "root"13SURREALDB_NAMESPACE = "test"14SURREALDB_DATABASE = "test"1516# Create a client17client = AsyncSurreal(url=SURREALDB_URL)1819surrealdb = SurrealDb(20async_client=client,21collection="recipes", # Collection name for storing documents22efc=150, # HNSW construction time/accuracy trade-off23m=12, # HNSW max number of connections per element24search_ef=40, # HNSW search time/accuracy trade-off25)2627async def async_demo():28"""Demonstrate asynchronous usage of SurrealDb"""2930await client.signin({"username": SURREALDB_USER, "password": SURREALDB_PASSWORD})31await client.use(namespace=SURREALDB_NAMESPACE, database=SURREALDB_DATABASE)3233knowledge_base = Knowledge(34 vector_db=surrealdb,35 embedder=OpenAIEmbedder(),36)3738await knowledge_base.ainsert(39 url="https://kern-public.s3.amazonaws.com/recipes/ThaiRecipes.pdf"40)4142agent = Agent(knowledge=knowledge_base)43await agent.aprint_response(44 "What are the 3 categories of Thai SELECT is given to restaurants overseas?",45 markdown=True,46)4748if __name__ == "__main__":49# Run asynchronous demo50print("\nRunning asynchronous demo...")51asyncio.run(async_demo())Tip
Using aload() and aprint_response() with asyncio provides non-blocking operations, making your application more responsive under load.
SurrealDB Params
| Parameter | Type | Default | Description |
|---|---|---|---|
client | Optional[Union[BlockingWsSurrealConnection, BlockingHttpSurrealConnection]] | None | A blocking connection, either HTTP or WS |
async_client | Optional[Union[AsyncWsSurrealConnection, AsyncHttpSurrealConnection]] | None | An async connection, either HTTP or WS |
collection | str | "documents" | Collection name to store documents |
distance | Distance | Distance.cosine | Distance metric to use (cosine, l2, or max_inner_product) |
efc | int | 150 | HNSW construction time/accuracy trade-off |
m | int | 12 | HNSW max number of connections per element |
search_ef | int | 40 | HNSW search time/accuracy trade-off |
embedder | Optional[Embedder] | OpenAIEmbedder() | Embedder instance for creating embeddings |