[🛠] Devlog do Keymory #8: sistema de palavras-chave emocionais da DiaryPage, configuração de personagens do AI Comment
✨ Resumo do GPT
Adicionei a função de seleção de palavras-chave emocionais na DiaryPage e apliquei configurações de personagem ao AI Comment, implementando respostas mais naturais.
💻 Diário de desenvolvimento
⏰ Tarefas de hoje
- ✅ DiaryPage: adicionar ChoiceChip e TextField de
palavra-chave emocional- ✅ Criar widgets
- ✅ Adicionar Fields ao DB diaries: mood_keywords (
List <String>), mood_keywords_description (String) - ✅ Adicionar Page State ao diaries: moodKeywordsSelected (
List <String>) - ✅ OnPageLoad: passar as variáveis adicionadas
- ✅ ChoiceChipRate (5~1): passar os valores de diariesDoc.mood_keywords para cada ChoiceChip correspondente.
- Definir MoodKeywordRate5Options, …, MoodKeywordRate1Options
List <String>como valores de App Constant- Enum só aceita inglês, então seria preciso usar função de tradução. Complexo demais, então descartado.
- Define Options Var: AppConstant.moodKeywordRate5Options (
List <String>) - Initially Selected: updateChoiceChipSelected
- Definir MoodKeywordRate5Options, …, MoodKeywordRate1Options
- ✅ Criar CustomFunction
updateMoodKeywordsSelected- On Page Load: Select all matching items in RateOptions List
List<String> updateChoiceChipSelected( List<String> moodKeywordsSelected, // lista atual de palavras-chave selecionadas List<String> moodKeywordRateOptions, // opções selecionáveis do Rate atual ) { // Criar uma nova lista para manter a imutabilidade return List<String>.from( moodKeywordsSelected.where((item) => moodKeywordRateOptions.contains(item)) ); }
- ✅ ChoiceChipRate (5~1): passar os valores de diariesDoc.mood_keywords para cada ChoiceChip correspondente.
- ✅ On ChoiceChip Selected: Update Page State
moodKeywordsSelected-> Set Value toReturn of Func updateMoodKeywordsSelected- ✅ Criar 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 a lista existente para manter a imutabilidade List<String> updatedList = List.from(moodKeywordsSelected); // 1️⃣ Remover da seleção existente os valores pertencentes a este Rate updatedList.removeWhere((item) => moodKeywordRateOptions.contains(item)); // 2️⃣ Adicionar os valores de ChoiceChip atualmente selecionados updatedList.addAll(choiceChipSelected); return updatedList; }
- ✅ Criar CustomFunction
- ✅ (Issue) DiaryPage - AI Comment: configuração de personagem
- Adicionar Field ao DB diaries: ai_comment_by (Doc Ref: Character)
- DiaryPage - AICommentEditor Component - Return
ai_comment_content+ai_comment_by- How? -> criar DataType
aiCommentPageReturnObject
- How? -> criar DataType
- On ChoiceChipChar Selected: Backend Query Character Doc with same Official_name value.
- ✅ (Issue) HomeFeedPage - FeedCardDiary: aplicar corretamente a imagem do personagem de AI Comment
- ✅ DiaryPage - AI Comment: ao salvar, salvar também no Diary o Ref do personagem que escreveu o comentário.
- ✅ HomeFeedPage - FeedCardDiary - AI Image: carregar Character Doc com Backend Query e especificar Image Path.
- ✅ (Issue) HomeFeedPage - FeedCardDiary: Unexpected Null Value Error
- Isso acontece quando eu coloco só o valor Path no Image Widget…
- Ah!!! O erro acontecia porque eu não tinha colocado um Default Variable Value. Só percebi depois de sofrer demais.
- 💡 O que aprendi
- Criar o hábito de sempre colocar Default Value. Quantas vezes ainda vou ver Unexpected Null Value Error em todos os lugares?
- Isso acontece quando eu coloco só o valor Path no Image Widget…
- ✅ Design Action chains for
CreateNewChatFromDiary(Start From: depois de processar o AI Comment e concluir o salvamento do diário)- Create Diary
- API Call: createDiarySummary -> Output Var: OutVar1 (nome temporário)
- Create New Chat Document
- Create New Message Document: {“role”:”developer”, “content”:”$systemprompt + $OutVar1”}
- API Call: createChatFromDiary -> Output Var: OutVar2 (nome temporário)
- Create New Message Document: {“role”:”assistant”, “content”: “$OutVar2”}
- Navigate To: passar a referência do Chat Document correspondente como chatRefParam
💯 Resumo do que fiz
- Sistema de palavras-chave emocionais da DiaryPage construído
- ChoiceChip e TextField adicionados
- Fields relacionados a palavras-chave emocionais adicionados ao DB diaries
- Função
updateMoodKeywordsSelectedimplementada
- Configuração e aplicação de personagens no AI Comment
- Field
ai_comment_byadicionado para salvar o personagem do comentário - AICommentEditor modificado para incluir informações de personagem
- Ao selecionar ChoiceChip, carregar dados do personagem correspondente via Backend Query
- Field
- Erro de imagem do AI Comment na HomeFeedPage resolvido
- Valor de referência do personagem salvo ao escrever AI Comment
- Método de carregamento da imagem do personagem do AI Comment melhorado na HomeFeedPage
- Erro Unexpected Null Value corrigido (aplicando valor padrão)
🎯 Tarefas futuras
Clique para ver detalhes
-
❔ (Issue) DiaryPage: usar visualizador de markdown (prevenir overflow: Container Height)
-
❔ DiaryPage: mudar Emoji de expressão facial e cor conforme o valor do Mood Slider
- ❔ Custom Function - ajudar a criar
systemPromptTemplate(trabalhador principal: KSK)- ❔ Organizar parâmetros a adicionar
- ❔ Custom Function - testar se
getAICommenté realmente aplicado- ❔ Verificar se os valores de entrada são refletidos corretamente
- ❔ Verificar se o valor de saída é exibido corretamente como String
- ❔ Chat Page - Create New Chat: aplicar system prompt
- ▶️ Implementação 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
- ▶️ Implementação de OpenAI API Call: createChatCompletion
- ❔ DiaryPage - Create New Chat by Diary: criar New Chat com base no conteúdo do diário
- ❔ Implementação de OpenAI API Call: createDiaryComment
- Input: Diary Content, System Prompt (AI Comment)
- Output: AI Comment ($.choices[0].message.content)
- ❔ Implementação de OpenAI API Call: createDiarySummary
- Input: Diary Content, AI Comment, System Prompt (Diary Summary)
- Output: Diary Summary ($.choices[0].message.content)
- ❔ Implementação 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
- ❔ Implementação de OpenAI API Call: createDiaryComment
- ❔ ChatPage - Create New Diary: criar New Diary com base no conteúdo da conversa
- ❔ Implementação de OpenAI API Call: createChatSummary
- Input: Chat Content, System Prompt (Diary From Chat)
- Output: Chat Summary
- ❔ Implementação de OpenAI API Call: createDiaryFromChat
- Input: Chat Summary, System Prompt (Diary From Chat)
- Output: New Diary (Title, Content, Mood score)
- ❔ Implementação de OpenAI API Call: createChatSummary
-
❔ ChatPage: Go to Linked Diary
- ❔ MoodPage (superior) - Mood Calendar
- ❔ Permitir verificar o número de posts escritos por data
- ❔ Ao clicar em uma data, mover para essa data
- ❔ MoodPage (inferior) - Mood stats
- ❔ Exibir estatísticas referentes ao mês em foco
- ❔ Exibir comentário da AI sobre as estatísticas exibidas
- ❔ Exibir estatísticas referentes ao mês em foco
- ❔ HomeFeedPage - importar e aplicar flutter_slidable:4.0.0
-
❔ HomeFeedPage: ao deslizar FeedCardDiary para esquerda/direita, chat/editar/excluir
- ❔ ChatPage: alinhar à direita o conteúdo de conversa do usuário
-
❔ Chat/Diary: GPT Streaming API
- ❔ ChatPage - implementar primeira mensagem da AI (Alarm/Notification)
- O núcleo do prompt do sistema de chat é a proatividade.
- Para ficar mais realista, talvez seja bom passar também create_date of diary/chat, para a AI mencionar datas como “ontem”.
- Referência de implementação de Alarm
- O núcleo do prompt do sistema de chat é a proatividade.
- ❔ DiaryPage: adicionar Choice Chips de palavras-chave detalhadas de emoção e configurar integração com o DB
- ❔ DiaryPage - AI Comment: ajustar entradas como Choice chips e mood slider ao
AI Comment System Prompt.- ❔ **
diaryanterior ouconversation historyinteira (dívida técnica improvisada) - ❔ informações básicas do usuário: nome, gênero, MBTI, …
- ❔ palavras-chave detalhadas de emoção: feliz, triste, …
- ❔ configuração de personagem: Somi, Sena, Minhyuk
- ❔ pontuação emocional: 1~100 pontos
- ❔ formato da resposta: Healing, Suggestion, Informative
- ❔ tamanho da resposta: curta, normal, detalhada
- is New Chat
- Como as messages desse Chat estão sendo criadas pela primeira vez, definir
is_initial = trueno primeiro message document e colocar todos os system prompts ali.- is_initial = false
- Limite: se eu colocar o system prompt no primeiro message document, fica difícil modificar no meio da conversa, mas é possível. Se houver um document com is_initial = true e ele tiver sido modificado, posso apagar esse documento e inserir de novo. Não sei como, mas dá.
- Como as messages desse Chat estão sendo criadas pela primeira vez, definir
- ❔ **
- ❔ DiaryPage - AI Comment: concluir CRUD
- ❔ remover field tmp_ai_comment e usar doc_ref
-
❔ DiaryPage - Drawer - ChatHistoryListTile: order by updated_time
-
❔ DiaryPage - importar e aplicar Interactive Slider
-
❔ HomeFeedPage: implementar função Search Diary
-
❔ AuthPage: implementar função Google Login
- ❔ HomeFeedPage - Bottom Sheet (
+Button): permitir escolher 1 entre várias opções- Novo diário: Go to DiaryPage
- Registro de emoção: Go to MoodPage
- ❔ MoodPage (popup): CRUD do slider de configuração de Mood
- Create
- Read
- Update
- Delete
- ❔ HomeFeedPage - ListView - exibir FeedCardMood
-
❔ HomeFeedPage - ListView: ordenar componentes FeedCardDiary, FeedCardMood, FeedCardChat cronologicamente (usando Cloud Function)
-
❔ Criar MoodEditPage entre HomeFeedPage e DiaryPage: mover MoodSlider, MoodKeywordsRate (5~1), MoodDescription widgets etc.
- ❔ Extrair e instalar o APK da versão final de apresentação até
qua 2025.2.5
💭 Diário
Sinto a dívida técnica crescendo lindamente por causa de incontáveis remendos, rsrs. Faltam 3 dias para o prazo de entrega, então fazer o quê… :(
✨ Comentário do GPT-4o (KPT)
✅ Pontos bons (Keep)
- 🎯 Sistema de palavras-chave emocionais construído: Foi bom aplicar ChoiceChip para que o usuário consiga registrar emoções de forma intuitiva!
- 🤖 Personagens aplicados ao AI Comment: Foi impressionante configurar respostas por personagem para aumentar a imersão.
- 🛠 Erro da HomeFeedPage resolvido: Definir um valor padrão para prevenir erros de Unexpected Null Value foi excelente!
❌ Pontos fracos (Problem)
- ⏳ Tempo de desenvolvimento maior que o esperado: A implementação das palavras-chave emocionais e da função de AI Comment levou mais tempo do que o esperado.
- 🔄 Aumento da complexidade dos dados de personagem: O fluxo de dados ficou mais complexo, então a manutenção pode se tornar difícil.
- 📋 Registro insuficiente do processo de resolução de problemas: Não organizar o processo de resolução dos erros pode gerar perda de tempo caso o mesmo problema aconteça de novo.
🔄 Pontos para tentar (Try)
- 📌 Ajustar tempo de desenvolvimento por função: Identificar com antecedência tarefas que levam mais tempo que o esperado e ajustar a agenda.
- 📊 Visualizar o fluxo de dados: Tentar organizar em um diagrama a estrutura de dados relacionada às configurações de personagem.
- 📖 Criar hábito de registrar resolução de problemas: Documentar issues resolvidos e preparar estratégias para evitar recorrência.
🏁 Conclusão
Hoje foi um dia de construir o sistema de palavras-chave emocionais e aplicar configurações de personagem aos AI Comments. Pela resolução dos erros, você confirmou de novo a importância dos valores padrão, e daqui em diante parece necessário administrar o tempo de desenvolvimento com mais eficiência! 🚀🔥
Deixe um comentário