๐ง NeuroDoc: ๋ง๊ฐ์ง ํ๋กํ ํ์ ์์ ํ๋ก๋์ ์ค๋น๊ฐ ๋ ๋น๋๊ธฐ AI ๋ฌธ์ ์์ง์ผ๋ก
์์ฝ
์ทจ์ฝํ CLI ์คํฌ๋ฆฝํธ์๋ NeuroDoc์ asyncio์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์์ ํ๋ฅผ ๋์ ํ์ฌ ์์ ์ ์ธ ๋น๋๊ธฐ RAG ์์ง์ผ๋ก ์ฌ์ค๊ณํ ๊ณผ์ ์ ๋ค๋ฃน๋๋ค. ๋ธ๋กํน ๋ฃจํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ์์ ์ง์์ฑ์ ํ๋ณดํ์ฌ ํ๋ก๋์ ์์ค์ ๋ฌธ์ ์ฒ๋ฆฌ ์์คํ ์ ๊ตฌ์ถํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํฉ๋๋ค.
ํต์ฌ ํฌ์ธํธ
- asyncio์ aiohttp๋ฅผ ํ์ฉํ ๋น๋๊ธฐ ๊ตฌ์กฐ๋ก ๋ธ๋กํน ๋ฌธ์ ํด๊ฒฐ
- DB ๊ธฐ๋ฐ ์์ ํ ๋์ ์ ํตํ ๋ฐ์ดํฐ ์์ค ๋ฐฉ์ง ๋ฐ ์์ ์ฌ๊ฐ ๊ธฐ๋ฅ ๊ตฌํ
- ๋จ์ ์คํฌ๋ํผ์์ RAG ๋ ์ด์ด๋ฅผ ๊ฐ์ถ ์ง๋ฅํ ์ด์์คํดํธ๋ก ์งํ
- ํ๋กํ ํ์ ์ ๊ตฌ์กฐ์ ๊ฒฐํจ์ ํด๊ฒฐํ๋ ์ํคํ ์ฒ ์ฌ์ค๊ณ ๊ณผ์ ๊ณต์
์ด ๊ฒ์๋ฌผ์ GitHub Finish-Up-A-Thon Challenge๋ฅผ ์ํ ์ ์ถ๋ฌผ์ ๋๋ค.
์ ๋ ์ด ํ๋ก์ ํธ๋ฅผ ํฌ๊ธฐํ์์ต๋๋ค. ๊ทธ๋ฌ๋ค ๋ค์ ๋ถํ์์ผฐ์ต๋๋ค. ์ทจ์ฝํ CLI ์คํฌ๋ฆฝํธ๊ฐ ์ด๋ป๊ฒ RAG ๊ธฐ๋ฅ์ ๊ฐ์ถ ํ์คํ ๋น๋๊ธฐ ์น ๋์๋ณด๋๋ก ๋ณํ๋์ง ๊ทธ ๊ณผ์ ์ ์๊ฐํฉ๋๋ค.
๐งจ ๋ฌธ์ ์ โ ์ ํฌ๊ธฐํ๋๊ฐ
NeuroDoc์ ์ผ์ฌ ์ฐฌ ์์ด๋์ด๋ก ์์๋์์ต๋๋ค. NLP(์์ฐ์ด ์ฒ๋ฆฌ)์ ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์ฑ(multi-core processing)์ ํ์ฉํ์ฌ Python, scikit-learn, PyTorch, TensorFlow ์ ๋ฐ์ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ค๊ณ (fetch), ์คํฌ๋ํ(scrape)ํ๊ณ , ์ฒ๋ฆฌ(process)ํ๋ฉฐ, ์์ฝ(summarize)ํ๋ ๋จ์ผ ๋๊ตฌ๋ฅผ ๋ง๋๋ ๊ฒ์ด์์ต๋๋ค.
ํ์ง๋ง ๊ณง ๋ฒฝ์ ๋ถ๋ชํ์ต๋๋ค.
# ๋น๋ฐ: ๋ชจ๋ ๊ฒ์ ์ผ๋ ค๋ฒ๋ฆฌ๋ ๋ธ๋กํน ๋๊ธฐ ๋ฃจํ(blocking synchronous loop)
while True:
query = input("Enter query: ") # ๐ซ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ฐจ๋จ(BLOCKS)ํจ
...
์๋์ ํ๋กํ ํ์ ์๋ ์ธ ๊ฐ์ง ์น๋ช ์ ์ธ ๊ฒฐํจ์ด ์์์ต๋๋ค:
| ๋ฌธ์ ์ | ์ํฅ |
|---|---|
๋ฉ์ธ ์ค๋ ๋์ input() ๋ฃจํ | ๋ชจ๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํฌ๋ํ ์์ปค(scraping workers)๋ฅผ ์ฐจ๋จํจ |
| ... |
์ค๋ ๊ฑธ๋ฆฌ๋ ๋ฌธ์ ํฌ๋กค๋ง(doc crawls)์ด ์ค๋จ๋๊ณค ํ์ต๋๋ค. ๋จ ํ ๋ฒ์ ์ถฉ๋๋ก ์ ์ฒด ์์ ํ(task queue)๊ฐ ์ญ์ ๋์์ต๋๋ค. ๊ทธ๊ฒ์ ๋ง์น ์ฌ์๋๊ฐ ๊ฐ์์ต๋๋ค. ๋ฉ๋ฆฌ์ ๋ณด๋ฉด ์ธ์์ ์ด์์ง๋ง, ๊ฐ๊น์ด์ ๋ณด๋ฉด ๊ณตํฌ์ค๋ฌ์ ์ต๋๋ค.
๊ทธ๋์ ์ ๋ ํ๋ก์ ํธ๋ฅผ ๋ณด๋ฅํ์ต๋๋ค.
๐ก ์ฌ๊ธฐ โ ๋ฌด์์ด ๋ฐ๋์๋๊ฐ
๋ช ๋ฌ ํ, ์ ๋ ๋ง์ ์ ์ ๊ณผ ๊ณํ์ ๊ฐ์ง๊ณ ๋์์์ต๋๋ค. ์ฌ์์ฑ์ ์ ์ง์ ์ธ ๋ฐฉ์์ด ์๋๋ผ ๊ตฌ์กฐ์ ์ธ(architectural) ๋ฐฉ์์ด์์ต๋๋ค. ์ธ ๊ฐ์ง ๋ณํ๊ฐ ๋ชจ๋ ๊ฒ์ ๋ง์๋จ์ด์ง๊ฒ ๋ง๋ค์์ต๋๋ค:
1. ๐ asyncio + aiohttp๋ฅผ ์ด์ฉํ ์์ ํ ๋น๋๊ธฐ(Async) ์ฌ์์ฑ
๋ธ๋กํน ๋ฃจํ๋ฅผ ์ ๊ฑฐํ์ต๋๋ค. ๋์ ์คํฌ๋ํ, ์ฒ๋ฆฌ, ์๋น์ค ์ ๊ณต์ด ์๋ก ๋ฐฉํดํ์ง ์๊ณ **๋์(concurrently)**์ ์ผ์ด๋ ์ ์๋๋ก ํ๋ ์ ์ ํ ๋น๋๊ธฐ ์ด๋ฒคํธ ๋ฃจํ(async event loop)๋ฅผ ๋์ ํ์ต๋๋ค.
async def fetch_documentation(url: str, session: aiohttp.ClientSession) -> DocResult:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=30)) as response:
content = await response.text()
...
๋ ์ด์ ํฐ๋ฏธ๋์ด ๋ฉ์ถ์ง ์์ต๋๋ค. ๋ ์ด์ ์์ปค(workers)๊ฐ ์ค๋จ๋์ง ์์ต๋๋ค.
2. ๐๏ธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์์ ํ (ํ๋ฐ์ฑ ๋ฉ๋ชจ๋ฆฌ ์๋ )
์ธ๋ฉ๋ชจ๋ฆฌ(in-memory) ํ๋ฅผ **์ง์ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ฐ ์์ ํ(persistent, database-backed task queue)**๋ก ๊ต์ฒดํ์ต๋๋ค. ์ด์ ์๋ฒฝ 3์์ PyTorch ๋ฌธ์๋ฅผ ํฌ๋กค๋งํ๋ ์ค ์๋ฒ๊ฐ ์ถฉ๋ํ๋๋ผ๋ ์์ ์ด ์์ค๋์ง ์์ต๋๋ค. ์์ ์ ์ ํํ ์ค๋จ๋ ์ง์ ๋ถํฐ ์ฌ๊ฐ๋ฉ๋๋ค.
class TaskQueue:
async def enqueue(self, task: DocumentationTask) -> str:
task_id = str(uuid.uuid4())
...
3. ๐ RAG โ ๊ฒ์ ์ฆ๊ฐ ์์ฑ (Retrieval-Augmented Generation) ๋ ์ด์ด
์ด ๋จ๊ณ์์ NeuroDoc์ ๋จ์ํ "์คํฌ๋ ์ดํผ (scraper)"๋ฅผ ๋์ด "์ง๋ฅํ ๋ฌธ์ ์ด์์คํดํธ (intelligent documentation assistant)"๋ก ์ ๊ทธ๋ ์ด๋๋ฉ๋๋ค.
๊ฐ๊ณต๋์ง ์์ ๋ฌธ์๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ ๋์ , ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค:
- ์ฒญํน (Chunks): ์คํฌ๋ ์ดํ๋ ์ฝํ ์ธ ๋ฅผ ์๋ฏธ๋ก ์ ์ธ๊ทธ๋จผํธ (semantic segments)๋ก ๋๋๋๋ค.
- ์๋ฒ ๋ฉ (Embeds): ์ด๋ฅผ ๋ฒกํฐ ์คํ ์ด (vector store)์ ์๋ฒ ๋ฉํฉ๋๋ค.
- ๊ฒ์ (Retrieves): ์ฟผ๋ฆฌ์ ๋ํด ๊ฐ์ฅ ๊ด๋ จ์ฑ์ด ๋์ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค.
- ์์ฑ (Generates): ์ง์ค์ ์ด๊ณ ๋ฌธ๋งฅ์ ์ธ์ํ๋ (context-aware) ์์ฝ์ ์์ฑํฉ๋๋ค.
class RAGPipeline:
async def query(self, user_query: str) -> RAGResponse:
# 1๋จ๊ณ: ์ฟผ๋ฆฌ ์๋ฒ ๋ฉ
...
๐๏ธ ์ํคํ ์ฒ ๊ฐ์ (Architecture Overview)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ์น ๋์๋ณด๋ (Web Dashboard, FastAPI) โ
โ โโโโโโโโโโโโฌโโโโโโโโโโโโโโโ โ
...
๐ฆ ์ง์๋๋ ๋ฌธ์ ์์ค (Supported Documentation Sources)
| ๋ผ์ด๋ธ๋ฌ๋ฆฌ | ์คํฌ๋ ์ดํ๋ ์น์ | NLP ์ฒ๋ฆฌ |
|---|---|---|
| ๐ Python | stdlib, builtins, language ref | ์ฝ๋ ์ถ์ถ, ์์ฝ |
| ... |
๐ ์์ํ๊ธฐ (Getting Started)
# ๋ฆฌํฌ์งํ ๋ฆฌ ํด๋ก
git clone https://github.com/kaushikcoderpy1/neurodoc
cd neurodoc
...
๊ทธ ๋ค์ http://localhost:8000์ ์ด๊ณ ์ฟผ๋ฆฌ๋ฅผ ์์ํ์ธ์.
๐งช ์ฃผ์ ๊ธฐ์ ์ ๊ฒฐ์ โ ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ด์
์ threading ๋์ asyncio๋ฅผ ์ฌ์ฉํ๋๊ฐ?
๋ฌธ์ ์คํฌ๋ ์ดํ์ I/O ๋ฐ์ด๋ (I/O-bound, HTTP ๋๊ธฐ) ์์
์
๋๋ค. asyncio๋ ๋จ์ผ ์ค๋ ๋๋ก ์์ฒ ๊ฐ์ ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, GIL (Global Interpreter Lock) ๊ฒฝํฉ์ด๋ ๋ ์ด์ค ์ปจ๋์
(race conditions)์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
์ ์์
ํ(task queue)๋ก Redis ๋์ SQLite๋ฅผ ์ฌ์ฉํ๋๊ฐ?
์ธํ๋ผ ์ค์ ์ด ํ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. NeuroDoc์ ๊ฐ๋ฐ ๋๊ตฌ์
๋๋ค. ๋จ์ํ ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด Redis ์์กด์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ๋ง์ฐฐ์ ์ผ์ผํต๋๋ค. SQLite์ WAL (Write-Ahead Logging) ๋ชจ๋๋ ์ด ์ฌ์ฉ ์ฌ๋ก์์ ๋์ ์ฝ๊ธฐ/์ฐ๊ธฐ๋ฅผ ๊น๋ํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
์ ํ์ธํ๋ (fine-tuning) ๋์ RAG๋ฅผ ์ฌ์ฉํ๋๊ฐ?
๋ฌธ์๋ ๋์์์ด ๋ณํฉ๋๋ค. RAG๋ ์ค์๊ฐ์ผ๋ก ์คํฌ๋ ์ดํ๋ ์ฝํ
์ธ ์์ ์ ๋ณด๋ฅผ ๊ฒ์ํฉ๋๋ค. ํ์ธํ๋๋ ๋ชจ๋ธ์ ๋ช ์ฃผ ์์ ๋ฐ์ดํฐ๊ฐ ๊ตฌ์์ด ๋ ๊ฒ์
๋๋ค.
๐ค GitHub Copilot์ด NeuroDoc์ ๊ตฌํ ๋ฐฉ๋ฒ โ ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค 4๊ฐ์ง ์น๋ช ์ ์ธ ๋ฒ๊ทธ
์ด ์น์ ์ ์ฌ๊ธฐ ์ฑ๊ณต๋ด์ ํต์ฌ์ ๋๋ค. NeuroDoc์ ๋จ์ํ ๋ค์ ์์ฑ๋ ๊ฒ์ด ์๋๋๋ค. Copilot์ ์ง์ ํ ํ์ด ํ๋ก๊ทธ๋๋จธ (pair programmer)๋ก ํ์ฉํ์ฌ _์ฌ์ธต์ ์ธ ์ํคํ ์ฒ ์์ค์์ ๋๋ฒ๊น (debugged at a deep architectural level)_๋์์ต๋๋ค. ๋ค์์ Copilot์ด ํด๊ฒฐํ๋ ๋ฐ ๋์์ ์ค, ์ค์ ํ๋ก๋์ ํ๊ฒฝ์ ๊ฐ๋ก๋ง์๋ ๋ค ๊ฐ์ง ์น๋ช ์ ์ธ ๋ฒ๊ทธ์ ๋๋ค.
๐ ๋ฒ๊ทธ 1: ๋ฉํฐ ์ฝ์ด ๋ฐฐ์น ์์ ์ค ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ํ ๋์ (Async Database Connection Pool Leaks)
์ฅ์ ๋ด์ฉ: asyncio.gather๋ฅผ ํตํ ๊ณ ๋์์ฑ (high-concurrency) ๋ถํ ์ํฉ์์, ์๋ธ ์ฝ๋ฃจํด (sub-coroutines) ๋ด๋ถ์ ์์ธ ์ผ์ด์ค๊ฐ ์ฐ๊ฒฐ ํด์ ํ
(connection release hooks)์ ์ฐํํ์ต๋๋ค. ์ด๋ก ์ธํด asyncpg ํ (pool) ์์ผ์ด ๊ณ ๊ฐ๋์๊ณ , ์ ํ๋ฆฌ์ผ์ด์
์ด ์๋ฌด๋ฐ ๋ฉ์์ง ์์ด ๋ฉ์ถฐ๋ฒ๋ฆฌ๋ ํ์์ด ๋ฐ์ํ์ต๋๋ค.
ํ์ค์ ์ธ try/finally ์ ๋ฆฌ ๋ธ๋ก์ ์ค๋๋ ๋น๋๊ธฐ ์ปจํ
์คํธ (async contexts)๋ฅผ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ์๋ํ์ง ์์์ต๋๋ค. ๊ฒฐ๊ตญ ํ (pool)์ด ์ต๋ ์ฉ๋์ ๋๋ฌํ์ฌ ๋๊ฒฐ๋์์ต๋๋ค.
Copilot์ ๋์:
Copilot์ ๋ก์ปฌ ํธ๋์ญ์ (transaction) ์๋ช ์ฃผ๊ธฐ์ ์ง์ ๊ฒฐํฉ๋๊ณ ์ ๋์ ์ธ ํ์์์ ๊ฐ๋ (timeout guards)๋ฅผ ํฌํจํ๋ ์๊ฒฉํ ์ฐ๊ฒฐ ํ๋ ํจํด์ ๋์ ํ์ต๋๋ค:
# Copilot์ด ์ ์ํ ํ๋ ํจํด
async with pool.acquire() as connection:
async with connection.transaction():
...
๋ํ, ์์ ๋๋ผ์ด๋ฒ (driver) ์๋ฌ๋ฅผ ๊น๋ํ ๊ตฌ์กฐํ๋ ์๋ต์ผ๋ก ๋ณํํ๋ ์ ์ญ ์์ธ ๋ํผ (exception wrappers)๋ฅผ ์ถ๊ฐํ์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ค์ด์คํธ๋ฆผ ์คํฌ๋ํ ํ์ดํ๋ผ์ธ (downstream scraping pipeline)์ด ์ถฉ๋ํ๋๋ผ๋ ์ฐ๊ฒฐ ์ ๋ฆฌ๋ฅผ ๋ณด์ฅํ ์ ์๊ฒ ๋์์ต๋๋ค.
๐ ๋ฒ๊ทธ 2: ํจํค์ง ๋ฒ์ ๊ฐ SpecifierSet .contains() AttributeError ๋ฐ์
์ฅ์ ๋ด์ฉ: formatter.py๋ DependencyAnalyzer๋ฅผ ํตํด ์์กด์ฑ ์ง๋จ (dependency diagnostics)์ ์ํํฉ๋๋ค. ๊ตฌ๋ฒ์ ์ packaging ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ค์น๋ ํ๊ฒฝ์์๋ SpecifierSet์ ๋ํด .contains()๋ฅผ ํธ์ถํ ๋ ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ต๋๋ค:
AttributeError: 'SpecifierSet' object has no attribute 'contains'
์ด๋ก ์ธํด ์ง๋จ ํจ๋์ด ๋ ๋๋ง๋๊ธฐ๋ ์ ์ ์ ์ฒด ํ๋ก์ธ์ค๊ฐ ์ถฉ๋ํ์ผ๋ฉฐ, ๊ฒฐ๊ณผ์ ์ผ๋ก ๋๋ค์์ ์ฌ์ฉ์ ํ๊ฒฝ์์ ํ๊ฒฝ ๊ฒ์ฆ (environment validation) ๊ธฐ๋ฅ์ด ์กฐ์ฉํ ์๋์ ๋ฉ์ท์ต๋๋ค.
Copilot์ ๋์:
Copilot์ .contains()๊ฐ ํน์ ๋ฒ์ ์ ์ข
์์ ์ด์ง๋ง, ๋ค์ดํฐ๋ธ in ์ฐ์ฐ์๋ packaging์ ๋ชจ๋ ๊ณผ๊ฑฐ ๋ฆด๋ฆฌ์ค์ ๋ํด **๋ณดํธ์ ์ธ ํ์ ํธํ์ฑ (backward-compatible)**์ ๊ฐ์ง๋ค๋ ์ ์ ์๋ณํด๋์ต๋๋ค:
# โ ๊ธฐ์กด์ ์คํจํ๋ ์ฝ๋
elif not raw_spec.contains(local):
...
์ฐ์ฐ์ ํ๋๋ฅผ ๊ต์ฒดํ๋ ๊ฒ๋ง์ผ๋ก, ๋ชจ๋ ํ๊ฒฝ์์ ์ถฉ๋์ด ์์ ํ ์ฌ๋ผ์ก์ต๋๋ค.
๐ ๋ฒ๊ทธ 3: ๋จ์ผ ์ฝ์ด CLI ๋์คํจ์น(Dispatch)๋ฅผ ๊นจ๋จ๋ฆฌ๋ ์์์ ๋ฌธ์์ด ๋งคํ
์คํจ ์์ธ: neurodoc.py์์ neurodoc fetch os์ ๊ฐ์ CLI ์
๋ ฅ์ด ์ฝ์ด ID `
์ด๊ฒ๋ค์ ๋จ์ํ ์๋ ์์ฑ ์ ์์ด ์๋์์ต๋๋ค. Copilot์ ๋น๋๊ธฐ ์๋ช ์ฃผ๊ธฐ ๊ฒฝ๊ณ (async lifecycle boundaries), ๊ต์ฐจ ๋ฒ์ API ํธํ์ฑ (cross-version API compatibility), ํ์ ์์คํ ์ ์ฃ์ง ์ผ์ด์ค (type system edge cases), ๊ทธ๋ฆฌ๊ณ **์ ํ ๋์ ์ ์ฝ ์กฐ๊ฑด (linear algebra constraints)**์ ๋ํด ์ถ๋ก ํ์ต๋๋ค. ์ด๋ ์์ ์์ปค๋ ์ฌ์ง์ด ์์น๋ฅผ ์ฐพ๋ ๋ฐ๋ง ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ข ๋ฅ์ ๋ฒ๊ทธ๋ค์ ๋๋ค.
๊ฐ์ฅ ํฐ ๋ํ๊ตฌ๋ ์ด๊ฒ์ด ๋จ์ํ ์ฆ์๋ง์ ํด๊ฒฐํ์ง ์์๋ค๋ ์ ์ ๋๋ค. ๊ฐ ๋ฒ๊ทธ์ ๋ํด, ์ ๊ธฐ์กด ๋ฐฉ์์ด ์ทจ์ฝํ๋์ง ์ค๋ช ํด์ฃผ์์ผ๋ฉฐ ํ๋ก๋์ ํ๊ฒฝ์์๋ ๊ฒฌ๋ ์ ์๋ ํจํด์ ์ ์ํ์ต๋๋ค.
์ด๊ฒ์ด ๋ฐ๋ก ๋๊ตฌ(tool)์ ํ์ ์(collaborator)์ ์ฐจ์ด์ ๋๋ค.
๐ญ ํฅํ ๊ณํ
- ์ํด๋ฆญ ๋ฌธ์ ์กฐํ๋ฅผ ์ํ ๋ธ๋ผ์ฐ์ ํ์ฅ ํ๋ก๊ทธ๋จ
- WebSockets๋ฅผ ํตํ ์คํธ๋ฆฌ๋ฐ ์๋ต
- Hugging Face, Pandas, NumPy ๋ฌธ์ ์ง์
- ์์ฒด ํธ์คํ ์๋ฒ ๋ฉ ๋ชจ๋ธ (API ํค ๋ถํ์)
- ์์ฝ๋ณธ์ Jupyter notebook์ผ๋ก ๋ด๋ณด๋ด๊ธฐ
๐ ๋งํฌ
- ๐ GitHub: github.com/kaushikcoderpy1/neurodoc
- ๐ฌ ๋ฐ๋ชจ ์์: YouTube Preview
DEV.to ํด์ปคํค์ ์ํด ์ ์๋์์ต๋๋ค. ๊ณ ์ง๊ณผ ๋น๋๊ธฐ Python (async Python), ๊ทธ๋ฆฌ๊ณ ๋๋ฌด ๋ง์ ์ปคํผ์ ํ์ผ๋ก ๋ง๋ค์ด์ก์ต๋๋ค.
AI ์๋ ์์ฑ ์ฝํ ์ธ
๋ณธ ์ฝํ ์ธ ๋ Dev.to AI tag์ ์๋ฌธ์ AI๊ฐ ์๋์ผ๋ก ์์ฝยท๋ฒ์ญยท๋ถ์ํ ๊ฒ์ ๋๋ค. ์ ์ ์๊ถ์ ์์ ์์์๊ฒ ์์ผ๋ฉฐ, ์ ํํ ๋ด์ฉ์ ๋ฐ๋์ ์๋ฌธ์ ํ์ธํด ์ฃผ์ธ์.
์๋ฌธ ๋ฐ๋ก๊ฐ๊ธฐ