Skip to content

firepool7030/FactWave

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

5 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

FactWave ๐ŸŒŠ

AI ๊ธฐ๋ฐ˜ ๋‹ค์ค‘ ์—์ด์ „ํŠธ ์‹ค์‹œ๊ฐ„ ํŒฉํŠธ์ฒดํ‚น ์‹œ์Šคํ…œ

FactWave๋Š” CrewAI ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜์„ ํ™œ์šฉํ•˜์—ฌ 5๊ฐœ์˜ ์ „๋ฌธ AI ์—์ด์ „ํŠธ๊ฐ€ ํ˜‘์—…ํ•˜๋Š” 3๋‹จ๊ณ„ ๊ฒ€์ฆ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์‹ค์‹œ๊ฐ„ WebSocket ํ†ต์‹ ๊ณผ Chrome ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•ด ์›น ๋ธŒ๋ผ์šฐ์ง• ์ค‘ ์ฆ‰์‹œ ์ •๋ณด ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

โœจ ์ฃผ์š” ํŠน์ง•

  • ๐Ÿค– 5๊ฐœ ์ „๋ฌธ ์—์ด์ „ํŠธ: ํ•™์ˆ (25%), ๋‰ด์Šค(30%), ํ†ต๊ณ„(20%), ๋…ผ๋ฆฌ(15%), ์†Œ์…œ(10%) ๊ฐ€์ค‘์น˜ ๊ธฐ๋ฐ˜ ํ˜‘์—…
  • โšก ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ: WebSocket ๊ธฐ๋ฐ˜ ๋ถ„์„ ๊ณผ์ • ์‹ค์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ๐ŸŽฏ 3๋‹จ๊ณ„ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ: ๋…๋ฆฝ ๋ถ„์„ โ†’ ๊ตฌ์กฐํ™”๋œ ํ† ๋ก  โ†’ ์ตœ์ข… ์ข…ํ•ฉ
  • ๐ŸŒ Chrome ์‚ฌ์ด๋“œ ํŒจ๋„: Manifest V3 ๊ธฐ๋ฐ˜ 450x600px ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ
  • ๐Ÿ“Š 10+ ์ „๋ฌธ ์—ฐ๊ตฌ ๋„๊ตฌ: ํ•™์ˆ  ๋…ผ๋ฌธ, ๋‰ด์Šค, ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ, SNS ํŠธ๋ Œ๋“œ ํ†ตํ•ฉ ๋ถ„์„
  • ๐Ÿง  RAG ์‹œ์Šคํ…œ: 40+ OWID ๋ฐ์ดํ„ฐ์…‹ ์‚ฌ์ „ ์ธ๋ฑ์‹ฑ๋œ ChromaDB ๋ฒกํ„ฐ ๊ฒ€์ƒ‰
  • ๐ŸŒ ๋‹ค๊ตญ์–ด ์ง€์›: ํ•œ๊ตญ์–ด ์šฐ์„ , ์˜์–ด ๋ณด์กฐ ์ง€์›

๐Ÿ—๏ธ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜

3๋‹จ๊ณ„ ํ˜‘์—… ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ

[์ž…๋ ฅ ์ง„์ˆ ] โ†’ [Step 1: ๋…๋ฆฝ ๋ถ„์„] โ†’ [Step 2: ๊ตฌ์กฐํ™”๋œ ํ† ๋ก ] โ†’ [Step 3: ์ตœ์ข… ์ข…ํ•ฉ] โ†’ [๊ฒ€์ฆ ๊ฒฐ๊ณผ]

Step 1: ๋…๋ฆฝ์  ์ดˆ๊ธฐ ๋ถ„์„

๊ฐ ์—์ด์ „ํŠธ๊ฐ€ ์ž์‹ ์˜ ์ „๋ฌธ ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„์„:

์—์ด์ „ํŠธ ๊ฐ€์ค‘์น˜ ์ „๋ฌธ ๋„๊ตฌ ์บ์‹ฑ ์ „๋žต
๐Ÿ“š ํ•™์ˆ  ์—์ด์ „ํŠธ 25% OpenAlex (240M+ ๋…ผ๋ฌธ), ArXiv, Wikipedia, Tavily 72์‹œ๊ฐ„
๐Ÿ“ฐ ๋‰ด์Šค ์—์ด์ „ํŠธ 30% Naver News, NewsAPI (80K+ ์–ธ๋ก ์‚ฌ), Google Fact Check 1์‹œ๊ฐ„
๐Ÿ“Š ํ†ต๊ณ„ ์—์ด์ „ํŠธ 20% KOSIS, FRED, World Bank, OWID RAG 72์‹œ๊ฐ„
๐Ÿค” ๋…ผ๋ฆฌ ์—์ด์ „ํŠธ 15% ์ˆœ์ˆ˜ ๋…ผ๋ฆฌ ๋ถ„์„ (๋„๊ตฌ ๋ฏธ์‚ฌ์šฉ) -
๐Ÿ‘ฅ ์†Œ์…œ ์—์ด์ „ํŠธ 10% Twitter API (twscrape), YouTube 30๋ถ„

Step 2: ๊ตฌ์กฐํ™”๋œ ํ† ๋ก 

  • ๋ชจ๋“  ์—์ด์ „ํŠธ๊ฐ€ Step 1 ๊ฒฐ๊ณผ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ์ƒํ˜ธ ๊ฒ€ํ† 
  • ์™ธ๋ถ€ ๋„๊ตฌ ์—†์ด ์ˆœ์ˆ˜ ํ† ๋ก ๊ณผ ๋ถ„์„
  • ๋‹ค๋ฅธ ๊ด€์ ์„ ๊ณ ๋ คํ•œ ์˜๊ฒฌ ๊ฐœ์„  ๋ฐ ๋ฐ˜๋ฐ•

Step 3: ์ตœ์ข… ์ข…ํ•ฉ

  • Super Agent๊ฐ€ ๋ชจ๋“  ๋ถ„์„ ์ข…ํ•ฉ
  • ๊ฐ€์ค‘ ์‹ ๋ขฐ๋„ ๋งคํŠธ๋ฆญ์Šค ์ƒ์„ฑ
  • ์ตœ์ข… ํŒ์ • ๋ฐ ์ƒ์„ธ ๊ทผ๊ฑฐ ์ œ์‹œ

๐Ÿš€ ๋น ๋ฅธ ์‹œ์ž‘

1. ํ”„๋กœ์ ํŠธ ํด๋ก 

git clone <repository-url>
cd FactWave

2. ๋ฐฑ์—”๋“œ ์„ค์ •

cd backend
pip install -e .  # ๋˜๋Š” uv pip install -e . (๋” ๋น ๋ฆ„)

# ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
cp example.env .env
# .env ํŒŒ์ผ์— ํ•„์ˆ˜ API ํ‚ค ์ถ”๊ฐ€

3. ํ”„๋ก ํŠธ์—”๋“œ ์„ค์ •

cd frontend
npm install

4. ์‹คํ–‰

๋ฐฑ์—”๋“œ ์„œ๋ฒ„ (ํ„ฐ๋ฏธ๋„ 1):

cd backend
python -m app.api.server  # FastAPI WebSocket ์„œ๋ฒ„ (ํฌํŠธ 8000)

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ (ํ„ฐ๋ฏธ๋„ 2):

cd frontend
npm run dev  # Vite ๊ฐœ๋ฐœ ์„œ๋ฒ„ (ํฌํŠธ 5173)

5. Chrome ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜

  1. Chrome์—์„œ chrome://extensions/ ์—ด๊ธฐ
  2. "๊ฐœ๋ฐœ์ž ๋ชจ๋“œ" ํ™œ์„ฑํ™”
  3. "์••์ถ• ํ•ด์ œ๋œ ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ๋กœ๋“œ" ํด๋ฆญ
  4. frontend/dist ํด๋” ์„ ํƒ

๐Ÿ“ ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ

๋ฐฑ์—”๋“œ ์•„ํ‚คํ…์ฒ˜

backend/
โ”œโ”€โ”€ app/
โ”‚   โ”œโ”€โ”€ agents/                    # AI ์—์ด์ „ํŠธ ์‹œ์Šคํ…œ
โ”‚   โ”‚   โ”œโ”€โ”€ base.py               # FactWaveAgent ๊ธฐ๋ณธ ํด๋ž˜์Šค
โ”‚   โ”‚   โ”œโ”€โ”€ academic_agent.py     # ํ•™์ˆ  ์—ฐ๊ตฌ ์ „๋ฌธ๊ฐ€
โ”‚   โ”‚   โ”œโ”€โ”€ news_agent.py         # ๋‰ด์Šค ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€
โ”‚   โ”‚   โ”œโ”€โ”€ statistics_agent.py   # ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ ์ „๋ฌธ๊ฐ€
โ”‚   โ”‚   โ”œโ”€โ”€ logic_agent.py        # ๋…ผ๋ฆฌ ๊ฒ€์ฆ ์ „๋ฌธ๊ฐ€
โ”‚   โ”‚   โ”œโ”€โ”€ social_agent.py       # ์†Œ์…œ ๋ฏธ๋””์–ด ์ „๋ฌธ๊ฐ€
โ”‚   โ”‚   โ””โ”€โ”€ super_agent.py        # ์ตœ์ข… ์ข…ํ•ฉ ์ฝ”๋””๋„ค์ดํ„ฐ
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ services/tools/            # ๋„๋ฉ”์ธ๋ณ„ ์—ฐ๊ตฌ ๋„๊ตฌ
โ”‚   โ”‚   โ”œโ”€โ”€ base_tool.py          # EnhancedBaseTool (์บ์‹ฑ, ์žฌ์‹œ๋„)
โ”‚   โ”‚   โ”œโ”€โ”€ academic/             # ํ•™์ˆ  ๋„๊ตฌ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ arxiv_tool.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ openalex_tool.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ wikipedia_tool.py
โ”‚   โ”‚   โ”œโ”€โ”€ news/                 # ๋‰ด์Šค ๋„๊ตฌ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ naver_news_tool.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ newsapi_tool.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ factcheck_google_tool.py
โ”‚   โ”‚   โ”œโ”€โ”€ statistics/           # ํ†ต๊ณ„ ๋„๊ตฌ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ kosis_search_tool.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ fred_search_tool.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ worldbank_search_tool.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ owid_enhanced_rag.py
โ”‚   โ”‚   โ”œโ”€โ”€ community/            # ์ปค๋ฎค๋‹ˆํ‹ฐ ๋„๊ตฌ
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ twitter_tool.py
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ youtube_tool.py
โ”‚   โ”‚   โ””โ”€โ”€ verification/         # ๊ฒ€์ฆ ๋„๊ตฌ
โ”‚   โ”‚       โ”œโ”€โ”€ ai_image_detector.py
โ”‚   โ”‚       โ””โ”€โ”€ youtube_video_analyzer.py
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ core/
โ”‚   โ”‚   โ”œโ”€โ”€ crew.py               # FactWaveCrew ๋ฉ”์ธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ
โ”‚   โ”‚   โ””โ”€โ”€ streaming_crew.py     # WebSocket ์ŠคํŠธ๋ฆฌ๋ฐ ์ง€์›
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ api/
โ”‚   โ”‚   โ””โ”€โ”€ server.py             # FastAPI WebSocket ์„œ๋ฒ„
โ”‚   โ”‚
โ”‚   โ”œโ”€โ”€ config/
โ”‚   โ”‚   โ””โ”€โ”€ prompts.yaml          # ์ค‘์•™ํ™”๋œ ํ”„๋กฌํ”„ํŠธ ๊ด€๋ฆฌ
โ”‚   โ”‚
โ”‚   โ””โ”€โ”€ utils/
โ”‚       โ”œโ”€โ”€ llm_config.py         # LLM ์„ค์ • (GPT-4.1-mini)
โ”‚       โ”œโ”€โ”€ prompt_loader.py      # ๋™์  ํ”„๋กฌํ”„ํŠธ ๋กœ๋”ฉ
โ”‚       โ””โ”€โ”€ websocket_manager.py  # WebSocket ์ด๋ฒคํŠธ ๊ด€๋ฆฌ
โ”‚
โ”œโ”€โ”€ owid_enhanced_vectordb/        # ChromaDB ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
โ””โ”€โ”€ owid_datasets/                 # 40+ OWID ๋ฐ์ดํ„ฐ์…‹

ํ”„๋ก ํŠธ์—”๋“œ ๊ตฌ์กฐ

frontend/
โ”œโ”€โ”€ manifest.json                  # Chrome Extension Manifest V3
โ”œโ”€โ”€ background.js                  # Service Worker
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ App.jsx                   # ๋ฉ”์ธ ์•ฑ ์ปดํฌ๋„ŒํŠธ
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ Discussion.jsx        # ํ† ๋ก  ํƒญ (์‹ค์‹œ๊ฐ„ ํŒฉํŠธ์ฒดํ‚น)
โ”‚   โ”‚   โ”œโ”€โ”€ Results.jsx           # ๊ฒฐ๊ณผ ํƒญ (๊ฒ€์ฆ ๊ฒฐ๊ณผ ํ‘œ์‹œ)
โ”‚   โ”‚   โ”œโ”€โ”€ Library.jsx           # ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํƒญ (์ €์žฅ๋œ ๊ฒ€์ฆ)
โ”‚   โ”‚   โ”œโ”€โ”€ LoadingMessage.jsx    # ๋กœ๋”ฉ ์• ๋‹ˆ๋ฉ”์ด์…˜
โ”‚   โ”‚   โ”œโ”€โ”€ ImageAnalysisResult.jsx
โ”‚   โ”‚   โ””โ”€โ”€ YouTubeThumbnail.jsx
โ”‚   โ””โ”€โ”€ utils/
โ”‚       โ””โ”€โ”€ youtube.js             # YouTube ์œ ํ‹ธ๋ฆฌํ‹ฐ

๐Ÿ› ๏ธ ํ•ต์‹ฌ ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ

์—์ด์ „ํŠธ ์‹œ์Šคํ…œ

  • ๊ธฐ๋ณธ ํด๋ž˜์Šค: FactWaveAgent - ๋ชจ๋“  ์—์ด์ „ํŠธ์˜ ๋ถ€๋ชจ ํด๋ž˜์Šค
  • Step๋ณ„ LLM: GPT-4.1-mini ์‚ฌ์šฉ, ๋‹จ๊ณ„๋ณ„ ์˜จ๋„/ํ† ํฐ ์ตœ์ ํ™”
  • ๋„๊ตฌ ๋กœ๊น…: ์‹ค์‹œ๊ฐ„ ๋„๊ตฌ ์‚ฌ์šฉ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ฒฐ๊ณผ ์ถ”์ 
  • ๋…๋ฆฝ ์‹คํ–‰: Step 1์—์„œ ๊ฐœ๋ณ„ Crew ์ธ์Šคํ„ด์Šค๋กœ ๋…๋ฆฝ์„ฑ ๋ณด์žฅ

์—ฐ๊ตฌ ๋„๊ตฌ ํŠน์ง•

  • EnhancedBaseTool: ๋ชจ๋“  ๋„๊ตฌ์˜ ๊ธฐ๋ณธ ํด๋ž˜์Šค
  • MD5 ์บ์‹ฑ: ๋„๊ตฌ๋ณ„ TTL ์„ค์ • (ํ•™์ˆ : 72h, ๋‰ด์Šค: 1h, ์†Œ์…œ: 30m)
  • HTTP ์žฌ์‹œ๋„: ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„๋กœ ์•ˆ์ •์„ฑ ํ™•๋ณด
  • ์†๋„ ์ œํ•œ: API๋ณ„ rate limiting ์ž๋™ ๊ด€๋ฆฌ
  • ์šฐ์•„ํ•œ ์‹คํŒจ: ๋„๊ตฌ ์‹คํŒจ ์‹œ ์‹œ์Šคํ…œ ์ค‘๋‹จ ์—†์ด ๊ณ„์† ์ง„ํ–‰

RAG ์‹œ์Šคํ…œ (OWID)

  • ChromaDB: ์˜๊ตฌ ๋ฒกํ„ฐ ์ €์žฅ์†Œ
  • 40+ ๋ฐ์ดํ„ฐ์…‹: ๊ธฐํ›„, ๊ฒฝ์ œ, ๊ฑด๊ฐ•, ๊ต์œก ๋“ฑ ์‚ฌ์ „ ์ธ๋ฑ์‹ฑ
  • ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ๊ฒ€์ƒ‰: ๋ฒกํ„ฐ ์œ ์‚ฌ๋„ + BM25 ์ˆœ์œ„
  • ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํ•„ํ„ฐ: ์นดํ…Œ๊ณ ๋ฆฌ, ๋‚ ์งœ, ๊ตญ๊ฐ€๋ณ„ ํ•„ํ„ฐ๋ง

WebSocket ํ†ต์‹  ํ”„๋กœํ† ์ฝœ

// ํด๋ผ์ด์–ธํŠธ โ†’ ์„œ๋ฒ„
{"action": "start", "statement": "๊ฒ€์ฆํ•  ๋ฌธ์žฅ"}

// ์„œ๋ฒ„ โ†’ ํด๋ผ์ด์–ธํŠธ
{
  "type": "task_started|task_completed|agent_analysis|tool_call|final_result",
  "step": "step1|step2|step3",
  "agent": "academic|news|logic|social|statistics|super",
  "content": {...},
  "timestamp": "ISO 8601"
}

ํ”„๋กฌํ”„ํŠธ ๊ด€๋ฆฌ (prompts.yaml)

  • ์ค‘์•™ํ™”๋œ ๊ด€๋ฆฌ: ๋ชจ๋“  ์—์ด์ „ํŠธ ํ”„๋กฌํ”„ํŠธ YAML ํŒŒ์ผ ๊ด€๋ฆฌ
  • ํ•ซ ๋ฆฌ๋กœ๋”ฉ: ์‹œ์Šคํ…œ ์žฌ์‹œ์ž‘ ์—†์ด ํ”„๋กฌํ”„ํŠธ ์ˆ˜์ • ๊ฐ€๋Šฅ
  • Step๋ณ„ ํ…œํ”Œ๋ฆฟ: ๋‹จ๊ณ„๋ณ„ ๋งž์ถคํ˜• ํ”„๋กฌํ”„ํŠธ
  • ํŒ์ • ์˜ต์…˜: 13๊ฐ€์ง€ ์„ธ๋ถ„ํ™”๋œ ํŒ์ • ์นดํ…Œ๊ณ ๋ฆฌ

๐Ÿ› ๏ธ ๊ธฐ์ˆ  ์Šคํƒ

๋ฐฑ์—”๋“œ

  • Python 3.12+ / UV ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž
  • FastAPI - WebSocket API ์„œ๋ฒ„
  • CrewAI - ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ
  • OpenAI GPT-4.1-mini - ๋ฉ”์ธ LLM (๋ชจ๋“  Step์—์„œ ์‚ฌ์šฉ)
  • ChromaDB - ๋ฒกํ„ฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (OWID RAG ์‹œ์Šคํ…œ)
  • Pydantic - ๊ตฌ์กฐํ™”๋œ ์‘๋‹ต ์Šคํ‚ค๋งˆ ๊ฒ€์ฆ
  • Rich - ํ„ฐ๋ฏธ๋„ UI ๋ฐ ๋กœ๊น… ์‹œ๊ฐํ™”

ํ”„๋ก ํŠธ์—”๋“œ

  • React 19.1.0 - ์ตœ์‹  UI ํ”„๋ ˆ์ž„์›Œํฌ
  • Vite - ์ฐจ์„ธ๋Œ€ ๋ฒˆ๋“ค๋Ÿฌ
  • Tailwind CSS - ์œ ํ‹ธ๋ฆฌํ‹ฐ ๊ธฐ๋ฐ˜ ์Šคํƒ€์ผ๋ง
  • Chrome Extension Manifest V3 - ์ตœ์‹  ํ™•์žฅ ํ”„๋กœ๊ทธ๋žจ ํ‘œ์ค€
  • Service Worker - ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ฒ˜๋ฆฌ

์—ฐ๊ตฌ ๋„๊ตฌ API

  • OpenAlex - 240M+ ํ•™์ˆ  ๋…ผ๋ฌธ (APIํ‚ค ๋ถˆํ•„์š”)
  • ArXiv - ์ˆ˜ํ•™/๋ฌผ๋ฆฌ/CS ํ”„๋ฆฌํ”„๋ฆฐํŠธ ๋…ผ๋ฌธ
  • Naver News API - ํ•œ๊ตญ ๋‰ด์Šค ๊ฒ€์ƒ‰
  • NewsAPI - 80,000+ ๊ธ€๋กœ๋ฒŒ ์–ธ๋ก ์‚ฌ
  • Google Fact Check API - ClaimReview ํŒฉํŠธ์ฒดํฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • Wikipedia API - ๋‹ค๊ตญ์–ด ๋ฐฑ๊ณผ์‚ฌ์ „
  • KOSIS API - ํ•œ๊ตญ ํ†ต๊ณ„์ฒญ
  • FRED API - ๋ฏธ๊ตญ ์—ฐ๋ฐฉ์ค€๋น„์ œ๋„ ๊ฒฝ์ œ ๋ฐ์ดํ„ฐ
  • World Bank API - ์„ธ๊ณ„์€ํ–‰ ๊ฐœ๋ฐœ ์ง€ํ‘œ
  • Twitter API (twscrape) - ์†Œ์…œ ๋ฏธ๋””์–ด ํŠธ๋ Œ๋“œ

๐Ÿงช ํ…Œ์ŠคํŠธ ๋ฐ ๊ฐœ๋ฐœ

ํ…Œ์ŠคํŠธ ์‹คํ–‰

# WebSocket ํด๋ผ์ด์–ธํŠธ ํ…Œ์ŠคํŠธ
cd backend
python test_websocket_client.py

# ๊ฐœ๋ณ„ ๋„๊ตฌ ํ…Œ์ŠคํŠธ
python tests/test_tavily.py
python tests/test_tool_usage.py
python tests/test_youtube_tool.py

# ์œ ๋‹› ํ…Œ์ŠคํŠธ ์ „์ฒด ์‹คํ–‰
python -m pytest tests/

# CLI ์ธํ„ฐํŽ˜์ด์Šค ํ…Œ์ŠคํŠธ
python main.py

๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์šฐ

# ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ
cd backend
python -m app.api.server  # ํฌํŠธ 8000์—์„œ ์„œ๋ฒ„ ์‹œ์ž‘

# ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ  
cd frontend
npm run dev  # ํฌํŠธ 5173์—์„œ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹œ์ž‘
npm run build  # ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ
npm run build:watch  # ๋นŒ๋“œ ๊ฐ์‹œ ๋ชจ๋“œ

# ์ฝ”๋“œ ํ’ˆ์งˆ ๊ด€๋ฆฌ
cd backend
ruff check .    # ๋ฆฐํŒ… ๊ฒ€์‚ฌ
ruff format .   # ์ฝ”๋“œ ํฌ๋งคํŒ…
cd frontend
npm run lint    # ESLint ๊ฒ€์‚ฌ

์„ฑ๋Šฅ ์ตœ์ ํ™” ํŒ

  • ์บ์‹œ ๊ด€๋ฆฌ: .cache/ ๋””๋ ‰ํ† ๋ฆฌ ์ •๊ธฐ ์ •๋ฆฌ
  • ๋ฒกํ„ฐ DB ์žฌ๊ตฌ์„ฑ: python build_owid_index.py (๋ฐ์ดํ„ฐ์…‹ ์—…๋ฐ์ดํŠธ ์‹œ)
  • ๋„๊ตฌ๋ณ„ TTL: ํ•™์ˆ (72h), ๋‰ด์Šค(1h), ์†Œ์…œ(30m)๋กœ ์ตœ์ ํ™”
  • ๋™์‹œ ์‹คํ–‰: Step 1์—์„œ 5๊ฐœ ์—์ด์ „ํŠธ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ

๐ŸŒ ์‚ฌ์šฉ ์‹œ๋‚˜๋ฆฌ์˜ค

1. ๋‰ด์Šค ๊ธฐ์‚ฌ ๊ฒ€์ฆ

์ž…๋ ฅ: "2024๋…„ ํ•œ๊ตญ GDP ์„ฑ์žฅ๋ฅ ์ด 3.2%๋ฅผ ๊ธฐ๋กํ–ˆ๋‹ค"

  • ๐Ÿ“ฐ ๋‰ด์Šค ์—์ด์ „ํŠธ: ์ตœ์‹  ๊ฒฝ์ œ ๋‰ด์Šค ๊ฒ€์ƒ‰
  • ๐Ÿ“Š ํ†ต๊ณ„ ์—์ด์ „ํŠธ: KOSIS, FRED ๊ฒฝ์ œ ์ง€ํ‘œ ํ™•์ธ
  • ๐Ÿค” ๋…ผ๋ฆฌ ์—์ด์ „ํŠธ: ์ˆ˜์น˜์˜ ํ•ฉ๋ฆฌ์„ฑ ๋ถ„์„

2. ๊ณผํ•™์  ์ฃผ์žฅ ๊ฒ€์ฆ

์ž…๋ ฅ: "๋น„ํƒ€๋ฏผ C๊ฐ€ ๊ฐ๊ธฐ๋ฅผ ์˜ˆ๋ฐฉํ•œ๋‹ค๋Š” ์—ฐ๊ตฌ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœํ‘œ๋˜์—ˆ๋‹ค"

  • ๐Ÿ“š ํ•™์ˆ  ์—์ด์ „ํŠธ: ArXiv, OpenAlex ๋…ผ๋ฌธ ๊ฒ€์ƒ‰
  • ๐Ÿ“ฐ ๋‰ด์Šค ์—์ด์ „ํŠธ: ์˜ํ•™ ๋‰ด์Šค ๋ฐ ํŒฉํŠธ์ฒดํฌ ๊ฒฐ๊ณผ
  • ๐Ÿค” ๋…ผ๋ฆฌ ์—์ด์ „ํŠธ: ๊ณผํ•™์  ๋ฐฉ๋ฒ•๋ก  ํ‰๊ฐ€

3. ์†Œ์…œ ํŠธ๋ Œ๋“œ ๊ฒ€์ฆ

์ž…๋ ฅ: "์ตœ๊ทผ ์ Š์€์ธต ์‚ฌ์ด์—์„œ ํ™˜๊ฒฝ ๋ณดํ˜ธ ๊ด€์‹ฌ์ด ๊ธ‰์ฆํ–ˆ๋‹ค"

  • ๐Ÿ‘ฅ ์†Œ์…œ ์—์ด์ „ํŠธ: Twitter ํŠธ๋ Œ๋“œ ๋ถ„์„
  • ๐Ÿ“Š ํ†ต๊ณ„ ์—์ด์ „ํŠธ: ํ™˜๊ฒฝ ๊ด€๋ จ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ
  • ๐Ÿ“ฐ ๋‰ด์Šค ์—์ด์ „ํŠธ: ํ™˜๊ฒฝ ๊ด€๋ จ ๋ณด๋„ ํ˜„ํ™ฉ

๐Ÿ“Š 13๊ฐ€์ง€ ํŒ์ • ์นดํ…Œ๊ณ ๋ฆฌ

โœ… ์‚ฌ์‹ค ๊ณ„์—ด

  • ์ฐธ: ํ™•์‹คํ•˜๊ฒŒ ์‚ฌ์‹ค (95-100% ์‹ ๋ขฐ๋„)
  • ๋Œ€์ฒด๋กœ_์ฐธ: ๋Œ€๋ถ€๋ถ„ ์‚ฌ์‹ค (75-95% ์‹ ๋ขฐ๋„)
  • ๋ถ€๋ถ„์ _์ฐธ: ์ผ๋ถ€๋งŒ ์‚ฌ์‹ค (50-75% ์‹ ๋ขฐ๋„)

โ“ ํŒ๋‹จ ์–ด๋ ค์›€ ๊ณ„์—ด

  • ๋ถˆํ™•์‹ค: ์ฆ๊ฑฐ ๋ถ€์กฑ์œผ๋กœ ํŒ๋‹จ ์–ด๋ ค์›€
  • ์ •๋ณด๋ถ€์กฑ: ๊ฒ€์ฆํ•  ์ถฉ๋ถ„ํ•œ ์ •๋ณด ์—†์Œ
  • ๋…ผ๋ž€์ค‘: ์ „๋ฌธ๊ฐ€๋“ค ์‚ฌ์ด์— ์˜๊ฒฌ ๋ถ„๋ถ„

โŒ ๊ฑฐ์ง“ ๊ณ„์—ด

  • ๋ถ€๋ถ„์ _๊ฑฐ์ง“: ์ผ๋ถ€๊ฐ€ ๊ฑฐ์ง“ (25-50% ๊ฑฐ์ง“)
  • ๋Œ€์ฒด๋กœ_๊ฑฐ์ง“: ๋Œ€๋ถ€๋ถ„ ๊ฑฐ์ง“ (5-25% ์‚ฌ์‹ค)
  • ๊ฑฐ์ง“: ํ™•์‹คํ•˜๊ฒŒ ๊ฑฐ์ง“ (0-5% ์‚ฌ์‹ค)

โš ๏ธ ๊ธฐํƒ€ ๊ณ„์—ด

  • ๊ณผ์žฅ๋จ: ์‚ฌ์‹ค์ด์ง€๋งŒ ๊ณผ์žฅ๋œ ํ‘œํ˜„
  • ์˜คํ•ด์†Œ์ง€: ์˜คํ•ด์˜ ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” ํ‘œํ˜„
  • ๋งฅ๋ฝ์˜ค๋ฅ˜: ๋งฅ๋ฝ์—์„œ ๋ฒ—์–ด๋‚œ ์ฃผ์žฅ
  • ์‹œ๋Œ€์ฐฉ์˜ค: ๊ณผ๊ฑฐ์—๋Š” ๋งž์•˜์ง€๋งŒ ํ˜„์žฌ๋Š” ๋ถ€์ •ํ™•

๐Ÿ”‘ API ํ‚ค ์„ค์ •

ํ•„์ˆ˜ API ํ‚ค

# .env ํŒŒ์ผ์— ์ถ”๊ฐ€
OPENAI_API_KEY=your_openai_api_key  # GPT-4.1-mini ์‚ฌ์šฉ
NAVER_CLIENT_ID=your_naver_client_id
NAVER_CLIENT_SECRET=your_naver_client_secret

์„ ํƒ์  API ํ‚ค (๊ณ ๋„ํ™” ๊ธฐ๋Šฅ)

# ๊ตญ์ œ ๋‰ด์Šค ํ™•์žฅ
NEWSAPI_KEY=your_newsapi_key

# Google ํŒฉํŠธ์ฒดํฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
GOOGLE_API_KEY=your_google_api_key

# ๊ฒฝ์ œ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ  
FRED_API_KEY=your_fred_key

# ํ•œ๊ตญ ํ†ต๊ณ„์ฒญ
KOSIS_API_KEY=your_kosis_key

# ์†Œ์…œ ๋ฏธ๋””์–ด ๋ถ„์„ (๊ณ ๊ธ‰ ๊ธฐ๋Šฅ)
# Twitter ๊ณ„์ • ์„ค์ •์€ TWITTER_ACCOUNTS_GUIDE.md ์ฐธ์กฐ

๐Ÿ“š ์ถ”๊ฐ€ ๋ฌธ์„œ

๐Ÿค ๊ธฐ์—ฌํ•˜๊ธฐ

  1. Fork the repository
  2. Create feature branch (git checkout -b feature/AmazingFeature)
  3. Commit changes (git commit -m 'Add some AmazingFeature')
  4. Push to branch (git push origin feature/AmazingFeature)
  5. Open Pull Request

๐Ÿ“ ๋ผ์ด์„ ์Šค

MIT License - LICENSE ํŒŒ์ผ ์ฐธ์กฐ

๐Ÿ™ ๊ฐ์‚ฌ์˜ ๋ง

  • CrewAI - ๋ฉ€ํ‹ฐ ์—์ด์ „ํŠธ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜
  • OpenAlex - ์˜คํ”ˆ ํ•™์ˆ  ๋…ผ๋ฌธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
  • Our World in Data - ๊ธ€๋กœ๋ฒŒ ํ†ต๊ณ„ ๋ฐ์ดํ„ฐ
  • ๋ชจ๋“  ์˜คํ”ˆ์†Œ์Šค ๊ธฐ์—ฌ์ž๋“ค

FactWave - AI ํ˜‘์—…์œผ๋กœ ์ง„์‹ค์„ ๋ฐํžˆ๋‹ค ๐ŸŒŠ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors