์ฝ˜ํ…์ธ  ๋Œ€ํ‘œ ์ด๋ฏธ์ง€ - ๐Ÿ‹ DeepSeek-Coder์˜ ์ฝ”๋“œ ํ•ด์„ ๋Šฅ๋ ฅ, ์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ํŒŒํ—ค์ณ ๋ณด๊ธฐ

๐Ÿ‹ DeepSeek-Coder์˜ ์ฝ”๋“œ ํ•ด์„ ๋Šฅ๋ ฅ, ์นœ๊ตฌ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ ํŒŒํ—ค์ณ ๋ณด๊ธฐ

"์ด ์ฝ”๋“œ ๋ˆ„๊ฐ€ ์งฐ์–ดโ€ฆ?" ํ•˜๊ณ  ํ•œ์ˆจ ์‰ฌ์–ด ๋ณธ ์  ์žˆ์ง€? ๋‚จ์ด ์ง  ์ฝ”๋“œ, ์‹ฌ์ง€์–ด 3๊ฐœ์›” ์ „์˜ ๋‚ด๊ฐ€ ์ง  ์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ฑด ๊ฐœ๋ฐœ์ž ์ธ์ƒ์˜ ์˜์›ํ•œ ์ˆ™์ œ์•ผ.
๊ทธ๋Ÿฐ๋ฐ ์š”์ฆ˜์€ ์ด ์ˆ™์ œ๋ฅผ ๊ฝค ์ž˜ ๋„์™€์ฃผ๋Š” ์นœ๊ตฌ๊ฐ€ ์ƒ๊ฒผ์–ด. ๋ฐ”๋กœ DeepSeek-Coder๋ผ๋Š” ์˜คํ”ˆ์†Œ์Šค ์ฝ”๋“œ ํŠนํ™” ์–ธ์–ด ๋ชจ๋ธ์ด์•ผ.
์˜ค๋Š˜์€ ์ด ์นœ๊ตฌ๊ฐ€ ์ฝ”๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ, ์–ผ๋งˆ๋‚˜, ์–ด๋””๊นŒ์ง€ ์ดํ•ดํ•˜๋Š”์ง€ ํŒฉํŠธ ์œ„์ฃผ๋กœ ์ฐจ๊ทผ์ฐจ๊ทผ ์ˆ˜๋‹ค ๋–จ๋“ฏ ํ’€์–ด๋ณผ๊ฒŒ!

์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ๊ณ ๋ž˜, DeepSeek-Coder def f(xs): s = 0 for x in xs: s += x return s "๋ฆฌ์ŠคํŠธ์˜ ํ•ฉ์„ ๊ตฌํ•˜๋Š” ํ•จ์ˆ˜์˜ˆ์š”!" ๐Ÿ’ก ์ฝ”๋“œ ์ž…๋ ฅ

๐Ÿค” 1. DeepSeek-Coder, ๋„Œ ๋ˆ„๊ตฌ๋‹ˆ?

DeepSeek-Coder๋Š” ์ค‘๊ตญ์˜ AI ๊ธฐ์—… DeepSeek(๋”ฅ์‹œํฌ)๊ฐ€ 2023๋…„ 11์›”์— ๊ณต๊ฐœํ•œ ์ฝ”๋“œ ํŠนํ™” ๋Œ€๊ทœ๋ชจ ์–ธ์–ด ๋ชจ๋ธ(Code LLM) ์‹œ๋ฆฌ์ฆˆ์•ผ. 2024๋…„ 1์›”์—๋Š” ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ ใ€ŒDeepSeek-Coder: When the Large Language Model Meets Programmingใ€๋„ arXiv์— ์˜ฌ๋ผ์™”์ง€.
ํ•ต์‹ฌ ํฌ์ธํŠธ๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ”๋“œ ๋ฐ์ดํ„ฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ํ•™์Šต(from scratch)ํ–ˆ๋‹ค๋Š” ๊ฑฐ์•ผ. ์ผ๋ฐ˜ ์ฑ—๋ด‡์— ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ ๋” ๋จน์ธ ๊ฒŒ ์•„๋‹ˆ๋ผ, ํƒœ์ƒ๋ถ€ํ„ฐ "์ฝ”๋“œ ์›์–ด๋ฏผ"์œผ๋กœ ํ‚ค์šด ์…ˆ์ด์ง€.

๐Ÿ“ฆ ๋ชจ๋ธ ํฌ๊ธฐ

1.3B, 5.7B, 6.7B, 33B ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฒ„์ „์ด ์žˆ์–ด. ๋…ธํŠธ๋ถ์—์„œ ๋Œ๋ฆด ์ž‘์€ ๊ฒƒ๋ถ€ํ„ฐ ์„œ๋ฒ„์šฉ ํฐ ๊ฒƒ๊นŒ์ง€ ๊ณจ๋ผ ์“ธ ์ˆ˜ ์žˆ์ง€.

๐Ÿ“š ํ•™์Šต ๋ฐ์ดํ„ฐ

์•ฝ 2์กฐ(2T) ํ† ํฐ์œผ๋กœ ํ•™์Šตํ–ˆ๊ณ , ๊ตฌ์„ฑ์€ ์ฝ”๋“œ 87%, ์ฝ”๋“œ ๊ด€๋ จ ์˜์–ด ์ž์—ฐ์–ด 10%, ์ค‘๊ตญ์–ด ์ž์—ฐ์–ด 3%์•ผ.

๐ŸชŸ ๋ฌธ๋งฅ ๊ธธ์ด

16K ํ† ํฐ ์ปจํ…์ŠคํŠธ ์œˆ๋„์šฐ. ํ•จ์ˆ˜ ํ•˜๋‚˜๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ํŒŒ์ผ ๋‹จ์œ„์˜ ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋ณผ ์ˆ˜ ์žˆ์–ด.

๊ทธ๋ฆฌ๊ณ  2024๋…„ 6์›”์—๋Š” ํ›„์†์ž‘ DeepSeek-Coder-V2๊ฐ€ ๋‚˜์™”์–ด. ์ด ์นœ๊ตฌ๋Š” MoE(Mixture-of-Experts, ์ „๋ฌธ๊ฐ€ ํ˜ผํ•ฉ) ๊ตฌ์กฐ๋ฅผ ์“ฐ๊ณ , ์ง€์› ์–ธ์–ด๊ฐ€ 86๊ฐœ์—์„œ 338๊ฐœ๋กœ ํ™• ๋Š˜์—ˆ๊ณ , ์ปจํ…์ŠคํŠธ๋„ 128K ํ† ํฐ๊นŒ์ง€ ๋Š˜์–ด๋‚ฌ์ง€. ์ด ํŒŒ๋ผ๋ฏธํ„ฐ 236B ๋ชจ๋ธ(ํ™œ์„ฑ ํŒŒ๋ผ๋ฏธํ„ฐ 21B)๊ณผ 16B Lite ๋ฒ„์ „(ํ™œ์„ฑ 2.4B)์ด ์žˆ์–ด.

๊ตฌ๋ถ„DeepSeek-Coder (V1)DeepSeek-Coder-V2
๊ณต๊ฐœ ์‹œ๊ธฐ2023๋…„ 11์›”2024๋…„ 6์›”
๊ตฌ์กฐDense ํŠธ๋žœ์Šคํฌ๋จธMoE (DeepSeek-V2 ๊ธฐ๋ฐ˜)
ํฌ๊ธฐ1.3B / 5.7B / 6.7B / 33B16B Lite / 236B
์ปจํ…์ŠคํŠธ16K128K
์ง€์› ์–ธ์–ด86๊ฐœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด338๊ฐœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด
์ถ”๊ฐ€ ํ•™์Šต2T ํ† ํฐ ์‚ฌ์ „ํ•™์ŠตDeepSeek-V2 ์ค‘๊ฐ„ ์ฒดํฌํฌ์ธํŠธ์—์„œ 6T ํ† ํฐ ์ถ”๊ฐ€ ํ•™์Šต

๐Ÿง  2. ์ฝ”๋“œ๋ฅผ "ํ•ด์„"ํ•œ๋‹ค๋Š” ๊ฑด ๋ญ˜๊นŒ?

์ฝ”๋“œ ํ•ด์„ ๋Šฅ๋ ฅ์ด๋ผ๊ณ  ํ•˜๋ฉด ๋ง‰์—ฐํ•˜๊ฒŒ ๋“ค๋ฆฌ์ง€? ์‚ฌ์‹ค ์—ฌ๋Ÿฌ ๋Šฅ๋ ฅ์ด ๋ญ‰์นœ ๊ฑฐ์•ผ. ์‚ฌ๋žŒ์œผ๋กœ ์น˜๋ฉด "์™ธ๊ตญ์–ด๋ฅผ ์ฝ๊ณ , ์ดํ•ดํ•˜๊ณ , ์š”์•ฝํ•˜๊ณ , ํ‹€๋ฆฐ ๋ฌธ๋ฒ•๋„ ์ฐพ์•„์ฃผ๋Š”" ๋Šฅ๋ ฅ์ด๋ž‘ ๋น„์Šทํ•ด.

1
๊ตฌ๋ฌธ ์ดํ•ด โ€” ์ด๊ฒŒ ๋ฐ˜๋ณต๋ฌธ์ธ์ง€, ์กฐ๊ฑด๋ฌธ์ธ์ง€, ํด๋ž˜์Šค์ธ์ง€ ๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ
2
์˜๋ฏธ ์ดํ•ด โ€” "๊ทธ๋ž˜์„œ ์ด ์ฝ”๋“œ๊ฐ€ ๊ฒฐ๊ตญ ๋ญ˜ ํ•˜๋Š”๋ฐ?"์— ๋‹ตํ•˜๋Š” ๊ฒƒ
3
์‹คํ–‰ ์ถ”๋ก  โ€” ํŠน์ • ์ž…๋ ฅ์„ ๋„ฃ์œผ๋ฉด ์–ด๋–ค ์ถœ๋ ฅ์ด ๋‚˜์˜ค๋Š”์ง€ ๋จธ๋ฆฟ์†์œผ๋กœ ๋Œ๋ ค๋ณด๋Š” ๊ฒƒ
4
๋ฌธ๋งฅ ์ดํ•ด โ€” ๋‹ค๋ฅธ ํŒŒ์ผ์— ์ •์˜๋œ ํ•จ์ˆ˜ยทํด๋ž˜์Šค์™€์˜ ๊ด€๊ณ„๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ
5
๊ฒฐํ•จ ํƒ์ง€ ๋ฐ ์ˆ˜์ • โ€” ๋ฒ„๊ทธ๋‚˜ ๋น„ํšจ์œจ์„ ์ฐพ์•„๋‚ด๊ณ  ๊ณ ์น˜๋Š” ๊ฒƒ

DeepSeek-Coder๋Š” ์ด ๋‹ค์„ฏ ๊ฐ€์ง€๋ฅผ ์œ„ํ•ด ํ•™์Šต ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ๊ฝค ์˜๋ฆฌํ•œ ์žฅ์น˜๋“ค์„ ๋„ฃ์—ˆ์–ด. ํ•˜๋‚˜์”ฉ ๋ณผ๊ฒŒ!

๐Ÿ”ง 3. ์ฝ”๋“œ๋ฅผ ์ž˜ ์ฝ๊ฒŒ ๋งŒ๋“  ๋น„๋ฐ€ ๋ ˆ์‹œํ”ผ

โ‘  ์ €์žฅ์†Œ(Repository) ๋‹จ์œ„ ํ•™์Šต

๋ณดํ†ต ๋ชจ๋ธ์€ ํŒŒ์ผ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋”ฐ๋กœ๋”ฐ๋กœ ๋ฐฐ์›Œ. ๊ทผ๋ฐ ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋Š” utils.py์—์„œ ๋งŒ๋“  ํ•จ์ˆ˜๋ฅผ main.py๊ฐ€ ๋ถˆ๋Ÿฌ ์“ฐ์ž–์•„?
DeepSeek-Coder๋Š” ํŒŒ์ผ ๊ฐ„ ์˜์กด์„ฑ(import ๊ด€๊ณ„ ๋“ฑ)์„ ๋ถ„์„ํ•ด์„œ, ์˜์กด๋˜๋Š” ํŒŒ์ผ์ด ๋จผ์ € ์˜ค๋„๋ก ์ˆœ์„œ๋ฅผ ์ •๋ ฌ(์œ„์ƒ ์ •๋ ฌ)ํ•œ ๋’ค ํ•™์Šต์‹œ์ผฐ์–ด. ๊ทธ๋ž˜์„œ "์ด ํ•จ์ˆ˜ ์–ด๋””์„œ ์˜จ ๊ฑฐ์ง€?"๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์œ ๋ฆฌํ•ด.

์ €์žฅ์†Œ ๋‹จ์œ„ ์˜์กด์„ฑ ์ •๋ ฌ config.py 1๋ฒˆ์งธ utils.py 2๋ฒˆ์งธ main.py 3๋ฒˆ์งธ ์˜์กด๋˜๋Š” ํŒŒ์ผ์ด ๋จผ์ € ํ•™์Šต ์ˆœ์„œ์— ๋†“์—ฌ ์ •์˜ โ†’ ์‚ฌ์šฉ ํ๋ฆ„์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐฐ์›Œ์š”

โ‘ก FIM(Fill-In-the-Middle) ํ•™์Šต

FIM์€ ์ฝ”๋“œ ์ค‘๊ฐ„์„ ๋ปฅ ๋šซ์–ด ๋†“๊ณ  "์•ž๋’ค ๋งฅ๋ฝ ๋ณด๊ณ  ๋นˆ์นธ ์ฑ„์›Œ๋ด!" ํ•˜๋Š” ํ›ˆ๋ จ์ด์•ผ. ๋งˆ์น˜ ๋นˆ์นธ ์ฑ„์šฐ๊ธฐ ์‹œํ—˜ ๊ฐ™์ง€?
์ด๊ฒŒ ์™œ ํ•ด์„๋ ฅ์ด๋ž‘ ๊ด€๋ จ์ด ์žˆ๋ƒ๋ฉด, ๋นˆ์นธ์„ ์ฑ„์šฐ๋ ค๋ฉด ์•ž ์ฝ”๋“œ์™€ ๋’ค ์ฝ”๋“œ๋ฅผ ๋‘˜ ๋‹ค ์ดํ•ดํ•ด์•ผ ํ•˜๊ฑฐ๋“ . DeepSeek-Coder๋Š” ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ์ƒ๋‹น ๋น„์œจ(๋ณด๊ณ ์„œ ๊ธฐ์ค€ FIM ๋น„์œจ 0.5, PSM ๋ชจ๋“œ)์— ์ด ๋ฐฉ์‹์„ ์ ์šฉํ–ˆ์–ด. ๋•๋ถ„์— ์—๋””ํ„ฐ์—์„œ ์ปค์„œ ์ค‘๊ฐ„์— ์ฝ”๋“œ๋ฅผ ์ด์–ด ์“ฐ๋Š” ์ž๋™์™„์„ฑ์— ํŠนํžˆ ๊ฐ•ํ•ด.

<๏ฝœfimโ–begin๏ฝœ>def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[0]
<๏ฝœfimโ–hole๏ฝœ>
    return quick_sort(left) + [pivot] + quick_sort(right)<๏ฝœfimโ–end๏ฝœ>

์œ„์ฒ˜๋Ÿผ ๋„ฃ์œผ๋ฉด ๋ชจ๋ธ์ด left, right๋ฅผ ๋‚˜๋ˆ„๋Š” ์ค‘๊ฐ„ ๋ถ€๋ถ„์„ ์ฑ„์›Œ์ค˜. ๋’ค์— ๋‚˜์˜ค๋Š” quick_sort(left)๋ฅผ "์ฝ๊ณ " ์ดํ•ดํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•œ ๊ฑฐ์•ผ. ๐Ÿงฉ

โ‘ข ๊ธด ๋ฌธ๋งฅ ์ฒ˜๋ฆฌ

V1์€ RoPE(ํšŒ์ „ ์œ„์น˜ ์ž„๋ฒ ๋”ฉ) ์Šค์ผ€์ผ๋ง ์„ค์ •์„ ์กฐ์ •ํ•ด 16K ๋ฌธ๋งฅ์„ ๋‹ค๋ฃจ๋„๋ก ํ–ˆ๊ณ , V2๋Š” YaRN ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ด 128K๊นŒ์ง€ ๋Š˜๋ ธ์–ด. 128K ํ† ํฐ์ด๋ฉด ์ค‘์†Œ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ํ•ต์‹ฌ ํŒŒ์ผ ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ํ†ต์งธ๋กœ ๋„ฃ์–ด๋„ ๋˜๋Š” ์ˆ˜์ค€์ด์•ผ.

โ‘ฃ ์ง€์‹œ ํŠœ๋‹(Instruct)

"์ด ์ฝ”๋“œ ์„ค๋ช…ํ•ด์ค˜", "๋ฒ„๊ทธ ์ฐพ์•„์ค˜" ๊ฐ™์€ ์‚ฌ๋žŒ ๋ง์„ ์•Œ์•„๋“ฃ๋„๋ก ์ง€์‹œ ๋ฐ์ดํ„ฐ๋กœ ์ถ”๊ฐ€ ํ•™์Šตํ•œ ๋ฒ„์ „์ด ๋ฐ”๋กœ DeepSeek-Coder-Instruct์•ผ. ํ•ด์„ยท์„ค๋ช… ์ž‘์—…์—” Base๋ณด๋‹ค Instruct ๋ฒ„์ „์„ ์“ฐ๋Š” ๊ฒŒ ์ •์„์ด์•ผ.

๐Ÿ’ก ๊ฟ€ํŒ
์ž๋™์™„์„ฑ(FIM)์ฒ˜๋Ÿผ "์ด์–ด ์“ฐ๊ธฐ"๋Š” Base ๋ชจ๋ธ, ์„ค๋ช…ยท๋ฆฌ๋ทฐยท๋Œ€ํ™”์ฒ˜๋Ÿผ "๋ง๋กœ ํ’€๊ธฐ"๋Š” Instruct ๋ชจ๋ธ์ด ์ž˜ ๋งž์•„. ์šฉ๋„๋ฅผ ๋ฐ”๊ฟ” ์“ฐ๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ์–ด์ƒ‰ํ•ด์งˆ ์ˆ˜ ์žˆ์–ด!

๐Ÿ“Š 4. ์ˆซ์ž๋กœ ๋ณด๋Š” ์‹ค๋ ฅ (๋ฒค์น˜๋งˆํฌ)

๋ง๋กœ๋งŒ "์ž˜ํ•ด์š”~" ํ•˜๋ฉด ์‹ ๋ขฐ๊ฐ€ ์•ˆ ๊ฐ€์ง€? ๊ณต์‹ ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ์— ๋‚˜์˜จ ๋Œ€ํ‘œ ์ˆ˜์น˜๋ฅผ ๋ณผ๊ฒŒ. (๋ชจ๋‘ pass@1 ๊ธฐ์ค€, ๋ณด๊ณ ์„œ ๋ฐœํ‘œ ๋‹น์‹œ ์ˆ˜์น˜์•ผ.)

HumanEval (Python) ์ ์ˆ˜ ๋น„๊ต V1 33B Base 56.1% V1 33B Instruct 79.3% V2 Instruct 90.2% ์ถœ์ฒ˜: DeepSeek-Coder / Coder-V2 ๊ธฐ์ˆ  ๋ณด๊ณ ์„œ
๋ฒค์น˜๋งˆํฌ๋ฌด์—‡์„ ๋ณด๋‚˜๋Œ€ํ‘œ ๊ฒฐ๊ณผ
HumanEvalํ•จ์ˆ˜ ์„ค๋ช… ๋ณด๊ณ  Python ์ฝ”๋“œ ์ž‘์„ฑV1 33B Instruct 79.3%, V2 Instruct 90.2%
MBPP๊ธฐ์ดˆ Python ๋ฌธ์ œ ํ•ด๊ฒฐV1 33B Instruct 70.0%
DS-1000NumPyยทPandas ๋“ฑ ๋ฐ์ดํ„ฐ ๊ณผํ•™ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™œ์šฉV1 33B Base ํ‰๊ท  40.2%
CRUXEval์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ ์ถ”๋ก (์ž…๋ ฅโ†’์ถœ๋ ฅ, ์ถœ๋ ฅโ†’์ž…๋ ฅ)์ฝ”๋“œ "์ฝ๊ณ  ๋จธ๋ฆฟ์† ์‹คํ–‰"ํ•˜๋Š” ๋Šฅ๋ ฅ ์ธก์ •
LiveCodeBench์ตœ์‹  ์ฝ”๋”ฉ ๋Œ€ํšŒ ๋ฌธ์ œ (๋ฐ์ดํ„ฐ ์˜ค์—ผ ์ตœ์†Œํ™”)V2 Instruct 43.4%

์—ฌ๊ธฐ์„œ ํŠนํžˆ ์žฌ๋ฐŒ๋Š” ๊ฑด CRUXEval์ด์•ผ. ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ "์ด ์ฝ”๋“œ ๋Œ๋ฆฌ๋ฉด ๋ญ๊ฐ€ ๋‚˜์˜ฌ๊นŒ?"๋ฅผ ๋งžํžˆ๋Š” ์‹œํ—˜์ด๋ผ, ์ˆœ์ˆ˜ํ•œ ์ฝ”๋“œ ํ•ด์„ ๋Šฅ๋ ฅ์„ ๋ณด๊ธฐ ๋”ฑ ์ข‹๊ฑฐ๋“ . DeepSeek-Coder ๋ณด๊ณ ์„œ๋„ ์ด ๋ฒค์น˜๋งˆํฌ๋กœ ์‹คํ–‰ ์ถ”๋ก  ๋Šฅ๋ ฅ์„ ํ‰๊ฐ€ํ–ˆ์–ด.
๋˜ V1 33B Instruct๋Š” ๊ณต๊ฐœ ๋‹น์‹œ HumanEval์—์„œ GPT-3.5-Turbo๋ฅผ ์•ž์„ ๋‹ค๊ณ  ๋ณด๊ณ ๋๊ณ , V2๋Š” ์ฝ”๋”ฉ ๋ฒค์น˜๋งˆํฌ ์—ฌ๋Ÿฌ ๊ฐœ์—์„œ ๋‹น๋Œ€ ์ตœ์ƒ์œ„ ๋น„๊ณต๊ฐœ ๋ชจ๋ธ๋“ค๊ณผ ๋น„์Šทํ•œ ์ˆ˜์ค€์ด๋ผ๊ณ  ๋ฐœํ‘œ๋์ง€.

โš ๏ธ ์ž ๊น! ๋ฒค์น˜๋งˆํฌ ๋งน์‹  ๊ธˆ์ง€
๋ฒค์น˜๋งˆํฌ๋Š” ์ •ํ•ด์ง„ ๋ฌธ์ œ์—์„œ์˜ ์„ฑ์ ์ผ ๋ฟ์ด์•ผ. ์‹ค๋ฌด ์ฝ”๋“œ๋Š” ์‚ฌ๋‚ด ๊ทœ์น™, ๋ ˆ๊ฑฐ์‹œ, ์ด์ƒํ•œ ๋ณ€์ˆ˜๋ช…(tmp2_final_real ๊ฐ™์€โ€ฆ)์ด ๊ฐ€๋“ํ•˜์ž–์•„. ์ˆซ์ž๋Š” ์ฐธ๊ณ ์šฉ์œผ๋กœ, ๋‚ด ์ฝ”๋“œ๋กœ ์ง์ ‘ ํ…Œ์ŠคํŠธํ•ด ๋ณด๋Š” ๊ฒŒ ์ตœ๊ณ ์•ผ!

๐ŸŽฎ 5. ์‹ค์ „! ์ฝ”๋“œ ํ•ด์„ ์‹œ์ผœ๋ณด๊ธฐ

๊ทธ๋Ÿผ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์งˆ๋ฌธ์„ ๋˜์ง„๋‹ค๊ณ  ํ•ด๋ณด์ž.

def mystery(n):
    a, b = 0, 1
    for _ in range(n):
        a, b = b, a + b
    return a

print(mystery(10))

๐Ÿ™‹ ๋‚˜: ์ด ์ฝ”๋“œ๊ฐ€ ๋ญ˜ ํ•˜๋Š”์ง€, ์ถœ๋ ฅ๊ฐ’์ด ๋ญ”์ง€ ์„ค๋ช…ํ•ด์ค˜.

๐Ÿ‹ DeepSeek-Coder(์‘๋‹ต ์˜ˆ์‹œ): ์ด ํ•จ์ˆ˜๋Š” n๋ฒˆ์งธ ํ”ผ๋ณด๋‚˜์น˜ ์ˆ˜๋ฅผ ๋ฐ˜๋ณต๋ฌธ์œผ๋กœ ๊ณ„์‚ฐํ•ด์š”. a, b๋ฅผ ๋™์‹œ์— ๊ฐฑ์‹ ํ•ด ์ด์ „ ๋‘ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ , 10๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด a๋Š” 55๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์žฌ๊ท€๋ณด๋‹ค ๋ฉ”๋ชจ๋ฆฌ์™€ ์†๋„ ๋ฉด์—์„œ ํšจ์œจ์ ์ธ O(n) ๋ฐฉ์‹์ด์—์š”.

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

์ด๋ ‡๊ฒŒ ์จ๋จน์œผ๋ฉด ์ข‹์•„

๐Ÿ•ต๏ธ ๋ ˆ๊ฑฐ์‹œ ๋ถ„์„

์ฃผ์„ ํ•˜๋‚˜ ์—†๋Š” ์˜ค๋ž˜๋œ ์ฝ”๋“œ๋ฅผ ๋„ฃ๊ณ  "๋ชจ๋“ˆ๋ณ„ ์—ญํ•  ์š”์•ฝํ•ด์ค˜"๋ผ๊ณ  ํ•˜๋ฉด ์ „์ฒด ์ง€๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ทธ๋ฆด ์ˆ˜ ์žˆ์–ด.

๐Ÿž ๋ฒ„๊ทธ ํƒ์ƒ‰

์—๋Ÿฌ ๋กœ๊ทธ์™€ ์ฝ”๋“œ๋ฅผ ๊ฐ™์ด ์ฃผ๋ฉด ์›์ธ ํ›„๋ณด๋ฅผ ์งš์–ด์ค˜. ๋‹จ, ์ˆ˜์ •์•ˆ์€ ๊ผญ ํ…Œ์ŠคํŠธ๋กœ ๊ฒ€์ฆ!

๐Ÿ“ ๋ฌธ์„œํ™”

ํ•จ์ˆ˜๋ณ„ docstring, README ์ดˆ์•ˆ ์ž‘์„ฑ์— ์‹œ๊ฐ„์„ ํ™• ์ค„์—ฌ์ค˜.

๐Ÿ”„ ์–ธ์–ด ๋ณ€ํ™˜

Python โ†’ Go, Java โ†’ Kotlin์ฒ˜๋Ÿผ ์˜๋ฏธ๋ฅผ ์œ ์ง€ํ•œ ๋ฒˆ์—ญ์—๋„ ํ™œ์šฉ๋ผ.

๐Ÿ’ป 6. ์ง์ ‘ ๋Œ๋ ค๋ณด๋Š” ๋ฐฉ๋ฒ•

์˜คํ”ˆ์†Œ์Šค๋ผ ์ข‹์€ ์ ! ๊ฐ€์ค‘์น˜๊ฐ€ Hugging Face์— ๊ณต๊ฐœ๋˜์–ด ์žˆ์–ด์„œ ๋‚ด ์ปดํ“จํ„ฐ๋‚˜ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๋Œ๋ฆด ์ˆ˜ ์žˆ์–ด. ์ฝ”๋“œ์™€ ๋ชจ๋ธ ๋ผ์ด์„ ์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ณ , ๋ชจ๋ธ ๋ผ์ด์„ ์Šค ์กฐ๊ฑด ์•ˆ์—์„œ ์ƒ์—…์  ์ด์šฉ๋„ ํ—ˆ์šฉ๋ผ. ์‚ฌ์šฉ ์ „์—” ๋ผ์ด์„ ์Šค ์›๋ฌธ์„ ๊ผญ ํ™•์ธํ•˜์ž.

from transformers import AutoTokenizer, AutoModelForCausalLM
import torch

name = "deepseek-ai/deepseek-coder-6.7b-instruct"
tok = AutoTokenizer.from_pretrained(name, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    name, trust_remote_code=True, torch_dtype=torch.bfloat16
).cuda()

messages = [{"role": "user", "content": "์ด ์ฝ”๋“œ ์„ค๋ช…ํ•ด์ค˜:\nprint(sum(range(5)))"}]
inputs = tok.apply_chat_template(
    messages, add_generation_prompt=True, return_tensors="pt"
).to(model.device)

out = model.generate(inputs, max_new_tokens=300, do_sample=False,
                     eos_token_id=tok.eos_token_id)
print(tok.decode(out[0][len(inputs[0]):], skip_special_tokens=True))

GPU๊ฐ€ ๋ถ€๋‹ด์Šค๋Ÿฌ์šฐ๋ฉด Ollama๋‚˜ LM Studio ๊ฐ™์€ ๋กœ์ปฌ ์‹คํ–‰ ๋„๊ตฌ์—์„œ ์–‘์žํ™” ๋ฒ„์ „์„ ๋ฐ›์•„ ์“ฐ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ , 1.3B ๊ฐ™์€ ์ž‘์€ ๋ชจ๋ธ์€ ๋น„๊ต์  ๊ฐ€๋ฒผ์šด ํ™˜๊ฒฝ์—์„œ๋„ ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์–ด. VS Code์˜ Continue ๊ฐ™์€ ํ™•์žฅ๊ณผ ์—ฐ๊ฒฐํ•˜๋ฉด ์—๋””ํ„ฐ ์•ˆ ์ฝ”๋”ฉ ๋น„์„œ๋กœ ์“ธ ์ˆ˜ ์žˆ์ง€. ๐Ÿš€

๐Ÿšง 7. ํ•œ๊ณ„๋„ ์†”์งํ•˜๊ฒŒ ์•Œ์•„๋‘์ž

AI ๋‹ต๋ณ€ = ๊ฒ€์ฆ์ด ํ•„์š”ํ•œ ์ดˆ์•ˆ AI ํ•ด์„ ๋น ๋ฆ„ + ์‚ฌ๋žŒ ๊ฒ€ํ†  ์ •ํ™• = ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ
๐Ÿ‘ป ํ™˜๊ฐ(Hallucination)

์กด์žฌํ•˜์ง€ ์•Š๋Š” API๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ๊ทธ๋Ÿด๋“ฏํ•˜๊ฒŒ ์ง€์–ด๋‚ผ ์ˆ˜ ์žˆ์–ด.

๐Ÿ“… ์ง€์‹ ์‹œ์ 

ํ•™์Šต ์ดํ›„์— ๋‚˜์˜จ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์ด๋‚˜ ๋ฌธ๋ฒ• ๋ณ€๊ฒฝ์€ ๋ชจ๋ฅผ ์ˆ˜ ์žˆ์–ด.

๐Ÿ” ๋ณด์•ˆ ์ฃผ์˜

์™ธ๋ถ€ API๋กœ ์“ธ ๋• ์‚ฌ๋‚ด ์ฝ”๋“œยท๋น„๋ฐ€ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๊ฒŒ ์กฐ์‹ฌ! ๋ฏผ๊ฐํ•œ ์ฝ”๋“œ๋Š” ๋กœ์ปฌ ์‹คํ–‰์ด ์•ˆ์ „ํ•ด.

๐ŸŒ ํ•œ๊ตญ์–ด ์„ค๋ช…

ํ•™์Šต ๋ฐ์ดํ„ฐ์˜ ์ž์—ฐ์–ด๋Š” ์˜์–ดยท์ค‘๊ตญ์–ด ์ค‘์‹ฌ์ด๋ผ, ํ•œ๊ตญ์–ด ์„ค๋ช… ํ’ˆ์งˆ์€ ์˜์–ด๋ณด๋‹ค ๋‹ค์†Œ ๋“ค์ญ‰๋‚ ์ญ‰ํ•  ์ˆ˜ ์žˆ์–ด.

๐ŸŒฑ 8. ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ฃผ๋Š” ์˜๋ฏธ

DeepSeek-Coder๊ฐ€ ์—…๊ณ„์— ์ค€ ๊ฐ€์žฅ ํฐ ๋ฉ”์‹œ์ง€๋Š” "์˜คํ”ˆ์†Œ์Šค ๋ชจ๋ธ๋„ ์ฝ”๋“œ ์ดํ•ด๋ ฅ์—์„œ ์ƒ์šฉ ๋ชจ๋ธ๊ณผ ๊ฒจ๋ฃฐ ์ˆ˜ ์žˆ๋‹ค"๋Š” ๊ฑฐ์•ผ. ๋•๋ถ„์— ๊ฐœ์ธ ๊ฐœ๋ฐœ์ž๋‚˜ ์Šคํƒ€ํŠธ์—…๋„ ๋น„์šฉ ๋ถ€๋‹ด์„ ์ค„์ด๋ฉฐ ์ž์ฒด ์ฝ”๋“œ ๋น„์„œ๋ฅผ ๊พธ๋ฆด ์ˆ˜ ์žˆ๊ฒŒ ๋์ง€.
์žฌ๋Šฅ๋„ท ๊ฐ™์€ ์žฌ๋Šฅ ๊ณต์œ  ํ”Œ๋žซํผ์—์„œ ํ™œ๋™ํ•˜๋Š” ํ”„๋ฆฌ๋žœ์„œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด, ๊ณ ๊ฐ์ด ๋„˜๊ฒจ์ค€ ๋‚ฏ์„  ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ํŠนํžˆ ์“ธ๋ชจ๊ฐ€ ๋งŽ์„ ๊ฑฐ์•ผ. ๋‹ค๋งŒ ์ตœ์ข… ํ’ˆ์งˆ ์ฑ…์ž„์€ ๋Š˜ ์‚ฌ๋žŒ์—๊ฒŒ ์žˆ๋‹ค๋Š” ๊ฑฐ, ์žŠ์ง€ ๋ง์ž!

๐ŸŽฏ ํ•œ ์ค„ ์š”์•ฝ
DeepSeek-Coder๋Š” ์ €์žฅ์†Œ ๋‹จ์œ„ ํ•™์Šต + FIM + ๊ธด ๋ฌธ๋งฅ + ์ง€์‹œ ํŠœ๋‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ "์ฝ๊ณ  ์ดํ•ดํ•˜๋Š”" ๋Šฅ๋ ฅ์„ ๋Œ์–ด์˜ฌ๋ฆฐ ์˜คํ”ˆ์†Œ์Šค ์ฝ”๋“œ ๋ชจ๋ธ์ด์•ผ. ๋˜‘๋˜‘ํ•œ ๋™๋ฃŒ์ฒ˜๋Ÿผ ์“ฐ๋˜, ๊ฒ€์ฆ์€ ๋‚ด๊ฐ€ ํ•˜๋Š” ๊ฒƒ! ๊ทธ๊ฒŒ AI ์‹œ๋Œ€ ๊ฐœ๋ฐœ์ž์˜ ์ƒ์กด ๊ณต์‹์ด์•ผ. ๐Ÿ˜Ž
AIยท๋จธ์‹ ๋Ÿฌ๋‹ ๊ฐœ๋ฐœ์ด ๊ถ๊ธˆํ•˜๋‹ค๋ฉด ์žฌ๋Šฅ๋„ท์˜ ์ง€์‹์ธ์˜ ์ˆฒ์—์„œ ๋‹ค๋ฅธ ๊ธ€๋“ค๋„ ํ•จ๊ป˜ ์‚ดํŽด๋ด!

๐Ÿ“Ž ์ฐธ๊ณ  ์ž๋ฃŒ

ยท DeepSeek-Coder: When the Large Language Model Meets Programming (arXiv:2401.14196) โ€” https://arxiv.org/abs/2401.14196
ยท DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence (arXiv:2406.11931) โ€” https://arxiv.org/abs/2406.11931
ยท deepseek-ai/DeepSeek-Coder GitHub โ€” https://github.com/deepseek-ai/DeepSeek-Coder
ยท deepseek-ai/DeepSeek-Coder-V2 GitHub โ€” https://github.com/deepseek-ai/DeepSeek-Coder-V2
ยท CRUXEval: A Benchmark for Code Reasoning, Understanding and Execution โ€” https://arxiv.org/abs/2401.03065

๋Œ“๊ธ€ ์ž‘์„ฑ

์ด ๊ธ€์— ๋Œ€ํ•œ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์„ ๋“ค๋ ค์ฃผ์„ธ์š”

๋Œ“๊ธ€ 0
๋Œ“๊ธ€์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘์ž…๋‹ˆ๋‹ค.

์•„์ง ๋Œ“๊ธ€์ด ์—†์Šต๋‹ˆ๋‹ค.