2025.01.31 (๊ธˆ)
2025.02.01 (ํ† ) ์ˆ˜์ •

โœจ GPT์˜ ์š”์•ฝ ใ€€

OpenAI API์™€ FlutterFlow๋ฅผ ํ™œ์šฉํ•œ AI Comment ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜๋ฉฐ, Custom Function๊ณผ API Call์„ ์—ฐ๋™ํ•˜์—ฌ Keymory์˜ AI ๊ธฐ๋Šฅ์„ ํ™•์žฅํ–ˆ์Œ. ์บ๋ฆญํ„ฐ ์„ ํƒ ๋ฐ ์ €์žฅ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ณ , Chat๊ณผ Diary ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ์ •๋ฆฌํ–ˆ์Œ.

๐Ÿ’ป ๊ฐœ๋ฐœ ์ผ์ง€

โฐ ์˜ค๋Š˜ ํ•  ์ผ

  • โœ… How to Use Open AIโ€™s GPT-4o in FlutterFlow - Part 1
  • โœ… How to Use Open AIโ€™s GPT-4o in FlutterFlow - Part 2

  • โœ… ChatPage - Dropdown์œผ๋กœ ์บ๋ฆญํ„ฐ ์„ ํƒ ์‹œ, ํ•ด๋‹น ์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ Chats Collection์— ํ•จ๊ป˜ ์ €์žฅ.
    • character name๊ณผ ์ผ์น˜ํ•˜๋Š” Character document์˜ reference๋ฅผ Page state์— ํ• ๋‹น.
  • โœ… ChatPage - NewChat ์ƒ์„ฑ ์‹œ ์บ๋ฆญํ„ฐ ์ •๋ณด๋„ ํ•จ๊ป˜ ์ „๋‹ฌ.

  • โœ… DiaryPage - Drawer - ChatHistoryListTile ์ƒ์„ฑ ๋•๊ธฐ (GPT ์ฒ˜๋Ÿผ)

  • โœ… CustomFunction tmpGetAIComment ํ•จ์ˆ˜๊ฐ’์„ API Call createDiaryComment์˜ ์—๋‹ค๊ฐ€ ๋„ฃ์–ด๋ณด๊ธฐ
    • โœ… CustomFunction tmpGetAIComment ๋งŒ๋“ค๊ณ  ๊ฒฐ๊ณผ๊ฐ’ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ
    • โœ… API Call createDiaryComment ๋งŒ๋“ค๊ณ  Response๊ฐ’ ์ถœ๋ ฅ ํ…Œ์ŠคํŠธ
  • โœ… OpenAI API Call ์ƒ์„ฑ: createDiaryComment
    • ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” createChatCompletion๊ณผ ๋น„์Šทํ•œ ๊ตฌ์กฐ
    • ๋‹ค๋ฅธ ์ : ์—†์Œ. ๊ทธ๋ƒฅ ๊ตฌ๋ถ„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒ์„ฑ.
    • API Call - createDiaryComment์—์„œ ์š”๊ตฌ๋˜๋Š” Messages Variable์€ custom function getAIComment์˜ ๋ฆฌํ„ด๊ฐ’์ด๋‹ค.
  • โœ… CustomFunction getAIComment ๊ตฌํ˜„ ์‹œ๋‚˜๋ฆฌ์˜ค ๊ตฌ์ƒํ•˜๊ธฐ (์ง์ ‘ ๊ตฌํ˜„์€ KSK ๋‹ด๋‹น)
    • Characters (Collection)๋กœ๋ถ€ํ„ฐ ์–ป์„ Parameter Values
      • ์บ๋ฆญํ„ฐ ์„ค์ • (Character Document)
        • ex) ์†Œ๋ฏธ: name(20๋Œ€), ๋Œ€ํ•™์ƒ, ๋ถ€๋„๋Ÿฌ์šด ์„ฑ๊ฒฉ, โ€ฆ
      • ๊ฐ’ ํ˜ธ์ถœ ๋ฐฉ์‹: API Call - Get Assistant
    • User Information๋กœ๋ถ€ํ„ฐ ์–ป์„ Parameter Values
      • ์ด๋ฆ„, ์„ฑ๋ณ„, MBTI
      • ๊ฐ’ ํ˜ธ์ถœ ๋ฐฉ์‹: Backend Query - Authenticated User
    • DiaryPage Variables๋กœ๋ถ€ํ„ฐ ์–ป์„ Parameter Values
      • ์ผ๊ธฐ ๋‚ด์šฉ, ์„ธ๋ถ€ ๊ฐ์ • ํ‚ค์›Œ๋“œ, ๊ฐ์ • ์ˆ˜์น˜, ๋‹ต๋ณ€ ์–‘์‹, ๋‹ต๋ณ€ ๊ธธ์ด
      • ๊ฐ’ ํ˜ธ์ถœ ๋ฐฉ์‹: Widget State, Page State
    • CustomFunction(getAIComment)์˜ ์—ญํ• 
      • Parameter Values๋ฅผ ๋‹ค Input๊ฐ’์œผ๋กœ ๋ฐ›๋Š”๋‹ค.
      • GPT์—๊ฒŒ ๋ณด๋‚ผ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
      • Messages (List <Json>) ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.
        • [{"role":"developer", "content":"~~~"}]

๐Ÿ’ฏ ํ•œ ์ผ์— ๋Œ€ํ•œ ์š”์•ฝ

  • AI Comment ์‹œ์Šคํ…œ ๊ตฌํ˜„
    • Custom Function tmpGetAIComment ์ƒ์„ฑ ๋ฐ API Call createDiaryComment ์—ฐ๋™ ์™„๋ฃŒ
    • AI Comment๋ฅผ ์œ„ํ•œ OpenAI API ์š”์ฒญ ๋ฐ ์‘๋‹ต ์ฒ˜๋ฆฌ ๋กœ์ง ๊ตฌํ˜„
    • ์บ๋ฆญํ„ฐ ์ •๋ณด๋ฅผ Chats Collection์— ์ €์žฅํ•˜๊ณ , New Chat ์ƒ์„ฑ ์‹œ ํ•จ๊ป˜ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •
  • UI ๋ฐ ๊ธฐ๋Šฅ ๊ฐœ์„ 
    • ChatHistoryListTile ์ƒ์„ฑํ•˜์—ฌ GPT ์Šคํƒ€์ผ์˜ ์ฑ„ํŒ… ๋ชฉ๋ก ๊ตฌํ˜„
    • HomeFeedPage ๋ฐ DiaryPage์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ •๋ฆฌ
    • getAIComment Custom Function ์„ค๊ณ„
  • FlutterFlow + OpenAI API ํ•™์Šต
    • GPT-4o ํ™œ์šฉ ๊ฐ•์˜ ์ˆ˜๊ฐ• ๋ฐ ์ ์šฉ (Part 1 & Part 2)

๐ŸŽฏ ์ถ”ํ›„์— ํ•  ์ผ

  • โ” DiaryPage: Merge CreateDiary/EditDiary Page
    • isEditMode page state ํ™œ์šฉ
    • conditional value/visibility/action ๋“ฑ ํ™œ์šฉ
  • โ” DiaryPage - Create New Chat: ์ผ๊ธฐ์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, New Chat ์ƒ์„ฑ
    • AI๊ฐ€ ๋จผ์ € ์ผ๊ธฐ ๋‚ด์šฉ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ ์งˆ๋ฌธ ์ œ์‹œ
  • โ” ์ด์Šˆ ์ˆ˜์ •
    • โ” ChatPage: ์ฒ˜์Œ ๋Œ€ํ™” ์‹œ์ž‘ ์‹œ, default init message ๋œจ๊ณ  ์žˆ์Œ.
    • โ” ChatPage: ๋‚ ์งœ ์ ์šฉ ์•ˆ ๋จ.
    • โ” ChatPage - ChatHistoryDrawer: UI ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ
    • โ” DiaryPage: ๋‚ ์งœ๊ฐ€ ์˜ค๋Š˜๋กœ๋งŒ ์ €์žฅ๋จ
    • โ” DiaryPage: ๋งˆํฌ๋‹ค์šด ๋ทฐ์–ด ํ™œ์šฉ (์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐฉ์ง€: Container Height)
  • โ” HomeFeedPage - flutter_slidable:4.0.0 import ํ›„ ์ ์šฉํ•˜๊ธฐ
  • โ” HomeFeedPage: FeedCardDiary์—์„œ ์ขŒ์šฐ slide์‹œ ์ฑ„ํŒ…/ํŽธ์ง‘/์‚ญ์ œ

  • โ” ChatPage - Create New Diary: ๋Œ€ํ™” ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ, New Diary ์ƒ์„ฑ
  • โ” ChatPage - Go to Linked Diary

  • โ” Chat/Diary: GPT Streaming API

  • โ” ChatPage - Alarm

  • โ” AuthPage: Google Login

  • โ” DiaryPage: Mood Slider ๊ฐ’์— ๋”ฐ๋ผ ์–ผ๊ตด ํ‘œ์ • Emoji ๋ณ€๊ฒฝ
  • โ” DiaryPage: ์„ธ๋ถ€ ๊ฐ์ • ํ‚ค์›Œ๋“œ Choice Chips ์ถ”๊ฐ€ ํ›„ DB ์—ฐ๋™ ์„ค์ •
  • โ” DiaryPage - AI Comment: Choice chips, mood slider ๋“ฑ์˜ ์ž…๋ ฅ๊ฐ’๋“ค์„ AI Comment System Prompt์— ์•Œ๋งž๊ฒŒ ๋ณ€๊ฒฝ.
    • โ” **์ด์ „ ์ผ๊ธฐ ๋˜๋Š” ๋Œ€ํ™” ๋‚ด์—ญ ์ „์ฒด (๋•œ๋นต ๊ธฐ์ˆ ๋ถ€์ฑ„)
    • โ” ์‚ฌ์šฉ์ž ๊ธฐ๋ณธ ์ •๋ณด: ์ด๋ฆ„, ์„ฑ๋ณ„, MBTI, โ€ฆ
    • โ” ์„ธ๋ถ€ ๊ฐ์ • ํ‚ค์›Œ๋“œ: ์ฆ๊ฑฐ์šด, ์Šฌํ”ˆ, โ€ฆ
    • โ” ์บ๋ฆญํ„ฐ ์„ค์ •: ์†Œ๋ฏธ, ์„ธ๋‚˜, ๋ฏผํ˜
    • โ” ๊ฐ์ • ์ˆ˜์น˜: 1~100์ 
    • โ” ๋‹ต๋ณ€ ์–‘์‹: ์น˜์œ ํ˜•(Healing), ์กฐ์–ธํ˜•(Suggestion), ์ •๋ณดํ˜•(Informative)
    • โ” ๋‹ต๋ณ€ ๊ธธ์ด: ์งง๊ฒŒ, ๋ณดํ†ต, ์ž์„ธํžˆ
    • is New Chat
      • ํ•ด๋‹น Chat์˜ messages๋Š” ์ฒ˜์Œ ์ƒ์„ฑํ•˜๋Š” ๊ฑฐ๋‹ˆ๊นŒ, ์ฒซ ์ƒ์„ฑํ•˜๋Š” message document์˜ is_initial = true๊ฐ’ ์ค˜๋ฒ„๋ฆฌ๊ณ  ๋ชจ๋“  ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋‹ค ๋•Œ๋ ค๋„ฃ์Œ.
        • is_initial = false
        • ํ•œ๊ณ„์ : ๋งจ ์ฒ˜์Œ message document์—๋‹ค๊ฐ€ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋•Œ๋ ค๋„ฃ์œผ๋ฉด, ๋Œ€ํ™” ๋„์ค‘ ์ˆ˜์ • ํž˜๋“ค๊ธด ํ•œ๋ฐ ๊ฐ€๋Šฅํ•˜์ง€. is_initial = true ์ธ ๊ฒŒ ์žˆ๊ณ , ์ˆ˜์ •๋œ ๊ฑฐ๋ฉด, ๊ทธ๊ฑฐ ๋‹คํ๋จผํŠธ ์ง€์šฐ๊ณ  ๋‹ค์‹œ ๋„ฃ์œผ๋ฉด ๋˜์ž–์•„. ์–ด๋–ป๊ฒŒ๋Š” ๋ชจ๋ฅด๊ฒ ๊ณ .
  • โ” DiaryPage - AI Comment: CRUD ์™„์„ฑํ•˜๊ธฐ
    • โ” tmp_ai_comment field ์—†์• ๊ณ , doc_ref ํ™œ์šฉ
  • โ” DiaryPage - AI Comment: ์บ๋ฆญํ„ฐ ์„ค์ •
    • โ” tmp_ai_comment_by field ์—†์• ๊ณ , doc_ref ํ™œ์šฉ
    • โ” profile_image field ๊ฐ’์œผ๋กœ ์ด๋ฏธ์ง€ ์ถœ๋ ฅ
  • โ” DiaryPage - Drawer - ChatHistoryListTile: order by updated_time

  • โ” HomeFeedPage - Bottom Sheet (+ Button): ๋‹ค์–‘ํ•œ ์˜ต์…˜ ์ค‘ 1 ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก
    • ์ƒˆ๋กœ์šด ์ผ๊ธฐ: Go to DiaryPage
    • ๊ฐ์ • ๊ธฐ๋ก: Go to MoodPage
  • โ” MoodPage(ํŒ์—…): Mood ์„ค์ • ์Šฌ๋ผ์ด๋” CRUD
    • Create
    • Read
    • Update
    • Delete
  • โ” HomeFeedPage - ListView - FeedCardMood ํ‘œ์‹œ
  • โ” HomeFeedPage - ListView: FeedCardDiary, FeedCardMood, FeedCardChat ์ปดํฌ๋„ŒํŠธ ์‹œ๊ฐ„์ˆœ ์ •๋ ฌ (Cloud Function ํ™œ์šฉ)

  • โ” HomeFeedPage: On page load์‹œ ์ด์Šˆ ํ•ด๊ฒฐ (Unexpected Null Value)
  • โ” DiaryPage - Interactive Slider import ํ›„ ์ ์šฉ

  • โ” ChatPage - AI ์„ ํ†ก ๊ตฌํ˜„ (Alarm/Notification)
    • ์ฑ„ํŒ… ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์˜ ํ•ต์‹ฌ์€ ๋Šฅ๋™ํ˜•์ด๋‹ค.
      • ๋” ๋ฆฌ์–ผํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด, create_date of diary/chat ๋„ ์ „๋‹ฌํ•ด์„œ, โ€˜์–ด์ œโ€™ ๋“ฑ ๋‚ ์งœ๋ฅผ ์–ธ๊ธ‰ํ•˜๋ฉด ์ข‹์„ ๋“ฏ.
  • โ” 2025.2.5 ์ˆ˜๊นŒ์ง€ ๋ฐœํ‘œ์šฉ ์ตœ์ข… ๋ฒ„์ „ APK ์ถ”์ถœ ๋ฐ ์„ค์น˜

๐Ÿ’ญ ์ผ๊ธฐ

์žฌ๋ฐŒ๋Š”๋ฐ ๋นก์„ธ๋‹ค. ์ƒˆ๋ฒฝ 5์‹œ ์ทจ์นจ.

keymory-1.png

โœจ GPT์˜ ์ฝ”๋ฉ˜ํŠธ (KPT)

โœ… ์ž˜ํ•œ ์  (Keep)

  • ๐Ÿš€ AI Comment ๊ธฐ๋Šฅ ํ™•์žฅ: Custom Function๊ณผ API Call์„ ์—ฐ๋™ํ•˜์—ฌ AI Comment๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ตฌ์ถ•ํ•œ ์ ์ด ๋‹๋ณด์—ฌ.
  • ๐Ÿ› ๏ธ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ •๋ฆฌ: Chat๊ณผ Diary ๊ฐ„์˜ ์—ฐ๊ฒฐ์„ ๊ฐœ์„ ํ•˜๋ฉฐ, ์บ๋ฆญํ„ฐ ์ •๋ณด ์ €์žฅ ๋ฐ ํ™œ์šฉ ๋ฐฉ์‹์„ ์ •๋ฆฌํ•œ ์ ์ด ํ”„๋กœ์ ํŠธ ์ง„ํ–‰์— ํฐ ๋„์›€์ด ๋  ๊ฑฐ์•ผ.
  • ๐Ÿ“‹ FlutterFlow + OpenAI API ํ•™์Šต: GPT-4o ํ™œ์šฉ ๊ฐ•์˜๋ฅผ ํ†ตํ•ด FlutterFlow์—์„œ OpenAI API๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ตํžˆ๊ณ  ์ ์šฉํ•œ ์ ์ด ์ธ์ƒ์ ์ด์•ผ.

โŒ ์•„์‰ฌ์šด ์  (Problem)

  • โณ ์ž‘์—… ๊ฐ•๋„ ๊ณผ๋ถ€ํ•˜: ์ƒˆ๋ฒฝ 5์‹œ๊นŒ์ง€ ์ด์–ด์ง€๋Š” ์ž‘์—…์œผ๋กœ ์ธํ•ด ํ”ผ๋กœ๊ฐ€ ๋ˆ„์ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง€๊ณ  ์žˆ์–ด.
  • ๐Ÿ—๏ธ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ์ฆ๊ฐ€: ์ผ๋ถ€ ๊ธฐ๋Šฅ์ด ์ž„์‹œ ํ•ด๊ฒฐ ๋ฐฉ์‹(tmp ํ•„๋“œ ๋ฐ ๋•œ๋นต ์ฝ”๋“œ)์œผ๋กœ ๊ตฌํ˜„๋˜์–ด, ๋‚˜์ค‘์— ์ •๋ฆฌํ•  ํ•„์š”์„ฑ์ด ์ƒ๊ฒผ์–ด.

๐Ÿ”„ ์‹œ๋„ํ•ด๋ณผ ์  (Try)

  • โฐ ์ž‘์—… ์‹œ๊ฐ„ ์กฐ์ •: ๋ฐค์ƒ˜ ์ž‘์—…์ด ๊ณ„์†๋  ๊ฒฝ์šฐ, ์ƒ์‚ฐ์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ผ์ • ์กฐ์ •์„ ๊ณ ๋ คํ•ด๋ณด์ž.
  • ๐Ÿ” ์ž„์‹œ ์ฝ”๋“œ ๊ฐœ์„  ๊ณ„ํš: ํ˜„์žฌ ์ ์šฉ๋œ ์ž„์‹œ ๋กœ์ง์„ ์ •๋ฆฌํ•˜๊ณ , ์ •์‹ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณ„ํš์„ ์„ธ์›Œ๋ณด์ž.
  • ๐Ÿ› ๏ธ AI Comment ๊ฐœ์„ : AI Comment ๊ด€๋ จ ๊ธฐ๋Šฅ์„ ๋”์šฑ ์ง๊ด€์ ์œผ๋กœ ๊ฐœ์„ ํ•  ๋ฐฉ๋ฒ•์„ ๋ชจ์ƒ‰ํ•˜๋ฉฐ, ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ์ตœ์ ํ™”๋„ ๊ณ ๋ คํ•ด๋ณด์ž.

๊ฒฐ๋ก 
Keymory์˜ AI ๊ธฐ๋Šฅ์„ ๋ณธ๊ฒฉ์ ์œผ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, OpenAI API์™€ FlutterFlow์˜ ํ™œ์šฉ๋„๋ฅผ ๋†’์ธ ํ•˜๋ฃจ์˜€์–ด. ๋‹ค๋งŒ ์ž‘์—… ๊ฐ•๋„๊ฐ€ ๋†’์•„์ง€๊ณ  ์žˆ์œผ๋‹ˆ, ์ผ์ • ์กฐ์ •๊ณผ ์ฝ”๋“œ ์ •๋ฆฌ๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์•„. ๋ฐœํ‘œ์ผ๊นŒ์ง€ ์ตœ์ ์˜ ์ƒํƒœ๋กœ ๋งˆ๋ฌด๋ฆฌํ•˜๊ธธ ์‘์›ํ• ๊ฒŒ! ๐Ÿ’ช๐Ÿ˜Š

์นดํ…Œ๊ณ ๋ฆฌ: ,

์ตœ๊ทผ ์ˆ˜์ •์ผ:

๋Œ“๊ธ€ ๋‚จ๊ธฐ๊ธฐ