[๐ ] Log Pengembangan Keymory #8: Membangun Sistem Kata Kunci Emosi DiaryPage, Pengaturan Karakter AI Comment
โจ Ringkasan GPT ใ
Fitur pemilihan kata kunci emosi ditambahkan ke DiaryPage, lalu respons yang lebih natural diimplementasikan dengan menerapkan pengaturan karakter pada AI Comment.
๐ป Log Pengembangan
โฐ Yang Dikerjakan Hari Ini
- โ
DiaryPage: menambahkan ChoiceChip dan TextField
kata kunci emosi- โ Membuat widget
- โ
Menambahkan diaries DB Field: mood_keywords (
List <String>), mood_keywords_description (String) - โ
Menambahkan diaries Page State: moodKeywordsSelected (
List <String>) - โ
OnPageLoad: mengirim variable yang baru ditambahkan
- โ
ChoiceChipRate(5~1): mengirim nilai diariesDoc.mood_keywords ke masing-masing ChoiceChip yang sesuai.
- MoodKeywordRate5Options, โฆ, MoodKeywordRate1Options
List <String>didefinisikan sebagai nilai App Constant- Enum hanya mendukung bahasa Inggris, jadi perlu fitur terjemahan. Terlalu rumit, maka ditolak.
- Define Options Var: AppConstant.moodKeywordRate5Options (
List <String>) - Initially Selected: updateChoiceChipSelected
- MoodKeywordRate5Options, โฆ, MoodKeywordRate1Options
- โ
Membuat CustomFunction
updateMoodKeywordsSelected- On Page Load: Select all matching items in RateOptions List
List<String> updateChoiceChipSelected( List<String> moodKeywordsSelected, // daftar keyword yang sedang dipilih List<String> moodKeywordRateOptions, // opsi yang bisa dipilih untuk Rate saat ini ) { // Buat daftar baru untuk menjaga immutability return List<String>.from( moodKeywordsSelected.where((item) => moodKeywordRateOptions.contains(item)) ); }
- โ
ChoiceChipRate(5~1): mengirim nilai diariesDoc.mood_keywords ke masing-masing ChoiceChip yang sesuai.
- โ
On ChoiceChip Selected: Update Page State
moodKeywordsSelected-> Set Value toReturn of Func updateMoodKeywordsSelected- โ
Membuat CustomFunction
updateMoodKeywordsSelected- On Chip Select: Add to moodKeywordsSelected
- On Chip Deselect: Remove from moodKeywordsSelected
List<String> updateMoodKeywordsSelected( List<String> moodKeywordsSelected, List<String> choiceChipSelected, List<String> moodKeywordRateOptions, ) { // Salin daftar yang ada untuk menjaga immutability List<String> updatedList = List.from(moodKeywordsSelected); // 1๏ธโฃ Hapus nilai dari pilihan lama yang termasuk Rate ini updatedList.removeWhere((item) => moodKeywordRateOptions.contains(item)); // 2๏ธโฃ Tambahkan nilai ChoiceChip yang sedang dipilih updatedList.addAll(choiceChipSelected); return updatedList; }
- โ
Membuat CustomFunction
- โ
(Issue) DiaryPage - AI Comment: pengaturan karakter
- Menambahkan diaries DB Field: ai_comment_by (Doc Ref: Character)
- DiaryPage - AICommentEditor Component - Return
ai_comment_content+ai_comment_by- How? -> membuat DataType
aiCommentPageReturnObject
- How? -> membuat DataType
- On ChoiceChipChar Selected: Backend Query Character Doc with same Official_name value.
- โ
(Issue) HomeFeedPage - FeedCardDiary: menerapkan gambar karakter AI Comment dengan benar
- โ DiaryPage - AI Comment: saat Save, simpan juga Ref karakter yang menulis komentar ke Diary.
- โ HomeFeedPage - FeedCardDiary - AI Image: muat Character Doc dengan Backend Query lalu tentukan Image Path.
- โ
(Issue) HomeFeedPage - FeedCardDiary: Unexpected Null Value Error
- Ini muncul kalau hanya memasukkan nilai Path ke Image Widgetโฆ
- Ah!!! Ternyata terjadi karena Default Variable Value belum dimasukkan. Baru sadar setelah susah payah.
- ๐ก Yang dipelajari
- Biasakan untuk selalu memasukkan Default Value. Entah sudah berapa kali melihat Unexpected Null Value Error di mana-mana.
- Ini muncul kalau hanya memasukkan nilai Path ke Image Widgetโฆ
- โ
Design Action chains for
CreateNewChatFromDiary(Start From: setelah proses AI Comment dan penyimpanan diary selesai)- Create Diary
- API Call: createDiarySummary -> Output Var: OutVar1 (nama sementara)
- Create New Chat Document
- Create New Message Document: {โroleโ:โdeveloperโ, โcontentโ:โ$systemprompt + $OutVar1โ}
- API Call: createChatFromDiary -> Output Var: OutVar2 (nama sementara)
- Create New Message Document: {โroleโ:โassistantโ, โcontentโ: โ$OutVar2โ}
- Navigate To: kirim relevant Chat Document Reference sebagai chatRefParam
๐ฏ Ringkasan yang Sudah Dikerjakan
- Membangun sistem kata kunci emosi DiaryPage
- Menambahkan ChoiceChip dan TextField
- Menambahkan field terkait kata kunci emosi ke diaries DB
- Mengimplementasikan fungsi
updateMoodKeywordsSelected
- Pengaturan dan penerapan karakter AI Comment
- Menambahkan field
ai_comment_byuntuk menyimpan karakter komentar - Mengubah AICommentEditor agar menyertakan informasi karakter
- Saat ChoiceChip dipilih, data karakter terkait dimuat dengan Backend Query
- Menambahkan field
- Menyelesaikan error gambar AI Comment di HomeFeedPage
- Menyimpan nilai referensi karakter saat menulis AI Comment
- Memperbaiki cara loading gambar karakter AI Comment di HomeFeedPage
- Memperbaiki error Unexpected Null Value (dengan menerapkan nilai default)
๐ฏ Rencana Berikutnya
Klik untuk melihat detail
-
โ (Issue) DiaryPage: gunakan markdown viewer (mencegah overflow: Container Height)
-
โ DiaryPage: ubah Emoji ekspresi wajah dan warna sesuai nilai Mood Slider
- โ Membantu membuat Custom Function -
systemPromptTemplate(pekerja utama: KSK)- โ Rapikan parameter yang akan ditambahkan
- โ Custom Function - uji apakah
getAICommentbenar-benar diterapkan- โ Cek apakah input value tercermin dengan benar
- โ Cek apakah output value tercetak dengan benar sebagai String
- โ Chat Page - Create New Chat: terapkan system prompt
- โถ๏ธ Implementasi OpenAI API Call: createChatCompletion
- Input: System Prompt (Chat)
- Output: New Chat Message by AI ($.choices[0].message.content)
- Additional Actions: Create New Chat, Create New Message
- โถ๏ธ Implementasi OpenAI API Call: createChatCompletion
- โ DiaryPage - Create New Chat by Diary: membuat New Chat berdasarkan isi diary
- โ Implementasi OpenAI API Call: createDiaryComment
- Input: Diary Content, System Prompt (AI Comment)
- Output: AI Comment ($.choices[0].message.content)
- โ Implementasi OpenAI API Call: createDiarySummary
- Input: Diary Content, AI Comment, System Prompt (Diary Summary)
- Output: Diary Summary ($.choices[0].message.content)
- โ Implementasi OpenAI API Call: createChatFromDiary
- Input: Diary Summary, System Prompt (Chat From Diary)
- Output: New Chat Message by AI ($.choices[0].message.content)
- Additional Actions: Create New Chat, Create New Message
- โ Implementasi OpenAI API Call: createDiaryComment
- โ ChatPage - Create New Diary: membuat New Diary berdasarkan isi percakapan
- โ Implementasi OpenAI API Call: createChatSummary
- Input: Chat Content, System Prompt (Diary From Chat)
- Output: Chat Summary
- โ Implementasi OpenAI API Call: createDiaryFromChat
- Input: Chat Summary, System Prompt (Diary From Chat)
- Output: New Diary (Title, Content, Mood score)
- โ Implementasi OpenAI API Call: createChatSummary
-
โ ChatPage: Go to Linked Diary
- โ MoodPage (atas) - Mood Calendar
- โ Bisa mengecek jumlah post yang ditulis per tanggal
- โ Saat tanggal diklik, pindah ke tanggal tersebut
- โ MoodPage (bawah) - Mood stats
- โ Tampilkan statistik terkait bulan yang sedang difokuskan
- โ Tampilkan komentar AI terhadap statistik yang muncul
- โ Tampilkan statistik terkait bulan yang sedang difokuskan
- โ HomeFeedPage - import dan terapkan flutter_slidable:4.0.0
-
โ HomeFeedPage: saat slide kiri/kanan dari FeedCardDiary, tampilkan chat/edit/delete
- โ ChatPage: ratakan output percakapan user ke kanan
-
โ Chat/Diary: GPT Streaming API
- โ ChatPage - implementasi pesan pertama dari AI (Alarm/Notification)
- Inti dari chat system prompt adalah sifat proaktif.
- Agar terasa lebih nyata, mungkin bagus juga mengirim create_date of diary/chat, supaya AI bisa menyebut tanggal seperti โkemarin.โ
- Referensi implementasi Alarm
- Inti dari chat system prompt adalah sifat proaktif.
- โ DiaryPage: tambahkan Choice Chips untuk kata kunci emosi detail dan atur integrasi DB
- โ DiaryPage - AI Comment: sesuaikan input seperti Choice chips dan mood slider agar cocok dengan
AI Comment System Prompt.- โ **
diarysebelumnya atau seluruhconversation history(technical debt tambalan) - โ informasi dasar pengguna: nama, gender, MBTI, โฆ
- โ kata kunci emosi detail: senang, sedih, โฆ
- โ pengaturan karakter: Somi, Sena, Minhyuk
- โ skor emosi: 1~100 poin
- โ format jawaban: Healing, Suggestion, Informative
- โ panjang jawaban: pendek, normal, detail
- is New Chat
- Karena messages untuk Chat ini dibuat pertama kali, berikan nilai
is_initial = truepada message document pertama dan masukkan semua system prompt.- is_initial = false
- Batasan: kalau system prompt dimasukkan ke message document paling awal, memang sulit diubah di tengah percakapan, tetapi masih mungkin. Kalau ada document dengan is_initial = true dan isinya diubah, document itu bisa dihapus lalu dimasukkan lagi. Caranya belum tahu, tapi bisa saja.
- Karena messages untuk Chat ini dibuat pertama kali, berikan nilai
- โ **
- โ DiaryPage - AI Comment: selesaikan CRUD
- โ hapus field tmp_ai_comment dan gunakan doc_ref
-
โ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time
-
โ DiaryPage - import dan terapkan Interactive Slider
-
โ HomeFeedPage: implementasi fitur Search Diary
-
โ AuthPage: implementasi Google Login
- โ HomeFeedPage - Bottom Sheet (
+Button): buat agar bisa memilih 1 dari beberapa opsi- Diary baru: Go to DiaryPage
- Catatan emosi: Go to MoodPage
- โ MoodPage (popup): CRUD slider pengaturan Mood
- Create
- Read
- Update
- Delete
- โ HomeFeedPage - ListView - tampilkan FeedCardMood
-
โ HomeFeedPage - ListView: urutkan komponen FeedCardDiary, FeedCardMood, FeedCardChat secara kronologis (menggunakan Cloud Function)
-
โ Membuat MoodEditPage di antara HomeFeedPage dan DiaryPage: pindahkan MoodSlider, MoodKeywordsRate(5~1), MoodDescription widget, dan sebagainya
- โ Ekstrak dan instal APK versi final untuk presentasi sampai
Rab 2025.2.5
๐ญ Diary
Rasanya technical debt tumbuh subur karena patchwork yang tidak ada habisnya haha. Deadline submit tinggal 3 hari, jadi yaโฆ sedih sih.
โจ Komentar GPT-4o (KPT)
โ Yang Berjalan Baik (Keep)
- ๐ฏ Membangun sistem kata kunci emosi: Bagus karena ChoiceChip diterapkan agar pengguna bisa mencatat emosi secara intuitif!
- ๐ค Menerapkan karakter AI Comment: Mengesankan karena respons per karakter diatur sehingga immersion meningkat.
- ๐ Menyelesaikan error HomeFeedPage: Sangat baik karena nilai default diatur untuk mencegah error Unexpected Null Value!
โ Yang Kurang (Problem)
- โณ Waktu pengembangan lebih lama dari perkiraan: Implementasi fitur kata kunci emosi dan AI Comment memakan waktu lebih banyak dari yang diperkirakan.
- ๐ Kompleksitas data karakter meningkat: Alur data menjadi lebih kompleks, sehingga maintenance bisa makin sulit.
- ๐ Catatan proses penyelesaian masalah kurang: Jika proses penyelesaian error tidak dirapikan, masalah yang sama bisa membuang waktu saat muncul lagi.
๐ Yang Bisa Dicoba (Try)
- ๐ Sesuaikan waktu pengembangan per fitur: Kenali lebih awal task yang memakan waktu lebih lama dari perkiraan dan sesuaikan jadwal.
- ๐ Visualisasikan alur data: Coba rapikan struktur data terkait pengaturan karakter dalam bentuk diagram.
- ๐ Biasakan mencatat proses penyelesaian masalah: Dokumentasikan issue yang sudah diselesaikan dan siapkan strategi agar tidak terulang.
๐ Kesimpulan
Hari ini adalah hari ketika sistem kata kunci emosi dibangun dan pengaturan karakter diterapkan pada AI Comment. Lewat penyelesaian error, pentingnya default value kembali terkonfirmasi, dan ke depan sepertinya perlu mengelola waktu pengembangan dengan lebih efisien! ๐๐ฅ
Tinggalkan komentar