AI・機械学習

速報!Claudeベースの自作チャットボット「メッセージテーブルなし」のデータモデルが面白い

「チャットボットを作るとき、メッセージの履歴ってどうやって保存するの?」そう考えたとき、多くの人がまず思い浮かべるのは メッセージ専用のテーブルを用意してレコードを積み上げる、いわゆるオーソドックスな設計ですよね。

でも今回紹介するのは、そのやり方をあえて使わないアプローチです。ClaudeのAPIを使った自作チャットボット「Claudius」の開発者が公開した設計思想が、シンプルでいて非常に合理的なんです。🚀

「メッセージテーブルなし」とはどういうこと?

chatbot database
chatbot database / Photo by Tim Witzdam via Pexels

通常のチャットアプリを設計すると、データベースには大まかに以下のようなテーブルが並びます。

  • users(ユーザー情報)
  • conversations(会話セッション)
  • messages(メッセージ1件ずつのレコード)

この messages テーブルにチャットのやりとりを1行ずつ保存するのが「普通」の発想です。

ところが Claudius の設計では、メッセージの配列をまるごと1つのドキュメントにまとめて保存しています。MongoDBのドキュメント指向の特性をうまく活かしたアプローチで、イメージとしては「会話履歴をひとつのJSONオブジェクトとして扱う」感じです。

具体的なデータ構造を見てみよう

実際のドキュメント構造はこんな感じになります。

{
  "_id": "会話セッションのID",
  "user_id": "ユーザーID",
  "created_at": "2025-01-01T00:00:00Z",
  "messages": [
    {
      "role": "user",
      "content": "Claudeって何ができるの?"
    },
    {
      "role": "assistant",
      "content": "私はAnthropicが開発したAIアシスタントです!"
    }
  ]
}

ポイントをまとめるとこんな感じです。

  • messages フィールドが配列になっていて、やりとりが順番に格納される
  • 1ドキュメント=1会話セッションという1対1の対応が明快
  • ✅ この配列をそのまま Claude API のリクエストに渡せる形になっている

これがめちゃくちゃ便利なポイントです!Claude APIは会話履歴を配列形式で受け取るので、データベースから取り出した配列をそのままAPIに投げられるんですよね。余計な変換処理が要らないわけです。

なぜこの設計が「合理的」なのか


リレーショナルDB(MySQLなど)でメッセージテーブルを使う場合、APIに渡す前に「SELECT * FROM messages WHERE session_id = ? で取得 → 配列に整形 → APIへ投げる」という手順が必要です。

MongoDBのドキュメント設計ならこうなります。

import pymongo

client = pymongo.MongoClient("your_mongodb_uri")
db = client["claudius"]
conversations = db["conversations"]

# セッションIDで会話を取得
def get_messages(session_id):
    doc = conversations.find_one({"_id": session_id})
    # そのままClaude APIのmessagesパラメータに渡せる!
    return doc["messages"] if doc else []

# メッセージを追加して保存
def append_message(session_id, role, content):
    conversations.update_one(
        {"_id": session_id},
        {"$push": {"messages": {"role": role, "content": content}}},
        upsert=True  # なければ新規作成
    )

$push で配列にメッセージを追加するだけ。シンプルですよね。

まとめ

今回は「メッセージテーブルなし」というユニークなデータ設計を持つ自作チャットボット Claudius の構造を紹介しました。

MongoDBのドキュメント指向の柔軟さと、Claude APIが期待するデータ形式がぴったりハマった、とても実用的な設計です。「むずかしそう」が「できそう」に変わる瞬間ですよね。

自分でもClaude APIを使ったチャットボットを作ってみたい方は、ぜひこの設計を参考にしてみてください!💡

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です