[🛠] Registro de desarrollo de Keymory #8: construcción del sistema de palabras clave emocionales de DiaryPage, configuración de personajes para AI Comment
✨ Resumen de GPT
Añadí a DiaryPage una función de selección de palabras clave emocionales y apliqué configuración de personajes a AI Comment para implementar respuestas más naturales.
💻 Registro de desarrollo
⏰ Tareas de hoy
- ✅ DiaryPage: añadir ChoiceChip y TextField de
palabras clave emocionales- ✅ Crear widgets
- ✅ Añadir Fields a diaries DB: mood_keywords (
List <String>), mood_keywords_description (String) - ✅ Añadir Page State a diaries: moodKeywordsSelected (
List <String>) - ✅ OnPageLoad: pasar las variables añadidas
- ✅ ChoiceChipRate (5~1): pasar los valores de diariesDoc.mood_keywords a cada ChoiceChip correspondiente.
- Definir MoodKeywordRate5Options, …, MoodKeywordRate1Options
List <String>como valores de App Constant- Enum solo soporta inglés, así que haría falta una función de traducción. Demasiado complejo, descartado.
- Define Options Var: AppConstant.moodKeywordRate5Options (
List <String>) - Initially Selected: updateChoiceChipSelected
- Definir MoodKeywordRate5Options, …, MoodKeywordRate1Options
- ✅ Create CustomFunction
updateMoodKeywordsSelected- On Page Load: Select all matching items in RateOptions List
List<String> updateChoiceChipSelected( List<String> moodKeywordsSelected, // lista actual de palabras clave seleccionadas List<String> moodKeywordRateOptions, // opciones seleccionables del Rate actual ) { // Crear una lista nueva para mantener la inmutabilidad return List<String>.from( moodKeywordsSelected.where((item) => moodKeywordRateOptions.contains(item)) ); }
- ✅ ChoiceChipRate (5~1): pasar los valores de diariesDoc.mood_keywords a cada ChoiceChip correspondiente.
- ✅ On ChoiceChip Selected: Update Page State
moodKeywordsSelected-> Set Value toReturn of Func updateMoodKeywordsSelected- ✅ Create 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, ) { // Copiar la lista existente para mantener la inmutabilidad List<String> updatedList = List.from(moodKeywordsSelected); // 1️⃣ Eliminar de la seleccion existente los valores que pertenecen a este Rate updatedList.removeWhere((item) => moodKeywordRateOptions.contains(item)); // 2️⃣ Anadir los valores actualmente seleccionados en ChoiceChip updatedList.addAll(choiceChipSelected); return updatedList; }
- ✅ Create CustomFunction
- ✅ (Issue) DiaryPage - AI Comment: configuración de personajes
- Añadir Field a diaries DB: ai_comment_by (Doc Ref: Character)
- DiaryPage - AICommentEditor Component - Return
ai_comment_content+ai_comment_by- How? -> crear DataType
aiCommentPageReturnObject
- How? -> crear DataType
- On ChoiceChipChar Selected: Backend Query Character Doc with same Official_name value.
- ✅ (Issue) HomeFeedPage - FeedCardDiary: aplicar correctamente la imagen del personaje de AI Comment
- ✅ DiaryPage - AI Comment: al guardar, guardar también en Diary la Ref del personaje que escribió el comentario.
- ✅ HomeFeedPage - FeedCardDiary - AI Image: cargar Character Doc con Backend Query y especificar Image Path.
- ✅ (Issue) HomeFeedPage - FeedCardDiary: Unexpected Null Value Error
- Esto pasa si solo pongo el valor Path en el Image Widget…
- ¡Ah! Ocurrió porque no puse un Default Variable Value. Solo me di cuenta después de sufrir muchísimo.
- 💡 Lo que aprendí
- Siempre hay que crear el hábito de poner Default Value. ¿Cuántas veces voy a ver Unexpected Null Value Error por todas partes?
- Esto pasa si solo pongo el valor Path en el Image Widget…
- ✅ Diseñar Action chains para
CreateNewChatFromDiary(Start From: después de terminar el procesamiento de AI Comment y guardar el diario)- Create Diary
- API Call: createDiarySummary -> Output Var: OutVar1 (nombre temporal)
- Create New Chat Document
- Create New Message Document: {“role”:”developer”, “content”:”$systemprompt + $OutVar1”}
- API Call: createChatFromDiary -> Output Var: OutVar2 (nombre temporal)
- Create New Message Document: {“role”:”assistant”, “content”: “$OutVar2”}
- Navigate To: pasar la referencia del Chat Document correspondiente como chatRefParam
💯 Resumen de lo hecho
- Construcción del sistema de palabras clave emocionales de DiaryPage
- Añadí ChoiceChip y TextField
- Añadí a diaries DB fields relacionados con palabras clave emocionales
- Implementé la función
updateMoodKeywordsSelected
- Configuración y aplicación de personajes en AI Comment
- Añadí el field
ai_comment_bypara guardar el personaje del comentario - Modifiqué AICommentEditor para incluir información del personaje
- Al seleccionar ChoiceChip, cargar los datos del personaje correspondiente con Backend Query
- Añadí el field
- Resolución del error de imagen de AI Comment en HomeFeedPage
- Guardé el valor de referencia del personaje al escribir AI comments
- Mejoré la forma de cargar la imagen del personaje de AI Comment en HomeFeedPage
- Corregí el error Unexpected Null Value (aplicando un valor por defecto)
🎯 Tareas futuras
Haz clic para ver detalles
-
❔ (Issue) DiaryPage: usar markdown viewer (prevenir overflow: Container Height)
-
❔ DiaryPage: cambiar el Emoji de expresión facial y el color según el valor del Mood Slider
- ❔ Ayudar a crear Custom Function -
systemPromptTemplate(trabajador principal: KSK)- ❔ Ordenar parámetros para añadir
- ❔ Custom Function - probar si
getAICommentse aplica realmente- ❔ Comprobar si los valores de input se reflejan correctamente
- ❔ Comprobar si el valor de output se imprime correctamente como String
- ❔ Chat Page - Create New Chat: aplicar system prompt
- ▶️ Implementación de 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
- ▶️ Implementación de OpenAI API Call: createChatCompletion
- ❔ DiaryPage - Create New Chat by Diary: crear un New Chat basado en el contenido del diario
- ❔ Implementación de OpenAI API Call: createDiaryComment
- Input: Diary Content, System Prompt (AI Comment)
- Output: AI Comment ($.choices[0].message.content)
- ❔ Implementación de OpenAI API Call: createDiarySummary
- Input: Diary Content, AI Comment, System Prompt (Diary Summary)
- Output: Diary Summary ($.choices[0].message.content)
- ❔ Implementación de 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
- ❔ Implementación de OpenAI API Call: createDiaryComment
- ❔ ChatPage - Create New Diary: crear un New Diary basado en el contenido de la conversación
- ❔ Implementación de OpenAI API Call: createChatSummary
- Input: Chat Content, System Prompt (Diary From Chat)
- Output: Chat Summary
- ❔ Implementación de OpenAI API Call: createDiaryFromChat
- Input: Chat Summary, System Prompt (Diary From Chat)
- Output: New Diary (Title, Content, Mood score)
- ❔ Implementación de OpenAI API Call: createChatSummary
-
❔ ChatPage: Go to Linked Diary
- ❔ MoodPage (parte superior) - Mood Calendar
- ❔ Comprobar el número de posts escritos por fecha
- ❔ Al hacer clic en una fecha, moverse a esa fecha
- ❔ MoodPage (parte inferior) - Mood stats
- ❔ Mostrar estadísticas del mes enfocado
- ❔ Mostrar comentario de IA sobre las estadísticas mostradas
- ❔ Mostrar estadísticas del mes enfocado
- ❔ HomeFeedPage - importar y aplicar flutter_slidable:4.0.0
-
❔ HomeFeedPage: chat/editar/eliminar al deslizar a izquierda/derecha desde FeedCardDiary
- ❔ ChatPage: alinear a la derecha el contenido de conversación del usuario
-
❔ Chat/Diary: GPT Streaming API
- ❔ ChatPage - implementar primer mensaje de IA (Alarm/Notification)
- El núcleo del prompt del sistema de chat es la proactividad.
- Para hacerlo más realista, quizá convenga pasar también create_date of diary/chat, para que la IA pueda mencionar fechas como “ayer”.
- Referencia de implementación de Alarm
- El núcleo del prompt del sistema de chat es la proactividad.
- ❔ DiaryPage: añadir Choice Chips de palabras clave emocionales detalladas y configurar integración con DB
- ❔ DiaryPage - AI Comment: adaptar inputs como Choice chips y mood slider al
AI Comment System Prompt.- ❔ **
diarioanterior ohistorial de conversacióncompleto (deuda técnica parcheada) - ❔ información básica del usuario: nombre, género, MBTI, …
- ❔ palabras clave emocionales detalladas: alegre, triste, …
- ❔ configuración de personajes: Somi, Sena, Minhyuk
- ❔ puntuación emocional: 1~100 puntos
- ❔ formato de respuesta: Healing, Suggestion, Informative
- ❔ longitud de respuesta: corta, normal, detallada
- is New Chat
- Como los messages de este Chat se crean por primera vez, poner
is_initial = trueen el primer message document y meter todos los system prompts ahí.- is_initial = false
- Límite: si meto el system prompt en el primer message document, modificarlo durante la conversación será difícil, aunque posible. Si existe un documento con is_initial = true y se modificó, puedo borrar ese documento y volver a insertarlo. No sé cómo, pero se podría.
- Como los messages de este Chat se crean por primera vez, poner
- ❔ **
- ❔ DiaryPage - AI Comment: completar CRUD
- ❔ eliminar tmp_ai_comment field y usar doc_ref
-
❔ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time
-
❔ DiaryPage - importar y aplicar Interactive Slider
-
❔ HomeFeedPage: implementar función Search Diary
-
❔ AuthPage: implementar función Google Login
- ❔ HomeFeedPage - Bottom Sheet (
+Button): permitir elegir 1 entre varias opciones- Nuevo diario: Go to DiaryPage
- Registro emocional: Go to MoodPage
- ❔ MoodPage (popup): Mood setting slider CRUD
- Create
- Read
- Update
- Delete
- ❔ HomeFeedPage - ListView - mostrar FeedCardMood
-
❔ HomeFeedPage - ListView: ordenar cronológicamente los componentes FeedCardDiary, FeedCardMood, FeedCardChat (usando Cloud Function)
-
❔ Crear MoodEditPage entre HomeFeedPage y DiaryPage: mover MoodSlider, MoodKeywordsRate (5~1), MoodDescription widgets, etc.
- ❔ Extraer e instalar el APK final para la presentación antes del
miércoles 2025.2.5
💭 Diario
Siento que la deuda técnica está creciendo muy bien por todos estos parches jajaja. Quedan 3 días para la fecha límite de entrega, así que bueno… qué se le va a hacer.
✨ Comentario de GPT-4o (KPT)
✅ Lo que salió bien (Keep)
- 🎯 Construcción del sistema de palabras clave emocionales: Fue bueno aplicar ChoiceChip para que el usuario pueda registrar emociones de forma intuitiva.
- 🤖 Aplicación de personajes en AI Comment: Fue impresionante configurar respuestas por personaje para aumentar la inmersión.
- 🛠 Resolución del error de HomeFeedPage: Fue excelente prevenir el error Unexpected Null Value configurando un valor por defecto.
❌ Lo que faltó (Problem)
- ⏳ Tiempo de desarrollo mayor al esperado: Implementar las palabras clave emocionales y las funciones de AI Comment tomó más tiempo del previsto.
- 🔄 Aumento de complejidad en los datos de personajes: El flujo de datos se volvió más complejo, así que puede dificultarse el mantenimiento.
- 📋 Registro insuficiente del proceso de resolución: No ordenar el proceso de resolución de errores puede hacer perder tiempo si ocurre el mismo problema otra vez.
🔄 Qué probar (Try)
- 📌 Ajustar el tiempo de desarrollo por función: Identificar con antelación las tareas que tardan más de lo esperado y ajustar el calendario.
- 📊 Visualizar el flujo de datos: Probar a ordenar en un diagrama la estructura de datos relacionada con la configuración de personajes.
- 📖 Crear el hábito de registrar la resolución de problemas: Documentar los issues resueltos y preparar estrategias para prevenir que se repitan.
🏁 Conclusión
Hoy fue un día de construir el sistema de palabras clave emocionales y aplicar configuración de personajes a AI Comment. Al resolver errores confirmé otra vez la importancia de los valores por defecto, y de ahora en adelante parece necesario gestionar el tiempo de desarrollo de forma más eficiente. 🚀🔥
Deja un comentario