<!-- markdown -->

# はじめに
「AIとのチャット履歴を別のAIでも参照できたら...」

「過去の会話の文脈を踏まえた応答がほしい...」

このような課題を解決する可能性を秘めているのが、Apache UnomiとModel Context Protocol(MCP)の組み合わせです。この記事では、Apache UnomiをAIチャット履歴の管理に活用する方法について、実践的に解説していきます。

# 目次
[TOC]

# 1. Apache Unomiとは
Apache Unomiは、顧客データプラットフォーム(CDP)として知られていますが、その特徴は:

- プロファイル管理:ユーザー情報の統合管理
- セッション管理:時系列でのユーザー行動追跡
- プライバシー管理:GDPRなどの規制に準拠
- APIベース:RESTful APIによる柔軟な連携

これらの機能は、AIチャットの履歴管理にも非常に適しています。

# 2. AIチャット履歴管理のユースケース
## 2.1 基本的な使い方
    // チャット履歴の保存
    profile.setProperty("lastChat", {
        timestamp: "2024-01-19T10:00:00",
        content: "こんにちは、気温が低いですね",
        context: ["天候", "挨拶"]
    });
    
    // 文脈を考慮した応答の取得
    const context = profile.getProperty("lastChat").context;
    if (context.includes("天候")) {
        // 天候に関する文脈を考慮した応答
    }

## 2.2 高度な活用例

複数AIでの履歴共有

長期的な文脈理解

ユーザー嗜好の学習

# 3. Model Context Protocol (MCP)との連携
ClaudeのMCPを使用することで、より高度な文脈管理が可能になります。
## 3.1 MCPサーバーの設定
    {
      "mcpServers": {
        "unomi-server": {
          "command": "npx",
          "args": ["@inoyu/mcp-unomi-server"],
          "env": {
            "UNOMI_BASE_URL": "http://your-unomi-server:8181",
            "UNOMI_USERNAME": "karaf",
            "UNOMI_PASSWORD": "karaf",
            "UNOMI_PROFILE_ID": "your-profile-id",
            "UNOMI_KEY": "your-key",
            "UNOMI_EMAIL": "your@email.com"
          }
        }
      }
    }
## 3.2 主要な機能

プロファイルの自動作成と管理

セッション単位での文脈保持

スコープによる文脈の分離

# 4. 実装例と応用パターン
## 4.1 マルチAI連携パターン
    // AI-A との会話をUnomiに保存
    await unomiClient.saveChat({
        aiType: "claude",
        content: message,
        context: currentContext
    });
    
    // AI-B で過去の文脈を参照
    const history = await unomiClient.getChatHistory({
        timeRange: "24h",
        aiTypes: ["claude", "gpt"]
    });
## 4.2 文脈強化パターン

キーワード抽出による文脈理解

センチメント分析との連携

トピックモデリングの適用

## 4.3 プライバシー考慮パターン

センシティブ情報の自動検出

データ保持期間の管理

アクセス制御の実装

## 5. 参考リンク集
公式ドキュメント

### Apache Unomi Documentation
https://unomi.apache.org/manual/latest/

### dockerイメージ
Apache UnomiのDockerイメージが公式に提供されています!これを使うと、セットアップがより簡単になります。

https://hub.docker.com/r/apache/unomi

### Docker docker-compose.yml
Quick start with に記載がある

    version: '3.8'
    services:
        elasticsearch:
        image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
        environment:
            - discovery.type=single-node
        ports:
            - 9200:9200
        unomi:
        # Unomi version can be updated based on your needs
        image: apache/unomi:2.0.0
        environment:
            - UNOMI_ELASTICSEARCH_ADDRESSES=elasticsearch:9200
            - UNOMI_THIRDPARTY_PROVIDER1_IPADDRESSES=0.0.0.0/0,::1,127.0.0.1
        ports:
            - 8181:8181
            - 9443:9443
            - 8102:8102
        links:
            - elasticsearch
        depends_on:
            - elasticsearch

### * 最新バージョンの取得
    docker pull apache/unomi

### * または特定のバージョンを指定
    docker pull apache/unomi:2.4.0

### Model Context Protocol Specification
https://github.com/modelcontextprotocol

https://github.com/modelcontextprotocol/specification

### 実装例

    inoyu-mcp-unomi-server
    Claude Desktop Configuration Guide

# チュートリアルと解説

## Getting Started with Apache Unomi

https://mcp.so/server/inoyu-mcp-unomi-server

### inoyu-mcp-unomi-serverの主な機能

- メールアドレスベースのプロファイル管理
- セッションの自動管理
- スコープ(文脈の範囲)の管理
- JSONフォーマットでのデータ交換

## Understanding MCP for Claude

# 逆引き Apache Unomi 逆引きクックブック

## ユーザー管理編

### Q1: 新しいユーザープロファイルを作成したい
    # POSTリクエストでプロファイルを作成
    curl -X POST http://localhost:8181/cxs/profiles/ \
      -H "Content-Type: application/json" \
      -d '{
        "itemType": "profile",
        "properties": {
          "firstName": "John",
          "lastName": "Doe",
          "email": "john@doe.com"
        }
      }'

### Q2: ユーザーのプロファイル情報を更新したい
    # PATCHリクエストでプロファイルを更新
    curl -X PATCH http://localhost:8181/cxs/profiles/profile-id \
      -H "Content-Type: application/json" \
      -d '{
        "properties": {
          "age": 25,
          "interests": ["sports", "music"]
        }
      }'

### Q3: 複数の情報源からユーザーデータを統合したい
- 1. セッション情報の紐付け:
    {
      "itemType": "session",
      "profileId": "profile-id",
      "properties": {
        "deviceId": "mobile-123",
        "browser": "Chrome"
      }
    }

- 2. イベントの記録:
    {
      "eventType": "view",
      "sessionId": "session-id",
      "profileId": "profile-id",
      "source": {
        "itemType": "site",
        "scope": "acme",
        "itemId": "page-123"
      }
    }

## セグメント管理編

### Q4: ユーザーをグループ分けしたい
    {
      "itemType": "segment",
      "metadata": {
        "id": "premium-users",
        "name": "Premium Users",
        "scope": "acme"
      },
      "condition": {
        "type": "profilePropertyCondition",
        "parameterValues": {
          "propertyName": "accountType",
          "comparisonOperator": "equals",
          "propertyValue": "premium"
        }
      }
    }

### Q5: 特定の条件に合うユーザーを抽出したい
    # セグメントに基づくユーザー検索
    curl -X POST http://localhost:8181/cxs/profiles/search \
      -H "Content-Type: application/json" \
      -d '{
        "segment": "premium-users",
        "offset": 0,
        "limit": 10
      }'

## イベント管理編

### Q6: ユーザーの行動を記録したい
    {
      "eventType": "purchase",
      "scope": "ecommerce",
      "profileId": "profile-id",
      "properties": {
        "productId": "123",
        "amount": 99.99
      },
      "source": {
        "itemType": "site",
        "itemId": "online-store"
      }
    }

### Q7: 特定期間のユーザー行動を分析したい
    curl -X POST http://localhost:8181/cxs/events/search \
      -H "Content-Type: application/json" \
      -d '{
        "timeRange": {
          "from": "2024-01-01T00:00:00Z",
          "to": "2024-01-31T23:59:59Z"
        },
        "condition": {
          "type": "eventTypeCondition",
          "parameterValues": {
            "eventTypeId": "purchase"
          }
        }
      }'

## パーソナライゼーション編

### Q8: ユーザーごとにコンテンツを変更したい
    {
      "itemType": "personalization",
      "scope": "acme",
      "strategy": "matching-first",
      "strategyOptions": {
        "segments": ["premium-users", "new-visitors"],
        "fallback": "default-content"
      }
    }

### Q9: A/Bテストを実施したい
    {
      "itemType": "rule",
      "metadata": {
        "id": "ab-test-homepage",
        "name": "Homepage A/B Test"
      },
      "condition": {
        "type": "randomCondition",
        "parameterValues": {
          "percentage": 50
        }
      },
      "actions": [
        {
          "type": "setPropertyAction",
          "parameterValues": {
            "propertyName": "selectedVersion",
            "propertyValue": "A"
          }
        }
      ]
    }

## プライバシー管理編

### Q10: GDPRに対応したデータ管理をしたい
- 1. 同意管理:
{
     "itemType": "consent",
     "scope": "acme",
     "status": "granted",
     "properties": {
       "purpose": "marketing",
       "expiration": "2025-01-01T00:00:00Z"
     }
    }

- 2. データ削除:
    curl -X DELETE http://localhost:8181/cxs/profiles/profile-id
    
## 応用例:AIチャット履歴管理

### Q11: AIチャットの履歴を保存したい
    {
      "eventType": "ai_chat",
      "scope": "chatbot",
      "profileId": "user-123",
      "properties": {
        "message": "こんにちは",
        "context": ["greeting"],
        "timestamp": "2024-01-20T10:00:00Z"
      }
    }

### Q12: 過去のチャット文脈を取得したい
    curl -X POST http://localhost:8181/cxs/events/search \
      -H "Content-Type: application/json" \
      -d '{
        "condition": {
          "type": "eventTypeCondition",
          "parameterValues": {
            "eventTypeId": "ai_chat"
          }
        },
        "sortby": "timestamp",
        "limit": 10
      }'

## 高度な使用例

### Q13: 複数のイベントを組み合わせて分析したい
    {
      "itemType": "rule",
      "condition": {
        "type": "booleanCondition",
        "parameterValues": {
          "operator": "and",
          "subConditions": [
            {
              "type": "pastEventCondition",
              "parameterValues": {
                "eventType": "view",
                "minimumCount": 5
              }
            },
            {
              "type": "pastEventCondition",
              "parameterValues": {
                "eventType": "purchase",
                "minimumCount": 1
              }
            }
          ]
        }
      }
    }

### Q14: リアルタイムでユーザー行動に反応したい
- 1. イベントリスナーの設定:
    {
      "itemType": "rule",
      "metadata": {
        "id": "realtime-reaction",
        "name": "Realtime User Action"
      },
      "condition": {
        "type": "eventTypeCondition",
        "parameterValues": {
          "eventTypeId": "cart_abandon"
        }
      },
      "actions": [
        {
          "type": "sendEventAction",
          "parameterValues": {
            "eventType": "notification"
          }
        }
      ]
    }

## エラー対処編

### Q15: よくあるエラーと対処法
- 1. 認証エラー:
    # Basic認証の確認
    curl -u karaf:karaf http://localhost:8181/cxs/cluster

- 2. CORS エラー:
etc/org.apache.unomi.cors.cfg の設定:
    org.apache.unomi.cors.allowed.origins=http://localhost:*

- 3. セッションエラー:
セッションの有効性確認:
    curl http://localhost:8181/cxs/sessions/current

# おわりに
Apache UnomiとMCPの組み合わせは、AIチャットの新しい可能性を開きます。特に:

文脈の永続化

マルチAI連携

プライバシー管理

これらの機能により、より自然で継続的なAIとの対話が実現できます。
ぜひ、あなたのプロジェクトでもApache UnomiとMCPを活用し、次世代のAIチャット体験を創造してみてください。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   最終更新のRSS