【要約】SurrealDBを活用して、過去の会話を取りこぼさないAIChatを作ってみた [Zenn_Python] | Summary by TechDistill
> Source: Zenn_Python
Execute Primary Source
// Problem
AIチャットボットの開発において、ユーザーとの過去の対話内容を適切に保持し、文脈を維持することが困難であるという課題がある。開発者は、単なる履歴の保存だけでは、過去の特定の話題を再開した際に情報を引き出せない問題に直面した。
- ・従来の時系列ログ管理では、情報の検索が時間軸に依存しすぎる。
- ・会話が長くなるほど、関連するコンテキストのみを抽出するコストが増大する。
- ・ユーザーの断片的な発言から、過去の類似した話題を特定する仕組みが不足している。
// Approach
開発者は、SurrealDBのマルチモデル機能を活用して、会話をグラフ構造として管理する手法を採用した。概念を介して会話同士を接続することで、意味的な繋がりを持たせている。
- ・Conversation(会話履歴)とConcept(抽出された概念)をノードとして定義する。
- ・LLMを用いて発言から主要なキーワードを抽出し、ベクトルデータとして保存する。
- ・ベクトル類似度検索を行い、閾値0.7を超えた場合に既存のConceptノードへリレーションを張る。
- ・グラフ構造を介して、特定のConceptに関連する過去のConversationをコンテキストとして取得する。
// Result
構築したシステムにより、ユーザーの断片的な発言から過去の関連情報を正確に引き出すことに成功した。これにより、AIが「親しい友人」のように過去の出来事を覚えている体験を実現している。
- ・「シャンプーの話」といった短い入力から、過去の具体的なエピソードを想起できる。
- ・会話を重ねるほど、Conceptをハブとした網目状の記憶構造が形成される。
- ・アプリを再起動した後でも、グラフ走査によって自然な文脈の引き継ぎが可能となった。
Senior Engineer Insight
> SurrealDBの特性を活かした、非常に筋の良いアーキテクチャである。グラフとベクトル検索を単一のDBで完結させる点は、データ整合性と開発速度の面で大きな利点となる。ただし、大規模運用ではConcept抽出のLLMコストと、グラフの次数が増大した際のクエリレイテンシがボトルネックになる。実戦投入には、Conceptのライフサイクル管理と、検索範囲を限定するインデックス戦略が不可欠だ。