Day 10 整理了 Chat API 的基本流程:
使用者輸入訊息
→ 後端接收
→ AI 產生回覆
→ 儲存對話
→ 回傳前端
但其中還有一個很重要的問題:
聊天內容到底要怎麼存?
如果只是把整段對話直接存成一大段文字,短期看起來很簡單,但後面要做 Memory、Context、搜尋紀錄或重新分析時,就會變得很難使用。
所以在 VoCare 裡,我們會把聊天資料拆成兩個主要概念:
Conversation 和 Message。
Conversation 可以理解成一次聊天工作階段。
例如長者晚上打開 VoCare,和 AI 聊了十分鐘,這整段互動就可以視為一個 Conversation。
一筆 Conversation 可以保存:
它本身不一定需要保存所有聊天文字,而是負責表示:
這些訊息屬於同一次對話。
Conversation 裡面真正的聊天內容,則會拆成一筆一筆的 Message。
例如:
長者:
我以前很常去釣魚。
AI:
那你以前最常去哪裡釣魚?
長者:
以前常跟公司的朋友一起去。
這三句話可以分別存成三筆 Message。
每一筆 Message 至少可以包含:
其中「發送者」可以用來區分:
這樣系統就知道哪一句是長者說的,哪一句是 AI 回覆的。
拆成 Conversation 和 Message,最主要的原因是:
後面的功能需要使用單一訊息。
例如未來做 Memory Extraction 時,系統可能要從某幾句話裡找出:
興趣:釣魚
或者做近期狀況分析時,要找到:
最近睡不好
如果整段聊天全部混在同一欄位裡,每次都必須重新分析整段內容。
但如果訊息是一筆一筆保存,就可以直接知道:
是哪一則 Message 產生了這筆 Memory 或 Status Event。
這也讓資料之間可以建立清楚的關係。
兩者的關係可以簡化成:
User
→ Conversation
→ Message
一位長者可以有很多次 Conversation。
而每一個 Conversation 裡,又會包含很多筆 Message。
例如:
User 001
→ Conversation A
→ Message 1
→ Message 2
→ Message 3
→ Conversation B
→ Message 4
→ Message 5
這樣之後不管是要查看某一天的聊天、搜尋某一句內容,或分析某一次對話,都會比較容易。
Conversation 和 Message 保存的是:
原始聊天紀錄。
Memory 保存的則是:
從聊天中整理出來的長期資訊。
例如原始 Message 是:
「我以前很喜歡跟朋友去釣魚。」
系統之後可以從這句話整理出:
類型:興趣
Memory:喜歡釣魚
所以兩者不能混在一起。
可以理解成:
Message = 長者實際說過什麼
Memory = 系統從裡面整理出什麼
而 Memory 最好還能保留來源 Message ID。
這樣未來就能追蹤:
這筆記憶到底是從哪一句話產生的。
保存 Conversation 和 Message 還有另一個目的,就是建立 Context。
例如 AI 回答之前,可以取得:
再搭配長期 Memory 一起提供給 AI。
所以 Conversation / Message 不只是「聊天紀錄」。
它其實也是後面:
Memory、Context、個人化回覆與狀況分析的基礎資料。