SurrealDBのレビューとインストールガイド:AIとエージェントのアプリのための1つのデータベース
執筆: Andrew Miller ·
アーカイブ記事です。 2025年8月に執筆されたもので、その後、料金やモデル、機能が変わっている可能性があります。最新の状況はおすすめのベクトルデータベースをご覧ください。
物事を覚えておくAIアプリは、たいてい3つのデータベースを抱えることになります。ユーザーとセッション用、文書用、そして検索用の別のベクトルストアです。SurrealDBは、ドキュメント、グラフ、リレーショナル、ベクトル、地理空間、時系列のデータを1か所に置く、オープンソースのマルチモデルデータベースです。ローカルファーストのアプリ、エージェントのワークフロー、言語モデルのバックエンドを作る開発者に向いています。
このガイドでは、何が違うのか、ローカルでのインストールと起動の方法、そしてOllamaで配信するモデルとの使い方を説明します。オープンソースのLLMを使ったローカルの開発環境をもとにまとめたもので、その記録によれば、すぐに動かせて扱いも簡単でした。
AIアプリケーションに向いている理由
SurrealDBは、1つのデータベースで複数の種類のデータを扱います。
- ユーザーやセッションのような構造化されたメタデータのためのリレーショナルのテーブル
- 関係や入れ子の内容のためのドキュメントとグラフ
- 検索拡張生成(RAG、モデルが答える前に関連する文章を調べる仕組み)での類似検索のためのベクトル
- 組み込み型または分散型のデプロイ
そのため、チャットボットの記憶、オープンソースの埋め込みモデルを使ったRAGのパイプライン、エージェントの状態の管理、そしてマシンの外に出ないプライベートなデプロイに合っています。
仕組み
これらのデータモデルはすべて、SQLに似た1つの言語SurrealQLで問い合わせ、データの種類や関係をまたいだクエリを扱えます。幅広さの割に軽量で、ノートパソコンで快適に動き、アプリに組み込むこともでき、クラスターにスケールアウトすることもできます。
設計では、計算とストレージを分けています。
- クエリ層は、クエリを解析して実行し、トランザクションを管理します。
- ストレージ層では、異なるエンジンを使えます。
- 組み込み、インメモリでの利用にはRocksDB、
- 分散構成にはTiKV、
- ブラウザで動くアプリにはIndexedDB。
この分割のおかげで、同じクエリとロジックが1台のマシンでも分散システムでも動きます。SurrealDBは、アプリの背後のデータベースとしても、認証と権限を備えた完全なバックエンドサービスとしても、デスクトップやブラウザで動くAIエージェントに組み込んでも使えます。
ステップ1:SurrealDBをインストールする
UbuntuやほかのLinuxディストリビューションでは:
curl -sSf https://install.surrealdb.com | sh
バイナリをパスの通った場所に移します。
sudo mv surreal /usr/local/bin/
インストールされたか確認します。
surreal version
次のように表示されるはずです。
surreal 1.0.0-beta.9 (linux-x86_64)
ステップ2:ローカルで起動する
開発とテスト用に、インメモリで:
surreal start --log debug --user root --pass root memory
データをディスクに保存する場合:
surreal start --log debug --user root --pass root file:/path/to/data
初期設定では、HTTPのポート8000で待ち受けます。
ステップ3:Pythonから接続する
クライアントをインストールします。
pip install surrealdb
最小限の例:
from surrealdb import Surreal
import asyncio
async def run():
db = Surreal()
await db.connect("http://localhost:8000/rpc")
# Sign in
await db.signin({"user": "root", "pass": "root"})
await db.use("test", "test")
# Create a document
await db.query("CREATE message CONTENT { text: 'Hello from SurrealDB!' }")
# Query it back
results = await db.query("SELECT * FROM message")
print(results)
asyncio.run(run())
ステップ4:ベクトルを保存する
Ollamaで配信するものやHugging Faceのものなど、どのモデルの埋め込みでも保存できます。この例ではOpenAIの埋め込みを使います。
from openai import OpenAI
import numpy as np
# Assume you have your API key and text
response = openai.Embedding.create(
input="This is a sample text",
model="text-embedding-ada-002"
)
embedding = response['data'][0]['embedding']
await db.query("CREATE vector_doc CONTENT { id: 'doc1', text: 'This is a sample text', embedding: $embedding }", {"embedding": embedding})
その後、使っているバージョンが対応していれば、SurrealQLでコサイン類似度による絞り込みができます。
例:記憶を持つローカルのチャットボット
Ollamaでローカルのモデルを配信します。
ollama run llama3
チャットボットは次のように動きます。
- Ollamaがユーザーのメッセージを処理し、モデルが返答と要約を書きます。
- 要約を埋め込みに変換し、SurrealDBに保存します。
- チャットボットが再起動すると、ベクトルの類似度で過去の会話を探し、プロンプトに加えます。
記録によると、この基本的な形でもデータベースからの想起は速く正確で、外部のAPIを呼ばずに物事を覚えておく必要があるエージェントやアシスタントにとって、SurrealDBは妥当な選択になります。
使ってみた感触
- 設定が速い:インストール、起動、接続まで5分未満です。
- 有能なスキーマの仕組み:ドキュメントの型、インデックス、制約、関係をデータベース自体の中で定義できます。
- ベクトルを内蔵:Pinecone、Qdrant、その他の独立したベクトルデータベースは不要です。
- プロトタイプに向く:インメモリのモードなら、クラウドのインフラを用意せずにアイデアを試せます。
- 複数の言語のSDK:ここではPythonを使っていますが、Node.js、Rust、Goなどのクライアントもあります。
- 完全オフライン:クラウドに依存せずローカルで動くため、プライバシーに配慮が必要な仕事、エッジ、規制のある分野に役立ちます。
注意点:このガイドはベータ版(1.0.0-beta.9)をもとに書いており、SurrealQLでのベクトルの類似検索は使っているバージョン次第でした。RAGのシステムをこれを中心に計画する前に、手元のビルドが何に対応しているか確認してください。
結論:AIのプロジェクトで本来ならリレーショナルデータベースとベクトルストアを並べて使う必要があるなら、SurrealDBでは1つのローカルのプロセスで両方の仕事をこなせます。そして設定が手早いので、これでプロトタイプを作る費用はごくわずかです。
コードはGitHubにあります。このようなデータベースの上で動くエージェントのオーケストレーションについては、Kiroのレビューをご覧ください。
