์ต์ข
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 compose up -d --build
curl http://localhost:8000/healthuv 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 8000CLI๋ก๋ ์ธ ์ ์์ต๋๋ค.
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 ๊ณ์ฝ,
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 |
๊ฒฝ๊ณผ ์๊ฐ(์ด). ์๋ฃ๋๋ฉด ์ด ์์ ์๊ฐ์ผ๋ก ๊ณ ์ ๋ฉ๋๋ค |
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์ ์ฌ์ |
์๋ ์ซ์ยท์ฃผ์ฅยท์ถ์ฒ๋ ํ์์ ์ค๋ช
ํ๋ ์์์ด์ง ์ค์ ๋ถ์ ๊ฒฐ๊ณผ๊ฐ ์๋๋๋ค. ํนํ cited: true์
์๋ฌธ ์กฐ๊ฑด์ ๋ชจ์ ์๋ฃ๋ก๋ง ๊ฒ์ฆํ์ผ๋ฉฐ, ํ์ฌ ๊ฒ์ ๋ฐ์ท ์์ง ๊ฒฝ๋ก๊ฐ ์ด๋ฅผ ํ๋ณดํ๋ค๋ ๋ป์ด ์๋๋๋ค.
ํ๋ก ํธ์์ ๋ฐ๋์ ์ฒ๋ฆฌํด์ผ ํ ๊ฒ๋ค:
status๋ง ํ์ํ๊ณ ์ซ์๋ ์ฐ์ง ๋ง์ธ์.face_manipulation/whole_video_generation์signals์ ์ ์๋ ๋๋ฒ๊ทธ์ฉ์ ๋๋ค. ํ๋ฉด์๋status_label(๋๋status๋ฅผ ๋ณด๊ณ ์ง์ ๋งคํํ ๋ฌธ๊ตฌ)๋ง ์๋๋ค.status === "unavailable"์ด๋ฉด "ํ๋จ ๋ถ๊ฐ"์ ์ฌ์ (detail)๋ฅผ ๋ณด์ฌ์ฃผ์ธ์.whole_video_generation์ ์ ์ฉ ๋ชจ๋ธ์ด ์์ง ์์ด ์๊ฐํ๊ธฐ๊ฐ ์๋ ํunavailable์ ๋๋ค. ํ์ ๋ถ์ ์ถ์ ๋ชป ํ ํ๊ณ์ด๋ฏ๋ก ์ ์ฒด ๊ฒฐ๊ณผ๋partial๋ก ํ์ํฉ๋๋ค.- ์นด๋์
status(์ฒ๋ฆฌ ์ํ)์verdict(๊ฒ์ฆ ํ์ )๋ฅผ ๋ถ๋ฆฌํด์ ๋ค๋ฃจ์ธ์.status !== "done"์ธ ์นด๋๋verdict๋ฅผ ์์ง ์ ๋ขฐํ ์ ์์ต๋๋ค(๊ธฐ๋ณธ๊ฐ์ผ ๋ฟ). verdict: "unverified"(๊ทผ๊ฑฐ ๋ถ์กฑ)๋ **"๊ฑฐ์ง"์ด ์๋๋ผ "ํ์ธ ๋ชป ํจ"**์ ๋๋ค. ๊ฑฐ์ง์ฒ๋ผ ๋ณด์ด๊ฒ ํ์ํ๋ฉด ์ ๋ฉ๋๋ค.insufficient_label์ ์ ํ์ ํ์ง ๋ชปํ๋์ง๊ฐ ๋ค์ด ์์ผ๋ ํจ๊ป ๋ณด์ฌ์ฃผ์ธ์.- ํ์ ๋ฌธ๊ตฌ๋
verdict_label์ ์ฐ์ธ์. ์ฝ๋๊ฐ(supported๋ฑ)์ ์ง์ ๋งคํํ์ง ์์๋ ๋ฉ๋๋ค.๊ทผ๊ฑฐ์ ์ผ์น๋ "์ด ์ฃผ์ฅ์ด ์ฐธ"์ด ์๋๋ผ "์ฐ๋ฆฌ๊ฐ ์ฐพ์ ๊ทผ๊ฑฐ์ ์ผ์นํ๋ค"๋ ๋ป์ ๋๋ค โ ์ฃผ์ด๊ฐ ์ฃผ์ฅ์ด ์๋๋ผ ๊ทผ๊ฑฐ์ ๋๋ค. ํ๋ฉด ๋ฌธ๊ตฌ๋ ๊ทธ๋ ๊ฒ ์ฝํ๊ฒ ์จ์ฃผ์ธ์. evidence[].cited๊ฐfalse์ธ ์๋ฃ๋ "์ฐธ๊ณ ์๋ฃ"์ด์ง ํ์ ๊ทผ๊ฑฐ๊ฐ ์๋๋๋ค. ๊ทผ๊ฑฐ ๋ถ์กฑ ์นด๋์ ๋ถ์ ์๋ฃ๊ฐ ์ฌ๊ธฐ ํด๋นํฉ๋๋ค. ํ์ ๊ทผ๊ฑฐ์ ๊ฐ์ ์๋ฆฌ์ ์์ด ๋ณด์ฌ์ฃผ๋ฉด, ํ์ ํ์ง ์์ ๊ฒ์ ํ์ ํ ๊ฒ์ฒ๋ผ ๋ณด์ฌ์ฃผ๊ฒ ๋ฉ๋๋ค.cited: true๋ ์๋ฒ์ ์๋ฌธยท์ถฉ๋ถ์ฑยท์ธ์ฉ ๊ฒ์ฆ์ ํต๊ณผํ ํ์ ๊ทผ๊ฑฐ์ ๋๋ค. ๊ฒ์ ๋ฐ์ท ์ธ์ฉ๋ง์ผ๋ก๋ ์ด ๊ฐ์ ํ์ ํ์ง ์์ต๋๋ค.cite_reason์ LLM์ ์ค๋ช ์ด๋ฉฐ ๋ฌธ์์ด ๊ฒ์ฆ๋ง์ผ๋ก ์๋ฏธ ์ ํ์ฑ์ ๋ณด์ฅํ์ง ์์ต๋๋ค.evidence[].is_primary๋ ์ถ์ฒ ์ ํ ๋ถ๋ฅ ์ ๋ณด์ ๋๋ค. ์ด๊ฒ๋ง์ผ๋ก ์ถ์ฒ ์ง์ยท์๋ฌธ ํ๋ณด๋ฅผ ๋ณด์ฅํ์ง ์์ผ๋ฉฐ,content_scopeยทprovenance_verified์ ํจ๊ป ํด์ํด์ผ ํฉ๋๋ค.time_precision์ด"approx"๋ฉด ์ ํํ ์์น๊ฐ ์๋๋๋ค. ํต์ฌ์ด ๊ฒน์นจ์ผ๋ก ์ถ์ ํ ๊ฐ์ด๋ผ ๋ช ์ด ์ด๊ธ๋ ์ ์์ต๋๋ค."์ฝ 00:28"์ฒ๋ผ ๊ทผ์ฟ๊ฐ์์ด ๋๋ฌ๋๊ฒ ํ์ํด์ฃผ์ธ์.null์ด๋ฉด ์์น๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒ์ด๋ผ ํ์๋ฅผ ๋นผ๋ฉด ๋ฉ๋๋ค.analysis_status === "partial"์ด๋ฉดstages๋ฟ ์๋๋ผ ๊ฐ ์ถ์unavailable๊ณผ ์คํจยท๋ฏธ์๋ฃ ์นด๋๋ ์๋ดํด์ฃผ์ธ์.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)๋ก ๋๊ฐ๋๋ค. ํ๋ฉด ๋ฌธ๊ตฌ๋ฅผ ๋ฐ๊พธ์ค์ง, ์๋ฒ ๋ผ๋ฒจ์ ๋ง์ถ์ง ์ ํด์ฃผ์๋ฉด ๋ง์ถ๊ฒ ์ต๋๋ค.
| ๊ฐ | ์๋ฏธ | ํ๋ฉด |
|---|---|---|
analyzed |
์ฃผ์ฅ์ ๋ฝ์ ๊ฒ์ฆํ๋ค | ์นด๋ ๋ชฉ๋ก |
no_claims |
๋ถ์์ ์ ์์ด์์ง๋ง ๊ฒ์ฆํ ์ฃผ์ฅ์ด ์์๋ค | ์นด๋ ๋ชฉ๋ก ๋์ ์๋ด ๋ฌธ๊ตฌ(detail) |
unavailable |
๋ฐ์ธ ํ๋ณดยท์ฃผ์ฅ ์ถ์ถ ์คํจ ๋๋ ์ต์ ํด์ ๋ก ๊ฒ์ฆ ์์ฒด๋ฅผ ๋ชป ํ๋ค | ๋ถ์ ๋ถ๊ฐ ์ฌ์ ์๋ด |
no_claims์ unavailable์ ๊ฐ๊ฒ ๋ค๋ฃจ๋ฉด ์ ๋ฉ๋๋ค. ์์ "๋ณผ ๊ฒ ์์๋ค"์ด๊ณ ๋ค๋ "๋ณด์ง ๋ชปํ๋ค"์
๋๋ค.
| ์ฝ๋ | ํ๋ฉด ๋ฌธ๊ตฌ |
|---|---|
no_source |
๊ด๋ จ ์๋ฃ๋ฅผ ์ฐพ์ง ๋ชปํจ |
not_direct |
์๋ฃ๋ ์์ผ๋ ์ฃผ์ฅ์ ์ง์ ํ์ธํ์ง ๋ชปํจ |
timeout |
์๊ฐ ๋ด ํ์ธํ์ง ๋ชปํจ |
time_mismatch |
์ฃผ์ฅ๊ณผ ์๋ฃ์ ์์ ์ด ๋ค๋ฆ |
source_conflict |
์ถ์ฒ๋ค์ด ์๋ก ์ถฉ๋ํจ |
weak_source |
์ถ์ฒ์ ๋ด์ฉ์ด ํ์ ์ ์ถฉ๋ถํ์ง ์์ |
partial |
์ฃผ์ฅ์ ์ผ๋ถ๋ง ํ์ธ๋จ |
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 ์ ๋ ฅ์ ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ธ์ด ์๊ฑฐ๋ ์ผ๊ตด์ ๋ชป ์ฐพ์ผ๋ฉด ์ ์ฒด ํ๋ ์์ผ๋ก ๋์ฒดํ์ง ์์ต๋๋ค. 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.tfliteOllama์ ๋น์ ๋ชจ๋ธ์ ๋์ฐ๊ณ 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 ์ฌ์ฉ์ ๋์ ์ฌ์ดํธ์ ์ฝ๊ด๊ณผ ์ ์๊ถ ์ ์ฑ ์ ๋ฐ๋ฆ ๋๋ค.
{ "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 } // ์ฐธ๊ณ ์ฉ โ ์ด๋ ์ถ ์ ์์๋ ๋ฏธ๋ฐ์ } }