Skip to content
chamsae-aiPublic

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

121 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

์ฐธ์ƒˆ AI โ€” ๋ฐฑ์—”๋“œ (be)

์ตœ์ข… API ์›๋ณธ์€ https://chamsae-ai-api.dotseven.cloud์ž…๋‹ˆ๋‹ค. DNSยทTunnel๊ณผ ์ด๋ฉ”์ผ Access ๋ณดํ˜ธ๋Š” ์ ์šฉ๋๊ณ , ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ๊ณต๊ฐœ์™€ ์ƒˆ ๋ฐฑ์—”๋“œ ์ด๋ฏธ์ง€ ๋ฐฐํฌ๋Š” ์•„์ง์ž…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์‹œ ์ด ์ฃผ์†Œ๋Š” Vercel ์„œ๋ฒ„์˜ ์›๋ณธ ์„ค์ •์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํ”„๋ก ํŠธ ์ฃผ์†Œ๋Š” chamsae-ai.vercel.app์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์šฉ ๊ณต๊ฐœ ์ ‘๊ทผ ๋ณดํ˜ธยทFE ์ „๋‹ฌ ๊ณ„์•ฝ์„ ์ค€๋น„ํ–ˆ์œผ๋ฉฐ ์•„์ง ๋ฐฐํฌํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์ด๋ฉ”์ผ Access ๋ณดํ˜ธ๋Š” ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํŒ€์žฅ๋‹˜์˜ FE #13์—์„œ ํ™•์ธํ•œ ์„œ๋น„์Šค๋ช…์€ ์‚ฌ์šฉ์ž ์š”์ฒญ์— ๋”ฐ๋ผ ์ฐธ์ƒˆ AI๋กœ ํ‘œ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ก ํŠธยทVercel ๋ณ€๊ฒฝ์€ ํŒ€์žฅ ๋‹ด๋‹น์ž…๋‹ˆ๋‹ค.

์˜์ƒ URL์„ ๋ฐ›์•„ ๋ฏธ๋””์–ด ์กฐ์ž‘ ๊ฐ€๋Šฅ์„ฑ๊ณผ ์ฃผ์žฅ ์‚ฌ์‹ค์„ฑ์„ ๋ถ„์„ํ•˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๊ธฐํšยท์„ค๊ณ„ ๊ธฐ์ค€์€ docs ๋ ˆํฌ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค (project/prd.md, design/ai-pipeline.md). ์ž‘์—… ๊ทœ์น™์€ AGENTS.md๋ฅผ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์ƒˆ ๊ธฐ๊ธฐ์—์„œ ์ด์–ด์„œ ์ž‘์—…ํ•  ๋•Œ๋Š” ํ˜„์žฌ ์ƒํƒœ์™€ ์ฝ๋Š” ์ˆœ์„œ๋ถ€ํ„ฐ ํ™•์ธํ•˜์„ธ์š”. ํ”„๋กฌํ”„ํŠธยทํ‰๊ฐ€ ๊ฒฐ๊ณผ์™€ M4 ๋งฅ๋ฏธ๋‹ˆยทOrbStack ๋ฐฐํฌ ์ ˆ์ฐจ๋ฅผ ๋ณ„๋„๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ๊ฐœ๋ฐœ ์ฝ”๋“œ์™€ ์šด์˜ ์ด๋ฏธ์ง€๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์ž…๊ตฌ ๋ณดํ˜ธ๋Š” ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ ์ƒํƒœ์ด๋ฉฐ ๋งฅ๋ฏธ๋‹ˆ์—๋Š” ์•„์ง conan-be:472aff7์ด ์šด์˜ ์ค‘์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ์ง€ ์ „ํ™˜์€ ์„œ๋ช… ๊ธฐ๋ฐ˜ CI/CD ๋Ÿฐ๋ถ, ํ™ˆ์„œ๋ฒ„ ๊ณต๊ฐœ ์กฐ๊ฑด์€ ๊ฒฉ๋ฆฌ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๊ณผ๊ฑฐ ์‹คํ–‰ยทํ…Œ์ŠคํŠธ ์ด๋ ฅ์€ ์ž‘์—… ๊ธฐ๋ก์— ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ ํ•ด๋ถ€๋„ โ€” ๋‹จ๊ณ„๋ณ„ ํ๋ฆ„๋„, ๊ฐ ๋‹จ๊ณ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‹คํŒจ ์ฒ˜๋ฆฌ, ๋ชจ๋ธยท๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐˆ์•„๋ผ์šธ ๋•Œ ๊ฑด๋“œ๋ฆด ๊ณณ, ๊ตฌ๊ฐ„๋ณ„ ์‹ค์ธก ์„ฑ๋Šฅ. ๊ฒ€์ฆํ•˜๊ฑฐ๋‚˜ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ต์ฒดํ•  ๋•Œ ์—ฌ๊ธฐ๋ถ€ํ„ฐ ๋ณด์„ธ์š”.

์„ธ ์ถ•์„ ๋ถ„๋ฆฌํ•œ๋‹ค

์ œํ’ˆ์€ ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ ํ•˜๋‚˜์˜ ์ง„์œ„ ์ ์ˆ˜๋กœ ํ•ฉ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ธ๋ฌผ์ด ๋‚˜์˜จ ์˜์ƒ์—๋„ ํ—ˆ์œ„ ์ฃผ์žฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , AI๋กœ ๋งŒ๋“  ์˜์ƒ์˜ ๋ฐœ์–ธ์ด ์‚ฌ์‹ค์ผ ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์กฐ์ž‘๋„ ๋‘ ๊ฐ€์ง€๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค โ€” ์–ผ๊ตด์„ ํ•ฉ์„ฑยท๋ณ€ํ˜•ํ•œ ๊ฒƒ๊ณผ, ์˜์ƒ ์ „์ฒด๋ฅผ AI๊ฐ€ ๋งŒ๋“  ๊ฒƒ์€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์ถ• ์‘๋‹ต ํ•„๋“œ ๋‚ด์šฉ
์–ผ๊ตด ํ•ฉ์„ฑยท๋ณ€ํ˜• face_manipulation ์–ผ๊ตด crop ๋ถ„๋ฅ˜ ์ ์ˆ˜ + ๊ธฐ์กด ์ž๊ฐ€ํ‘œ๊ธฐ ์‹ ํ˜ธ. ํœด๋ฆฌ์Šคํ‹ฑยท์„ ํƒ์  VLM์€ ์ฐธ๊ณ  ์ •๋ณด
์˜์ƒ ์ „์ฒด AI ์ƒ์„ฑ whole_video_generation ์ž๊ฐ€ํ‘œ๊ธฐ๋งŒ (์ „์šฉ ํƒ์ง€ ๋ชจ๋ธ์€ ์•„์ง ์—†์Œ โ€” docs T-06)
์ฃผ์žฅ ์‚ฌ์‹ค์„ฑ ๊ฒ€์ฆ claim_verification ์ฃผ์žฅ ์ถ”์ถœ โ†’ ์™ธ๋ถ€ ๊ทผ๊ฑฐ ๊ฒ€์ƒ‰ โ†’ ๊ทผ๊ฑฐ์™€ ์ผ์น˜ยท๋ถˆ์ผ์น˜ยท๊ทผ๊ฑฐ ๋ถ€์กฑ

๋ฏธ๋””์–ด ์กฐ์ž‘ ๋‘ ์ถ•์€ ์ˆซ์ž ์ ์ˆ˜๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์กฐ์ž‘ ์˜์‹ฌ/๋šœ๋ ทํ•œ ์กฐ์ž‘ ์ง•ํ›„ ์—†์Œ/ ํŒ๋‹จ ๋ณด๋ฅ˜/๋ถ„์„ ๋ถˆ๊ฐ€ ๋„ค ๋‹จ๊ณ„๋กœ๋งŒ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค(status, ํ‘œ์‹œ์šฉ ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ๋Š” status_label). ๋‚ด๋ถ€์ ์œผ๋กœ ๊ณ„์‚ฐํ•˜๋Š” ์—ฐ์† ์ ์ˆ˜๋Š” signals ์•ˆ์—๋งŒ ๋‚จ์•„ ์žˆ๊ณ  ๋””๋ฒ„๊น…์šฉ์ž…๋‹ˆ๋‹ค โ€” ํ™•๋ฅ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ˆซ์ž๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋ฉด ์‹ค์ œ๋ณด๋‹ค ์ •๋ฐ€ํ•œ ํŒ์ •์ฒ˜๋Ÿผ ์˜คํ•ด๋  ์ˆ˜ ์žˆ์–ด์„œ์ž…๋‹ˆ๋‹ค.

๋˜ ํ•˜๋‚˜์˜ ์›์น™์€ "๋ถ„์„ ๋ชป ํ•จ"๊ณผ "๋ถ„์„ํ–ˆ๋”๋‹ˆ ์ •์ƒ"์„ ๊ตฌ๋ถ„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์„ ํ•œ ์žฅ๋„ ๋ชป ๋ฝ‘์•˜๋Š”๋ฐ "๋šœ๋ ทํ•œ ์กฐ์ž‘ ์ง•ํ›„ ์—†์Œ"์ด๋ผ๊ณ  ๋‹ตํ•˜๋ฉด ์‹คํŒจ๊ฐ€ ๋ฌด์ฃ„ ํŒ์ •์œผ๋กœ ๋‘”๊ฐ‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ status๋Š” unavailable("๋ถ„์„ ๋ถˆ๊ฐ€")์ž…๋‹ˆ๋‹ค.

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

ํŒ์ •์— ๋Œ€ํ•œ ํƒœ๋„

์šฐ๋ฆฌ๊ฐ€ ๋‚ด๋Š” ํŒ์ •์€ ์ฃผ์žฅ์˜ ์ง„์œ„๊ฐ€ ์•„๋‹ˆ๋ผ ์ฃผ์žฅ๊ณผ ๊ทผ๊ฑฐ์˜ ๊ด€๊ณ„์ž…๋‹ˆ๋‹ค. ๊ทผ๊ฑฐ์™€ ์ผ์น˜๋Š” "์ด ์ฃผ์žฅ์€ ์ฐธ์ด๋‹ค"๊ฐ€ ์•„๋‹ˆ๋ผ "์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ๊ทผ๊ฑฐ๋Š” ์ด ์ฃผ์žฅ๊ณผ ์ผ์น˜ํ•œ๋‹ค"๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์™€ ์ „๋ฌธ ๊ธฐ๊ด€์˜ rating์€ ์ฐธ๊ณ  ์ž๋ฃŒ์ด๋ฉฐ ๊ทธ ๋ฌธ์ž์—ด์„ ํ˜„์žฌ ์ฃผ์žฅ ํŒ์ •์œผ๋กœ ๋ฐ”๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ™์€ ์ฃผ์žฅ์— ๊ด€ํ•œ ํŒ์ •๋“ค์ด ์ถฉ๋Œํ•˜๋ฉด ์œ ๋ณดํ•˜๊ณ , ๊ทธ ์™ธ์—๋Š” LLM์ด ์ œ์•ˆํ•œ ๊ด€๊ณ„๋ฅผ ์„œ๋ฒ„๊ฐ€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๊ทผ๊ฑฐ์™€ ์ผ์น˜ยท๊ทผ๊ฑฐ์™€ ๋ถˆ์ผ์น˜์—๋Š” ์ธ์šฉ๋ฌธ ์ผ์น˜๋ฟ ์•„๋‹ˆ๋ผ ๊ฒ€์ฆ๋œ ์›๋ฌธยท์ถœ์ฒ˜ ๋Œ€์‘์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” content_scope=original, provenance_verified=true, ์‹ค์ œ ์›๋ฌธ ์ธ์šฉ์„ ํ™•์ธํ•˜๊ณ , 1์ฐจ ์ถœ์ฒ˜ ํ•˜๋‚˜ ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒ€์ฆ๋œ ์›๋ฌธ ๊ณ„๋ณด ๋‘ ๊ฐœ ์ด์ƒ์˜ ์ถฉ๋ถ„์„ฑ ์กฐ๊ฑด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒ€์ฆ์€ DEEPCHECK_LLM_QUOTE_CHECK=false๋กœ ๋Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ฒ€์ƒ‰ ์ œ๊ณต์ž(๋„ค์ด๋ฒ„ยท์œ„ํ‚ค๋ฐฑ๊ณผยทFactCheck) ์ž์ฒด๋Š” ์ œ๋ชฉยท๋ฐœ์ทŒ๋งŒ ์ค๋‹ˆ๋‹ค. ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ๊ทผ๊ฑฐ ์ค‘ ์ผ๋ถ€(์ฃผ์žฅ๋‹น ์ตœ๋Œ€ DEEPCHECK_EVIDENCE_FETCH_MAX_PER_CLAIM๊ฑด)๋Š” deepcheck/article_fetch.py๊ฐ€ ์‹ค์ œ URL์„ ์•ˆ์ „ํ•˜๊ฒŒ ์—ด์–ด(SSRF ๋ฐฉ์–ด: ์‚ฌ์„ค๋ง ์ฐจ๋‹จ, ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋งˆ๋‹ค ์žฌ๊ฒ€์ฆ, ์‘๋‹ต ํฌ๊ธฐ ์ œํ•œ) ๋ณธ๋ฌธ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. ๋„์ฐฉํ•œ ๋„๋ฉ”์ธ์ด DEEPCHECK_TRUSTED_NEWS_DOMAINS(๊ธฐ๋ณธ๊ฐ’: ์ฃผ์š” ํ†ต์‹ ์‚ฌยท๋ฐฉ์†ก์‚ฌยท์ข…ํ•ฉ์ผ๊ฐ„์ง€)์— ์žˆ์„ ๋•Œ๋งŒ content_scope=originalยทprovenance_verified=true๋ฅผ ์ฃผ๊ณ , ๊ทธ ๋„๋ฉ”์ธ์„ independence_group์œผ๋กœ ์จ์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์‹ ๋ขฐ ์ถœ์ฒ˜ ๋‘ ๊ณณ์ด๋ฉด 1์ฐจ ์ถœ์ฒ˜ ์—†์ด๋„ ์ถฉ๋ถ„์„ฑ ์กฐ๊ฑด์„ ์ฑ„์šธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. 2026-09-16 ์‹ค์‚ฌ์šฉ(์—ฐ์˜ˆ์ธ ์‚ฌ๋ง ์˜ค๋ณด ์˜์ƒ)์—์„œ ํ•ต์‹ฌ ์ฃผ์žฅ์— ๊ทผ๊ฑฐ 6๊ฑด์„ ํ™•๋ณดํ•˜๊ณ ๋„ ์ „๋ถ€ ๋ฐœ์ทŒ๋ฌธ๋ฟ์ด๋ผ ๊ทผ๊ฑฐ ๋ถ€์กฑ์œผ๋กœ ๊ฐ•์ œ ๊ฐ•๋“ฑ๋œ ๊ฒƒ์„ ๊ณ„๊ธฐ๋กœ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์›๋ฌธ ํ™•๋ณด์— ์‹คํŒจํ•˜๊ฑฐ๋‚˜ ์‹ ๋ขฐ ๋„๋ฉ”์ธ์ด ์•„๋‹ˆ๋ฉด ๊ธฐ์กด์ฒ˜๋Ÿผ ๋ฐœ์ทŒ๋ฌธ๋งŒ ๋‚จ์•„ ๊ทผ๊ฑฐ ๋ถ€์กฑ์œผ๋กœ ์œ ๋ณด๋˜๋ฉฐ, DEEPCHECK_EVIDENCE_FETCH_ORIGINAL=false๋กœ ์ด ๋‹จ๊ณ„ ์ „์ฒด๋ฅผ ๋Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์ฃผ์žฅ์„ ๊ฑฐ์ง“์œผ๋กœ ํŒ์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๊ทผ๊ฑฐ๊ฐ€ ๋ถ€์กฑํ•˜๊ฑฐ๋‚˜ ์„œ๋กœ ์ถฉ๋Œํ•˜๋ฉด ํŒ๋‹จ์„ ์œ ๋ณดํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์žฅ๊ณผ ๊ทผ๊ฑฐ์˜ ๊ธฐ์ค€ ์‹œ์ ์ด ๋‹ค๋ฅด๋ฉด ์ˆ˜์น˜๊ฐ€ ๋‹ฌ๋ผ๋„ ๊ทผ๊ฑฐ์™€ ๋ถˆ์ผ์น˜๊ฐ€ ์•„๋‹ˆ๋ผ ๊ทผ๊ฑฐ ๋ถ€์กฑ์ž…๋‹ˆ๋‹ค.

๋ช…์‹œ์  ๊ทœ์น™ ์ถ”์ถœ(DEEPCHECK_CLAIM_EXTRACTOR=rule)์€ LLM ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ๊ฒฝ๋กœ๋„ ์ „๋ฌธ ๊ธฐ๊ด€ rating๋งŒ์œผ๋กœ ์ง€์ง€ยท๋ฐ˜๋ฐ•์„ ํ™•์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. llm ์ถ”์ถœ์„ ์š”์ฒญํ•œ ๋’ค ์ œ๊ณต์žยทํ˜ธ์ถœยท์‘๋‹ต ๊ฒ€์ฆ์ด ์‹คํŒจํ•˜๋ฉด ๊ทœ์น™ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ชฐ๋ž˜ ๋ฐ”๊พธ์ง€ ์•Š๊ณ  unavailable๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ดํ”„๋ผ์ธ

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

๋‹จ๊ณ„ ๋ชจ๋“ˆ ๋„๊ตฌ
์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ deepcheck/pipeline.py ๋‹จ๊ณ„๋ณ„ ์ƒํƒœยท์†Œ์š”์‹œ๊ฐ„ ๊ธฐ๋ก
๋‹ค์šด๋กœ๋“œยท์ž๋ง‰ deepcheck/downloader.py yt-dlp + PyAV (์‹œ์Šคํ…œ ffmpeg ๋ถˆํ•„์š”)
์ž๋ง‰ ํŒŒ์‹ฑ deepcheck/captions.py WebVTT/SRT ์ง์ ‘ ํŒŒ์‹ฑ
STT deepcheck/transcriber.py faster-whisper (CTranslate2)
์–ผ๊ตด crop deepcheck/face.py MediaPipe
์กฐ์ž‘ ํƒ์ง€ deepcheck/deepfake.py ์–ผ๊ตด crop ViT ๋ถ„๋ฅ˜, ํœด๋ฆฌ์Šคํ‹ฑยท์„ ํƒ์  VLM ์ฐธ๊ณ  ์ •๋ณด
ํ…์ŠคํŠธ ์‹ ํ˜ธ deepcheck/analyzer.py ์ž๊ฐ€ํ‘œ๊ธฐยทํ•ฉ์„ฑ์Œ์„ฑยทํด๋ฆญ๋ฒ ์ดํŠธ
์ฃผ์žฅ ๊ฒ€์ฆ deepcheck/claims.py, deepcheck/prompts.py LLM/๊ทœ์น™ ์ถ”์ถœ + ๋„ค์ด๋ฒ„ยท์œ„ํ‚ค๋ฐฑ๊ณผ ๋“ฑ ๊ฒ€์ƒ‰ + LLM ํŒ์ •ยท์ธ์šฉ ๊ฒ€์ฆ
๊ฒฐ๊ณผ ์กฐ๋ฆฝ deepcheck/report.py ๋‘ ์ถ• ๋ถ„๋ฆฌ, text/JSON/HTML ์ถœ๋ ฅ
API backend/app.py, backend/harness.py FastAPI + ์›Œ์ปค ํ’€
์—๋Ÿฌยท๋กœ๊ทธ deepcheck/errors.py, deepcheck/logging_setup.py ๋„๋ฉ”์ธ ์˜ˆ์™ธ, request_id ๋กœ๊น…

๊ธฐ๋ณธ์€ ์ž๋ง‰ ๋ฏธ์‚ฌ์šฉ(caption_policy: "off")์ด๋ฉฐ STT๋กœ ๋ฐœ์–ธ์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. manual์„ ์„ ํƒํ•˜๋ฉด ๋“ฑ๋ก ์ˆ˜๋™ CC๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๊ณ  ์‚ฌ์šฉํ•  CC๊ฐ€ ์—†์œผ๋ฉด STT๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. any๋Š” ์ž๋™ ์ƒ์„ฑ CC๊นŒ์ง€ ํ—ˆ์šฉํ•˜๋Š” ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์˜์ƒ์— ์ž…ํžŒ ๊ธ€์ž์˜ OCR์€ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋“ฑ๋ก CC๋ผ๋Š” ๋ถ„๋ฅ˜๋งŒ์œผ๋กœ ์‚ฌ๋žŒ ์ž‘์„ฑยท์ •ํ™•์„ฑยท๋ฐœ์–ธ ์ „๋ฌธ์„ ๋ณด์ฆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋ฒ„ ํ™˜๊ฒฝ์— manual์ด ๋ช…์‹œ๋ผ ์žˆ๋‹ค๋ฉด ์ฝ”๋“œ ๊ธฐ๋ณธ๊ฐ’ ๋ณ€๊ฒฝ๋งŒ์œผ๋กœ ์ „ํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ํ™˜๊ฒฝ ๋ณ€๊ฒฝยท๋ฐฐํฌ๋Š” ๋ณ„๋„ ์Šน์ธ ํ›„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. FE ์ธ์ˆ˜ ์กฐ๊ฑด์„ ํ™•์ธํ•˜์„ธ์š”.

STT๋Š” ์–ธ์–ด ์ž๋™ ๊ฐ์ง€ ๋Œ€์‹  DEEPCHECK_WHISPER_LANGUAGE(๊ธฐ๋ณธ ko)๋กœ ๊ณ ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ๊ฐ์ง€๋Š” ์˜ค๋””์˜ค ์•ž๋ถ€๋ถ„์˜ ๋ฐฐ๊ฒฝ์Œ์•…ยทํšจ๊ณผ์Œ๋งŒ์œผ๋กœ๋„ ์˜คํŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‹ค์ธก: ํ•œ๊ตญ์–ด ๋‰ด์Šค ์˜์ƒ์„ ์˜์–ด 48% ์‹ ๋ขฐ๋„๋กœ ์˜คํŒํ•ด 1๋‹จ์–ด๋งŒ ์ธ์‹). caption_policy๊ฐ€ off์—ฌ์„œ ์ž๋ง‰์„ ์•„์˜ˆ ๋ฐ›์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„, STT ๋‹จ์–ด ๋ฐ€๋„๊ฐ€ ๋น„์ •์ƒ์ ์œผ๋กœ ๋‚ฎ์œผ๋ฉด(DEEPCHECK_CAPTION_QUALITY_FALLBACK, ๊ธฐ๋ณธ ์ผœ์ง) ์ž๋ง‰์ด ์žˆ๋Š”์ง€ ๋’ค๋Šฆ๊ฒŒ ํ•œ ๋ฒˆ ๋” ํ™•์ธํ•ด ์žˆ์œผ๋ฉด ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฑด "์ž๋ง‰์„ ๊ธฐ๋ณธ ์†Œ์Šค๋กœ ์“ธ์ง€"์˜ ์ •์ฑ…๊ณผ๋Š” ๋ณ„๊ฐœ๋กœ, STT๊ฐ€ ์‚ฌ์‹ค์ƒ ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ์•ˆ์ „๋ง์ž…๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ ํ•œ๊ตญ์–ด ๋‰ด์Šค ํ‘œ๋ณธ์—์„œ๋Š” small ์•ฝ 88์ดˆ, tiny ์•ฝ 53์ดˆ์™€ ์ˆ˜์น˜ยท๊ณ ์œ ๋ช…์‚ฌ ์˜ค์ธ์‹์ด ๊ธฐ๋ก๋์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋‹น์‹œ ๋ณ„๋„ ์‹คํ–‰ ๊ฒฐ๊ณผ์ด์ง€ ํ˜„์žฌ ์ˆ˜์ •์•ˆ์˜ ์„ฑ๋Šฅ์ด๋‚˜ ํ•œ๊ตญ์–ด ์ „๋ฐ˜์˜ ์ •ํ™•๋„ ๋ณด์ฆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ž๋ง‰๋„ ์˜ค๊ธฐยท๋ฐœ์–ธ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์‹ค์ธก๊ณผ ํ•œ๊ณ„๋ฅผ ํ•จ๊ป˜ ํ™•์ธํ•˜์„ธ์š”.

์‹คํ–‰

Docker (๋…๋ฆฝ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ)

์•„๋ž˜๋Š” ์ƒˆ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์„œ๋น„์Šค๊ฐ€ ์žˆ๋Š” ๋งฅ๋ฏธ๋‹ˆ์—์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜์ง€ ๋ง๊ณ , ์„œ๋ฒ„ ๋ช…๋ น์€ ๋ณ€๊ฒฝ ๋Œ€์ƒยท์˜ํ–ฅ์„ ํ™•์ธํ•œ ๋’ค ์Šน์ธ๋ฐ›์•„ ๋ณ„๋„ ๋ฐฐํฌ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

docker compose up -d --build
curl http://localhost:8000/health

๋กœ์ปฌ

uv venv --python 3.12 && source .venv/bin/activate
uv pip install -r requirements.txt -r requirements-vision.txt -r requirements-backend.txt
uvicorn backend.app:app --host 0.0.0.0 --port 8000

CLI๋กœ๋„ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

python -m deepcheck.cli analyze "URL" --model-size small --json
python -m deepcheck.cli analyze "URL" --no-classifier       # ์–ผ๊ตด ๋ถ„๋ฅ˜ ๋ฏธ์‹คํ–‰, ํœด๋ฆฌ์Šคํ‹ฑ๋งŒ์œผ๋กœ ์ •์ƒ ํŒ์ •ํ•˜์ง€ ์•Š์Œ
python -m deepcheck.cli analyze "URL" --save-transcript     # STT ์›๋ฌธ ์ €์žฅ

ํ…Œ์ŠคํŠธ

uv pip install -r requirements-dev.txt
pytest

API

์ƒ์„ธ ํ•„๋“œยท๊ธฐ๋ณธ๊ฐ’ยท๋ถ€๋ถ„ ๊ฒฐ๊ณผยทํด๋ง ์ข…๋ฃŒยท์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” API ๊ณ„์•ฝ, Vercel๊ณผ Access ์—ฐ๊ฒฐ ์ˆœ์„œ๋Š” FE ์—ฐ๋™ ์ธ์ˆ˜์ธ๊ณ„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธํ•˜์„ธ์š”. /docs(Swagger), /redoc, /openapi.json์€ ํ•ด๋‹น ์„œ๋ฒ„ ๋ฒ„์ „์˜ ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์ƒ์„ธ ์Šคํ‚ค๋งˆ ๋ณด์™„์€ ๋ฏธ๋ฐฐํฌ์ด๋ฉฐ ๋„๋ฉ”์ธ์˜ ์‹ค์ œ ํ™”๋ฉด์„ ์žฌ๊ฒ€์ฆํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฉ”์„œ๋“œ ๊ฒฝ๋กœ ์„ค๋ช…
POST /api/analyze {url, model_size, max_frames, use_classifier, vlm_model, enable_claim_verification, caption_policy, session_id} โ†’ {job_id, status, session_id, deduplicated}
GET /api/jobs/{job_id} {status, progress, message, result, error} โ€” status ๊ฐ’์€ ์•„๋ž˜ ํ‘œ ์ฐธ๊ณ 
GET /api/sessions/{session_id} ๋””๋ฒ„๊ทธ ์ „์šฉ, ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ(404)
GET /api/jobs ์ „์ฒด ๋ชฉ๋ก ๋””๋ฒ„๊ทธ ์ „์šฉ, ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ(404)
GET /health {"status":"ok"} โ€” ํ”„๋กœ์„ธ์Šค ์ƒ์กด ํ™•์ธ
GET /ready {status, harness:{...}} โ€” ์ ‘์ˆ˜ ์—ฌ๋ ฅ ํ™•์ธ

๋ถ„์„์€ ๋ฌด๊ฑฐ์šฐ๋ฏ€๋กœ job ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. POST๋กœ job_id๋ฅผ ๋ฐ›๊ณ  2~3์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ํด๋งํ•˜์„ธ์š”. ๊ฐ™์€ URL์˜ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ด๋ฉด ๊ธฐ์กด job์„ ์žฌ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค(deduplicated: true). ํ˜„์žฌ ์ค‘๋ณต ํ‚ค๋Š” URL๋งŒ ๋ณด๋ฏ€๋กœ ์˜ต์…˜์ด ๋‹ฌ๋ผ๋„ ์ฒซ ์š”์ฒญ์˜ ๋ถ„์„ ์˜ต์…˜๊ณผ ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. session_id๋Š” ๋ฌถ์Œ ์‹๋ณ„์ž์ด์ง€ ์ธ์ฆ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ž…๋ ฅ์€ YouTube URL๋กœ ์ œํ•œํ•˜๊ณ  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์˜ ๊ณต๊ฐœ ์ƒํƒœยท์—ฐ๋ น ์ œํ•œยท๊ธธ์ด๋ฅผ ๊ฒ€์‚ฌํ•˜์ง€๋งŒ, YouTube์˜ ์‹ค์ œ Shorts ๋ถ„๋ฅ˜์™€ ํ•œ๊ตญ์–ด ์—ฌ๋ถ€๋ฅผ ์™„์ „ํ•˜๊ฒŒ ๊ฒ€์ฆํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.

429๋Š” ๋‘ ๊ฐ€์ง€ ์›์ธ์œผ๋กœ ๋‚˜์˜ต๋‹ˆ๋‹ค. error.code๋กœ ๊ตฌ๋ถ„ํ•ด์„œ ์•ˆ๋‚ดํ•ด์ฃผ์„ธ์š”.

code ์›์ธ ์•ˆ๋‚ด
session_busy ์ด ์„ธ์…˜์ด ๋‹ค๋ฅธ ์˜์ƒ์„ ์ด๋ฏธ ๋ถ„์„ ์ค‘ (M-07: ์„ธ์…˜๋‹น 1๊ฑด) "์ด๋ฏธ ๋ถ„์„ ์ค‘์ธ ์˜์ƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค"
server_busy ์„œ๋ฒ„ ๋Œ€๊ธฐ์—ด์ด ๊ฐ€๋“ ์ฐธ "์š”์ฒญ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์ž ์‹œ ํ›„ ๋‹ค์‹œ"

GET /api/jobs/{job_id} ์‘๋‹ต์—๋Š” ๊ฒฐ๊ณผ ์™ธ์— ํ™”๋ฉด์— ํ•„์š”ํ•œ ๊ฐ’์ด ํ•จ๊ป˜ ์˜ต๋‹ˆ๋‹ค.

ํ•„๋“œ ์šฉ๋„
display_id CN-A1B2-C3D4 โ€” ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ณ  ํ”ผ๋“œ๋ฐฑ ํผ์— ์ฒจ๋ถ€ํ•  ๋ถ„์„ ID
created_at_iso ๋ถ„์„ ์‹œ๊ฐ
elapsed_sec ๊ฒฝ๊ณผ ์‹œ๊ฐ„(์ดˆ). ์™„๋ฃŒ๋˜๋ฉด ์ด ์†Œ์š” ์‹œ๊ฐ„์œผ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค

job ์ƒํƒœ๊ฐ’

result๋Š” ํด๋ง๋งˆ๋‹ค ์กฐ๊ธˆ์”ฉ ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค. ๋ฏธ๋””์–ด ์กฐ์ž‘ ๋‘ ์ถ•์€ ์ค€๋น„๋˜๋Š” ์ฆ‰์‹œ, ์ฃผ์žฅ ์นด๋“œ๋Š” ๊ฐœ์ˆ˜๊ฐ€ ํ™•์ •๋˜๋ฉด ์ „๋ถ€(๋Œ€๊ธฐ ์ค‘ ์ƒํƒœ๋กœ) ๋จผ์ € ๋‚˜ํƒ€๋‚ฌ๋‹ค๊ฐ€ ํ•˜๋‚˜์”ฉ ๊ฒ€์ฆ๋˜๋ฉฐ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌํ˜„์€ ๋ฏธ๋””์–ด ์ฒ˜๋ฆฌ ํ›„ ๋ฐœ์–ธ ํ™•๋ณดยท์ฃผ์žฅ ๊ฒ€์ฆ ์ˆœ์„œ์ด๋ฉฐ, ๋ฏธ๋””์–ด ์‹คํŒจ๊ฐ€ ์ฃผ์žฅ ๊ฒ€์ฆ์„ ๋ง‰์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

status ์˜๋ฏธ
queued ๋Œ€๊ธฐ์—ด์—์„œ ์›Œ์ปค๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘. result๋Š” ๋น„์–ด ์žˆ๋‹ค
processing:collecting ์˜์ƒยทํ”„๋ ˆ์ž„์„ ํ™•๋ณดํ•˜๋Š” ์ค‘
processing:transcribing ๋ฐœ์–ธ ํ…์ŠคํŠธ(์ž๋ง‰ ๋˜๋Š” STT)๋ฅผ ํ™•๋ณดํ•˜๋Š” ์ค‘
processing:extracting_claims ์ฃผ์žฅ์„ ์ถ”์ถœํ•˜๊ณ  ์ค‘๋ณต์„ ํ•ฉ์น˜๋Š” ์ค‘
processing:verifying ์ถ”์ถœํ•œ ์ฃผ์žฅ์„ ๊ฒ€์ฆํ•˜๋Š” ์ค‘. ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์œผ๋ฉด status๋Š” partially_completed, stage๋Š” verifying์ผ ์ˆ˜ ์žˆ์Œ
partially_completed ์ฒซ ๋ถ€๋ถ„ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™”๋‹ค. result์˜ ํ‚ค๋ฅผ ๋ณด๊ณ  ๋ญ๊ฐ€ ์ค€๋น„๋๋Š”์ง€ ํ™•์ธ
completed ๋ชจ๋“  ๋ถ„์„์ด ๋๋‚ฌ๋‹ค
completed_with_limitations ์ผ๋ถ€ ๋ถ„์„์„ ๋ชป ํ–ˆ์ง€๋งŒ ๋‚˜๋จธ์ง€ ๊ฒฐ๊ณผ๋Š” ์žˆ๋‹ค (stages์—์„œ ์‹คํŒจํ•œ ๋‹จ๊ณ„ ํ™•์ธ)
timed_out ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ์ธ์‹ํ•ด ์ข…๋ฃŒํ•œ ์ž‘์—…. ์™„๋ฃŒ ๊ฒฐ๊ณผ๋Š” ์œ ์ง€ํ•˜๋ฉฐ, ์‹คํ–‰ ์ค‘ ๋‹ค์šด๋กœ๋“œยทSTT๋ฅผ ์ •ํ™•ํžˆ 10๋ถ„์— ์ค‘๋‹จํ•˜๋Š” ํ•˜๋“œ ์ œํ•œ์€ ์•„์ง ์•„๋‹˜
failed ์ง„ํ–‰ํ•  ์ˆ˜ ์—†๋Š” ์˜ค๋ฅ˜. error์— ์‚ฌ์œ 

result ์Šคํ‚ค๋งˆ (ํ”„๋ก ํŠธ ๊ณ„์•ฝ)

์•„๋ž˜ ์ˆซ์žยท์ฃผ์žฅยท์ถœ์ฒ˜๋Š” ํ˜•์‹์„ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ์‹œ์ด์ง€ ์‹ค์ œ ๋ถ„์„ ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํŠนํžˆ cited: true์˜ ์›๋ฌธ ์กฐ๊ฑด์€ ๋ชจ์˜ ์ž๋ฃŒ๋กœ๋งŒ ๊ฒ€์ฆํ–ˆ์œผ๋ฉฐ, ํ˜„์žฌ ๊ฒ€์ƒ‰ ๋ฐœ์ทŒ ์ˆ˜์ง‘ ๊ฒฝ๋กœ๊ฐ€ ์ด๋ฅผ ํ™•๋ณดํ–ˆ๋‹ค๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค.

{
  "url": "...",
  "media": {
    "title": "...", "uploader": "...",       // ์ œ๋ชฉ ยท ์ฑ„๋„
    "duration": 123,                          // ๊ธธ์ด(์ดˆ)
    "upload_date": "2026-09-01",              // ๊ฒŒ์‹œ์ผ (์—†์œผ๋ฉด null)
    "thumbnail": "https://i.ytimg.com/...",   // ์ธ๋„ค์ผ URL (์—†์œผ๋ฉด null)
    "video_id": "...", "language": "ko",
    "transcript_source": "stt",               // stt | caption โ€” ๋ฐœ์–ธ ์œ„์น˜ ์˜†์— ํ‘œ์‹œํ•  ์ถœ์ฒ˜
    "stt_coverage_pct": 99.8,                 // ์ž…๋ ฅ ์˜ค๋””์˜ค ๊ธธ์ด ๋น„์œจ, ์ธ์‹ ์ •ํ™•๋„ ์•„๋‹˜
    "transcript_coverage_basis": "input_audio_duration",
    "transcript_segment_coverage_pct": 21.0,  // ํ…์ŠคํŠธ ํƒ€์ž„์Šคํƒฌํ”„ ๊ตฌ๊ฐ„ ํ•ฉ์ง‘ํ•ฉ ๋น„์œจ
    "transcript_coverage_detail": "์ž…๋ ฅ ์˜ค๋””์˜ค ๊ธธ์ด ๋น„์œจ์ด๋ฉฐ ๋ฐœ์–ธ ์™„์ „์„ฑยท์ธ์‹ ์ •ํ™•๋„๋ฅผ ๋œปํ•˜์ง€ ์•Š๋Š”๋‹ค."
  },
  "analysis_status": "partial",         // ํ•„์ˆ˜ ์ถ• ๋ˆ„๋ฝยท๋‹จ๊ณ„ ์‹คํŒจยท๋ฏธ์™„๋ฃŒ ์ฃผ์žฅ๋„ partial. job.status๊ฐ€ ์ตœ์ข… ๊ธฐ์ค€
  "stages": {                            // ๋ฌด์—‡์„ ํ–ˆ๊ณ  ๋ฌด์—‡์„ ๋ชป ํ–ˆ๋Š”์ง€
    "download":  { "status": "ok", "detail": null, "elapsed_sec": 6.1 },
    "frames":    { "status": "ok", "detail": "8์žฅ ์ถ”์ถœ", "elapsed_sec": 1.2 },
    "transcript":{ "status": "ok", "detail": "STT 226๋‹จ์–ด, ํ…์ŠคํŠธ ๊ตฌ๊ฐ„ ๋น„์œจ 21.0% (์ •ํ™•๋„๋Š” ๋ณ„๋„ ๊ฒ€์ฆ)", "elapsed_sec": 58.4 },
    "media_manipulation":  { "status": "ok", "detail": null, "elapsed_sec": 10.0 },
    "claim_verification":  { "status": "ok", "detail": "์ฃผ์žฅ 8๊ฑด (...)", "elapsed_sec": 14.2 },
    "cleanup": { "status": "ok", "detail": "์š”์ฒญ๋ณ„ ์ž„์‹œ ํŒŒ์ผ์„ ์ •๋ฆฌํ–ˆ๋‹ค." }
  },
  "face_manipulation": {
    "status": "suspected",               // suspected / no_clear_signs / inconclusive / unavailable
    "status_label": "์กฐ์ž‘ ์˜์‹ฌ",          // ํ™”๋ฉด์— ๊ทธ๋Œ€๋กœ ์“ธ ์ˆ˜ ์žˆ๋Š” ํ•œ๊ตญ์–ด ๋ฌธ๊ตฌ
    "detail": "ํ”„๋ ˆ์ž„ 8์žฅ์„ ๋ถ„์„ํ•ด ๊ทธ์ค‘ 4์žฅ์—์„œ ์–ผ๊ตด์„ ์ฐพ์•˜๋‹ค. ...",  // ๋ถ„์„ ๋ฒ”์œ„. ํ•œ๊ณ„๊ฐ€ ์žˆ์œผ๋ฉด ๋’ค์— ๋ง๋ถ™๋Š”๋‹ค
    "evidence": ["frame_000.jpg: fake 98.4% (๋ผ๋ฒจ Fake) [์–ผ๊ตด crop ์ ์šฉ]"],
    "signals": { "combined_risk": 81.0, "frames_analyzed": 8, "frames_with_face": 4, "..." : "..." }
    // signals๋Š” ๋””๋ฒ„๊ทธ์šฉ์ด๋‹ค. ํ™•๋ฅ ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์ˆซ์ž๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ์ง€ ์•Š๋Š”๋‹ค โ€” status๋งŒ ํ‘œ์‹œํ•  ๊ฒƒ.
  },
  "whole_video_generation": {
    "status": "unavailable",
    "status_label": "๋ถ„์„ ๋ถˆ๊ฐ€",
    "detail": "์˜์ƒ ์ „์ฒด AI ์ƒ์„ฑ ํƒ์ง€ ๋ชจ๋ธ์ด ์•„์ง ์„ ์ •๋˜์ง€ ์•Š์•˜๋‹ค.",
    "evidence": [],
    "signals": { "self_disclosure_risk": 0, "model": null }
  },
  "claim_verification": {
    "status": "analyzed",                // analyzed | no_claims | unavailable
    "summary": {
      "total": 8,
      // ์ฒ˜๋ฆฌ ์ƒํƒœ๋ณ„ โ€” ํ™”๋ฉด ์š”์•ฝ์˜ "์™„๋ฃŒ 8 ยท ๋ฏธ์™„๋ฃŒ 0 ยท ์‹œ๊ฐ„ ์ดˆ๊ณผ 0"
      "pending": 0, "verifying": 0, "done": 8, "failed": 0, "timed_out": 0,
      // ํŒ์ •๋ณ„ โ€” ํ™”๋ฉด ์š”์•ฝ์˜ "์ผ์น˜ 2 ยท ๋ถˆ์ผ์น˜ 3 ยท ๊ทผ๊ฑฐ ๋ถ€์กฑ 3"
      "supported": 2, "refuted": 3, "unverified": 3
    },
    "claims": [
      {
        "text": "2024๋…„ ์‹ค์—…๋ฅ ์ด 3.2% ๊ฐ์†Œํ–ˆ๋‹ค",
        "start": 12.5, "end": 18.0,      // ๋ฐœ์–ธ ์œ„์น˜ (๋ชป ์ฐพ์œผ๋ฉด null)
        "time_precision": "exact",       // exact | approx | null โ€” approx๋ฉด "์•ฝ 00:28"์ฒ˜๋Ÿผ ํ‘œ์‹œํ•  ๊ฒƒ
        "mentions": [],                  // ๊ฐ™์€ ์ฃผ์žฅ์ด ๋ฐ˜๋ณต๋  ๋•Œ์˜ ๋ฌธ๋งฅยทํšŸ์ˆ˜
        "status": "done",                // pending / verifying / done / failed / timed_out (์นด๋“œ ์ฒ˜๋ฆฌ ์ƒํƒœ)
        "verdict": "refuted",            // supported / refuted / unverified (status๊ฐ€ done์ผ ๋•Œ๋งŒ ์˜๋ฏธ ์žˆ์Œ)
        "verdict_label": "๊ทผ๊ฑฐ์™€ ๋ถˆ์ผ์น˜",  // ํ™”๋ฉด์— ๊ทธ๋Œ€๋กœ ์“ฐ๋ฉด ๋˜๋Š” ๋ฌธ๊ตฌ
        "reason": "ํ†ต๊ณ„์ฒญ ์ž๋ฃŒ๋Š” ๊ฐ™์€ ๊ธฐ๊ฐ„ ์‹ค์—…๋ฅ ์ด ์˜ฌ๋ž๋‹ค๊ณ  ๋ฐํžˆ๊ณ  ์žˆ๋‹ค.",  // ์นด๋“œ์˜ "ํŒ์ • ๊ทผ๊ฑฐ"
        "quote": "2024๋…„ ์—ฐ๊ฐ„ ์‹ค์—…๋ฅ ์€ ์ „๋…„ ๋Œ€๋น„ 0.4%p ์ƒ์Šนํ–ˆ๋‹ค.",  // ๋Œ€ํ‘œ ์ธ์šฉ (๊ทผ๊ฑฐ๋ณ„ ์ธ์šฉ์€ ์•„๋ž˜)
        "insufficient_reason": null,     // ๊ทผ๊ฑฐ ๋ถ€์กฑ์ผ ๋•Œ๋งŒ ์ฑ„์›Œ์ง (์•„๋ž˜ ํ‘œ ์ฐธ๊ณ )
        "insufficient_label": null,
        "evidence": [
          {
            "title": "...", "url": "https://...",
            "source": "naver_news",            // ์–ด๋А ๊ฒ€์ƒ‰ ์ˆ˜๋‹จ์—์„œ ์™”๋Š”์ง€ (๋‚ด๋ถ€ ์‹๋ณ„์šฉ)
            "publisher": "kostat.go.kr",       // ๋ฐœํ–‰์ฒ˜ โ€” ํ™”๋ฉด์˜ "๋ฐœํ–‰ ๊ธฐ๊ด€ ยท ์–ธ๋ก ์‚ฌ"
            "published_at": "2024-03-01",
            "source_type": "official",
            "source_type_label": "๊ณต์‹ ๋ฐœํ‘œ",   // ํ™”๋ฉด์˜ ์ถœ์ฒ˜ ์œ ํ˜• ๋ฐฐ์ง€
            "is_primary": true,                // 1์ฐจ ์ถœ์ฒ˜(ํ†ต๊ณ„ ์›๋ฌธยท๊ณต์‹ ๋ฐœํ‘œ)๋ฉด true
            "content_scope": "original",       // ๊ฒ€์ฆ๋œ ์›๋ฌธ์„ ํ™•๋ณดํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅ
            "provenance_verified": true,        // ์„œ๋ฒ„ ์›๋ฌธ ๊ฒ€์ฆ ๊ฒฝ๋กœ์˜ ๊ฐ’, LLM์ด ๋ถ€์—ฌํ•  ์ˆ˜ ์—†์Œ
            "rating": null,                    // ์ „๋ฌธ ๊ธฐ๊ด€ ํŒ์ • ํ‘œ๊ธฐ๊ฐ€ ์žˆ์„ ๋•Œ๋งŒ
            "cited": true,                     // ํŒ์ •์— ์‹ค์ œ๋กœ ์“ฐ์˜€๋Š”์ง€. false๋ฉด "์ฐธ๊ณ  ์ž๋ฃŒ"
            "cite_reason": "์ด ์ž๋ฃŒ๊ฐ€ ์ฃผ์žฅ์„ ๋ฐ˜๋ฐ•ํ•˜๋Š” ์ด์œ .",  // ๊ทผ๊ฑฐ ์นด๋“œ์— ๊ทธ๋Œ€๋กœ ํ‘œ์‹œ
            "quote": "2024๋…„ ์—ฐ๊ฐ„ ์‹ค์—…๋ฅ ์€ ์ „๋…„ ๋Œ€๋น„ 0.4%p ์ƒ์Šนํ–ˆ๋‹ค."  // ์›๋ฌธ ๋Œ€์กฐ๋ฅผ ํ†ต๊ณผํ•œ ๋ฐœ์ทŒ
          }
        ]
      }
    ],
    "detail": null
  },
  "transcript": {
    "summary": "...", "keywords": ["..."], "tone": "์ค‘๋ฆฝ",
    "language": "ko", "word_count": 226, "coverage_pct": 99.8,
    "coverage_basis": "input_audio_duration", "segment_coverage_pct": 21.0,
    "coverage_detail": "์ž…๋ ฅ ์˜ค๋””์˜ค ๊ธธ์ด ๋น„์œจ์ด๋ฉฐ ๋ฐœ์–ธ ์™„์ „์„ฑยท์ธ์‹ ์ •ํ™•๋„๋ฅผ ๋œปํ•˜์ง€ ์•Š๋Š”๋‹ค.",
    "signals": { "clickbait": 6, "claim_strength": 0, "tts": 8 }   // ์ฐธ๊ณ ์šฉ โ€” ์–ด๋А ์ถ• ์ ์ˆ˜์—๋„ ๋ฏธ๋ฐ˜์˜
  }
}

ํ”„๋ก ํŠธ์—์„œ ๋ฐ˜๋“œ์‹œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ๊ฒƒ๋“ค:

  1. status๋งŒ ํ‘œ์‹œํ•˜๊ณ  ์ˆซ์ž๋Š” ์“ฐ์ง€ ๋งˆ์„ธ์š”. face_manipulation/whole_video_generation์˜ signals ์•ˆ ์ ์ˆ˜๋Š” ๋””๋ฒ„๊ทธ์šฉ์ž…๋‹ˆ๋‹ค. ํ™”๋ฉด์—๋Š” status_label(๋˜๋Š” status๋ฅผ ๋ณด๊ณ  ์ง์ ‘ ๋งคํ•‘ํ•œ ๋ฌธ๊ตฌ)๋งŒ ์”๋‹ˆ๋‹ค.
  2. status === "unavailable"์ด๋ฉด "ํŒ๋‹จ ๋ถˆ๊ฐ€"์™€ ์‚ฌ์œ (detail)๋ฅผ ๋ณด์—ฌ์ฃผ์„ธ์š”. whole_video_generation์€ ์ „์šฉ ๋ชจ๋ธ์ด ์•„์ง ์—†์–ด ์ž๊ฐ€ํ‘œ๊ธฐ๊ฐ€ ์—†๋Š” ํ•œ unavailable์ž…๋‹ˆ๋‹ค. ํ•„์ˆ˜ ๋ถ„์„ ์ถ•์„ ๋ชป ํ•œ ํ•œ๊ณ„์ด๋ฏ€๋กœ ์ „์ฒด ๊ฒฐ๊ณผ๋„ partial๋กœ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
  3. ์นด๋“œ์˜ status(์ฒ˜๋ฆฌ ์ƒํƒœ)์™€ verdict(๊ฒ€์ฆ ํŒ์ •)๋ฅผ ๋ถ„๋ฆฌํ•ด์„œ ๋‹ค๋ฃจ์„ธ์š”. status !== "done"์ธ ์นด๋“œ๋Š” verdict๋ฅผ ์•„์ง ์‹ ๋ขฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๊ธฐ๋ณธ๊ฐ’์ผ ๋ฟ).
  4. verdict: "unverified"(๊ทผ๊ฑฐ ๋ถ€์กฑ)๋Š” **"๊ฑฐ์ง“"์ด ์•„๋‹ˆ๋ผ "ํ™•์ธ ๋ชป ํ•จ"**์ž…๋‹ˆ๋‹ค. ๊ฑฐ์ง“์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ‘œ์‹œํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. insufficient_label์— ์™œ ํŒ์ •ํ•˜์ง€ ๋ชปํ–ˆ๋Š”์ง€๊ฐ€ ๋“ค์–ด ์žˆ์œผ๋‹ˆ ํ•จ๊ป˜ ๋ณด์—ฌ์ฃผ์„ธ์š”.
  5. ํŒ์ • ๋ฌธ๊ตฌ๋Š” verdict_label์„ ์“ฐ์„ธ์š”. ์ฝ”๋“œ๊ฐ’(supported ๋“ฑ)์„ ์ง์ ‘ ๋งคํ•‘ํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค. ๊ทผ๊ฑฐ์™€ ์ผ์น˜๋Š” "์ด ์ฃผ์žฅ์ด ์ฐธ"์ด ์•„๋‹ˆ๋ผ "์šฐ๋ฆฌ๊ฐ€ ์ฐพ์€ ๊ทผ๊ฑฐ์™€ ์ผ์น˜ํ•œ๋‹ค"๋Š” ๋œป์ž…๋‹ˆ๋‹ค โ€” ์ฃผ์–ด๊ฐ€ ์ฃผ์žฅ์ด ์•„๋‹ˆ๋ผ ๊ทผ๊ฑฐ์ž…๋‹ˆ๋‹ค. ํ™”๋ฉด ๋ฌธ๊ตฌ๋„ ๊ทธ๋ ‡๊ฒŒ ์ฝํžˆ๊ฒŒ ์จ์ฃผ์„ธ์š”.
  6. evidence[].cited๊ฐ€ false์ธ ์ž๋ฃŒ๋Š” "์ฐธ๊ณ  ์ž๋ฃŒ"์ด์ง€ ํŒ์ • ๊ทผ๊ฑฐ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ทผ๊ฑฐ ๋ถ€์กฑ ์นด๋“œ์— ๋ถ™์€ ์ž๋ฃŒ๊ฐ€ ์—ฌ๊ธฐ ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ํŒ์ • ๊ทผ๊ฑฐ์™€ ๊ฐ™์€ ์ž๋ฆฌ์— ์„ž์–ด ๋ณด์—ฌ์ฃผ๋ฉด, ํŒ์ •ํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ํŒ์ •ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  7. cited: true๋Š” ์„œ๋ฒ„์˜ ์›๋ฌธยท์ถฉ๋ถ„์„ฑยท์ธ์šฉ ๊ฒ€์ฆ์„ ํ†ต๊ณผํ•œ ํŒ์ • ๊ทผ๊ฑฐ์ž…๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ๋ฐœ์ทŒ ์ธ์šฉ๋งŒ์œผ๋กœ๋Š” ์ด ๊ฐ’์„ ํ™•์ •ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. cite_reason์€ LLM์˜ ์„ค๋ช…์ด๋ฉฐ ๋ฌธ์ž์—ด ๊ฒ€์ฆ๋งŒ์œผ๋กœ ์˜๋ฏธ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  8. evidence[].is_primary๋Š” ์ถœ์ฒ˜ ์œ ํ˜• ๋ถ„๋ฅ˜ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋งŒ์œผ๋กœ ์ถœ์ฒ˜ ์ง„์œ„ยท์›๋ฌธ ํ™•๋ณด๋ฅผ ๋ณด์žฅํ•˜์ง€ ์•Š์œผ๋ฉฐ, content_scopeยทprovenance_verified์™€ ํ•จ๊ป˜ ํ•ด์„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  9. time_precision์ด "approx"๋ฉด ์ •ํ™•ํ•œ ์œ„์น˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํ•ต์‹ฌ์–ด ๊ฒน์นจ์œผ๋กœ ์ถ”์ •ํ•œ ๊ฐ’์ด๋ผ ๋ช‡ ์ดˆ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "์•ฝ 00:28"์ฒ˜๋Ÿผ ๊ทผ์‚ฟ๊ฐ’์ž„์ด ๋“œ๋Ÿฌ๋‚˜๊ฒŒ ํ‘œ์‹œํ•ด์ฃผ์„ธ์š”. null์ด๋ฉด ์œ„์น˜๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒƒ์ด๋ผ ํ‘œ์‹œ๋ฅผ ๋นผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  10. analysis_status === "partial"์ด๋ฉด stages๋ฟ ์•„๋‹ˆ๋ผ ๊ฐ ์ถ•์˜ unavailable๊ณผ ์‹คํŒจยท๋ฏธ์™„๋ฃŒ ์นด๋“œ๋„ ์•ˆ๋‚ดํ•ด์ฃผ์„ธ์š”.
  11. coverage_pctยทstt_coverage_pct์˜ 100%๋Š” "๋ฐœ์–ธ์„ ๋ชจ๋‘ ์ •ํ™•ํžˆ ์ธ์‹ํ–ˆ๋‹ค"๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค. coverage_basis, segment_coverage_pct, coverage_detail์„ ํ•จ๊ป˜ ํ™•์ธํ•˜์„ธ์š”. ๊ตฌ๊ฐ„ ๋น„์œจ๋„ ์ •ํ™•๋„ ์ ์ˆ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

ํ™”๋ฉด๋ณ„๋กœ ์–ด๋””๋ฅผ ๋ณด๋ฉด ๋˜๋Š”์ง€

์กฐ์ •์ค€ ํŒ€์žฅ์ด ๊ณต์œ ํ•œ ์‹œ์•ˆ(S-01 ~ S-04D) ๊ธฐ์ค€์ž…๋‹ˆ๋‹ค.

ํ™”๋ฉด ํ‘œ์‹œํ•  ๊ฒƒ ์–ด๋””์„œ
S-02 ์ƒ๋‹จ ์ธ๋„ค์ผ ยท ์ฑ„๋„ ยท ๊ธธ์ด ยท ๊ฒŒ์‹œ์ผ result.media.thumbnail / uploader / duration / upload_date
S-02 ์ง„ํ–‰ ๋‹จ๊ณ„ ๋ฌธ๊ตฌ job.message, ๋‹จ๊ณ„ ๊ตฌ๋ถ„์€ job.stage (๋ถ€๋ถ„ ๊ฒฐ๊ณผ ์ดํ›„์—๋„ ๊ฐฑ์‹ )
S-02 ํ•˜๋‹จ ๋ถ„์„ ID ยท ์‹œ๊ฐ job.display_id(CN-A1B2-C3D4) / job.created_at_iso
S-02ยทS-03 ๊ฒฝ๊ณผ "๊ฒฝ๊ณผ 01:52" job.processing_elapsed_sec, ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ job.queue_wait_sec
S-03 โ‘  "๊ฒ€์ฆํ•  ์ฃผ์žฅ 8๊ฐœ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค" claim_verification.summary.total
S-03 โ‘ก "3/8๊ฐœ ์™„๋ฃŒ" summary.done / summary.total
S-03 โ‘ฆ "00:12 ~ 00:19 ยท ์Œ์„ฑ ์ธ์‹" claim.startยทendยทtime_precision, ์ถœ์ฒ˜๋Š” media.transcript_source
S-03 ์ ‘ํž˜ ์ž๋ฃŒ ๊ฐœ์ˆ˜ยท์ถœ์ฒ˜ ์œ ํ˜•. "์›๋ฌธ ํฌํ•จ"์€ ํ™•๋ณดยท๊ฒ€์ฆํ–ˆ์„ ๋•Œ๋งŒ claim.evidence.length, is_primary์™€ content_scopeยทprovenance_verified๋ฅผ ํ•จ๊ป˜ ํ™•์ธ
S-04 ์š”์•ฝ "์ผ์น˜ 2 ยท ๋ถˆ์ผ์น˜ 3 ยท ๊ทผ๊ฑฐ ๋ถ€์กฑ 3" summary.supported / refuted / unverified
S-04 ์š”์•ฝ "์™„๋ฃŒ 8 ยท ๋ฏธ์™„๋ฃŒ 0 ยท ์‹œ๊ฐ„ ์ดˆ๊ณผ 0" summary.done / pending+verifying+failed / timed_out
S-04 ๋ฏธ๋””์–ด ์ถ• ํŒ๋‹จ ๊ทผ๊ฑฐ์™€ ๋ถ„์„ ๋ฒ”์œ„ face_manipulation.status_label + detail
S-04D ๊ทผ๊ฑฐ ์นด๋“œ ์ถœ์ฒ˜ ์œ ํ˜• ๋ฐฐ์ง€ ยท ๋ฐœํ–‰์ผ ยท ๋ฐœํ–‰ ๊ธฐ๊ด€ evidence[].source_type_label / published_at / publisher
S-04D ๊ทผ๊ฑฐ ์นด๋“œ "์ด ์ž๋ฃŒ๊ฐ€ ์ฃผ์žฅ์„ ๋ฐ˜๋ฐ•ํ•˜๋Š” ์ด์œ " evidence[].cite_reason
S-04 ๊ทผ๊ฑฐ ๋ถ€์กฑ "ํŒ์ •ํ•˜์ง€ ๋ชปํ•œ ์ด์œ " claim.insufficient_label
S-04 ๊ทผ๊ฑฐ ๋ถ€์กฑ "์ฐธ๊ณ  ์ž๋ฃŒ 2๊ฑด (ํŒ์ •์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ)" evidence ์ค‘ cited: false์ธ ๊ฒƒ

์•„์ง ์„œ๋ฒ„๊ฐ€ ์ฃผ์ง€ ์•Š๋Š” ๊ฒƒ

  • S-03 โ‘ฃ "๋ถ„์„์ด ์˜ˆ์ƒ๋ณด๋‹ค ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค" โ€” job.processing_elapsed_sec๋กœ ํ”„๋ŸฐํŠธ์—์„œ ํŒ๋‹จํ•ด์ฃผ์„ธ์š”. ์„œ๋ฒ„๊ฐ€ ๋ณ„๋„ ์‹ ํ˜ธ๋ฅผ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ถœ์ฒ˜ ์œ ํ˜• ๋ผ๋ฒจ์ด ์‹œ์•ˆ๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์‹œ์•ˆ์˜ ์ •๋ถ€ยท๊ณต๊ณต๊ธฐ๊ด€์€ ์„œ๋ฒ„์—์„œ ๊ณต์‹ ๋ฐœํ‘œ(official)๋กœ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค. ํ™”๋ฉด ๋ฌธ๊ตฌ๋ฅผ ๋ฐ”๊พธ์‹ค์ง€, ์„œ๋ฒ„ ๋ผ๋ฒจ์„ ๋งž์ถœ์ง€ ์ •ํ•ด์ฃผ์‹œ๋ฉด ๋งž์ถ”๊ฒ ์Šต๋‹ˆ๋‹ค.

claim_verification.status

๊ฐ’ ์˜๋ฏธ ํ™”๋ฉด
analyzed ์ฃผ์žฅ์„ ๋ฝ‘์•„ ๊ฒ€์ฆํ–ˆ๋‹ค ์นด๋“œ ๋ชฉ๋ก
no_claims ๋ถ„์„์€ ์ •์ƒ์ด์—ˆ์ง€๋งŒ ๊ฒ€์ฆํ•  ์ฃผ์žฅ์ด ์—†์—ˆ๋‹ค ์นด๋“œ ๋ชฉ๋ก ๋Œ€์‹  ์•ˆ๋‚ด ๋ฌธ๊ตฌ(detail)
unavailable ๋ฐœ์–ธ ํ™•๋ณดยท์ฃผ์žฅ ์ถ”์ถœ ์‹คํŒจ ๋˜๋Š” ์˜ต์…˜ ํ•ด์ œ๋กœ ๊ฒ€์ฆ ์ž์ฒด๋ฅผ ๋ชป ํ–ˆ๋‹ค ๋ถ„์„ ๋ถˆ๊ฐ€ ์‚ฌ์œ  ์•ˆ๋‚ด

no_claims์™€ unavailable์„ ๊ฐ™๊ฒŒ ๋‹ค๋ฃจ๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ์•ž์€ "๋ณผ ๊ฒŒ ์—†์—ˆ๋‹ค"์ด๊ณ  ๋’ค๋Š” "๋ณด์ง€ ๋ชปํ–ˆ๋‹ค"์ž…๋‹ˆ๋‹ค.

๊ทผ๊ฑฐ ๋ถ€์กฑ ์‚ฌ์œ  (insufficient_reason)

์ฝ”๋“œ ํ™”๋ฉด ๋ฌธ๊ตฌ
no_source ๊ด€๋ จ ์ž๋ฃŒ๋ฅผ ์ฐพ์ง€ ๋ชปํ•จ
not_direct ์ž๋ฃŒ๋Š” ์žˆ์œผ๋‚˜ ์ฃผ์žฅ์„ ์ง์ ‘ ํ™•์ธํ•˜์ง€ ๋ชปํ•จ
timeout ์‹œ๊ฐ„ ๋‚ด ํ™•์ธํ•˜์ง€ ๋ชปํ•จ
time_mismatch ์ฃผ์žฅ๊ณผ ์ž๋ฃŒ์˜ ์‹œ์ ์ด ๋‹ค๋ฆ„
source_conflict ์ถœ์ฒ˜๋“ค์ด ์„œ๋กœ ์ถฉ๋Œํ•จ
weak_source ์ถœ์ฒ˜์˜ ๋‚ด์šฉ์ด ํŒ์ •์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Œ
partial ์ฃผ์žฅ์˜ ์ผ๋ถ€๋งŒ ํ™•์ธ๋จ

์ถœ์ฒ˜ ์œ ํ˜• (evidence[].source_type)

statistics(ํ†ต๊ณ„ ์›๋ฌธ) ยท official(๊ณต์‹ ๋ฐœํ‘œ) ยท factcheck(ํŒฉํŠธ์ฒดํฌ ํŒ์ •) ยท news(์–ธ๋ก  ๋ณด๋„) ยท encyclopedia(๋ฐฑ๊ณผ์‚ฌ์ „) ยท unknown(๊ธฐํƒ€). ์•ž์˜ ๋‘˜์€ 1์ฐจ ์ถœ์ฒ˜๋กœ ๋ถ„๋ฅ˜ํ•˜์ง€๋งŒ, ์œ ํ˜• ๋ถ„๋ฅ˜ ์ž์ฒด๊ฐ€ ์›๋ฌธ ํ™•๋ณดยท๊ฒ€์ฆ์„ ๋œปํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์—๋Ÿฌ ์‘๋‹ต

์•„๋ž˜๋Š” ๋ฌธ์„œํ™”ํ•œ API ์š”์ฒญ ์˜ค๋ฅ˜์˜ ๊ธฐ๋ณธ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๋ถ„์„ ์‹คํŒจ๋Š” ์กฐํšŒ HTTP 200 ์•ˆ์˜ job.errorยทresult.stages๋กœ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cloudflare ๋กœ๊ทธ์ธ HTMLยท๋ฆฌ๋‹ค์ด๋ ‰ํŠธ์™€ FastAPI ๊ธฐ๋ณธ 404ยท405๋Š” ์ด ๋ด‰ํˆฌ์™€ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. request_id๋Š” ์‘๋‹ต ํ—ค๋”(X-Request-ID)์™€ ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œ ํ•ด๋‹น API ์š”์ฒญ์„ ์ฐพ๋Š” ๋ฐ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ๊ณ„์•ฝ์„ ํ•จ๊ป˜ ํ™•์ธํ•˜์„ธ์š”.

{
  "error": {
    "code": "download_failed",     // unsupported_url / invalid_request / job_not_found /
                                   // server_busy / dependency_missing / internal_error
    "message": "์˜์ƒ์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์ƒํƒœ์™€ ์ง€์› ์กฐ๊ฑด์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.",
    "retryable": true,             // true๋ฉด ์ž ์‹œ ํ›„ ์žฌ์‹œ๋„ ์•ˆ๋‚ด๊ฐ€ ์ ์ ˆํ•ฉ๋‹ˆ๋‹ค
    "stage": "download"
  },
  "request_id": "b0a4df3f1230"
}

๋ถ„์„ ๋„์ค‘ ์‹คํŒจํ•œ job์€ GET /api/jobs/{id}์˜ error์— ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.

์„ค์ •

๋ชจ๋“  ๊ฐ’์€ DEEPCHECK_ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (๊ธฐ๋ณธ๊ฐ’์€ deepcheck/config.py).

๋…๋ฆฝ ๋กœ์ปฌ ๊ฐœ๋ฐœ์šฉ docker-compose.yml์€ ์„ ํƒ์  .env๋ฅผ env_file๋กœ ์ฝ์œผ๋ฉฐ environment์— ๋ช…์‹œ๋œ ํ•ญ๋ชฉ์ด ์šฐ์„ ํ•ฉ๋‹ˆ๋‹ค. ๋งฅ๋ฏธ๋‹ˆ์šฉ compose.home.yml์€ .env.home ๋˜๋Š” ๋ช…์‹œํ•œ CONAN_ENV_FILE์„ ์ฝ์Šต๋‹ˆ๋‹ค. ๋‘ ํŒŒ์ผ์€ ์ž๋™ ๋™๊ธฐํ™”๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ๋ฐฐํฌ ์„ค์ • ๋ณ€๊ฒฝ์€ ๋ณ„๋„ ์Šน์ธ๊ณผ ์ ˆ์ฐจ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

# .env
DEEPCHECK_BACKLOG=16
DEEPCHECK_MAX_CLAIMS=0
DEEPCHECK_GOOGLE_FACTCHECK_API_KEY=...
ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
DEEPCHECK_WORKERS 1 ๋™์‹œ ๋ถ„์„ ์˜์ƒ ์ˆ˜. MVP ๊ธฐ๋ณธ๊ฐ’
DEEPCHECK_CLAIM_WORKERS 3 ์˜์ƒ ํ•œ ๊ฑด ์•ˆ์˜ ๋™์‹œ ์ฃผ์žฅ ๊ฒ€์ฆ ์ˆ˜
DEEPCHECK_BACKLOG 64 ์‹ค์ œ ๋Œ€๊ธฐ์—ด ์ƒํ•œ. ์‹คํ–‰ ์›Œ์ปค์™€ ๋ณ„๋„๋กœ ์ œํ•œ
DEEPCHECK_ENABLE_DEBUG_ENDPOINTS false ์ „์ฒด jobยทsession ๋ชฉ๋ก. ๊ณต๊ฐœ ๊ธฐ๋ณธ๊ฐ’์€ ๋น„ํ™œ์„ฑ
DEEPCHECK_LOG_LEVEL INFO ๋กœ๊ทธ ๋ ˆ๋ฒจ
DEEPCHECK_LOG_FORMAT text json์œผ๋กœ ๋‘๋ฉด ํ•œ ์ค„ JSON ๋กœ๊ทธ (์ˆ˜์ง‘ยท๊ฒ€์ƒ‰์šฉ)
DEEPCHECK_CORS_ORIGINS * ํ—ˆ์šฉ ์˜ค๋ฆฌ์ง„. ์‰ผํ‘œ ๊ตฌ๋ถ„
DEEPCHECK_WHISPER_MODEL_SIZE small STT ๋ชจ๋ธ ํฌ๊ธฐ
DEEPCHECK_CAPTION_POLICY off ๊ธฐ๋ณธ ์ž๋ง‰ ๋ฏธ์‚ฌ์šฉยทSTT. manual์€ ๋“ฑ๋ก CC ์šฐ์„ , any๋Š” ์ž๋™ CC๋„ ํ—ˆ์šฉํ•˜๋ฉฐ ์‚ฌ์šฉํ•  CC๊ฐ€ ์—†์œผ๋ฉด STT
DEEPCHECK_MAX_FRAMES 8 ์ƒ˜ํ”Œ๋ง ํ”„๋ ˆ์ž„ ์ˆ˜
DEEPCHECK_CLASSIFIER_MODEL dima806/... ๋”ฅํŽ˜์ดํฌ ๋ถ„๋ฅ˜๊ธฐ
DEEPCHECK_VLM_MODEL (์—†์Œ) ์ง€์ • ์‹œ์—๋งŒ VLM ์‚ฌ์šฉ
DEEPCHECK_VLM_PROVIDER ollama VLM ์ œ๊ณต์ž
DEEPCHECK_MAX_CLAIMS 0 0์€ ๊ฐœ์ˆ˜ ์ƒํ•œ ์—†์Œ. ์ผ๋ถ€๋งŒ ๊ฒ€์ฆํ•˜๋„๋ก ๋ฐ”๊พธ๋Š” ๊ฒƒ์€ ์ œํ’ˆ ๋ฒ”์œ„์— ์˜ํ–ฅ
DEEPCHECK_LLM_PROVIDER off DeepSeek ๋“ฑ ์ œ๊ณต์ž๋Š” ๋ณ„๋„ ์„ค์ • ํ•„์š”
DEEPCHECK_CLAIM_EXTRACTOR rule rule/llm. LLM ๋ชจ๋“œ ์‹คํŒจ๋Š” ๋ถ„์„ ๋ถˆ๊ฐ€๋กœ ํ‘œ์‹œ
DEEPCHECK_FRAME_AGGREGATION trimmed_mean ์–ผ๊ตด ๋ถ„๋ฅ˜์— ์„ฑ๊ณตํ•œ ์ ์ˆ˜๋งŒ ์ ˆ์‚ฌํ‰๊ท . ์ž„๊ณ„๊ฐ’ ์žฌ๊ฒ€์ฆ์€ ๋ณ„๋„
DEEPCHECK_EVIDENCE_PER_CLAIM 3 ์ฃผ์žฅ๋‹น ๊ทผ๊ฑฐ ๊ฒ€์ƒ‰ ๊ฑด์ˆ˜
DEEPCHECK_EVIDENCE_TIMEOUT_SEC 8 ๊ทผ๊ฑฐ ๊ฒ€์ƒ‰ ์š”์ฒญ ํƒ€์ž„์•„์›ƒ
DEEPCHECK_EVIDENCE_PROVIDERS factcheck,naver_news,naver_encyc ์ž๊ฒฉ ์ •๋ณด ์—†๋Š” ์ˆ˜๋‹จ์€ ์ œ์™ธ. ์œ„ํ‚ค๋ฐฑ๊ณผ๋Š” ์‹ค์‚ฌ์šฉ์—์„œ ์ •ํ™•๋„๊ฐ€ ๋‚ฎ์•„ 2026-09-16 ๊ธฐ๋ณธ์—์„œ ๋บ๋‹ค
DEEPCHECK_GOOGLE_FACTCHECK_API_KEY (์—†์Œ) ์žˆ์œผ๋ฉด ์ „๋ฌธ ๊ธฐ๊ด€ ํŒ์ • ๊ฒ€์ƒ‰ ์‚ฌ์šฉ
DEEPCHECK_EVIDENCE_FETCH_ORIGINAL true ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ๊ทผ๊ฑฐ์˜ ์‹ค์ œ ์›๋ฌธ์„ ์—ด์–ด ํ™•๋ณดํ• ์ง€
DEEPCHECK_EVIDENCE_FETCH_TIMEOUT_SEC 8 ์›๋ฌธ ์š”์ฒญ ํƒ€์ž„์•„์›ƒ
DEEPCHECK_EVIDENCE_FETCH_MAX_BYTES 1500000 ์›๋ฌธ ์‘๋‹ต ํฌ๊ธฐ ์ƒํ•œ
DEEPCHECK_EVIDENCE_FETCH_MAX_PER_CLAIM 3 ์ฃผ์žฅ ํ•˜๋‚˜๋‹น ์›๋ฌธ ํ™•๋ณด๋ฅผ ์‹œ๋„ํ•  ๊ทผ๊ฑฐ ๊ฐœ์ˆ˜ ์ƒํ•œ
DEEPCHECK_TRUSTED_NEWS_DOMAINS ์ฃผ์š” ํ†ต์‹ ์‚ฌยท๋ฐฉ์†ก์‚ฌยท์ข…ํ•ฉ์ผ๊ฐ„์ง€ (์‰ผํ‘œ ๊ตฌ๋ถ„) ์ด ๋ชฉ๋ก์˜ ๋„๋ฉ”์ธ์—์„œ๋งŒ provenance_verified=true
DEEPCHECK_LEVEL_HIGH / _MODERATE / _CAUTION 70 / 45 / 25 ๋“ฑ๊ธ‰ ๊ฒฝ๊ณ„

๋กœ๊ทธ์—๋Š” request_id์™€ job_id๊ฐ€ ํ•จ๊ป˜ ๋ถ™์–ด([req:ab12 job:cd34]) ๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ถ„์„์ด ๋Œ์•„๋„ ์š”์ฒญ ํ•˜๋‚˜๋ฅผ ๋๊นŒ์ง€ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทผ๊ฑฐ ๊ฒ€์ƒ‰ ์ˆ˜๋‹จ

DEEPCHECK_EVIDENCE_PROVIDERS์— ์“ด ์ˆœ์„œ๋Œ€๋กœ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค (๊ธฐ๋ณธ factcheck,naver_news,naver_encyc).

์ด๋ฆ„ ํ‚ค ํ•„์š” ๋น„๊ณ 
factcheck ํ•„์š” Google Fact Check Tools. ํŒ์ • ๋ฌธ์ž์—ด๋„ ์ฐธ๊ณ  ์ž๋ฃŒ์ด๋ฉฐ ์ง์ ‘ ์ง€์ง€ยท๋ฐ˜๋ฐ•์œผ๋กœ ์˜ฎ๊ธฐ์ง€ ์•Š์Œ
naver_news / naver_encyc ํ•„์š” NAVER ๋‰ด์Šคยท๋ฐฑ๊ณผ ๊ฒ€์ƒ‰. API ํ‚ค๋Š” ๋ฐฑ์—”๋“œ ํ™˜๊ฒฝ์—๋งŒ ๋ณด๊ด€
wikipedia / wikipedia_en ๋ถˆํ•„์š” ํ•œ๊ตญ์–ดยท์˜์–ด ์œ„ํ‚ค๋ฐฑ๊ณผ ๊ฒ€์ƒ‰ ๋ฐœ์ทŒ. ์‹ค์‚ฌ์šฉ์—์„œ ๋ฌด๊ด€ํ•œ ๋ฌธ์„œ๊ฐ€ ์ž์ฃผ ์„ž์—ฌ ๊ธฐ๋ณธ์—์„œ๋Š” ๋บ๋‹ค(์„ค์ •์œผ๋กœ ๋‹ค์‹œ ์ผค ์ˆ˜ ์žˆ์Œ)
gdelt ๋ถˆํ•„์š” ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑ. ๊ณผ๊ฑฐ ์‹ค์ธก์—์„œ 16์ดˆ ์ด์ƒยท429๊ฐ€ ๊ธฐ๋ก๋จ; ํ˜„์žฌ ์žฌ๊ฒ€์ฆ ์•„๋‹˜

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

๊ฒ€์ƒ‰ ์ œ๊ณต์ž๊ฐ€ ๋Œ๋ ค์ค€ URL ์ค‘ ๊ด€๋ จ์„ฑ ํ•„ํ„ฐ๋ฅผ ํ†ต๊ณผํ•œ ์ผ๋ถ€๋Š” article_fetch.py๊ฐ€ ์‹ค์ œ๋กœ ์—ด์–ด ์›๋ฌธ ํ™•๋ณด๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์œ„ "ํŒ์ •์— ๋Œ€ํ•œ ํƒœ๋„"์˜ ์›๋ฌธ ํ™•๋ณด ๋ฌธ๋‹จ์„ ์ฐธ๊ณ ํ•˜์„ธ์š”.

์„ ํƒ ๊ตฌ์„ฑ ์š”์†Œ

๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋น ์ ธ๋„ ๊ฐ€๋Šฅํ•œ ๋‚˜๋จธ์ง€ ๋ถ„์„์€ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ํ–ˆ๋‹ค๊ณ  ์ •ํ™•๋„๊ฐ€ ์ž๋™ ๋ณด์žฅ๋˜์ง€๋Š” ์•Š์œผ๋ฉฐ, ์‹คํŒจยท๋ˆ„๋ฝ ์ด์œ ๋Š” ๊ฒฐ๊ณผ์˜ detail๊ณผ ๋กœ๊ทธ์— ๋‚จ์Šต๋‹ˆ๋‹ค.

์–ผ๊ตด crop ๋ชจ๋ธ (์–ผ๊ตด ๊ธฐ๋ฐ˜ ๋ถ„์„์— ํ•„์š”)

ํ˜„์žฌ ๋ถ„๋ฅ˜๊ธฐ๋Š” ์–ผ๊ตด crop ์ž…๋ ฅ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ธ์ด ์—†๊ฑฐ๋‚˜ ์–ผ๊ตด์„ ๋ชป ์ฐพ์œผ๋ฉด ์ „์ฒด ํ”„๋ ˆ์ž„์œผ๋กœ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Docker ์ด๋ฏธ์ง€๋Š” ๋นŒ๋“œ ์‹œ ์ž๋™์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ์‹คํ–‰์€ ํ•œ ๋ฒˆ๋งŒ:

mkdir -p deepcheck/models
curl -L -o deepcheck/models/blaze_face_short_range.tflite \
  https://storage.googleapis.com/mediapipe-models/face_detector/blaze_face_short_range/float16/1/blaze_face_short_range.tflite

VLM ๊ทผ๊ฑฐ (์„ ํƒ)

Ollama์— ๋น„์ „ ๋ชจ๋ธ์„ ๋„์šฐ๊ณ  DEEPCHECK_VLM_MODEL ๋˜๋Š” ์š”์ฒญ์˜ vlm_model๋กœ ์ง€์ •ํ•˜๋ฉด, "์™œ AI๋กœ ๋ณด์ด๋Š”์ง€"๋ฅผ ์ž์—ฐ์–ด ๊ทผ๊ฑฐ๋กœ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ง€์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ์‹คํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ollama pull qwen2.5vl:7b

๋ฐฐํฌ ์‹œ ์ฃผ์˜

  • ์•ฑ ๋งฅ๋ฏธ๋‹ˆ์— ๋ฒ”์šฉ GitHub self-hosted runner๋ฅผ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. GitHub๋Š” build/test/sign๊ณผ ์Šน์ธ๋œ artifact ์ƒ์„ฑ๊นŒ์ง€๋งŒ ๋งก๊ณ , ์‹ค์ œ ๊ต์ฒด๋Š” ๊ณ ์ • helper ์ ˆ์ฐจ๋ฅผ ๋ณ„๋„ ํ™œ์„ฑํ™”ํ•œ ๋’ค ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด Docker ์„œ๋น„์Šค์™€ ์‹ค์ œ ํ™˜๊ฒฝ ํŒŒ์ผ์„ ์ž„์˜๋กœ ์žฌ์‹œ์ž‘ยท๋ฎ์–ด์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • torch/torchvision์€ CPU ์ „์šฉ wheel index๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ PyPI ํœ ์€ GPU๊ฐ€ ์—†๋Š” ํ˜ธ์ŠคํŠธ์—๋„ CUDA ๋Ÿฐํƒ€์ž„(~2GB)์„ ๋Œ๊ณ  ์˜ต๋‹ˆ๋‹ค. Dockerfile์— ๋ฐ˜์˜๋ผ ์žˆ์Šต๋‹ˆ๋‹ค.
  • uvicorn์€ ๋‹จ์ผ ์›Œ์ปค ํ”„๋กœ์„ธ์Šค๋กœ ๋„์›๋‹ˆ๋‹ค. job ์ƒํƒœ๋ฅผ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ํ•˜๋ฏ€๋กœ ์›Œ์ปค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ฉด GET /api/jobs/{id}๊ฐ€ ๋ฌด์ž‘์œ„๋กœ 404๊ฐ€ ๋‚ฉ๋‹ˆ๋‹ค. ๋™์‹œ์„ฑ์€ DEEPCHECK_WORKERS๋กœ ์กฐ์ ˆํ•˜์„ธ์š”.

yt-dlp ์‚ฌ์šฉ์€ ๋Œ€์ƒ ์‚ฌ์ดํŠธ์˜ ์•ฝ๊ด€๊ณผ ์ €์ž‘๊ถŒ ์ •์ฑ…์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages