* はじめに [#k9b9111e] 「AIとのチャット履歴を別のAIでも参照できたら...」 「過去の会話の文脈を踏まえた応答がほしい...」 このような課題を解決する可能性を秘めているのが、Apache UnomiとModel Context Protocol(MCP)の組み合わせです。この記事では、Apache UnomiをAIチャット履歴の管理に活用する方法について、実践的に解説していきます。 * 目次 [#v8c6a689] #contents * 1. Apache Unomiとは [#heb2ba5e] Apache Unomiは、顧客データプラットフォーム(CDP)として知られていますが、その特徴は: - プロファイル管理:ユーザー情報の統合管理 - セッション管理:時系列でのユーザー行動追跡 - プライバシー管理:GDPRなどの規制に準拠 - APIベース:RESTful APIによる柔軟な連携 これらの機能は、AIチャットの履歴管理にも非常に適しています。 * 2. AIチャット履歴管理のユースケース [#d45eed04] ** 2.1 基本的な使い方 [#a3c5b333] // チャット履歴の保存 profile.setProperty("lastChat", { timestamp: "2024-01-19T10:00:00", content: "こんにちは、気温が低いですね", context: ["天候", "挨拶"] }); // 文脈を考慮した応答の取得 const context = profile.getProperty("lastChat").context; if (context.includes("天候")) { // 天候に関する文脈を考慮した応答 } ** 2.2 高度な活用例 [#ga3397a5] 複数AIでの履歴共有 長期的な文脈理解 ユーザー嗜好の学習 * 3. Model Context Protocol (MCP)との連携 [#p2e817c3] ClaudeのMCPを使用することで、より高度な文脈管理が可能になります。 ** 3.1 MCPサーバーの設定 [#od45053b] { "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 主要な機能 [#qe141366] プロファイルの自動作成と管理 セッション単位での文脈保持 スコープによる文脈の分離 * 4. 実装例と応用パターン [#p8e8ae93] ** 4.1 マルチAI連携パターン [#i101e71e] // 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 文脈強化パターン [#p0c00930] キーワード抽出による文脈理解 センチメント分析との連携 トピックモデリングの適用 ** 4.3 プライバシー考慮パターン [#m86a7357] センシティブ情報の自動検出 データ保持期間の管理 アクセス制御の実装 ** 5. 参考リンク集 [#u1a9bcd6] 公式ドキュメント *** Apache Unomi Documentation [#q64376af] https://unomi.apache.org/manual/latest/ *** dockerイメージ [#gbe2e6c1] Apache UnomiのDockerイメージが公式に提供されています!これを使うと、セットアップがより簡単になります。 https://hub.docker.com/r/apache/unomi *** Docker docker-compose.yml [#z44807ca] 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 **** 最新バージョンの取得 [#k345fda2] docker pull apache/unomi **** または特定のバージョンを指定 [#p253a640] docker pull apache/unomi:2.4.0 *** Model Context Protocol Specification [#sf784555] https://github.com/modelcontextprotocol https://github.com/modelcontextprotocol/specification *** 実装例 [#y3f295c4] inoyu-mcp-unomi-server Claude Desktop Configuration Guide * チュートリアルと解説 [#vc4152b7] ** Getting Started with Apache Unomi [#b319c36c] https://mcp.so/server/inoyu-mcp-unomi-server *** inoyu-mcp-unomi-serverの主な機能 [#o678c102] - メールアドレスベースのプロファイル管理 - セッションの自動管理 - スコープ(文脈の範囲)の管理 - JSONフォーマットでのデータ交換 ** Understanding MCP for Claude [#q1cff5b5] * 逆引き Apache Unomi 逆引きクックブック [#e7dcb6c8] ** ユーザー管理編 [#z1f30cd2] *** Q1: 新しいユーザープロファイルを作成したい [#ac1b550f] # 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: ユーザーのプロファイル情報を更新したい [#c1cd75fd] # PATCHリクエストでプロファイルを更新 curl -X PATCH http://localhost:8181/cxs/profiles/profile-id \ -H "Content-Type: application/json" \ -d '{ "properties": { "age": 25, "interests": ["sports", "music"] } }' *** Q3: 複数の情報源からユーザーデータを統合したい [#jfcf4f2c] - 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" } } ** セグメント管理編 [#pd35c4f7] *** Q4: ユーザーをグループ分けしたい [#u758f5bf] { "itemType": "segment", "metadata": { "id": "premium-users", "name": "Premium Users", "scope": "acme" }, "condition": { "type": "profilePropertyCondition", "parameterValues": { "propertyName": "accountType", "comparisonOperator": "equals", "propertyValue": "premium" } } } *** Q5: 特定の条件に合うユーザーを抽出したい [#n26464c8] # セグメントに基づくユーザー検索 curl -X POST http://localhost:8181/cxs/profiles/search \ -H "Content-Type: application/json" \ -d '{ "segment": "premium-users", "offset": 0, "limit": 10 }' ** イベント管理編 [#a3ebb298] *** Q6: ユーザーの行動を記録したい [#h486f06d] { "eventType": "purchase", "scope": "ecommerce", "profileId": "profile-id", "properties": { "productId": "123", "amount": 99.99 }, "source": { "itemType": "site", "itemId": "online-store" } } *** Q7: 特定期間のユーザー行動を分析したい [#iaf7c470] 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" } } }' ** パーソナライゼーション編 [#s7ff3c90] *** Q8: ユーザーごとにコンテンツを変更したい [#u19e6ba7] { "itemType": "personalization", "scope": "acme", "strategy": "matching-first", "strategyOptions": { "segments": ["premium-users", "new-visitors"], "fallback": "default-content" } } *** Q9: A/Bテストを実施したい [#u959a8cf] { "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" } } ] } ** プライバシー管理編 [#q676228a] *** Q10: GDPRに対応したデータ管理をしたい [#s76b42ea] - 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チャット履歴管理 [#d400b508] *** Q11: AIチャットの履歴を保存したい [#ad99e53b] { "eventType": "ai_chat", "scope": "chatbot", "profileId": "user-123", "properties": { "message": "こんにちは", "context": ["greeting"], "timestamp": "2024-01-20T10:00:00Z" } } *** Q12: 過去のチャット文脈を取得したい [#kecb93f1] 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 }' ** 高度な使用例 [#dca775ba] *** Q13: 複数のイベントを組み合わせて分析したい [#n981ab80] { "itemType": "rule", "condition": { "type": "booleanCondition", "parameterValues": { "operator": "and", "subConditions": [ { "type": "pastEventCondition", "parameterValues": { "eventType": "view", "minimumCount": 5 } }, { "type": "pastEventCondition", "parameterValues": { "eventType": "purchase", "minimumCount": 1 } } ] } } } *** Q14: リアルタイムでユーザー行動に反応したい [#f58e2009] - 1. イベントリスナーの設定: { "itemType": "rule", "metadata": { "id": "realtime-reaction", "name": "Realtime User Action" }, "condition": { "type": "eventTypeCondition", "parameterValues": { "eventTypeId": "cart_abandon" } }, "actions": [ { "type": "sendEventAction", "parameterValues": { "eventType": "notification" } } ] } ** エラー対処編 [#f9033ac1] *** Q15: よくあるエラーと対処法 [#a298f322] - 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 * おわりに [#e04583ab] Apache UnomiとMCPの組み合わせは、AIチャットの新しい可能性を開きます。特に: 文脈の永続化 マルチAI連携 プライバシー管理 これらの機能により、より自然で継続的なAIとの対話が実現できます。 ぜひ、あなたのプロジェクトでもApache UnomiとMCPを活用し、次世代のAIチャット体験を創造してみてください。