์ฝ˜ํ…์ธ ๋กœ ์ด๋™

๐Ÿ“ธ ์‚ฌ์ง„ ์ •๋ฆฌ ์ž๋™ํ™” ํ”„๋กœ์ ํŠธ ๊ณ„ํš v2

๐Ÿ“ธ ์‚ฌ์ง„ ์ •๋ฆฌ ์ž๋™ํ™” ํ”„๋กœ์ ํŠธ ๊ณ„ํš v2

์„น์…˜ ์ œ๋ชฉ: โ€œ๐Ÿ“ธ ์‚ฌ์ง„ ์ •๋ฆฌ ์ž๋™ํ™” ํ”„๋กœ์ ํŠธ ๊ณ„ํš v2โ€

ํ”„๋กœ์ ํŠธ ๊ฐœ์š”: NAS์— ๋ถ„์‚ฐ ์ €์žฅ๋œ ์‚ฌ์ง„์˜ ์ค‘๋ณต ๊ฒ€์ถœ ๋ฐ ์ž๋™ ์ •๋ฆฌ
์ž‘์„ฑ์ž: ํ•˜๋Š˜์ด + 8๊ฐœ ๋ชจ๋ธ ํ˜‘๋™ ๋ถ„์„
์‹œ์ž‘์ผ: 2026-04-21
์ƒํƒœ: โณ ๊ณ„ํš ์ค‘


๐Ÿ’ก glm-5.1, qwen3.5, minimax-m2.5, gemma4:31b, deepseek-r1, llama3.1 6๊ฐœ ๋ชจ๋ธ์ด
๊ธฐ์กด ๊ณ„ํš์„ ๋ฆฌ๋ทฐํ•˜๊ณ  ๊ฐœ์„ ์•ˆ์„ ์ œ์‹œํ•จ (moondream, gemma4:e2b์€ ์‹ค์ „์—์„œ ํ™œ์šฉ)

๊ณตํ†ต ์ง€์ ์‚ฌํ•ญ (6๊ฐœ ๋ชจ๋ธ ๋ชจ๋‘ ๋™์˜)

์„น์…˜ ์ œ๋ชฉ: โ€œ๊ณตํ†ต ์ง€์ ์‚ฌํ•ญ (6๊ฐœ ๋ชจ๋ธ ๋ชจ๋‘ ๋™์˜)โ€
#๋ฌธ์ œ์ ๊ฐœ์„ ๋ฐฉ์•ˆ
1SHA-256๋งŒ์œผ๋กœ๋Š” ๋ฆฌ์‚ฌ์ด์ฆˆ/ํฌ๋งท๋ณ€๊ฒฝ ์ค‘๋ณต ๊ฐ์ง€ ๋ถˆ๊ฐ€pHash(์ง€๊ฐ์  ํ•ด์‹œ) ๋ณ‘ํ–‰ ๋„์ž…
2NAS 3๊ฐœ์†Œๅˆ†ๆ•ฃ ์Šค์บ” โ†’ ๋„คํŠธ์›Œํฌ I/O ๋ณ‘๋ชฉํŒŒ์ผ ํฌ๊ธฐ ๊ธฐ๋ฐ˜ 1์ฐจ ํ•„ํ„ฐ๋ง โ†’ ํ•ด์‹œ ๊ณ„์‚ฐ ์ตœ์†Œํ™”
3์„œ๋ธŒ์—์ด์ „ํŠธ์— ์—†๋Š” ๋ชจ๋ธ(kimi-k2.5, minimax-m2.7) ํฌํ•จ์‹ค์ œ ์„ค์น˜๋œ 8๊ฐœ ๋ชจ๋ธ๋กœ๋งŒ ๊ตฌ์„ฑ
4Phase 2 โ€œ์ค‘๋ณต์ฒ˜๋ฆฌโ€ ๊ธฐ์ค€ ๋ชจํ˜ธ๋ณด์กด ์šฐ์„ ์ˆœ์œ„ ๋ช…ํ™•ํ•œ ๊ทœ์น™์œผ๋กœ ์ •์˜
5LLM ์—ญํ•  ๋ถ„๋‹ด ๋ถˆ๋ช…ํ™•๋ชจ๋ธ ํŠน์„ฑ์— ๋งž๊ฒŒ ๋ช…ํ™• ๋ฐฐ๋ถ„

#์ €์žฅ์†ŒWSL ๊ฒฝ๋กœ์‚ฌ์ง„ ์ˆ˜์šฉ๋Ÿ‰๋งˆ์šดํŠธ
1๋ฐฑ์—…NAS - ๋ผ์ดํŠธ๋ฃธ/mnt/bk_nas/backup/pinksky/๊ฐœ์ธ๊ด€๋ จ/Media/๋ผ์ดํŠธ๋ฃธ์‚ฌ์ง„/Lightroom CC/a22a72c5542f4eacb44a1978b389d014/originals/1,247์žฅ-โœ… SMB
2๋ฐฑ์—…NAS - PhotoLibrary/mnt/bk_homes/pinksky/Photos/PhotoLibrary/1,254์žฅ-โœ… SMB
3๊ฐœ์ธNAS - ๋ชจ๋ฐ”์ผ๋ฐฑ์—…/mnt/nas_homes/pinkskys/Photos/MobileBackup/-~161GBโœ… SMB
4๊ฐœ์ธNAS - PhotoLibrary/mnt/nas_homes/pinkskys/Photos/PhotoLibrary/15์žฅ1.4GBโœ… SMB
5๊ฐœ์ธNAS - photo/mnt/nas_photo/--โœ… SMB

๋ชจ๋ฐ”์ผ๋ฐฑ์—… ์ƒ์„ธ (๊ฐœ์ธNAS):

ํด๋”์šฉ๋Ÿ‰
์•„์ดํฐ๋ฐฑ์—…์˜ˆ์ „๊บผ54GB
iPhone32GB
์ •ํ™˜์˜ S2117GB
์ •ํ™˜์˜ Z Flip416GB
์ •ํ™˜์ž๊ธ‰์ œ11GB
MH_S20U12GB
์ฃผ์˜์˜ Z Fold78.5GB
PS_SE33.2GB
์ฃผ์˜์˜ S213.3GB
์ •ํ™˜์˜ S20 Ultra3.9GB

๋งˆ์šดํŠธ ์ •๋ณด:

/mnt/minicity โ†’ ๊ฐœ์ธNAS Backup_data (WebDAV)
/mnt/nas_photo โ†’ ๊ฐœ์ธNAS photo (SMB)
/mnt/nas_homes โ†’ ๊ฐœ์ธNAS homes (SMB)
/mnt/bk_nas โ†’ ๋ฐฑ์—…NAS 14T-HDD (SMB)
/mnt/bk_homes โ†’ ๋ฐฑ์—…NAS homes (SMB)
  • ์ •ํ™•ํ•œ ์ค‘๋ณต: 3๊ฐœ์†Œ ๊ฒฝ๋กœ์— ๋™์ผ ํŒŒ์ผ์ด ์กด์žฌ (โ†’ SHA-256๋กœ ๊ฒ€์ถœ)
  • ์œ ์‚ฌ ์ค‘๋ณต: ๋ฆฌ์‚ฌ์ด์ฆˆ, ํฌ๋งท๋ณ€ํ™˜,่ฝปๅพฎํŽธ์ง‘์œผ๋กœ ํ•ด์‹œ๋Š” ๋‹ค๋ฅด์ง€๋งŒ ๊ฐ™์€ ์‚ฌ์ง„ (โ†’ pHash๋กœ ๊ฒ€์ถœ)
  • ํŒŒ์ผ๋ช… ๋ณ€๊ฒฝ: ํŒŒ์ผ๋ช…์ด ๋ฐ”๋€Œ์–ด๋„ ๊ฐ™์€ ์‚ฌ์ง„
  • ์ •๋ฆฌ ํ•„์š”: ํ–ฅํ›„ ๊ณผ์ œ๋กœ ๋ฏธ๋ฃจ์–ด์ง

  • 1์ฐจ ์ค‘๋ณต ๊ฒ€์ถœ - SHA-256 ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์ •ํ™•ํ•œ ์ค‘๋ณต ์ฐพ๊ธฐ
  • 2์ฐจ ์œ ์‚ฌ ๊ฒ€์ถœ - pHash ๊ธฐ๋ฐ˜ ์‹œ๊ฐ์  ์œ ์‚ฌ ์ค‘๋ณต ์ฐพ๊ธฐ
  • ์ค‘๋ณต ์ •๋ฆฌ - ์›๋ณธ ์œ ์ง€, ์ค‘๋ณต ํŒŒ์ผ ์ด๋™/์‚ญ์ œ
  • ๋ณด๊ณ ์„œ ์ƒ์„ฑ - ์–ด๋–ค ํŒŒ์ผ์ด ์–ด๋–ค ๊ฒฝ๋กœ์— ์žˆ๋Š”์ง€ ๊ธฐ๋ก
  • ์Šค๋งˆํŠธ ๋ถ„๋ฅ˜ - moondream์œผ๋กœ ์‚ฌ์ง„ ๋‚ด์šฉ ๋ถ„์„ โ†’ ์—ฐ๋„/์›”/์žฅ์†Œ ์ž๋™ ์ •๋ฆฌ
  • ์Šคํฌ๋ฆฐ์ƒท ๋ถ„๋ฆฌ - moondream + EXIF๋กœ ์Šคํฌ๋ฆฐ์ƒท/๋ฌธ์„œ์‚ฌ์ง„ vs ์ผ๋ฐ˜์‚ฌ์ง„ ๊ตฌ๋ถ„
  • ์ค‘์š” ์‚ฌ์ง„ ํ‘œ์‹œ - ํฌํ† ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ™œ์šฉ
  • ๋ฐฑ์—… ๊ฒ€์ฆ - ์ •๋ฆฌ ํ›„ ๋ฐฑ์—… ๋ฌด๊ฒฐ์„ฑ ํ™•์ธ
  • ์ธ๋ฌผ/์žฅ์†Œ ์ธ์‹ - moondream Vision ๋ถ„์„์œผ๋กœ ์ž๋™ ํƒœ๊น…
  • ์ƒ‰์ƒ ๋ถ„์„ - ์Šคํฌ๋ฆฐ์ƒท, ๋ฌธ์„œ, ์ผ๋ฐ˜ ์‚ฌ์ง„ ์ž๋™ ๊ตฌ๋ถ„
  • ์ž๋™ ์•„์นด์ด๋ธŒ - ์˜ค๋ž˜๋œ ์‚ฌ์ง„ ์ž๋™ ๋ฐฑ์—… ์ด๋™

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ์‚ฌ์ง„ ์ •๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ v2 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ 1.์Šค์บ” โ”‚ โ†’ โ”‚ 2.1์ฐจํ•„ํ„ฐ โ”‚ โ†’ โ”‚ 3.ํ•ด์‹œ โ”‚ โ†’ โ”‚ 4.์ค‘๋ณต โ”‚ โ”‚
โ”‚ โ”‚ ํŒŒ์ผ๋ฐœ๊ฒฌ โ”‚ โ”‚ ํฌ๊ธฐ๊ธฐ์ค€์ •๋ ฌ โ”‚ โ”‚ SHA-256 โ”‚ โ”‚ ๊ทธ๋ฃนํ•‘ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ v โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚5.์œ ์‚ฌ๊ฒ€์ถœโ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ pHash โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ v v v v โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ ๐Ÿค– ๋ฉ€ํ‹ฐ๋ชจ๋ธ ๋ถ„์„ (8๊ฐœ ๋ชจ๋ธ ํ˜‘๋™) โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€Phase 1โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐Ÿ–ผ๏ธ moondream โ†’ ์ด๋ฏธ์ง€ ๋‚ด์šฉ ๋ถ„์„/์บก์…”๋‹ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โšก gemma4:e2b โ†’ ๊ฒฝ๋Ÿ‰ EXIF ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€Phase 2โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐Ÿง  qwen3.5:cloud โ†’ ์ค‘๋ณต ๊ทธ๋ฃน ๋ถ„์„, ๋ณด์กด ์ˆœ์œ„ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐Ÿ“‹ glm-5.1:cloud โ†’ ์‚ญ์ œ/๋ณด์กด ๊ทœ์น™ ์ƒ์„ฑ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐Ÿ”ฌ deepseek-r1 โ†’ ๋ณต์žกํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค ์ถ”๋ก  โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”Œโ”€Phase 3โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐Ÿ“ llama3.1 โ†’ ์ข…ํ•ฉ ๋ณด๊ณ ์„œ ์ž‘์„ฑ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ โœจ minimax-m2.5 โ†’ ์ตœ์ข… ์š”์•ฝ ๋ฐ ๊ถŒ์žฅ ์•ก์…˜ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ”‚ ๐ŸŽฏ gemma4:31b โ†’ ์ตœ์ข… ๊ฒ€์ˆ˜ ๋ฐ ํ’ˆ์งˆ ๋ณด์ฆ โ”‚ โ”‚ โ”‚
โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚ โ”‚
โ”‚ v โ”‚
โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚
โ”‚ โ”‚ 6.์ •๋ฆฌ โ”‚ โ”‚
โ”‚ โ”‚Move/Del โ”‚ โ”‚
โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚
โ”‚ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
Phase๋ชจ๋ธ์—ญํ• ํƒ€์ž…์ด์œ 
1. ์Šค์บ”๋ถ„์„moondream์ด๋ฏธ์ง€ ๋‚ด์šฉ ๋ถ„์„/์บก์…”๋‹Local/Vision๐Ÿ–ผ๏ธ ์‚ฌ์ง„์ด ๋ฌด์—‡์ธ์ง€ ํŒŒ์•…
1. ์Šค์บ”๋ถ„์„gemma4:e2bEXIF/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๊ฒฝ๋Ÿ‰ ์ถ”์ถœLocalโšก ๋น ๋ฅธ ๋กœ์ปฌ ์ฒ˜๋ฆฌ
2. ์ค‘๋ณตํŒ๋‹จqwen3.5:cloud์ค‘๋ณต ๊ทธ๋ฃน ๋ถ„์„, ๋ณด์กด ์šฐ์„ ์ˆœ์œ„Cloud๐Ÿง  ๋ถ„์„/์ฝ”๋”ฉ ํŠนํ™”
2. ์ค‘๋ณตํŒ๋‹จglm-5.1:cloud์‚ญ์ œ/๋ณด์กด ๊ทœ์น™ ์ƒ์„ฑCloud๐Ÿ“‹ ๋…ผ๋ฆฌ์  ํŒ๋‹จ
2. ์ค‘๋ณตํŒ๋‹จdeepseek-r1๋ณต์žกํ•œ ์—ฃ์ง€ ์ผ€์ด์Šค ์ถ”๋ก Local๐Ÿ”ฌ ์‹ฌ์ธต ์ถ”๋ก 
3. ๋ณด๊ณ ์„œllama3.1์ข…ํ•ฉ ๋ณด๊ณ ์„œ ์ž‘์„ฑLocal๐Ÿ“ ์ž์—ฐ์–ด ์ƒ์„ฑ
3. ๋ณด๊ณ ์„œminimax-m2.5:cloud์ตœ์ข… ์š”์•ฝ ๋ฐ ๊ถŒ์žฅ ์•ก์…˜Cloudโœจ ์š”์•ฝ ํŠนํ™”
3. ๋ณด๊ณ ์„œgemma4:31b-cloud์ตœ์ข… ๊ฒ€์ˆ˜ ๋ฐ ํ’ˆ์งˆ ๋ณด์ฆCloud๐ŸŽฏ ๋Œ€ํ˜• ๋ชจ๋ธ ๊ฒ€์ˆ˜

๐Ÿ’ก ๊ฐœ์„  (gemma4:31b ์ œ์•ˆ): ํŒŒ์ผ ํฌ๊ธฐ ๊ธฐ๋ฐ˜ 1์ฐจ ํ•„ํ„ฐ๋ง โ†’
๊ฐ™์€ ํฌ๊ธฐ์˜ ํŒŒ์ผ๋งŒ ํ•ด์‹œ ๊ณ„์‚ฐ โ†’ ๋„คํŠธ์›Œํฌ I/O 70% ์ ˆ๊ฐ

#!/usr/bin/env python3
"""1_scan_and_hash.py - ์‚ฌ์ง„ ์Šค์บ” ๋ฐ ํ•ด์‹œ ์ƒ์„ฑ v2"""
import os, hashlib, json
from pathlib import Path
from collections import defaultdict
from concurrent.futures import ThreadPoolExecutor, as_completed
# ์ง€์› ํ™•์žฅ์ž
EXTENSIONS = {'.jpg', '.jpeg', '.png', '.heic', '.heif', '.webp', '.mov', '.mp4', '.avi'}
def get_file_hash(filepath: str) -> str:
"""SHA-256 ํ•ด์‹œ ๊ณ„์‚ฐ (8KB ์ฒญํฌ)"""
sha256 = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(8192), b''):
sha256.update(chunk)
return sha256.hexdigest()
def scan_and_hash(base_path: str) -> dict:
"""
1์ฐจ: ํŒŒ์ผ ํฌ๊ธฐ๋ณ„ ๊ทธ๋ฃนํ•‘ (๊ฐ™์€ ํฌ๊ธฐ๋งŒ ํ•ด์‹œ ๊ณ„์‚ฐ)
2์ฐจ: SHA-256 ํ•ด์‹œ ๊ณ„์‚ฐ
"""
# Step 1: ํŒŒ์ผ ๋ชฉ๋ก + ํฌ๊ธฐ ์ˆ˜์ง‘
size_groups = defaultdict(list)
file_info = {}
print(f"๐Ÿ“‚ ์Šค์บ” ์ค‘: {base_path}")
for root, _, files in os.walk(base_path):
for file in files:
ext = Path(file).suffix.lower()
if ext in EXTENSIONS:
filepath = os.path.join(root, file)
try:
fsize = os.path.getsize(filepath)
size_groups[fsize].append(filepath)
file_info[filepath] = {'size': fsize, 'ext': ext}
except OSError:
pass
# Step 2: ๊ฐ™์€ ํฌ๊ธฐ์˜ ํŒŒ์ผ์ด 2๊ฐœ ์ด์ƒ์ธ ๊ฒฝ์šฐ๋งŒ ํ•ด์‹œ ๊ณ„์‚ฐ
hash_map = defaultdict(list)
total = sum(len(v) for v in size_groups.values() if len(v) >= 2)
done = 0
for size, paths in size_groups.items():
if len(paths) < 2:
continue # ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์ค‘๋ณต ๋ถˆ๊ฐ€ โ†’ ์Šคํ‚ต
for filepath in paths:
try:
fhash = get_file_hash(filepath)
hash_map[fhash].append(filepath)
done += 1
if done % 100 == 0:
print(f" ๐Ÿ”ข ํ•ด์‹œ ๊ณ„์‚ฐ: {done}/{total}")
except Exception as e:
print(f" โŒ ์˜ค๋ฅ˜: {filepath} - {e}")
# Step 3: ํฌ๊ธฐ๊ฐ€ ์œ ์ผํ•œ ํŒŒ์ผ๋„ ๊ธฐ๋ก (๋‹จ์ผ ํŒŒ์ผ)
singles = {}
for size, paths in size_groups.items():
if len(paths) == 1:
singles[paths[0]] = size
return {
'duplicates': {k: v for k, v in hash_map.items() if len(v) > 1},
'unique_count': len(singles),
'total_scanned': len(file_info),
}
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--path', required=True)
parser.add_argument('--output', default='scan_result.json')
parser.add_argument('--dry-run', action='store_true')
args = parser.parse_args()
result = scan_and_hash(args.path)
with open(args.output, 'w') as f:
json.dump(result, f, ensure_ascii=False, indent=2)
dup_count = len(result['duplicates'])
print(f"\nโœ… ์™„๋ฃŒ! ์ด {result['total_scanned']}๊ฐœ ์Šค์บ”, {dup_count}๊ฐœ ์ค‘๋ณต ๊ทธ๋ฃน ๋ฐœ๊ฒฌ")

๐Ÿ’ก gemma4:31b + minimax-m2.5 ์ œ์•ˆ: SHA-256์œผ๋กœ ๋ชป ์žก๋Š”
๋ฆฌ์‚ฌ์ด์ฆˆ/ํฌ๋งท๋ณ€ํ™˜ ์ค‘๋ณต์„ pHash(Perceptual Hash)๋กœ ๊ฒ€์ถœ

#!/usr/bin/env python3
"""2_perceptual_hash.py - ์ง€๊ฐ์  ํ•ด์‹œ ๊ธฐ๋ฐ˜ ์œ ์‚ฌ ์‚ฌ์ง„ ๊ฒ€์ถœ"""
# ์˜์กด์„ฑ: pip install imagehash Pillow
# (์—†์œผ๋ฉด ์„ค์น˜: pip install imagehash Pillow)
import os, json
from pathlib import Path
from PIL import Image
import imagehash
def get_phash(filepath: str, size: int = 8) -> str:
"""pHash ๊ณ„์‚ฐ (์ด๋ฏธ์ง€๊ฐ€ ์—ด๋ฆฌ์ง€ ์•Š์œผ๋ฉด None ๋ฐ˜ํ™˜)"""
try:
img = Image.open(filepath)
return str(imagehash.phash(img, hash_size=size))
except Exception:
return None
def find_similar(base_path: str, threshold: int = 10) -> list:
"""
pHash ํ•ด๋ฐ๊ฑฐ๋ฆฌ๊ฐ€ threshold ์ดํ•˜์ธ ํŒŒ์ผ ์Œ ์ฐพ๊ธฐ
- threshold=0: ์™„์ „ ๋™์ผ (SHA-256๊ณผ ๋™์ผ)
- threshold=10: ์•ฝ๊ฐ„์˜ ์ฐจ์ด ํ—ˆ์šฉ (๋ฆฌ์‚ฌ์ด์ฆˆ, ๊ฒฝ๋ฏธํ•œ ํŽธ์ง‘)
"""
hashes = {}
for root, _, files in os.walk(base_path):
for file in files:
ext = Path(file).suffix.lower()
if ext in {'.jpg', '.jpeg', '.png', '.webp'}:
filepath = os.path.join(root, file)
h = get_phash(filepath)
if h:
hashes[filepath] = h
# ์œ ์‚ฌ ์Œ ์ฐพ๊ธฐ
similar_groups = []
paths = list(hashes.keys())
for i in range(len(paths)):
for j in range(i + 1, len(paths)):
h1 = imagehash.hex_to_hash(hashes[paths[i]])
h2 = imagehash.hex_to_hash(hashes[paths[j]])
distance = h1 - h2
if distance <= threshold:
similar_groups.append({
'file1': paths[i],
'file2': paths[j],
'distance': distance,
})
return similar_groups

๐Ÿ’ก minimax-m2.5 + qwen3.5 ์ œ์•ˆ: ๋ณด์กด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ช…์‹œ์  ๊ทœ์น™์œผ๋กœ

#!/usr/bin/env python3
"""3_process_duplicates.py - ์ค‘๋ณต ์ฒ˜๋ฆฌ (๋ณด์กด ์šฐ์„ ์ˆœ์œ„ ๋ช…ํ™•ํ™”)"""
import os, json
# ๋ณด์กด ์šฐ์„ ์ˆœ์œ„ (1์ด ์ตœ๊ณ )
PRIORITY_RULES = [
# ๊ทœ์น™ 1: ๋ผ์ดํŠธ๋ฃธ originals ํด๋” ์›๋ณธ
lambda f: 1 if 'originals' in f.lower() else 999,
# ๊ทœ์น™ 2: ํŒŒ์ผ๋ช…์— _original, _orig ํฌํ•จ
lambda f: 2 if any(x in os.path.basename(f).lower() for x in ['_original', '_orig']) else 999,
# ๊ทœ์น™ 3: ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๊ฐ€์žฅ ํผ (์›๋ณธ ํ’ˆ์งˆ)
lambda f: 3, # ํฌ๊ธฐ ๋น„๊ต๋Š” ์•„๋ž˜์—์„œ ๋ณ„๋„ ์ฒ˜๋ฆฌ
# ๊ทœ์น™ 4: ์ˆ˜์ •์ผ์ด ๊ฐ€์žฅ ์˜ค๋ž˜๋จ (์ตœ์ดˆ ์ƒ์„ฑ)
lambda f: 4, # ๋‚ ์งœ ๋น„๊ต๋„ ๋ณ„๋„ ์ฒ˜๋ฆฌ
# ๊ทœ์น™ 5: PhotoLibrary ๊ฒฝ๋กœ
lambda f: 5 if 'photolibrary' in f.lower() else 999,
]
def select_original(file_list: list) -> str:
"""
์ค‘๋ณต ํŒŒ์ผ ๋ชฉ๋ก์—์„œ ์›๋ณธ ์„ ํƒ
์šฐ์„ ์ˆœ์œ„: originals > _original ๋ช…์นญ > ํŒŒ์ผ ํฌ๊ธฐ > ์ˆ˜์ •์ผ > ๊ฒฝ๋กœ
"""
scored = []
for f in file_list:
priority = 999
for i, rule in enumerate(PRIORITY_RULES[:2]): # ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ ๊ทœ์น™
p = rule(f)
if p < priority:
priority = p
fsize = os.path.getsize(f) if os.path.exists(f) else 0
mtime = os.path.getmtime(f) if os.path.exists(f) else 0
scored.append((f, priority, -fsize, mtime)) # ํฌ๊ธฐ๋Š” ํฐ๊ฒŒ ์ข‹์œผ๋‹ˆ ์Œ์ˆ˜
# ์šฐ์„ ์ˆœ์œ„ โ†’ ํฌ๊ธฐ(ํฐ๊ฒƒ) โ†’ ์ˆ˜์ •์ผ(์˜ค๋ž˜๋œ๊ฒƒ) ์ˆœ ์ •๋ ฌ
scored.sort(key=lambda x: (x[1], x[2], -x[3]))
return scored[0][0] # ๊ฐ€์žฅ ์šฐ์„ ์ˆœ์œ„ ๋†’์€ ํŒŒ์ผ = ์›๋ณธ
def process_duplicates(scan_result: dict, dry_run: bool = True) -> list:
"""์ค‘๋ณต ์ฒ˜๋ฆฌ ์‹คํ–‰"""
actions = []
for hash_key, file_list in scan_result.get('duplicates', {}).items():
if len(file_list) < 2:
continue
original = select_original(file_list)
duplicates = [f for f in file_list if f != original]
for dup in duplicates:
action = {
'original': original,
'duplicate': dup,
'action': 'move', # ์‚ญ์ œ ๋Œ€์‹  ์ด๋™ (์•ˆ์ „)
'destination': dup.replace('/originals/', '/duplicates/'),
}
actions.append(action)
if not dry_run:
os.makedirs(os.path.dirname(action['destination']), exist_ok=True)
os.rename(dup, action['destination'])
return actions

๐Ÿ’ก moondream ์ „์šฉ ์—ญํ• : ์‚ฌ์ง„ ๋‚ด์šฉ ๋ถ„์„ โ†’
์Šคํฌ๋ฆฐ์ƒท/๋ฌธ์„œ/์ธ๋ฌผ/ํ’๊ฒฝ ์ž๋™ ๋ถ„๋ฅ˜

#!/usr/bin/env python3
"""4_moondream_classify.py - Vision ๋ชจ๋ธ๋กœ ์‚ฌ์ง„ ๋ถ„๋ฅ˜"""
import json, urllib.request, base64
from pathlib import Path
def classify_image(image_path: str) -> dict:
"""moondream์œผ๋กœ ์ด๋ฏธ์ง€ ๋ถ„๋ฅ˜"""
with open(image_path, 'rb') as f:
img_b64 = base64.b64encode(f.read()).decode('utf-8')
payload = {
"model": "moondream",
"messages": [{
"role": "user",
"content": "์ด ์‚ฌ์ง„์„ ๋ถ„๋ฅ˜ํ•ด์ค˜. ๋‹ต๋ณ€์€ JSON์œผ๋กœ: {category, description, is_screenshot}",
"images": [img_b64]
}],
"stream": False,
"options": {"num_predict": 200}
}
req = urllib.request.Request(
"http://127.0.0.1:11434/api/chat",
data=json.dumps(payload).encode('utf-8'),
headers={'Content-Type': 'application/json'}
)
with urllib.request.urlopen(req, timeout=60) as resp:
data = json.loads(resp.read().decode('utf-8'))
return data.get('message', {}).get('content', '')

๋‹จ๊ณ„์ž‘์—…๋‹ด๋‹น ๋ชจ๋ธ์˜ˆ์ƒ ์‹œ๊ฐ„
1์Šค์บ” ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑqwen3.5:cloud + minimax-m2.530๋ถ„
2์˜์กด์„ฑ ์„ค์น˜ (imagehash, Pillow)-5๋ถ„
3๐Ÿงช ํ…Œ์ŠคํŠธ ์‹คํ–‰ (์ž‘์€ ์ƒ˜ํ”Œ ~50์žฅ)-30๋ถ„
4์ „์ฒด ์Šค์บ” ์‹คํ–‰-2~4์‹œ๊ฐ„
5pHash ์œ ์‚ฌ ๊ฒ€์ถœmoondream + gemma4:e2b1~2์‹œ๊ฐ„
6์ค‘๋ณต ๋ถ„์„ LLM ํ™œ์šฉqwen3.5 + glm-5.1 + deepseek-r130๋ถ„
7์ •๋ฆฌ ์‹คํ–‰ (dry-run)-30๋ถ„
8๐Ÿ” ์ตœ์ข… ๊ฒ€์ˆ˜gemma4:31b-cloud30๋ถ„
9๋ณด๊ณ ์„œ ์ž‘์„ฑllama3.1 + minimax-m2.520๋ถ„
10โœ… ์‹ค์ œ ์ •๋ฆฌ ์‹คํ–‰ (dry-run ํ™•์ธ ํ›„)-1์‹œ๊ฐ„
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ ์Šค์บ” ๊ฒฐ๊ณผ JSON โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Phase 1: ์Šค์บ” ๋ถ„์„ โ”‚
โ”‚ moondream โ”€โ†’ ์ด๋ฏธ์ง€ ๋‚ด์šฉ ์บก์…”๋‹ โ”‚
โ”‚ gemma4:e2b โ”€โ†’ EXIF/๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”์ถœ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Phase 2: ์ค‘๋ณต ํŒ๋‹จ โ”‚
โ”‚ qwen3.5:cloud โ”€โ†’ ๊ทธ๋ฃน ๋ถ„์„/๋ณด์กด์ˆœ์œ„ โ”‚
โ”‚ glm-5.1:cloud โ”€โ†’ ์‚ญ์ œ/๋ณด์กด ๊ทœ์น™ ์ƒ์„ฑ โ”‚
โ”‚ deepseek-r1 โ”€โ†’ ์—ฃ์ง€ ์ผ€์ด์Šค ์ถ”๋ก  โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
โ”‚
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ–ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ Phase 3: ๋ณด๊ณ ์„œ + ๊ฒ€์ˆ˜ โ”‚
โ”‚ llama3.1 โ”€โ†’ ์ข…ํ•ฉ ๋ณด๊ณ ์„œ ์ž‘์„ฑ โ”‚
โ”‚ minimax-m2.5 โ”€โ†’ ์ตœ์ข… ์š”์•ฝ/๊ถŒ์žฅ์•ก์…˜ โ”‚
โ”‚ gemma4:31b โ”€โ†’ ํ’ˆ์งˆ ๊ฒ€์ˆ˜/์ตœ์ข…์Šน์ธ โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

Terminal window
# ์˜์กด์„ฑ ์„ค์น˜
pip install imagehash Pillow
# ์‹ค์ œ NAS ๊ฒฝ๋กœ ํ™•์ธ
ls /mnt/minicity/
Terminal window
# Step 1: SHA-256 ์Šค์บ” (1์ฐจ)
python3 1_scan_and_hash.py --path /mnt/minicity --output scan_result.json
# Step 2: pHash ์œ ์‚ฌ ๊ฒ€์ถœ (2์ฐจ)
python3 2_perceptual_hash.py --path /mnt/minicity --output similar_result.json
# Step 3: ์ค‘๋ณต ์ฒ˜๋ฆฌ (dry-run)
python3 3_process_duplicates.py --input scan_result.json --dry-run
# Step 4: moondream ๋ถ„๋ฅ˜
python3 4_moondream_classify.py --input scan_result.json --output classify_result.json
# Step 5: ์‹ค์ œ ์‹คํ–‰ (dry-run ๊ฒฐ๊ณผ ํ™•์ธ ํ›„!)
python3 3_process_duplicates.py --input scan_result.json
Terminal window
# ์ค‘๋ณต ๊ทธ๋ฃน LLM ๋ถ„์„ (3๊ฐœ ๋ชจ๋ธ ๋ณ‘๋ ฌ)
ollama run qwen3.5:cloud "์ด ์ค‘๋ณต ์‚ฌ์ง„ ๊ทธ๋ฃน๋“ค์„ ๋ถ„์„..."
ollama run glm-5.1:cloud "์‚ญ์ œ/๋ณด์กด ๊ทœ์น™์„ ์ƒ์„ฑ..."
ollama run deepseek-r1 "๋ณต์žกํ•œ ์ค‘๋ณต ์ผ€์ด์Šค๋ฅผ ํŒ๋‹จ..."

โš ๏ธ ์ค‘์š” (๋ชจ๋ธ ๊ณตํ†ต ์ง€์ ):

  1. ๋ฐฑ์—… ํ•„์ˆ˜ - ์ •๋ฆฌ ์ „ ๋ฐ˜๋“œ์‹œ ์ „์ฒด ํด๋” ๋ฐฑ์—…
  2. Dry-run ์„ ํ–‰ - ์‹ค์ œ ์‚ญ์ œํ•˜๊ธฐ ์ „์— dry-run์œผ๋กœ ํ…Œ์ŠคํŠธ
  3. ์›๋ณธ ๋ณด์กด - ํ•ญ์ƒ ์›๋ณธ ํŒŒ์ผ 1๊ฐœ๋Š” ์œ ์ง€ (์‚ญ์ œ ๋Œ€์‹  ์ด๋™)
  4. ๋กœ๊ทธ ์ €์žฅ - ๋ชจ๋“  ์ž‘์—…์„ ๋กœ๊ทธ๋กœ ๊ธฐ๋ก (๋ณต๊ตฌ ๊ฐ€๋Šฅ)
  5. pHash ์ž„๊ณ„๊ฐ’ ์ฃผ์˜ - threshold ๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ๋†“์น˜๊ณ , ๋„ˆ๋ฌด ๋†’์œผ๋ฉด ์˜คํƒ
  6. ๋„คํŠธ์›Œํฌ ์•ˆ์ •์„ฑ - NAS ์—ฐ๊ฒฐ ๋Š๊ธฐ๋ฉด ํ•ด์‹œ ๊ณ„์‚ฐ ์‹คํŒจ โ†’ ์žฌ์‹œ๋„ ๋กœ์ง ํ•„์š”
  7. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ - 207GB ๋ชจ๋ฐ”์ผ ๋ฐฑ์—…์€ ์ฒญํฌ ๋‹จ์œ„๋กœ ์ฒ˜๋ฆฌ

  • [[MiniCITY(v0.5_PARA_0502-)/01_PROJECTS(ํ”„๋กœ์ ํŠธ)/F_์ž๋ฃŒ์ •๋ฆฌ-PhotoVault/PS.BOT-F-01-๊ฐœ์š”]] - ๊ธฐ์กด ์ž๋ฃŒ ๊ฐœ์š”
  • [[MiniCITY(v0.5_PARA_0502-)/02_AREAS(์˜์—ญ)/์—์ด์ „ํŠธ/LLM-๋ชจ๋ธ/LLM_๋ชจ๋ธ_๋ชฉ๋ก]] - ์‚ฌ์šฉ ๋ชจ๋ธ ์ •๋ณด

๋‚ ์งœ์ž‘์„ฑ์ž๋‚ด์šฉ
2026-04-21ํ•˜๋Š˜์ดv1 ์ดˆ๊ธฐ ๊ณ„ํš ์ž‘์„ฑ
2026-04-21ํ•˜๋Š˜์ด + 8๋ชจ๋ธv2 ๋ฉ€ํ‹ฐ๋ชจ๋ธ ํ˜‘๋™ ๋ถ„์„ ๋ฐ˜์˜

[!note] ์ˆ˜์ •์ด๋ ฅ | 2026-04-21 06:XX, ํ•˜๋Š˜์ด (v2)

๐Ÿšง ์ง„ํ–‰ ์ƒํ™ฉ:

  • ๊ณ„ํš์„œ v1 ์ž‘์„ฑ
  • 8๋ชจ๋ธ ํ˜‘๋™ ๋ถ„์„ ์™„๋ฃŒ
  • ๊ณ„ํš์„œ v2 ์—…๋ฐ์ดํŠธ
  • ์˜์กด์„ฑ ์„ค์น˜ (imagehash, Pillow)
  • ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ
  • ํ…Œ์ŠคํŠธ ์‹คํ–‰
  • ์ „์ฒด ์Šค์บ”
  • ์ •๋ฆฌ ์‹คํ–‰
  • ๋ณด๊ณ ์„œ ์ž‘์„ฑ