🗒️

Difyでmemobaseを使ってみた

に公開

1. はじめに

  • Dify向けのmemobaseプラグインが公開されたのをXで見かけたので使ってみた
  • 要件としては以下の通り
    • 日々のチャットログを記録できること
    • チャットログを要約できること
    • 要約した内容はプロンプトに差し込める形でアウトプットできること
  • 使ってみた所、上記のことはだいたいできた

2. memobaseとは?

  • 概要
    • チャットにおけるユーザ発話とLLM回答を受け取り、要約・キーワード抽出・エモーション分析などをしてくれるサービス
  • 特徴
    • mem0と比較して最初から不特定多数ユーザーのチャットを想定し、大規模な会話ログの要約・管理に対応しているのかなと思う
  • 用途
    • 過去履歴を認識した応対
  • Difyプラグインの特徴
    • Difyのノードとしてシンプルに呼び出せる
    • 認証はDifyのシークレットストア経由で管理可能
    • HTTPノードでリクエストしてJSONパースする手間が省ける

3. Difyの基本と準備

  1. Difyアカウント作成
  2. 環境構築
    • APIキーの発行
    • memobaseプラグインの有効化
  3. memobase側準備
    • 認証トークンを取得し、Difyのシークレットストアに登録
    • memobaseはSaaSとローカル実行が提供されていますが、今回は動作確認目的でSaaSを採用しました

4. memobase連携ワークフローを作る

4-1. memobaseノードで連携を設定する

基本はdify-plugin-memobaseのREADME.mdに記載されている通り作ればよい。

4-2. UUID生成ノードを作成

Get or Create a Userノードはプラグイン内部でclient.get_or_create_user(user_id)を呼び出している。
このclient.get_or_create_user(user_id)はユーザーIDとしてUUID形式が必要。

sys.conversation_id を使う

Difyのsys.conversation_id変数はUUIDになっているので、これをUserIDに割り当てても良いと思う。

sys.queryに含まれるユーザ名を使う

sys.queryに含まれるユーザ名を使う場合は、以下のコードでユーザー名からUUIDを生成するとよい。

def main(user_id: str) -> dict:
    import uuid
    # Example namespace generation using a fixed name
    namespace = uuid.uuid5(uuid.NAMESPACE_DNS, "example")
    # Generate a UUID for the user based on the namespace
    user_uuid = uuid.uuid5(namespace, user_id)
    return {
        'user_uuid': str(user_uuid)
    }
  1. Insert Dataノードの設定で「UserID」欄に上記で生成したuser_idを指定

4-3. コンテキスト生成(flush)

上記Difyワークフローで行うのはチャットログの追加のみ。
蓄積したチャットログからコンテキスト(プロンプト本文)を生成するには、以下のエンドポイントを使用してflush処理を行います。

POST https://api.memobase.io/api/v1/profiles/flush

4-5. プロンプト用コンテキスト取得(prompt/get_context)

プロンプトに組み込むコンテキスト(プロンプト本文)を取得するには、以下のエンドポイントを使用します

GET https://api.memobase.io/api/v1/prompt/get_context?user_id=<USER_UUID>&limit=<NUM>

まとめと今後の展開

  • なぜか登録したユーザ一覧を取得するAPIが無い。

  • 今後はSaaS環境でトークン消費状況をモニタリングし、費用を想定した上でローカル実行を検討

  • SaaS環境の無料トークンを一瞬で使い切ったので、翌日にはローカル環境を構築した

8. 参考リンク

Discussion