
面影AIのソースコードについて
記事内でのソースコードの管理が非常に煩雑になってきたため、今後はGitHubで一元管理することに決めました。
この記事で紹介しているプロジェクトの完成版ソースコードは、以下のGitHubにて公開しています。
🔗 GitHubでソースコードを確認する
「記憶するAI」という言葉には、どこか重々しさが漂います。しかし、今回構築するシステムの本質は、とても素朴なものです。
大切な人が話してくれた言葉や価値観を、将来AIが“思い出す”ための仕組みを、どのように分けて考えるか──それが今回のテーマになります。
面影AIは、誰かを再現するシステムではありません。
本人そのものではなく、ただ残された言葉や記録をもとに、「その人ならこう答えるかもしれない」と想像するための装置です。
技術で心を救おうとするこの挑戦は、本物ではないと理解したうえで、それでも対話したいと願う人のために存在しています。
本記事は中編にあたります。まだ前編をお読みでない方は、先にこちらをご確認ください。
面影AI
🟡 面影AI
📌 忘れたくない想いを、AIが記憶する──過去の声と、もう一度向き合うために。
├─いつか消える面影を、繋ぐ未来をAIに託す挑戦【ChatGPT】
├─【Pythonの基礎知識】Phase構成で考える、記憶する面影AIの設計思想【ChatGPT】
├─【Pythonの基礎知識】面影AIを記録する|Phase1:記憶と重みの保存構造【ChatGPT】
└─【Pythonの基礎知識】記憶から応答するAIを作る|面影AI Phase2【ChatGPT】
🟦 面影AIにおける2つのPhaseとは何か

面影AIは、機能的に「Phase1」と「Phase2」に分けて構成しております。
Phase1は記録フェーズ、Phase2は応答フェーズという役割分担を行うことで、AIが「蓄積」と「活用」を混在させない構造を実現しています。
この設計により、処理の責任範囲が明確になり、将来的な機能追加やデータ構造の変更にも柔軟に対応できるようになっております。
また、Phase1は「対象者が生きている間の記録フェーズ」、Phase2は「記録された情報を元に応答を行うフェーズ」として、時間軸にも明確な対応関係を持たせています。
構成図として「Phase1/Phase2 アーキテクチャ」を挿入し、それぞれの処理フローを視覚的に整理することで、設計全体の理解を促します。
Phase1:記録を残すための蓄積フェーズ
Phase1では、対象となる人物や情報の発言・メッセージを蓄積することに特化しております。

番号 | 構成要素 | 役割・説明 |
---|---|---|
① | スマートフォン(LINEアプリ) | ユーザーがメッセージを送信する入口となります |
② | LINEプロバイダー(Messaging API) | 送信されたメッセージをLINEプラットフォームが受信し、登録されたWebhook先に転送します |
③ | VPS上のFlaskアプリ(ログ受信API) | Webhookリクエストを受け取り、対象ユーザーの発言であるかを判定します |
④ | ChatGPT(カテゴリ分類) | 対象メッセージをもとに、ChatGPTがカテゴリ(例:家族・仕事・感情など)を1単語で判定します |
⑤ | 分類結果の受信 | ChatGPTから返されたカテゴリを受け取り、メッセージ内容と一緒にDBへ保存する準備を行います |
⑥ | 人格ログDB | カテゴリ付きでメッセージを保存します(例:content, category, timestamp など) |
⑦ | (処理なし) | このフェーズでは応答生成は行われず、あくまで「記録のみ」が行われます |
⑧ | (処理なし) | 以降の応答生成などの処理はPhase2にて実施されます |
LINEなどのチャネルから受け取った発言を、そのまま記録データとして保存し、属性情報(日時や発言者など)を付加することで、あとから検索・分類が可能な形に整理していきます。
Phase2:記憶を活用して応答を生成するフェーズ
Phase2では、蓄積された記録情報を活用し、ChatGPTなどのAIモデルを通じて応答を生成します。

番号 | 構成要素 | 役割・説明 |
---|---|---|
① | スマートフォン(LINEアプリ) | ユーザーが対話を開始するためにメッセージを送信します |
② | LINEプロバイダー(Messaging API) | メッセージを受信し、Webhook経由でVPSのFlaskアプリに転送します |
③ | VPS上のFlaskアプリ | メッセージを受け取り、対象ユーザーの人格ログを検索する処理に移ります |
④ | 人格ログDB | ユーザーの過去発言を記録したDBから、応答に必要な情報を抽出します |
⑤ | プロンプト生成モジュール | 抽出されたログをもとに、ChatGPTに渡すプロンプト(指示文)を組み立てます |
⑥ | ChatGPT API | プロンプトに基づいて、記録に沿った応答文を生成します |
⑦ | LINE応答送信処理 | 生成されたメッセージをLINEに返すための処理を行います(VPS内) |
⑧ | 人格ログベースの送信中継(VPS → LINE) | 応答内容をVPSからLINEプロバイダーへ中継します |
⑨ | 人格ログベースの送信中継(LINE → Web) | LINEプラットフォーム内で、応答データをユーザー端末へルーティングします |
➓ | 人格ログベースの送信(スマートフォン) | 最終的に、ユーザーのLINEアプリに応答が表示されます |
このフェーズでは、過去の発言ログから適切な記録を抽出し、それをプロンプトに組み込んで応答を生成する処理が中心となります。
対話における一貫性や、記録された言葉の“らしさ”を保つことを重視しながら、あくまで仮想的な対話体験を実現するための構成となっております。
🟩 Phase1:人格ログの蓄積フェーズ
Phase1では、ユーザーの発言や価値観を「ログ」として蓄積することに専念します。
この段階では、対話の応答などは一切行わず、メッセージを記録・分類するだけの静的な構造となっています。
目的は、対象ユーザーが生きている間に、その思考や感情の“かけら”を体系的に保存しておくことです。 それにより、Phase2においてAIがその人格の一部を再現するための根拠データが形成されます。
構成図として「Phase1 実装構成図」を挿入し、以下の構成要素がどのように連携して記録処理が完了するのかを視覚的に理解できるようにします。
Phase1の処理構成と保存対象
以下は、Phase1における処理の全体像を表形式で整理したものです。図中の①〜⑥までの構成要素をすべて明示し、特に⑤と⑥では処理が存在しないことも明記しています。

番号 | 構成要素 | 役割・説明 |
---|---|---|
① | スマートフォン(LINEアプリ) | ユーザーが任意の発言を送信します |
② | LINEプロバイダー(Messaging API) | メッセージを受信し、設定されたWebhook URLへ転送します |
③ | ChatGPT API(カテゴリ分類) | 発言内容をもとにChatGPTがカテゴリを自動判定します(出力は1単語) |
④ | Flaskアプリ(/train エンドポイント) | イベントを解析し、user_id・message・category・timestampをDB保存形式に整形します |
⑤ | 人格ログDB | カテゴリ付きで記憶として保存されます(content / category / timestamp など) |
⑥ | スマートフォン(LINEアプリ) | このフェーズではユーザーに返信されず、記録処理のみで完了します |
保存対象データの項目と役割
Phase1で蓄積されるログデータには、以下のような項目が含まれます。これらの情報は、後にプロンプトの一部として利用されるため、整理された形で保存しておくことが重要です。
項目名 | 内容 | 備考 |
---|---|---|
user_id | 送信元ユーザーを識別するためのID | LINEのuserIdを使用 |
message | ユーザーが送信した本文 | 感情・思考の断片 |
timestamp | メッセージを受信した日時 | ログの時系列処理に使用 |
tags | 発言に含まれる感情や分類ラベル | 「怒り」「励まし」「人生観」など |
このフェーズで蓄積された情報こそが、後のPhase2で「人格として語らせるための核」になります。 静的で地味な処理に見えても、人格AIの品質を決定づける最も重要な土台です。
🟥 Phase2:記憶を使って応答するフェーズ
Phase2では、Phase1で蓄積した情報をもとに、ChatGPTを使って応答を生成します。
ユーザーがLINEで発言すると、LINEからのWebhookがトリガーとなり、VPS上のFlaskアプリがDBから人格ログを取得します。
そのログはプロンプトとして整形され、ChatGPTへ渡され、自然な応答文として出力されます。
このフェーズにおいて、Flaskは通信処理と構成制御の役割を担い、ChatGPTは人格に沿った応答を生成する役割に集中しています。
応答の品質と構成制御を完全に分離することで、障害が発生した場合の保守性や再現性が向上し、安全かつ拡張性のある運用が可能になります。
Phase2の処理構成と全体フロー
構成図として「Phase2 実装構成図」を挿入し、以下の処理フローと役割を明確にします。

以下は、Phase2におけるすべての処理構成を図中の番号に基づいて表形式で整理したものです。
番号 | 構成要素 | 役割・説明 |
---|---|---|
① | スマートフォン(LINEアプリ) | ユーザーが対話メッセージを送信します |
② | LINEプロバイダー(Messaging API) | ユーザーのメッセージをWebhookでFlaskアプリに転送します |
③ | Flaskアプリ(/replyエンドポイント) | LINEからのPOSTリクエストを受信し、ユーザーIDをもとに人格ログDBを参照します |
④ | 人格ログDB | 対象ユーザーの過去ログを検索し、応答生成に必要な記録を取得します |
⑤ | プロンプト生成(Flaskアプリ) | 取得したログをもとに、ChatGPT APIに渡すプロンプトを生成します |
⑥ | ChatGPT API(OpenAI) | 生成されたプロンプトに基づき、自然言語による応答メッセージを出力します |
⑦ | FlaskアプリからLINEへ応答送信 | ChatGPTからの応答をLINEプロバイダーに中継します |
⑧ | スマートフォン(LINEアプリ) | ユーザーのLINEアプリに応答メッセージが表示されます |
Phase2は、対話体験としては表に出るフェーズですが、その裏側ではPhase1で蓄積されたログが常に“人格の根”として機能しています。
この2つのフェーズが連動することで、単なる会話ではなく“誰かが返してくれている感覚”が実現されます。
🟪 「人格」とは何か──抽象化された記憶の考え方
本プロジェクトでは、「人格」を完全に再現することを目的としておりません。
過去に残された言葉や記録をもとに、その人ならこう答えるかもしれないという“仮想的な記憶”を生成する設計となっています。
ここでいう「人格」とは、脳や魂といった概念ではなく、言葉の選び方・語調・価値観などを含んだ“記録上の一貫性”のことを指します。
応答の正確性ではなく、むしろ曖昧さや癖のような“その人らしさ”がにじみ出ることのほうが、面影AIにおいては重要です。
あくまでこれは継承された情報であり、模倣でもシミュレーションでもありません。
現実の人物とは異なる存在であることを前提にしつつ、それでもなお「どこかで聞いたことがある」と感じられるような、感覚的な再現を目指しています。
人格を構成する情報は“言葉”そのもの
面影AIでは、人格を定義するために特別なパラメータやラベルを使っているわけではありません。
あくまで対象者の言葉そのものがログとして保存され、それがプロンプトの一部に組み込まれることで応答に反映されます。
したがって、どの言葉を保存するか、どのように分類しておくかが、人格の印象を左右する大きな要因になります。
特定の感情やテーマに偏ったログしか残っていなければ、当然その偏りが応答に反映される構造です。
これはAIによる再現というよりも、「残された言葉に支えられて、もう一度対話を試みるための装置」と捉えていただいたほうが近いかもしれません。
🟧 設計思想としてのPhase構成:分けることで守る
フェーズを分けることは、開発や運用の効率化だけでなく、倫理的な境界線を明確にするという重要な役割を担っています。
すべてを一括で処理してしまう構成では、記録と応答の区別が曖昧になり、ログの改ざんや誤解を招く恐れがあります。
そのため本プロジェクトでは、「記録」「保存」「応答」をそれぞれ別フェーズに分離することで、処理責任を明確にし、システムとしての信頼性と説明責任を両立させる構造としました。
また、フェーズを切り分けることで、目的ごとに独立した機能改修が可能になります。例えばPhase1の記録方式だけを変更したり、Phase2で用いるAIのバージョンを切り替えたりする際に、他の構成に影響を与えることなく運用を続けることができます。
フェーズ分離によって守られる3つの軸
フェーズ設計は、システム設計上の利点だけでなく、利用者・記録者・管理者というそれぞれの立場を守ることにもつながります。 以下の表は、分離によって確保される3つの軸を整理したものです。
守られる軸 | 具体的な分離対象 | 目的 |
---|---|---|
技術的安全性 | 記録処理と応答処理 | 不具合時の切り分けと再現性を確保する |
倫理的明確性 | 人格ログの保存と利用 | 「誰のための記録か」「誰が使うのか」を明確にする |
運用上の柔軟性 | フェーズ単位での改修 | 一部機能だけを差し替え可能にする |
今後の拡張フェーズを見据えた設計
このPhase構成は、現時点での記録・応答にとどまらず、将来的な拡張を見越して設計されています。
例えば、記録された人格ログを第三者と共有するPhaseや、感情表現を強化するPhase、あるいは視覚的に出力するPhaseなど、分離された構造があるからこそ柔軟な展開が可能になります。
設計において「すべてを1つにまとめない」という方針は、制御可能性を高め、長く使える仕組みとして成長させるための土台になります。
Phase1とPhase2を分けた理由
Phase1(記録)とPhase2(抽出・再構成)を分けることで、それぞれの処理に専念でき、システム全体の保守性と拡張性が大幅に向上します。これにより、データの質を保ちつつ、多様な用途に対応した柔軟な記憶管理が可能となります。
- 冗長性の排除とデータ精錬の分離
記録段階(Phase1)は忠実な蓄積に専念し、フィルタやノイズ除去は後工程(Phase2)に委ねられるため、記憶の劣化を防げます。 - 再利用性の確保(複数視点で再抽出可能)
一度記録すれば、Phase2で異なる軸・目的での抽出・構成が何度でも可能。Phase1を「生素材」として多目的に使い回せます。 - リアルタイム性と精度のトレードオフ調整
Phase1はリアルタイム記録に最適化し、Phase2は非同期処理による高精度な処理・再構築が可能です。 - ロジックの独立性が高く、改善・最適化が柔軟
Phase2の抽出ロジックや精度を向上させる際、Phase1の蓄積構造を一切変更せずに済むため、設計・保守が容易です。 - 安全性の確保(公開データと非公開データの明確化)
Phase2で匿名化・加工処理が可能なので、生データは外部公開せず、抽出結果だけを扱えます。 - 感情と意味の乖離の補正が可能
Phase1では主観や情動に忠実に記録し、Phase2では文脈や意図に沿って意味的再構成が可能。AIが言葉尻で判断しないよう設計できます。 - 時間軸・連続性の処理が可能になる
Phase2で連続する記録をまとまりとして抽出(イベント単位)できるため、単文処理では不可能な意味の理解が可能です。
逆に分けなかった場合の問題点は以下の通りです。
- その場で使える情報しか記録できず、再処理が不能になる。
- 文脈の再解釈ができず、意味の取り違えが起きる。
- 精度を上げるために過去全体を捨てて再学習が必要になる。
- 改善やロジック差し替えのたびに全データ再取得が必要になる。
なお、実際の運用においては、Phase1とPhase2は物理的に分離せず、同じLINEチャネルおよびWebhookエンドポイントで共用するのが一般的です。
環境変数(.envファイル)のモード設定により、「記録モード」と「応答モード」を切り替えて処理を制御するため、複数のチャネルやWebhook URLを用意する必要はありません。
これにより、運用負荷や設定の複雑さを軽減し、管理が容易になります。
🟨 利用方法と応用例:面影AIをあなたの生活に取り込むなら
本プロジェクトは、特定の個人や家庭に限定されるものではなく、「記憶を継承したい」というすべての人に向けて設計されています。
その対象は、身近な家族だけにとどまらず、大切な仲間や指導者、あるいは日常的に癒やしをくれた存在まで幅広く応用することが可能です。
LINEという身近なツールを入口としながらも、その内部には個別の人格ログが記録・保管され、ChatGPTと連携することで応答を生成できる構成となっております。
これにより、専門的な知識がなくても、誰でも自分の身近な人との「記憶の対話空間」を作り出すことができます。
面影AIが活用できる具体的なシーン
以下は、面影AIを活用できる具体的なシーンや対象を一覧にしたものです。日常や人生の節目など、さまざまな場面において「対話を継続する」ための手段として応用できます。
活用シーン | 対象 | 活用の目的・効果 |
---|---|---|
日常の記録 | 親子・家族 | 成長記録や思い出の継承として活用 |
人生の節目 | 師匠・恩師 | 過去の助言や価値観を思い出す手段として活用 |
精神的支え | パートナー・友人 | 孤独感の緩和や、心の整理に活用 |
癒しと回想 | 亡きペット | 過去の行動ログを用いて癒やしと再接続を試みる |
看取り・介護 | 高齢の家族 | 徐々に失われる記憶の補完として活用 |
個人用途に留まらない可能性
面影AIはもともと個人利用を想定して設計されていますが、記録フェーズと応答フェーズを明確に分離しているため、法人や福祉・教育分野などへの応用も十分に可能です。
たとえば、施設入所中の高齢者と家族との間にある「記憶の橋渡し」や、特別支援教育における個別対応記録の再活用など、用途はさらに広がっていくと考えられます。
今後の発展においても、「記憶は1人のものではなく、誰かに託すことで継承できる」という思想が、面影AIの中心にあり続けます。
📝 LINEやChatGPTの設定についての補足
面影AIの構成では、LINE Developersでのチャネル設定や、OpenAIのChatGPT APIとの連携が必要になります。 しかし本記事では、設計思想とフェーズ構成の考え方に集中して解説しているため、環境構築や技術的な設定手順については詳細を省略しております。
初めてLINE Messaging APIやChatGPT APIを利用される方、もしくは開発環境の構築に不安がある方は、以下のリンク先の記事をご参照ください。
上記の構築マニュアルでは、VPS環境の立ち上げから、Flaskアプリの構成、LINEとのWebhook連携、ChatGPTとの接続方法までを順序立てて解説しております。
技術的な設定が必要な方はこちらの記事へ
LINEやChatGPTの連携を初めて行う方向けに、具体的なコマンドや設定手順を含めた構築ガイドを公開しています。 環境構築やAPI接続に関する内容は、以下の記事をご確認ください。
参考記事 | 内容 |
---|---|
【Pythonの基礎知識】AI執事ボットのためのVPS環境構築マニュアル(LINE対応付き) | LINE DevelopersとChatGPTを連携させる構成・手順を解説しています |
なお、上記の記事にはGoogleカレンダー連携に関する構成も含まれておりますが、面影AIでは使用しておりません。
Google連携部分は読み飛ばしていただいて構いません。
🧩 まとめ:記憶を“使える”ようにするための構造化された思想
面影AIの設計思想は、「記憶を記録すること」と「記憶を呼び出すこと」を切り分け、それぞれに明確な役割を与えることにあります。
このPhase構成によって、システム全体の責務が整理され、ユーザーにとっても仕組みの理解がしやすくなっています。
また、技術的な構成を分離することで、応答の信頼性や保守性、将来的な拡張性も高めることができました。
仮想的な人格を扱う以上、技術的な正しさだけでなく、倫理的な設計判断も欠かせません。
本記事では、そうした構造的な思想に焦点を当てながら、面影AIの全体像と設計の考え方をご紹介してきました。
次回はコードとともに実装編へ
次回の後編では、今回紹介したPhase1とPhase2の構成を実際にどのようにコードで実現するのかを解説いたします。
Flaskアプリの構成、LINE Webhookの受信処理、ChatGPT APIへの接続、そして人格ログDBの設計まで、全体のソースコードを含めて順を追って解説していきます。
構造と思想を理解した今だからこそ、そのコードが「何のために、どこで、どう動いているのか」を明確に読み解くことができるはずです。
次は、実際に記憶を保存する仕組みの構築へ──Phase1として「記憶」と「重み」をどう記録するかを実装していきます。
>【Pythonの基礎知識】面影AIを記録する|Phase1:記憶と重みの保存構造