Chapl!

無料AIチャット - 技術マニュアル

Embeddingsによる革新的な会話履歴管理

Chapl!の核心技術は、OpenAI Embeddings APIを活用した「意味的類似度ベースの履歴選択システム」です。この技術により、無料サービスでありながら高品質なAI会話体験を持続的に提供できます。

設計思想: Embeddingsで会話の意味的文脈を理解し、必要最小限の情報でAI応答品質を最大化

解決すべき根本的課題:指数関数的なコスト増大

従来のAIチャットサービスが直面する最大の問題は、会話が続くほどAPIへ送信する履歴データが指数関数的に増大することです。

従来手法の致命的な問題

❌ 全履歴送信による指数関数的コスト増大 1回目の会話: 100トークン → コストA 2回目の会話: 300トークン → コスト3A 3回目の会話: 600トークン → コスト6A 10回目の会話: 3,000トークン → コスト30A 50回目の会話: 15,000トークン → コスト150A → 会話回数に比例してコストが爆発的に増加 → 長期利用ユーザーほど収益を圧迫 → 無料サービスとしての持続性が困難

Chapl!の革新的解決策:Embeddingsによる賢い選択

✅ 意味的に関連する履歴のみを厳選送信 どの会話回数でも一定: 500〜2,000トークン → 1回目でも50回目でも同じコスト → ユーザー数や利用頻度に関係なく予測可能なコスト → 長期運営が可能な持続性を実現

結果:会話回数に関係なく一定コストを維持(従来比90%削減)

核心技術:Embeddingsによる賢い履歴選択

システムの仕組み

ユーザーメッセージ
OpenAI Embeddings API
ベクトル化
LocalStorage検索
コサイン類似度計算
最適な履歴選択
OpenAI API (最小限)

実装の詳細

// 1. Embeddingsでベクトル化 async function getEmbeddings(text) { const response = await fetch('https://api.openai.com/v1/embeddings', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer YOUR_API_KEY' }, body: JSON.stringify({ model: 'text-embedding-3-small', input: text }) }); const data = await response.json(); return data.data[0].embedding; // 1536次元ベクトル } // 2. コサイン類似度計算 function cosineSimilarity(vecA, vecB) { const dotProduct = vecA.reduce((sum, a, i) => sum + a * vecB[i], 0); const magnitudeA = Math.sqrt(vecA.reduce((sum, a) => sum + a * a, 0)); const magnitudeB = Math.sqrt(vecB.reduce((sum, b) => sum + b * b, 0)); return dotProduct / (magnitudeA * magnitudeB); } // 3. 意味的類似度で関連メッセージを検索 async function findRelevantMessages(queryEmbedding) { const chats = JSON.parse(localStorage.getItem('chats')); const scored = []; for (const chat of Object.values(chats)) { for (const msg of chat.messages) { if (msg.role === 'user') { // キャッシュから取得、なければ生成 const msgEmbedding = msg.embedding || await getEmbeddings(msg.content); const similarity = cosineSimilarity(queryEmbedding, msgEmbedding); if (similarity > 0.5) { // 閾値以上のみ scored.push({ msg, score: similarity }); } } } } // 類似度順でソート、上位7件まで return scored.sort((a,b) => b.score - a.score) .slice(0, 7) .map(item => item.msg); }

具体例

ユーザー: "太郎さんの会議の件、どうなりましたか?" Embeddings化: [0.1, -0.3, 0.8, ...] (1536次元ベクトル) LocalStorage検索 (コサイン類似度): ✓ "太郎さんは来週会議があります" (類似度: 0.85) ✓ "会議の資料を準備してください" (類似度: 0.72) ✓ "太郎くんとランチした" (類似度: 0.65) × "今日は天気がいいですね" (類似度: 0.12 → 閾値以下で除外) → 3件の意味的に関連するメッセージのみをAPIに送信 → 全200件の履歴ではなく3件で文脈を維持

厳格なトークン制限システム

2000文字制限の実装

APIに送信するメッセージは必ず2000文字以内に制限し、予期しないコスト増大を防いでいます。

function optimizeMessageHistory(messages) { let totalLength = 0; const optimized = []; // 最新メッセージは必ず含める const latest = messages[messages.length - 1]; optimized.push(latest); totalLength += latest.content.length; // 関連メッセージを文字数制限内で追加 for (let i = 0; i < messages.length - 1; i++) { const msg = messages[i]; if (totalLength + msg.content.length <= 2000) { optimized.unshift(msg); totalLength += msg.content.length; } else break; } // 2000文字超過時は強制切り詰め if (totalLength > 2000) { // ... 切り詰めロジック } console.log(`送信文字数: ${totalLength}/2000`); return optimized; }

ユーザー入力の280文字制限

Twitterと同様の文字数制限により、ユーザーに簡潔な表現を促し、APIコストをさらに抑制。

function updateCharCount() { const input = document.getElementById('messageInput'); const currentLength = input.value.length; const maxLength = 280; // 250文字で警告表示 if (currentLength >= 250) { counter.classList.add('warning'); } // 280文字で送信不可 sendBtn.disabled = currentLength > maxLength; }

LocalStorageによるサーバーコスト削減とEmbeddingsキャッシュ

データベース不要の設計

全ての会話履歴をユーザーのブラウザ内に保存することで、サーバーサイドのデータベース運用コストを完全に削除しています。さらに、EmbeddingsをLocalStorageにキャッシュすることで、API呼び出し回数を最小化しています。

// Embeddingsキャッシュ付き会話データ構造 { "chat_1234567890": { "title": "太郎さんとの打ち合わせについて", "messages": [ { "role": "user", "content": "太郎さんはいつ来ますか?", "timestamp": "2025-01-27T10:00:00.000Z", "embedding": [0.1, -0.3, 0.8, ...] // 1536次元ベクトル }, { "role": "assistant", "content": "太郎さんは明日午後2時に到着予定です。", "timestamp": "2025-01-27T10:00:05.000Z" } ], "createdAt": "2025-01-27T10:00:00.000Z" } } // LocalStorageに保存(Embeddings含む) localStorage.setItem('chats', JSON.stringify(chats));

プライバシー保護とパフォーマンス向上

サーバーに会話データを保存しないため、ユーザーのプライバシーが完全に保護され、GDPR等の法的リスクも回避できます。また、Embeddingsキャッシュにより、同じメッセージに対するEmbeddings生成を省略し、レスポンス速度を向上させています。

実際のコスト効果

Embeddingsによる劇的なコスト削減効果

意味的に関連する履歴のみを選択して送信することで、会話品質を維持しながら大幅なコスト削減を実現します。

  • 従来手法(全履歴送信)
    会話回数に比例してトークン数が増大 → 指数関数的コスト増
  • Chapl!手法(Embeddings選択)
    意味的関連性で最適な履歴のみを選択 → 一定コストを維持
  • 削減効果
    90%削減 → 意味理解精度向上と大幅コスト削減を両立

使用モデルについて

なお、Chapl!ではテキストのみのAI会話において最も安価なGPT-4.1-nanoモデル($0.10/100万トークン)を採用しており、このEmbeddingsによる最適化と組み合わせることで、極めて効率的な運用を実現しています。

使用技術スタック

フロントエンド

  • JavaScript ES6+
    LocalStorage操作、Embeddings API呼び出し、リアルタイム文字数制御
  • HTML5 + CSS3
    レスポンシブ対応、SPA実装

バックエンド

  • PHP
    OpenAI API プロキシ
  • OpenAI API (GPT-4.1-nano)
    AI応答生成(最小トークンで最大品質)
  • OpenAI Embeddings API
    テキストのベクトル化、意味的類似度計算

まとめ:Embeddingsが実現する持続可能なAIサービス

Chapl!は「Embeddingsによる革新的な履歴管理」を核心技術として、従来の指数関数的コスト増大という根本課題を解決した実用的なシステムです。

革新的価値:
• Embeddingsによる意味的関連履歴の自動選択
• 指数関数的コスト増大の完全解決
• 会話回数に関係なく一定コストを維持
• LocalStorageによるサーバーレス設計
• 高品質な会話体験の維持
• ユーザープライバシーの完全保護

このEmbeddings技術により、長期利用ユーザーが増えても運営コストが爆発的に増加しない、真に持続可能な無料AIチャットサービスを実現しています。