asopi tech
asopi techIndie Developer

Asopitech With · チャット

Slack with Alopex DB & Alopex Chirps

Slackは、チャンネルごとに仕事の会話を集めるチャットです。これをAlopex DBとAlopex Chirpsで作り直すと…?

更新: 2026/10/12

どんなサービスか

Slackのようなチャットでは、仕事の会話がチャンネルに集まります。チャンネルはチームやプロジェクトごとに作り、あとから入った人も過去の会話をさかのぼって読めます。スレッド、ファイルの共有、会話の検索と要約があります。扱うデータは、ワークスペース、チャンネル、メンバー、メッセージ、スレッドです。

データの置き場所

  • SQLテーブル:ワークスペース、チャンネル、メンバー、メッセージ、スレッドをテーブルに持ちます。チャンネルの表示は、チャンネルと時刻での範囲の読み取りです。
  • ベクトル:メッセージの埋め込みをベクトル列に持ち、「この前決めた、リリースの手順」のような問いを、チャンネルの条件を付けて探します。
  • 全文検索:人の名前や言葉そのものは、全文検索で探します。
  • カラムナーテーブル:チャンネルごとの発言数や、利用の推移を集計します。

メッセージの埋め込みはアプリが作り、メッセージの行と同じトランザクションで書き込みます。

配置の形

ワークスペースが増えたら、Alopex DBのクラスタに広げます。ノードの参加と離脱、スキーマの変更は、クラスタ全体で合意して進みます。読み取りは、そのデータを受け持つノードに振り分けます。ノードどうしの通信は、関連製品のChirpsが受け持ちます。アプリは、どの形でも同じSQLを使います。

Alopex DBとAlopex Chirpsが合う理由

チャットは、小さなチームで始まり、利用が広がるにつれて大きくなります。Alopex DBは、ひとつのサーバーで始めたデータベースを、同じSQLのままAlopex DBのクラスタへ広げられます。会話とその意味検索が、いつも同じ場所にあります。

コードで見る

会話と意味検索はAlopex DBが持ちます(ノード間の配送はChirps)。チャンネルを絞った意味検索の中心だけを取り出したコードです。

import alopex
import numpy as np

# 会話とその意味検索は Alopex DB(ノード間の配送は Chirps)
db = alopex.Database.open("slack.alopex")

db.execute_sql("""
    CREATE TABLE IF NOT EXISTS messages (
        id INTEGER PRIMARY KEY,
        channel TEXT,
        author TEXT,
        body TEXT,
        posted DATE,
        embedding VECTOR(4)
    )
""")

messages = [
    (1, "release", "aya", "リリースの手順を決めた", "2026-10-18", [0.9, 0.1, 0.0, 0.0]),
    (2, "random", "ken", "お昼どこ行く?", "2026-10-19", [0.0, 0.0, 0.9, 0.1]),
    (3, "release", "mio", "次のリリースは金曜", "2026-10-20", [0.85, 0.15, 0.0, 0.0]),
]
for mid, channel, author, body, posted, emb in messages:
    db.execute_sql(
        "INSERT INTO messages (id, channel, author, body, posted, embedding) VALUES (?, ?, ?, ?, ?, ?)",
        [mid, channel, author, body, posted, np.array(emb, dtype=np.float32)],
    )

# 「リリースの手順」に近いメッセージを、release チャンネルに絞って意味検索する
query = np.array([1.0, 0.0, 0.0, 0.0], dtype=np.float32)
rows = db.execute_sql("""
    SELECT author, body, vector_similarity(embedding, ?, 'cosine') AS score
    FROM messages
    WHERE channel = ?
    ORDER BY score DESC
    LIMIT 2
""", [query, "release"])

for row in rows:
    print(round(row["score"], 3), row["author"], row["body"])

チャンネルの条件を付けて、意味の近いメッセージを探せます。ノードどうしの通信や、クラスタへの広げ方はChirpsが受け持ちます。

会話の意味検索を同じSQLで扱え、Alopex DBのクラスタまで広げられるAlopex DBを、チャットのデータベースにおすすめします。クイックスタートで小さく始められます。

関連リンク