ํต์ฌ ์์
- ๊ธฐ๋ณธ ์ค์ ์ 5,000โ8,000๊ฐ ์ฒญํฌ์์ ์คํจํฉ๋๋ค โ ๋ฒกํฐ ์ธ๋ฑ์ค๊ฐ RAM์ ์ด๊ณผํ๋ฉด ๊ฒ์ ์ฌํ์จ์ด ๋จ์ด์ง๊ณ ๊ธฐ๋ณธ ์ฝ์ฌ์ธ ๊ฒ์์ด ์ดํ์ ์ผ๋ก ์ ์ฌํ์ง๋ง ์๋ฏธ์ ์ผ๋ก ์๋ชป๋ ์ฒญํฌ๋ฅผ ๋ฐํํฉ๋๋ค.
- ๊ธฐ๋ฅ ์ ํธ๊ฐ ์๋ ์ฝํผ์ค ํฌ๊ธฐ์ ๋ฐ๋ผ ์ํคํ ์ฒ๋ฅผ ์ ํํ์ญ์์ค: 100โ1,000๊ฐ ๋ฌธ์์๋ ์กฐ์ ๋ AnythingLLM; 1,000โ5,000๊ฐ์๋ ๋ก์ปฌ LlamaIndex; 5,000โ10,000๊ฐ์๋ ๋ง์ถคํ Ollama+ChromaDB; 10,000๊ฐ+์๋ Ollama+Qdrant.
- ์ํฅ๋ ฅ ์์์ ๋ฐ๋ฅธ ์ธ ๊ฐ์ง ์ต๋ ๊ฐ์ ์ฌํญ: ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์(BM25 + ๋ฒกํฐ), ์ํ ํฌ๋ก์ค ์ธ์ฝ๋๋ก ์์ 50๊ฐ ํ๋ณด ์ฌ๋ญํน, ๋ฉํ๋ฐ์ดํฐ ์ฌ์ ํํฐ๋ง. ๊ณ์ธต์ ๊ฒ์์ 10k+ ์ด์์์ ๋์์ด ๋ฉ๋๋ค.
- ์ ์ฅ์ ์์ฐ: ์ฒญํฌ ํฌ๊ธฐ์ ์๋ฒ ๋ฉ ์ฐจ์์ ๋ฐ๋ผ PDF 100ํ์ด์ง๋น 10โ30 MB. 50,000ํ์ด์ง ์ฝํผ์ค๋ ๋ฒกํฐ๋ง์ผ๋ก ๋์คํฌ์ 5โ15 GB๊ฐ ํ์ํฉ๋๋ค.
- ์ธ๋ฑ์ฑ ์๊ฐ: ๋ฌธ์ ์์ ์ ํ์ . ์๋น์ ํ๋์จ์ด์์ nomic-embed-text-v1.5๋ก 5,000๊ฐ PDF๋น 30โ90๋ถ์ ๊ณํํ์ญ์์ค. CPU๋ง์ผ๋ก x86๋ณด๋ค Apple Silicon์์ ๋ ๋น ๋ฆ ๋๋ค.
- 10k+ ๋ฌธ์๋ฅผ ์ํ ์ต์ ํ๋์จ์ด ์๊ฑด: 32 GB RAM, NVMe SSD, 8 GB+ VRAM์ ๋ ๋ฆฝ GPU ๋๋ 32 GB+ ํตํฉ ๋ฉ๋ชจ๋ฆฌ์ Apple Silicon.
- ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๋ฉด ๋ชจ๋ ์ํคํ ์ฒ์์ ์์ ํ ์ฌ์ธ๋ฑ์ฑ์ด ๊ฐ์ ๋ฉ๋๋ค. 10,000๊ฐ ๋ฌธ์๋ฅผ ์ธ๋ฑ์ฑํ๊ธฐ ์ ์ ์๋ฒ ๋๋ฅผ ์ ํํ์ญ์์ค. ์๋ชป๋ ์ ํ์ ๋๋๋ฆฌ๋ ๋ฐ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฝ๋๋ค.
1,000๊ฐ ์ด์์ ๋ฌธ์์์ ๊ธฐ๋ณธ RAG๊ฐ ์คํจํ๋ ์ด์
1,000โ10,000๊ฐ ๋ฌธ์ ์ฌ์ด์์ ๋ ๊ฐ์ง ์คํจ๊ฐ ๋์ ๋ฉ๋๋ค: ์ธ๋ฑ์ค๊ฐ RAM์ ์ด๊ณผํ๊ณ ์ฝ์ฌ์ธ ์ ์ฉ ๊ฒ์์ด ์ดํ์ ์ผ๋ก ์ ์ฌํ์ง๋ง ์๋ฏธ์ ์ผ๋ก ์๋ชป๋ ์ฒญํฌ๋ฅผ ๋ฐํํฉ๋๋ค. PDF 20๊ฐ๋ก ์๋ํ๋ ๋ฐ๋ชจ๋ ๊ฐ์ธ ์ฐ๊ตฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. ์ฝ๋๊ฐ ์๋ชป๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ๋ณธ ์ค์ ์ ๋ด์ฅ๋ ๊ฐ์ ์ด ๋ ์ด์ ์ฑ๋ฆฝํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- RAM์ ๋ฒ์ด๋ ์ธ๋ฑ์ค: LanceDB, ChromaDB, FAISS๋ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์์ฃผ๋ก ์์ํฉ๋๋ค. ์ธ๋ฑ์ค๊ฐ ์ฌ์ฉ ๊ฐ๋ฅํ RAM(16 GB ๋ ธํธ๋ถ์์ ์ผ๋ฐ์ ์ผ๋ก 5โ8 GB ๋ฒกํฐ)์ ์ด๊ณผํ๋ฉด ๋์คํฌ ์ฝ๊ธฐ๋ก ๋จ์ด์ง๊ณ ์ฟผ๋ฆฌ p95 ์ง์ฐ์๊ฐ์ด ~300ms์์ 1โ3์ด๋ก ๊ธ์ฆํฉ๋๋ค.
- ์ฝ์ฌ์ธ ์ ์ฉ์ ๋๋ฌธ ์ฉ์ด์์ ์คํจํฉ๋๋ค: ๋ฐ์ง ์๋ฒ ๋ฉ์ ์ผ๋ฐ์ ์ด์ง ์์ ๊ณ ์ ๋ช ์ฌ, ์ฝ๋ฌผ ์ด๋ฆ, ๋ฒ๋ น ๋ฒํธ, ์ฝ๋ ์๋ณ์๋ฅผ ๊ณผ์ํ๊ฐํฉ๋๋ค. "Section 230(c)(1)"์ ๋ํ ์ฟผ๋ฆฌ๊ฐ ์๋ฒ ๋ฉ์ด ์์น์ ํน์์ฑ์ ๊ตฌ๋ณํ ์ ์๊ธฐ ๋๋ฌธ์ "Section 9"์ ๋ํ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค. BM25๋ ๊ทธ๊ฒ์ ์ก์ต๋๋ค. ์์ ์ฝ์ฌ์ธ ๊ฒ์์ ๊ทธ๊ฒ์ ๋์นฉ๋๋ค.
- ๊ท๋ชจ์์ top-4๋ ๋๋ฌด ์ข์ต๋๋ค: 1,000๊ฐ ์ฒญํฌ์์ top-4๋ ์ ์ ํ ์ฌํ์จ์ ๊ฐ์ง๋๋ค. 50,000๊ฐ ์ฒญํฌ์์ ์ต์ ์ฒญํฌ๋ ์ข ์ข top-4 ์ฐฝ ๋ฐ์ธ 12โ30 ๋ฒ์์ ์์ต๋๋ค. ๊ฒ์์ด ์๋ํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง(์๋ต์ด ๊ทธ๋ด๋ฏํจ) ์๋ชป๋ ๊ตฌ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
- ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง์ด ์์ผ๋ฉด ์ธ๋ฑ์ค๊ฐ ๋ญ๋น๋ฉ๋๋ค: 10,000๊ฐ ๋ฌธ์ ์ฝํผ์ค์์ "Smith๊ฐ X์ ๋ํด ๋ญ๋ผ๊ณ ํ์ต๋๊น?"๋ฅผ ๋ฌป๋ ๊ฒ์ ์ธ๋ฑ์ค์ ๋ชจ๋ ์ฒญํฌ๋ฅผ ๊ฒ์ํ์ง๋ง, ์์คํ ์ ๋จผ์ "Smith๊ฐ ์์ฑํ ๋ฌธ์"๋ก ์ฌ์ ํํฐ๋งํด์ผ ํฉ๋๋ค. ๊ธฐ๋ณธ RAG์๋ ๋ฉํ๋ฐ์ดํฐ๋ณ ์ฌ์ ํํฐ๋ง ๊ฐ๋ ์ด ์์ต๋๋ค.
- ๊ธฐ๋ณธ 512/0 ์ฒญํฌ ํฌ๊ธฐ๋ ๊ธด ์ปจํ ์คํธ๋ฅผ ๋ถ์ด์ํต๋๋ค: PDF ๋จ๋ฝ๊ณผ ๋ฒ์ ์น์ ์ 512 ํ ํฐ์ ๊ฑฐ์ ๋ง์ง ์์ต๋๋ค. ๊ธฐ๋ณธ 0 ๊ฒน์นจ์ ์ฒญํฌ ๊ฐ ์๋ฏธ๋ฅผ ์์ต๋๋ค. 1,000/200 ์กฐ์ ์ด ์ค๊ฐ ๊ท๋ชจ ์ฝํผ์ค์์ ์ด๋ฅผ ์์ ํฉ๋๋ค. 5,000๊ฐ ๋ฌธ์ ์ด์์์๋ ๊ณ์ธต์ ์ฒญํน์ด ํ์ํฉ๋๋ค.
- ์ ๋ฐ์ดํธ ์ ์๋ฒ ๋ฉ ๋๋ฆฌํํธ: ์๋ ์ธ๋ฑ์ค์์ 3๊ฐ์ ํ 1,000๊ฐ์ ์ PDF๋ฅผ ์ถ๊ฐํ๋ฉด sentence-transformer ๋ชจ๋ธ ๋ฒ์ ์ด ๋ณ๊ฒฝ๋์์ ์ ์์ต๋๋ค. ํ๋์ ์ธ๋ฑ์ค์ ๋ ๊ฐ์ง ๋ชจ๋ธ ๋ฒ์ ์ ์๋ฒ ๋ฉ์ ํผํฉํ๋ฉด ๊ฒ์์ด ์กฐ์ฉํ ์ ํ๋ฉ๋๋ค โ ๋ชจ๋ ์ํคํ ์ฒ๋ ์๋ฒ ๋๋ฅผ ๋ณ๊ฒฝํ ๋ ์์ ํ ์ฌ์ธ๋ฑ์ฑ์ ๊ฐ์ ํฉ๋๋ค.
๐Note: "ํ์ฅ ์ ๋ฒฝ"์ ๋จ์ผ ์ซ์๊ฐ ์๋๋๋ค. ์ฝํผ์ค, ํ๋์จ์ด, ๊ฒ์ ์ค์ ์ด ์ถฉ๋ถํ ๋์๊ฒ ์ํธ์์ฉํ์ฌ ์๋ต์ด ๋์ ๋๊ฒ ์ ํ๋๋ ์ง์ ์ ๋๋ค. 16 GB ๋ ธํธ๋ถ์์๋ ์ ๋ฒฝ์ด 5,000๊ฐ ์ฒญํฌ ์ฃผ๋ณ์ ์์ต๋๋ค. 32 GB NVMe ์ํฌ์คํ ์ด์ ์์๋ 15,000โ20,000๊ฐ๋ก ์ด๋ํฉ๋๋ค. ์ด ๊ธฐ์ฌ์ ํด๊ฒฐ์ฑ (ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์, ์ฌ๋ญํน, ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง)์ ์ ๋ฒฝ์ ์์ ํ ์ ๊ฑฐํฉ๋๋ค.
์ํคํ ์ฒ ๊ฒฐ์ ํธ๋ฆฌ: ๋จผ์ ์ฝํผ์ค ํฌ๊ธฐ์ ๋ฐ๋ผ ์ ํ
๋ฌธ์ ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ์ํคํ ์ฒ๋ฅผ ์ ํํ์ญ์์ค. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์, ์ฌ๋ญํน, ๊ณ์ธต์ ์ธ๋ฑ์ค๋ฅผ ๋์ค์ ์ถ๊ฐํ๋ ๊ฒ์ ์ฝ์ต๋๋ค. ์ ์ฒด ๋ฒกํฐ ์คํ ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ด๋ค ์ธ์คํจ๋ฌ๋ฅผ ์ด๊ธฐ ์ ์ ์ด ํธ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
๐ ํ ๋ฌธ์ฅ์ผ๋ก
์ต๋ 1,000๊ฐ PDF์ ์ฑํ ํ๊ธฐ ์ํ ๊ฐ์ฅ ๋น ๋ฅธ ๋ก์ปฌ RAG ์ค์ ์ ์ฒญํฌ ํฌ๊ธฐ 1,000/๊ฒน์นจ 200๊ณผ nomic-embed-text-v1.5 ์๋ฒ ๋๊ฐ ์๋ AnythingLLM Desktop์ ๋๋ค โ ์ฝ๋ ์์, ์์ ํ ๊ธฐ๊ธฐ์์ ์คํ๋ฉ๋๋ค.
๐ฌ ์ฝ๊ฒ ๋งํ๋ฉด
๋ฌธ์ ์์ ๋ฐ๋ผ ์ํคํ ์ฒ๋ฅผ ์ ํํ์ญ์์ค: 1,000๊ฐ ๋ฏธ๋ง PDF์๋ AnythingLLM(์ฝ๋ ์์, ๋๋๊ทธ ์ค ๋๋กญ); 1,000โ5,000๊ฐ์๋ ๋ก์ปฌ LlamaIndex(Python 150์ค); 5,000โ10,000๊ฐ์๋ ๋ง์ถคํ Ollama + ChromaDB(300โ400์ค, ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ๋ฐ ์ฌ๋ญํน ์ถ๊ฐ); 10,000๊ฐ+์๋ Ollama + Qdrant(Docker, ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง, ํ๋ก๋์ ๋ฑ๊ธ). ์ฌ๋ฐ๋ฅธ ์ ํ์ ์ฝํผ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ๊ฐ๋จํ ๊ฒ์ ๋๋ค โ ์ํคํ ์ฒ๋ฅผ ๊ณผ๋ํ๊ฒ ์์ง๋์ด๋งํ๋ฉด ๋ ์์ ์ปฌ๋ ์ ์ ์๋ต ํ์ง์ ํฅ์์ํค์ง ์๊ณ ์ ์ง ๋น์ฉ์ด ์ถ๊ฐ๋ฉ๋๋ค.
- 1,000๊ฐ ๋ฏธ๋ง์ ๋ฌธ์(~5,000๊ฐ ์ฒญํฌ ๋ฏธ๋ง): ์ฒญํฌ ํฌ๊ธฐ 1,000/๊ฒน์นจ 200๊ณผ nomic-embed-text-v1.5 ์๋ฒ ๋๊ฐ ์๋ AnythingLLM Desktop. ๋ง์ถค ์ฝ๋ ์์. ์ค์ ์ ์ํ 30๋ถ ๋จ๊ณ๋ณ ๊ฐ์ด๋๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
- 1,000โ5,000๊ฐ ๋ฌธ์(5kโ25k๊ฐ ์ฒญํฌ): ๊ณ์ธต์ ์ธ๋ฑ์ค(DocumentSummaryIndex + VectorStoreIndex)๊ฐ ์๋ ์์ ๋ก์ปฌ ๋ชจ๋์ LlamaIndex, Ollama๋ฅผ LLM ์ ๊ณต์๋ก, nomic-embed-text-v1.5๋ฅผ ์๋ฒ ๋๋ก, LanceDB ๋๋ ChromaDB๋ฅผ ๋ฒกํฐ ์คํ ์ด๋ก. ~Python 150์ค, ์ฅ์๊ฐ ์คํ ํ๋ก์ธ์ค๋ก ์๋.
- 5,000โ10,000๊ฐ ๋ฌธ์(25kโ50k๊ฐ ์ฒญํฌ): Ollama, ChromaDB, Whoosh ๋๋ Tantivy๋ฅผ ํตํ BM25 ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์, ์์ 50๊ฐ ํ๋ณด์ BGE-reranker-v2-m3 ์ฌ๋ญ์ปค๊ฐ ์๋ ๋ง์ถค ์คํ. ~Python 300โ400์ค. ์ด ๊ท๋ชจ์์ ์ฌ๋ญ์ปค๋ ํ์์ ๋๋ค.
- 10,000๊ฐ+ ๋ฌธ์(50k+ ์ฒญํฌ): ํ์ด๋ก๋ ๊ธฐ๋ฐ ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง, Qdrant์ ๊ธฐ๋ณธ ํฌ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์, BGE-reranker-v2-m3, ๋ฌธ์ ID๋ณ ๊ณ์ธต์ ์์ฝ ์ธ๋ฑ์ค๊ฐ ์๋ ๋จ์ผ ๋ ธ๋ ๋ชจ๋์ Ollama + Qdrant. ๋จ์ผ ์ฌ์ฉ์๋ฅผ ์ํ ํ๋ก๋์ ๋ฑ๊ธ ์ค์ .
- ๋ฉํฐ ์ฌ์ฉ์(๋ชจ๋ ๊ท๋ชจ): ์์ ์ด๋ ๊ฒ ์์์๋ Open WebUI, ๋๋ ๋์ผํ Qdrant + Ollama ๋ฐฑ์๋๋ฅผ ๊ฐ์ธ๋ ์ํ FastAPI ๋ํผ. ๋ฉํฐ ์ฌ์ฉ์๋ ์ด์ ์ด์ (์ธ์ฆ, ๊ฒฉ๋ฆฌ, ์๋ ์ ํ)์ ๋ฐ๊พธ์ง๋ง ๊ฒ์ ์ํคํ ์ฒ๋ ๋ฐ๊พธ์ง ์์ต๋๋ค.
๐กTip: ํ์ ์ด ์๋ค๋ฉด ํ์ฌ ์ฝํผ์ค ํฌ๊ธฐ๋ณด๋ค ํ ์์ค ์์์ ์์ํ์ญ์์ค. ์ค๋ PDF 800๊ฐ๊ฐ ์๊ณ ์ 200๊ฐ๋ฅผ ์ถ๊ฐํ ์์ ์ด๋ผ๋ฉด LlamaIndex ์์ค์์ ์์ํ์ญ์์ค โ ๋์ค์ AnythingLLM์์ ์ฌ์ํคํ ์ฒ๋งํ๋ ๊ฒ์ด ์ง๊ธ ํ ๋จ๊ณ ๊ณผ๋ํ๊ฒ ์์ง๋์ด๋งํ๋ ๊ฒ๋ณด๋ค ๋ ๊ณ ํต์ค๋ฝ์ต๋๋ค.
์ํคํ ์ฒ ๋น๊ต ํ
100, 1,000, 10,000๊ฐ ๋ฌธ์์์ ๋์ผํ ์ฝํผ์ค์ ๋น๊ต๋ 4๊ฐ์ง ์ํคํ ์ฒ. ํ ์คํธ ์ค์ : ํ๊ท 12ํ์ด์ง์ ์ฐ๊ตฌ PDF(10k ๋ฌธ์์์ ~120k ํ์ด์ง). ํ๋์จ์ด: Windows 11์ NVIDIA RTX 4070(12 GB VRAM, 32 GB ์์คํ RAM); M5 MacBook Pro(32 GB ํตํฉ)์์ ๊ต์ฐจ ํ์ธ. LLM: Ollama๋ฅผ ํตํ Llama 3.3 8B Q4_K_M. ์๋ฒ ๋: nomic-embed-text-v1.5. ๋ชจ๋ ์ซ์๋ ์๋ฐ์ ํ ์ธ ๋ฒ ์คํ์ ์ค์๊ฐ์ ๋๋ค.
| ์ํคํ ์ฒ | ์ค์ ๋ณต์ก์ฑ | ์ต๋ ํ ์คํธ๋ ๋ฌธ์ | 1k๊ฐ ๋ฌธ์์์ p50 ์ฟผ๋ฆฌ | 10k๊ฐ ๋ฌธ์์์ p50 ์ฟผ๋ฆฌ | ์ด์์ ์ธ ๋์ |
|---|---|---|---|---|---|
| AnythingLLM (๊ธฐ๋ณธ๊ฐ) | ๋๋๊ทธ ์ค ๋๋กญ, ์ฝ๋ ์์ | ๊ฒ์์ด ์ ํ๋๊ธฐ ์ ~2,000๊ฐ ๋ฌธ์ | ~450 ms | ๋ถ๊ฐ (์ฌํ์จ์ด 50% ๋ฏธ๋ง์ผ๋ก ๋จ์ด์ง) | ๋ฐ๋ชจ ๋ฐ ๋งค์ฐ ์์ ์ฝํผ์ค; 500๊ฐ PDF ์ด์์์๋ ์ฌ์ฉํ์ง ๋ง์ญ์์ค |
| AnythingLLM (์กฐ์ ๋จ) | ์ฝ๋ ์์; ์ค์ ๋ง (1000/200 + nomic-embed-text) | ~3,000๊ฐ ๋ฌธ์ ํธ์ํ๊ฒ | ~310 ms | ~1.4์ด, ์ฌํ์จ ~70% | ๋ง์ถค ์ฝ๋ ์์ฐ์ด ์๋ 100โ1,000๊ฐ ๋ฌธ์ |
| ๋ก์ปฌ LlamaIndex | ~Python 150์ค, ์ฅ์๊ฐ ์คํ ํ๋ก์ธ์ค | ~8,000๊ฐ ๋ฌธ์ | ~280 ms | ๊ณ์ธต์ ์ธ๋ฑ์ค๋ก ~700 ms | ๊ตฌ์กฐํ๋ ๊ฒ์ ํ์ดํ๋ผ์ธ, 1,000โ5,000๊ฐ ๋ฌธ์ |
| ๋ง์ถคํ Ollama + ChromaDB | ~Python 300โ400์ค, BM25 + ์ฌ๋ญ์ปค ํตํฉ | ~12,000๊ฐ ๋ฌธ์ | ~340 ms | ํ์ด๋ธ๋ฆฌ๋ + ์ฌ๋ญํน์ผ๋ก ~520 ms | ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ด ํ์ํ 5,000โ10,000๊ฐ ๋ฌธ์ |
| Ollama + Qdrant | ~Python 500์ค, Docker, ํ์ด๋ก๋ ์คํค๋ง | 50,000๊ฐ+ ๋ฌธ์ | ~310 ms | ํ์ด๋ธ๋ฆฌ๋ + ๊ธฐ๋ณธ ํํฐ๋ง์ผ๋ก ~410 ms | ์ง์ค์ ์ธ ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง, 10,000๊ฐ+ ๋ฌธ์ |
์ต์ 1: ์กฐ์ ๋ AnythingLLM (100โ1,000๊ฐ ๋ฌธ์)
์ฌ๋ฐ๋ฅด๊ฒ ์กฐ์ ๋๋ฉด 1,000๊ฐ ๋ฌธ์์ ๊ฐ์ธ ์ฝํผ์ค๋ฅผ ์ฌ์ ํ ์ฒ๋ฆฌํ๋ ๊ฐ์ฅ ๋ง์ฐฐ์ด ์ ์ ์ต์ . AnythingLLM Desktop์๋ ๋ด์ฅ๋ LanceDB๊ฐ ํฌํจ๋์ด ์๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก PDF/DOCX/MD๋ฅผ ํ์ฑํ๋ฉฐ, Ollama์ LLM ์ ๊ณต์๋ก ํต์ ํฉ๋๋ค. ๊ธฐ๋ณธ ์ค์ ์ ์ฝ 500๊ฐ ๋ฌธ์์์ ์คํจํฉ๋๋ค. ๋ค์ ์กฐ์ ์ผ๋ก 2,000โ3,000๊ฐ๊น์ง ์ฌ๋ฆฝ๋๋ค.
- LLM: Ollama๋ฅผ ํตํ Llama 3.3 8B Q4_K_M (์ถ๋ก ์ค 5 GB RAM). 24 GB+ ์์คํ ์์ Qwen 3 14B Q4๊ฐ ํฉ์ฑ์ ๋์ ๋๊ฒ ํฅ์์ํต๋๋ค.
- ์๋ฒ ๋: AnythingLLM ๊ธฐ๋ณธ๊ฐ์์ Ollama๋ฅผ ํตํ nomic-embed-text-v1.5๋ก ๋ณ๊ฒฝํฉ๋๋ค. ๊ธฐ๋ณธ ์๋ฒ ๋๊ฐ "AnythingLLM์ด ํ์ฅ๋์ง ์๋๋ค"๋ ๋ณด๊ณ ๊ฐ ์๋ ์ฃผ์ ์ด์ ์ ๋๋ค.
- ์ฒญํน: ๋ฒกํฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์ ์ ์ํฌ์คํ์ด์ค๋ณ๋ก 1,000 ํ ํฐ๊ณผ 200 ํ ํฐ ๊ฒน์นจ์ผ๋ก ์ค์ ํฉ๋๋ค. ๊ธฐ๋ณธ 512/0์ ์์ญ ๊ฐ ์ด์์ ๋ฌธ์๊ฐ ์๋ ์ฝํผ์ค์๋ ์๋ชป๋์์ต๋๋ค.
- Top-K: ๊ธฐ๋ณธ 4์์ 6โ8๋ก ์ฆ๊ฐํฉ๋๋ค. 1,000๊ฐ ๋ฌธ์์์ ์ต์ ์ฒญํฌ๋ ์ข ์ข 5โ7 ๋ฒ์์ ์์ผ๋ฉฐ LLM์ ์ฝํ ์ฒญํฌ๋ฅผ ๋ฌด์ํ ์ ์์ต๋๋ค.
- ์ํฌ์คํ์ด์ค ํํฐ์ ๋: ๋ฌธ์ ์นดํ ๊ณ ๋ฆฌ๋ณ๋ก ์ํฌ์คํ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค(๊ธฐ์ฌ, ๊ณ์ฝ์, ๋ ธํธ). ๊ฐ ์ํฌ์คํ์ด์ค์๋ ๋ณ๋๋ก ์ธ๋ฑ์ฑ๋ LanceDB๊ฐ ์์ต๋๋ค. ์ํฌ์คํ์ด์ค ๊ฐ ์ฟผ๋ฆฌ๋ ์ง์๋์ง ์์ง๋ง ์ํฌ์คํ์ด์ค๋ณ ์ฌํ์จ์ด ๋จ์ผ ๋ํ ํ๋ณด๋ค ํจ์ฌ ๋์ต๋๋ค.
โ ๏ธWarning: AnythingLLM์๋ ๊ธฐ๋ณธ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ด๋ ๊ธฐ๋ณธ ์ฌ๋ญ์ปค๊ฐ ์์ต๋๋ค. ~2,000๊ฐ ๋ฌธ์ ์ด์์์ "์ฌ๋ฐ๋ฅธ ๋ฌธ์, ์๋ชป๋ ์ฒญํฌ" ์ค๋ฅ๊ฐ ๋ํ๋ฉ๋๋ค. ๋ชจ๋ธ์ด ๊ธฐ์ฌ๋ฅผ ์ธ์ฉํ์ง๋ง ์๋ชป๋ ๊ตฌ์ ์ ์ธ์ฉํฉ๋๋ค. ์ด ์ฆ์์ด LlamaIndex ์์ค์ผ๋ก ์ด๋ํ ์ ํธ์ ๋๋ค.
์ต์ 2: ๋ก์ปฌ LlamaIndex (1,000โ5,000๊ฐ ๋ฌธ์)
์์ ๋ก์ปฌ ๋ชจ๋์ LlamaIndex๋ 30๋ถ์ Python ์ค์ ์ผ๋ก ๊ณ์ธต์ ๊ฒ์, ์ฟผ๋ฆฌ ๋ผ์ฐํ , ํจ์ฌ ๋ ๋์ ํ์ฅ ๊ณก์ ์ ์ป์ต๋๋ค. ๋์ผํ Ollama ๋ฐฑ์๋, ๋์ผํ nomic-embed-text-v1.5 ์๋ฒ ๋, ํ์ง๋ง ๊ฒ์ ๋ ์ด์ด๋ ๋จ์ผ ํจ์ค top-K ๋์ ๊ตฌ์กฐํ๋ ํ์ดํ๋ผ์ธ์ ์ํด ๊ตฌ์ถ๋ฉ๋๋ค.
- ์คํ: Ollama + LlamaIndex + LanceDB(๋๋ ChromaDB) + OllamaEmbedding ์ด๋ํฐ๋ฅผ ํตํ nomic-embed-text-v1.5. ๋์คํฌ์ ์ง์; ์ํ FastAPI ๋ํผ ๋๋ CLI๋ก ์ํธ์์ฉํ๋ ์ฅ์๊ฐ ์คํ Python ํ๋ก์ธ์ค๋ก ์๋ํฉ๋๋ค.
- VectorStoreIndex์ ๋ํ DocumentSummaryIndex: LlamaIndex๋ ์ธ๋ฑ์ฑ ์ ๋ฌธ์๋น ์์ฝ์ ์์ฑํ ๋ค์ ๊ฒ์ ์ ๋จผ์ ๊ด๋ จ ๋ฌธ์๋ฅผ ์ ํ(์์ฝ ๊ฒ์)ํ๊ณ ๊ทธ ๋ค์์๋ง ํด๋น ๋ฌธ์ ๋ด์์ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค. ๊ฐ์ฅ ์ ๋ ดํ ๊ณ์ธต์ ๊ฒ์ ํจํด์ ๋๋ค.
- ์ฟผ๋ฆฌ ๋ผ์ฐํ : RouterQueryEngine์ ํฉํธ ๊ฒ์ ์ฟผ๋ฆฌ๋ฅผ ์ฒญํฌ ์ธ๋ฑ์ค๋ก, ํฉ์ฑ ์ฟผ๋ฆฌ๋ฅผ ์์ฝ ์ธ๋ฑ์ค๋ก ๋ณด๋ ๋๋ค. ~์ฝ๋ 30์ค; ์ฅ๋ฌธ์ ์ฝํผ์ค์์ ์๋ต ํ์ง์ด ๋ ๋ฐฐ๋ก ํฅ์๋ฉ๋๋ค.
- ๋ฌธ์ฅ ์ฐฝ ๊ฒ์: N๊ฐ์ ์ฃผ๋ณ ๋ฌธ์ฅ๊ณผ ํจ๊ป ๋์ ๋ฌธ์ฅ์ ๊ฒ์ํ๋ ๋ ๋ฒ์งธ ์ ํ์ ์ธ๋ฑ์ค. ๋ต์ด ํ๋์ ๋ฌธ์ฅ์ด์ง๋ง ๊ทธ ์๋ฏธ๊ฐ ์ฃผ๋ณ ๋จ๋ฝ์ ์์กดํ๋ ๋ฒ์ , ํ๋ฌธ์ ์ฝํผ์ค์ ์ ์ฉํฉ๋๋ค.
- ์ง์์ฑ:
index.storage_context.persist(persist_dir=...)๊ฐ ๋ชจ๋ ๊ฒ์ ์ ์ฅํฉ๋๋ค. NVMe SSD์์ 5,000๊ฐ ๋ฌธ์ ์ธ๋ฑ์ค์ ์ฌ๋ก๋ ์๊ฐ์ 10โ30์ด์ ๋๋ค.
# Minimal LlamaIndex local RAG with hierarchical indices (~30 lines)
from llama_index.core import VectorStoreIndex, DocumentSummaryIndex, SimpleDirectoryReader
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.llms.ollama import Ollama
from llama_index.core import Settings
Settings.llm = Ollama(model="llama3.3:8b-instruct-q4_K_M", request_timeout=120)
Settings.embed_model = OllamaEmbedding(model_name="nomic-embed-text:latest")
Settings.chunk_size = 1000
Settings.chunk_overlap = 200
docs = SimpleDirectoryReader("./pdfs").load_data()
# Summary index for routing + chunk index for retrieval
summary_index = DocumentSummaryIndex.from_documents(docs)
chunk_index = VectorStoreIndex.from_documents(docs)
summary_index.storage_context.persist("./storage/summary")
chunk_index.storage_context.persist("./storage/chunks")
# At query time, route by question type
response = chunk_index.as_query_engine(similarity_top_k=8).query(
"What sample size did Smith et al. use?"
)
print(response)์ต์ 3: ๋ง์ถคํ Ollama + ChromaDB (5,000โ10,000๊ฐ ๋ฌธ์)
5,000๊ฐ ๋ฌธ์์์ LlamaIndex์ ๊ธฐ๋ณธ๊ฐ์ด ์๋ฐ ์ ํธ๋ฅผ ๋ณด์ด๊ธฐ ์์ํฉ๋๋ค: ์์ ๋ฒกํฐ ๊ฒ์์ด ์ดํ์ ์ผ๋ก ๊ตฌ์ฒด์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ๋์น๊ณ , 50,000๊ฐ ์ฒญํฌ์ ์ฝ์ฌ์ธ ๊ฒ์์ด "์ถฉ๋ถํ ๋น ๋ฅธ" ์์ฐ์ ์ด๊ณผํฉ๋๋ค. ChromaDB, BM25 ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์, BGE ์ฌ๋ญ์ปค๊ฐ ์๋ ๋ง์ถค ์คํ์ด 32 GB ์ํฌ์คํ ์ด์ ์์ 10,000๊ฐ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- ์คํ: Ollama + ChromaDB(์๋ฒ ๋ชจ๋) + BM25๋ฅผ ์ํ Whoosh ๋๋ Tantivy + BGE-reranker-v2-m3(~570 MB, CPU์์ 50โ100๊ฐ ํ๋ณด/์ด์ ์๋). ๋จ์ผ Python ํ๋ก์ธ์ค ๋๋ ์์ง + ์ฟผ๋ฆฌ ์์ปค๋ก ๋ถํ ๋ ํธ์คํธ.
- ๊ฒ์ ์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์: BM25์ ๋ฐ์ง ๋ฒกํฐ ๊ฒ์์ ๋ณ๋ ฌ๋ก ์คํํ๊ณ , ๊ฐ๊ฐ์ ์์ 25๊ฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ค๋ณต์ ์ ๊ฑฐํ๊ณ , ํฌ๋ก์ค ์ธ์ฝ๋๋ก ๊ฒฐํฉ๋ ์์ 50๊ฐ๋ฅผ ์ฌ๋ญํนํฉ๋๋ค. ์ต์ข top-K 6โ8์ด LLM์ผ๋ก ๊ฐ๋๋ค.
- ChromaDB ๋ฉํ๋ฐ์ดํฐ ํ๋: ์ธ๋ฑ์ฑ ์ ๊ฐ ์ฒญํฌ์
source_filename,page_number,document_type,author,year๋ฅผ ์ฑ์๋๋ค. ์ฟผ๋ฆฌ ์ ํํฐ๋ง(where={"document_type": "contract"})์ ํ์ง ์์ค ์์ด ๊ฒ์ ๊ณต๊ฐ์ 5โ10๋ฐฐ ์ค์ ๋๋ค. - ๋ฐฐ์น ์ธ๋ฑ์ฑ: ChromaDB๋ 32โ128๊ฐ ์ฒญํฌ์ ๋ฐฐ์น๋ก ์๋ฒ ๋ฉ์ ์์ฑํฉ๋๋ค. RTX 4070์์ BGE-reranker๊ฐ ๋ณ๋ชฉ์ ๋๋ค(CPU์์ 50โ100๊ฐ ํ๋ณด/์ด; GPU์์ 400+/์ด).
- ์ง์์ฑ: ChromaDB๋ SQLite + Parquet ๋๋ ํ ๋ฆฌ์ ์๋๋ค. ๋์คํฌ์ 50,000๊ฐ ์ฒญํฌ ์ธ๋ฑ์ค๋ ~3โ5 GB์ ๋๋ค. ๋ฐฑ์ ์ ๋๋ ํ ๋ฆฌ ๋ณต์ฌ์ ๋๋ค.
๐กTip: BGE-reranker-v2-m3๋ ์ด ๊ท๋ชจ์์ ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ์ถ๊ฐ์ ๋๋ค. ์์ด๋ ์ฝ 15โ25%์ ๊ฒฝ์ฐ ์ฌ๋ฐ๋ฅธ ๋ฌธ์์ด์ง๋ง ์๋ชป๋ ์ฒญํฌ๋ฅผ ์ป์ต๋๋ค. ์์ผ๋ฉด 5% ๋ฏธ๋ง์ผ๋ก ๋จ์ด์ง๊ณ LLM์ด ์์ ํ ๊นจ๋ํ ๊ธฐ๋ฐ์ ๊ฐ์ง๋๋ค. ์ฟผ๋ฆฌ ์ง์ฐ์๊ฐ์ ์ถ๊ฐ๋๋ 200โ500ms๋ฅผ ์์ฐ์ ๋ฃ์ผ์ญ์์ค โ ๋ชจ๋ ๋ฐ๋ฆฌ์ด์ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ต์ 4: Ollama + Qdrant (10,000๊ฐ+ ๋ฌธ์)
10,000๊ฐ ๋ฌธ์ ์ด์์์ ๋จ์ผ ํ๋ก์ธ์ค ChromaDB๊ฐ ์๋ต์ฑ ์ด์ ์ ์๊ธฐ ์์ํฉ๋๋ค. Docker ๋จ์ผ ๋ ธ๋ ๋ชจ๋์ Qdrant๋ ๊ธฐ๋ณธ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์, ํ์ด๋ก๋ ๊ธฐ๋ฐ ํํฐ๋ง, 1์ด ๋ฏธ๋ง ์ฟผ๋ฆฌ๋ฅผ ์ํด ์กฐ์ ๋ HNSW ์ธ๋ฑ์ฑ์ผ๋ก 50,000๊ฐ+ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋์ผํ Ollama ๋ฐฑ์๋; ์ฐจ์ด๋ ๋ฒกํฐ ์คํ ์ด์ ๋๋ค.
- ์คํ: Ollama + Qdrant(Docker, ๋จ์ผ ๋ ธ๋) + ๊ธฐ๋ณธ ํฌ์ ๋ฒกํฐ(Qdrant 1.10+์ ๋ด์ฅ๋ BM25 ๋๋ฑ๋ฌผ) + BGE-reranker-v2-m3 + ์ํ Python ์ค์ผ์คํธ๋ ์ด์ ๋ ์ด์ด.
- ๊ธฐ๋ณธ ํ์ด๋ธ๋ฆฌ๋: Qdrant๋ ๋์ผํ ์ปฌ๋ ์ ์์ ๋ฐ์ง + ํฌ์ ๋ฒกํฐ๋ฅผ ์ง์ํ๋ฉฐ ์ฟผ๋ฆฌ ์ ๊ฐ์ค ํจ์ ์ด ์์ต๋๋ค. ์ ์ง ๊ด๋ฆฌํ ๋ณ๋์ BM25 ํ๋ก์ธ์ค๊ฐ ์์ต๋๋ค.
- HNSW ์กฐ์ : 50,000๊ฐ+ ๋ฒกํฐ์์ ์ธ๋ฑ์ค ๊ตฌ์ฑ์ ์ํด
ef_construct๋ฅผ 200์ผ๋ก,m์ 32๋ก ์ฆ๊ฐ์ํค๊ณ ์ฟผ๋ฆฌ ์ef=128์ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ด ์๋ํ์ง๋ง ๊ตฌ์ฑ ์๋๋ฅผ ์ํด ~10%์ ์ฌํ์จ์ ๊ตํํฉ๋๋ค. - ํํฐ๋ง์ ์ํ ํ์ด๋ก๋ ์คํค๋ง: Qdrant๋ ํ์ด๋ก๋๋ฅผ ์ผ๊ธ ์๋ฏผ์ผ๋ก ์ทจ๊ธํฉ๋๋ค. ์๋ธ๋ฐ๋ฆฌ์ด ์ฌ์ ํํฐ๋ง์ ํ์ฑํํ๊ธฐ ์ํด
author,document_type,year,tags๋ฅผ ํค์๋ ํ์ด๋ก๋๋ก ์ธ๋ฑ์ฑํฉ๋๋ค. - ๊ณ์ธต์ ๊ฒ์: ๋ ๊ฐ์ ์ปฌ๋ ์
์ ์ ์งํฉ๋๋ค โ
summaries(๋ฌธ์๋น ํ๋์ ๋ฒกํฐ)์chunks(์ผ๋ฐ). ์ฟผ๋ฆฌ๋ฅผ ๋จผ์ ์์ฝ ์ปฌ๋ ์ ์ ํตํด ๋ผ์ฐํ ํ ๋ค์ ์ผ์นํ๋ ๋ฌธ์ ID ๋ด์ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค. - ์ง์์ฑ: Qdrant๋ ๋ง์ดํธ๋ ๋จ์ผ ๋ณผ๋ฅจ์ ์๋๋ค. 100,000๊ฐ ์ฒญํฌ ์ปฌ๋ ์ ์ ํ์ด๋ก๋ ํฌ๊ธฐ์ HNSW ์ค์ ์ ๋ฐ๋ผ ๋์คํฌ์ ~6โ12 GB๋ฅผ ์ฐจ์งํฉ๋๋ค.
# Qdrant collection with dense + sparse vectors and metadata filtering
from qdrant_client import QdrantClient
from qdrant_client.models import (
Distance, VectorParams, SparseVectorParams, SparseIndexParams
)
client = QdrantClient(host="localhost", port=6333)
client.create_collection(
collection_name="docs",
vectors_config={
"dense": VectorParams(size=768, distance=Distance.COSINE), # nomic-embed-text-v1.5
},
sparse_vectors_config={
"bm25": SparseVectorParams(index=SparseIndexParams(on_disk=False)),
},
)
# Query: hybrid search + payload filter, no separate BM25 process needed
from qdrant_client.models import Filter, FieldCondition, MatchValue, Prefetch
results = client.query_points(
collection_name="docs",
query=dense_vec,
using="dense",
prefetch=[
Prefetch(query=sparse_vec, using="bm25", limit=25),
Prefetch(query=dense_vec, using="dense", limit=25),
],
query_filter=Filter(
must=[FieldCondition(key="document_type", match=MatchValue(value="contract"))]
),
limit=50, # before rerank
)ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์: BM25 + ๋ฒกํฐ๊ฐ ๋ ์ค ์ด๋ ๊ฒ๋ณด๋ค ๋ฐ์ด๋ฉ๋๋ค
์์ ์ฝ์ฌ์ธ ๊ฒ์์ ๋๋ฌธ ๊ณ ์ ๋ช ์ฌ, ๋ฒ๋ น ๋ฒํธ, ํน์ ์๋ณ์์ ์์กดํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋์นฉ๋๋ค. ์์ BM25๋ ์์ค ํ ์คํธ์ ๋ค๋ฅด๊ฒ ํํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋์นฉ๋๋ค. ์กฐํฉ์ ํนํ 1,000๊ฐ ์ด์์ ๋ฌธ์์์ ๋ ์ค ์ด๋ ๊ฒ๋ณด๋ค ๋ฐ์ด๋ฉ๋๋ค. ๊ตฌํ ๋น์ฉ: ํ๋์ ์ถ๊ฐ ๊ฒ์ ํธ์ถ๊ณผ ํจ์ ๋จ๊ณ.
- ๋ฐ์ง ๋จ๋ ์ด ์คํจํ๋ ์ด์ : ์๋ฒ ๋ฉ์ ๋๋ฌธ ํ ํฐ์ ๊ณผ์ํ๊ฐํฉ๋๋ค. "RFC 9110 section 7.4" ๋๋ "MNDA-2024-0143" ๊ฐ์ ์ฟผ๋ฆฌ๋ ์ผ๋ฐ์ ์ธ IETF/๊ณ์ฝ ์ฒญํฌ ๊ทผ์ฒ์ ์๋ฒ ๋ฉ๋ฉ๋๋ค. BM25๋ ์ ํํ ์๋ณ์๋ฅผ ์ก์ต๋๋ค. ์์ ์ฝ์ฌ์ธ ๊ฒ์์ ๊ทธ๊ฒ์ ๋์นฉ๋๋ค.
- BM25 ๋จ๋ ์ด ์คํจํ๋ ์ด์ : ์ดํ ์ผ์น๋ ํจ๋ฌํ๋ ์ด์ฆ๋ฅผ ๋์นฉ๋๋ค. "๊ณ์ฝ์ ์ด๋ป๊ฒ ์ทจ์ํฉ๋๊น?"๋ผ๋ ์ฟผ๋ฆฌ๊ฐ "ํด์ง ์ ์ฐจ"๋ผ๋ ์ ๋ชฉ์ ์ฒญํฌ์ ๋ํด ๋ฐ์ง ๊ณต๊ฐ์์ ์ผ์นํ์ง๋ง BM25์์ 0์ ์ ๋ฐ์ต๋๋ค.
- Reciprocal Rank Fusion(RRF)์ด ํ์ค ๊ฒฐํฉ์์
๋๋ค: ๊ฒฐ๊ณผ ๋ชฉ๋ก ์ค ํ๋์ ๋ํ๋๋ ๊ฐ ์ฒญํฌ์ ๋ํด
1/(60+rank_dense) + 1/(60+rank_bm25)๋ก ์ ์๋ฅผ ๋งค๊น๋๋ค. ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค. 60์ ์ค๋ฌด๋ฉ ์์์ ๋๋ค; 30โ100 ์ฌ์ด์ ๊ฐ์ด ์ค์ ๋ก ์๋ํฉ๋๋ค. - ์ค์ฉ์ ์ธ ๋ ์ํผ: ๊ฐ ๋ฐฉ๋ฒ์์ ์์ 25๊ฐ๋ฅผ ๊ฒ์ํ๊ณ , RRF๋ฅผ ํตํด ๊ฒฐํฉํ๊ณ , ์์ 50๊ฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์ฌ๋ญ์ปค์ ๋ณด๋ด๊ณ , ๊ทธ ๋ค์ ์์ 6โ8๊ฐ๋ฅผ LLM์ ๋ณด๋ ๋๋ค. ์ด๊ฒ์ด 1,000๊ฐ ์ด์์ ๋ฌธ์์์ ๋ชจ๋ ๊ท๋ชจ์ ํ์ค ํ๋ก๋์ ํ์ดํ๋ผ์ธ์ ๋๋ค.
- ์ ์ฅ์ ๋น์ฉ: BM25 ์ธ๋ฑ์ค๋ ๋ฐ์ง ์ธ๋ฑ์ค(๋์ผ ๊ท๋ชจ์์ ~500 MBโ2 GB)์ ๋นํด ์์ต๋๋ค(10,000๊ฐ ๋ฌธ์๋น ~50โ150 MB). ๊ธฐ์กด ๋ฐ์ง ์คํ ์ด์ BM25๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ์ ๋ ดํฉ๋๋ค.
๐Note: Qdrant 1.10+์ Weaviate๋ ๊ธฐ๋ณธ์ผ๋ก ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์ง์ํฉ๋๋ค. ChromaDB๋ Whoosh ๋๋ Tantivy ์ถ๊ฐ๊ฐ ํ์ํฉ๋๋ค. LanceDB์๋ ์คํ์ ์ธ ํ์ด๋ธ๋ฆฌ๋ ์ง์์ด ์์ง๋ง 2026๋ 5์ ๊ธฐ์ค API๊ฐ ๋ณ๊ฒฝ ์ค์ ๋๋ค โ ์ฝ์ ์ ์ ํ์ฌ ๋ฌธ์๋ฅผ ํ์ธํ์ญ์์ค. ๊ธฐ๋ณธ ํ์ด๋ธ๋ฆฌ๋๋ ๋ฒกํฐ ์คํ ์ด ์ ํ์ ์ ๋นํํฉ๋๋ค.
์ฌ๋ญํน: ์์ N ์ ์ ๋จ๊ณ
์ฌ๋ญ์ปค๋ ๋ ๋ฆฝ์ ์ด ์๋ ๊ณต๋์ผ๋ก (์ฟผ๋ฆฌ, ํ๋ณด) ์์ ์ ์ ๋งค๊ธฐ๋ ์ํ ํฌ๋ก์ค ์ธ์ฝ๋์ ๋๋ค. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์์ ์์ 25โ50๊ฐ ํ๋ณด์ ๋ํด ์คํํ์ฌ "์ฌ๋ฐ๋ฅธ ๋ฌธ์, ์๋ชป๋ ์ฒญํฌ" ์คํจ๋ฅผ ์์ ํฉ๋๋ค. 5,000โ50,000๊ฐ ๋ฌธ์ ์ฌ์ด์์ ๋จ์ผ ์ต๋ ํ์ง ๋ ๋ฒ๋ฆฌ์ง.
- BGE-reranker-v2-m3(~570 MB, ๋ค๊ตญ์ด, Apache 2.0)๋ 2026๋ 5์์ ๊ธฐ๋ณธ ์ ํ์ ๋๋ค. ํ๋ CPU์์ 50โ100๊ฐ ํ๋ณด/์ด์ ์๋ํฉ๋๋ค; GPU์์ 400+/์ด. ์์ 50๊ฐ ์ฌ๋ญํน์ ์ง์ฐ์๊ฐ ๋น์ฉ์ CPU์์ ~200โ500 ms, GPU์์ ~80โ150 ms์ ๋๋ค.
- ํฌ๋ก์ค ์ธ์ฝ๋๊ฐ ๊ฒ์์์ ์ด๊ธฐ๋ ์ด์ : ๋ฐ์ง ์๋ฒ ๋ฉ์ ์ฟผ๋ฆฌ์ ๋ฌธ์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ธ์ฝ๋ฉํ๋ฏ๋ก ๋ชจ๋ธ์ด ๊ทธ๊ฒ๋ค์ ํจ๊ป ๋ณผ ์ ์์ต๋๋ค. ํฌ๋ก์ค ์ธ์ฝ๋๋ `[CLS] ์ฟผ๋ฆฌ [SEP] ํ๋ณด [SEP]`๋ฅผ ๊ณต๋์ผ๋ก ์ฝ๊ณ ์์ ์ง์ ์ ์ ๋งค๊น๋๋ค. Recall@5๋ ์ผ๋ฐ์ ์ผ๋ก 15โ25ํฌ์ธํธ ์์นํฉ๋๋ค.
- ์ฌ๋ญ์ปค๋ฅผ ์ฃผ์ ํ ์์น: ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์ ํ, LLM ์ . ํ์ด๋ธ๋ฆฌ๋์์ ์์ 50๊ฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ , ์์ 6โ8๊ฐ๋ก ์ฌ์ ๋ ฌํ๊ณ , LLM์ ์ปจํ ์คํธ๋ก ๋ณด๋ ๋๋ค.
- ๋์ โ Cohere Rerank API: ๋ ๋์ ํ์ง์ด์ง๋ง ํด๋ผ์ฐ๋ ํธ์ถ์ด ํ์ํฉ๋๋ค. ์์ ๋ก์ปฌ ์คํ์ ๊ฒฝ์ฐ BGE-reranker-v2-m3๊ฐ ์ค์ฉ์ ์ธ ๊ธฐ๋ณธ๊ฐ์ ๋๋ค. mxbai-rerank-base-v2๊ฐ ๊ฐ๋ ฅํ ๋์ ํ๋ณด์ ๋๋ค.
- 1,000๊ฐ ๋ฏธ๋ง ๋ฌธ์์์๋ ์ฌ๋ญ์ปค๋ฅผ ๊ฑด๋๋ฐ์ด๋ ๋ฉ๋๋ค: ํ์ง ํฅ์์ด ์ง์ฐ์๊ฐ ๋น์ฉ์ ์ ๋นํํ์ง ์์ต๋๋ค. 5,000๊ฐ ๋ฌธ์ ์ด์์์๋ ๊ทธ๊ฒ์ ์๋ตํ๋ฉด ~15โ25%์ ์๋ต์ด ์๋ชป๋ ์ฒญํฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๊ฒ ๋ฉ๋๋ค.
๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง: ๊ฒ์ ๊ณต๊ฐ์ ์ฌ์ ์ถ์
๊ฐ ์ฒญํฌ์ ๊ตฌ์กฐํ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฉด ๋ฒกํฐ ๊ฒ์์ด ์คํ๋๊ธฐ ์ ์ ์ธ๋ฑ์ค๋ฅผ ์๋ผ๋ผ ์ ์์ต๋๋ค. 10,000๊ฐ ๋ฌธ์ ์ฝํผ์ค์์ ์ผ๋ฐ์ ์ธ ํ์ด๋ก๋ ํํฐ๋ ํ์ง ์์ค ์์ด ๊ฒ์ ๊ณต๊ฐ์ 5โ10๋ฐฐ ์ค์ ๋๋ค. ์ธ๋ฑ์ฑ ์ ์ถ๊ฐํ๊ธฐ ์ ๋ ด; ๋์ค์ ์ถ๊ฐํ๊ธฐ ๋น์๋๋ค.
- ์ธ๋ฑ์ฑ ์ ์ฑ์ธ ๋ฒ์ฉ ํ์ด๋ก๋ ํ๋:
source_filename,page_number,document_type(๊ธฐ์ฌ/๊ณ์ฝ์/๋ ธํธ/์ํค),author,year,language, ๋๋ถ์ด ๋๋ฉ์ธ๋ณ ํ๊ทธ(์:case_number,project_id,client_id). - ์ฟผ๋ฆฌ ์ ์ฌ์ ํํฐ: "2024๋
3๋ถ๊ธฐ ์ด์ฌํ ํ์๋ก์ด ๊ฐ๊ฒฉ์ ๋ํด ๋ญ๋ผ๊ณ ํ์ต๋๊น?" โ ๋จผ์
document_type=board_minutes AND year=2024 AND quarter=3์ผ๋ก ํํฐ๋งํ๊ณ , ์ ์ฒด 10,000๊ฐ ๋์ ~12๊ฐ ๋ฌธ์ ๋ด์์ ๋ฒกํฐ ๊ฒ์. - ๋ฒกํฐ ์คํ ์ด ์ง์: Qdrant ํ์ด๋ก๋, Weaviate ์์ฑ, ChromaDB ๋ฉํ๋ฐ์ดํฐ, LanceDB ์คํค๋ง ์ด์ด ๋ชจ๋ ํํฐ๋ง์ ์ง์ํฉ๋๋ค. ์ฑ๋ฅ์ ๋ค์ํฉ๋๋ค โ ์ธ๋ฑ์ฑ๋ ํ๋์ Qdrant ํ์ด๋ก๋ ํํฐ๋ง์ ์๋ธ๋ฐ๋ฆฌ์ด; 100k๊ฐ+ ์ฒญํฌ์์ ChromaDB ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง์ 50โ150 ms๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ์๋ ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ: ๋ฒ์ ์ฝํผ์ค์ ๊ฒฝ์ฐ ์ธ๋ฑ์ฑ ์ ์ํ LLM ๋จ๊ณ๊ฐ ๋ฌธ์๋น ์ฌ๊ฑด ๋ฒํธ, ๋ ์ง, ๋น์ฌ์ ์ด๋ฆ์ ์ถ์ถํ ์ ์์ต๋๋ค. Llama 3.3 8B์์ ๋ฌธ์๋น ~30์ด๊ฐ ์์๋ฉ๋๋ค; ์์ง๋น ํ ๋ฒ ์คํ๋ฉ๋๋ค.
- ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๊ณผ ๊ฒฐํฉ: ํ์ด๋ก๋ ํํฐ๊ฐ ๋ฒ์๋ฅผ ์ค์ ๋๋ค โ ํํฐ๋ง๋ ์ธํธ ๋ด์์ BM25 + ๋ฐ์ง ๊ฒ์ โ ์ฌ๋ญํน. ํ์ด๋ก๋ ํํฐ๋ ๋ชจ๋ ๋ํ RAG ์์คํ ์์ ๊ฐ์ฅ ์ ๋ ดํ 5โ10ร ๊ฐ์์ ๋๋ค.
๊ณ์ธต์ ๊ฒ์: ๋จผ์ ์์ฝ, ๊ทธ ๋ค์ ์ฒญํฌ
๊ณ์ธต์ ๊ฒ์์ ๋ ๊ฐ์ ์ธ๋ฑ์ค๋ฅผ ์ ์งํฉ๋๋ค โ ๋ฌธ์๋น ์์ฝ ์ธ๋ฑ์ค์ ์ฒญํฌ ์ธ๋ฑ์ค โ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ค ํตํด ๋ผ์ฐํ ํฉ๋๋ค. ์์ฝ ๊ฒ์์ด ์ฌ๋ฐ๋ฅธ ๋ฌธ์๋ฅผ ์ฐพ๊ณ , ์ฒญํฌ ๊ฒ์์ด ๊ทธ ์์์ ์ฌ๋ฐ๋ฅธ ๊ตฌ์ ์ ์ฐพ์ต๋๋ค. ํฉ์ฑ ์ฟผ๋ฆฌ์์ ๋ ธ์ด์ฆ๋ฅผ ์ค์ ๋๋ค; ํฉํธ ๊ฒ์์๋ ํฌ๊ฒ ๋ถํ์ํฉ๋๋ค.
- ๋ฌธ์๋น ์์ฝ: ์ธ๋ฑ์ฑ ์ LLM์๊ฒ ๊ฐ ๋ฌธ์์ 100โ200 ํ ํฐ ์์ฝ์ ์์ฑํ๋๋ก ์์ฒญํฉ๋๋ค. ํด๋น ์์ฝ์ ์๋ฒ ๋ฉ์ ๋ณ๋์
summaries์ปฌ๋ ์ ์ ์์ฑํฉ๋๋ค. ๋น์ฉ์ Llama 3.3 8B์์ ๋ฌธ์๋น ~30โ90์ด์ ๋๋ค. - 2๋จ๊ณ ๊ฒ์: (1) ์ฟผ๋ฆฌ ์๋ฒ ๋ฉ์ ์์ฑํ๊ณ
summaries๋ฅผ ๊ฒ์ํ๊ณ ์์ 5๊ฐ ๋ฌธ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค; (2) ํด๋น 5๊ฐ ๋ฌธ์ ๋ด์์ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ํตํด ์์ 8๊ฐ ์ฒญํฌ๋ฅผ ๊ฒ์ํฉ๋๋ค; (3) ํ์ํ๋ฉด ์ฌ๋ญํน ์ ์ฉ; (4) LLM์ ๋ณด๋ ๋๋ค. - ๊ฐ์ฅ ๋์์ด ๋๋ ๊ฒฝ์ฐ: ํฉ์ฑ ๋ฐ ๋ฉํฐ ๋ฌธ์ ์ฟผ๋ฆฌ("์ด ๊ธฐ์ฌ๋ค์ด X๋ฅผ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง ๋น๊ตํฉ๋๋ค"). ํฉํธ ๊ฒ์("Smith๊ฐ ์ด๋ค ๊ฐ์ ๋ณด๊ณ ํ์ต๋๊น?")์ ์ฒญํฌ ์ธ๋ฑ์ค๋ง์ผ๋ก ์ ์๋ํฉ๋๋ค โ ์์ฝ ์ฐํ๊ฐ ํ์ง ํฅ์ ์์ด ์ง์ฐ์๊ฐ์ ์ถ๊ฐํฉ๋๋ค.
- ๋น์ฉ ํธ๋ ์ด๋์คํ: ์ธ๋ฑ์ค ์ ์ฅ์๊ฐ ๋ ๋ฐฐ ๋ฉ๋๋ค(์์ฝ์ ์์ง๋ง ์ธ๋ฑ์ค ์์ฒด๊ฐ ์ค๋ณต ์ธํ๋ผ์ ๋๋ค). ๋น๋ผ์ฐํ ์ฟผ๋ฆฌ์ ์ง์ฐ์๊ฐ์ด ๋ ๋ฐฐ ๋ฉ๋๋ค. ์ด๋์ 10,000๊ฐ+ ๋ฌธ์์์ ๋ ธ์ด์ฆ ๊ฐ์์ ์์ต๋๋ค.
- LlamaIndex์ ๋ด์ฅ:
DocumentSummaryIndex์RouterQueryEngine์ด 30์ค ๊ตฌํ์ ๋๋ค. ChromaDB ๋๋ Qdrant๋ฅผ ์ฌ์ฉํ ๋ง์ถค Python์ ~80โ120์ค์ ๋๋ค.
100, 1,000, 10,000๊ฐ ๋ฌธ์์์ ์ธก์ ๋ ๋ฒค์น๋งํฌ
๋์ผํ ์ฝํผ์ค์์ ๋น๊ต๋ 4๊ฐ์ง ์ํคํ ์ฒ. ํ ์คํธ ๋ฆฌ๊ทธ: NVIDIA RTX 4070(12 GB VRAM, 32 GB ์์คํ RAM), Windows 11 + WSL2, NVMe SSD. M5 MacBook Pro(32 GB ํตํฉ)์์ ๊ต์ฐจ ํ์ธ. ์ซ์๋ ์๋ฐ์ ํ ์ธ ๋ฒ ์คํ์ ์ค์๊ฐ์ ๋๋ค. ๋ค์ํ ๊ท๋ชจ์์์ ์ธ๋ฑ์ฑ ์๊ฐ, ๋์คํฌ ์ ์ฅ์, p50 ๋ฐ p95 ์ฟผ๋ฆฌ ์ง์ฐ์๊ฐ.
| ์คํ | ์งํ | @ 100๊ฐ ๋ฌธ์ | @ 1,000๊ฐ ๋ฌธ์ | @ 10,000๊ฐ ๋ฌธ์ |
|---|---|---|---|---|
| ์กฐ์ ๋ AnythingLLM | ์ธ๋ฑ์ฑ ์๊ฐ | ~1๋ถ | ~12๋ถ | 3,000๊ฐ ๋ฌธ์ ์ด์ ํ ์คํธ ์๋จ |
| ์กฐ์ ๋ AnythingLLM | ๋์คํฌ ๋ฒกํฐ | ~30 MB | ~280 MB | N/A |
| ์กฐ์ ๋ AnythingLLM | ์ฟผ๋ฆฌ p50 / p95 | ~180 / 420 ms | ~310 / 880 ms | N/A (์ฌํ์จ์ด ๋๋ฌด ๋ฎ์) |
| ๋ก์ปฌ LlamaIndex | ์ธ๋ฑ์ฑ ์๊ฐ | ~3๋ถ (์์ฝ ํฌํจ) | ~25๋ถ | ~3.5์๊ฐ |
| ๋ก์ปฌ LlamaIndex | ๋์คํฌ ์ ์ฅ์ | ~45 MB | ~340 MB | ~3.6 GB |
| ๋ก์ปฌ LlamaIndex | ์ฟผ๋ฆฌ p50 / p95 | ~210 / 480 ms | ~280 / 720 ms | ~700 / 1,400 ms |
| ๋ง์ถคํ Ollama+ChromaDB | ์ธ๋ฑ์ฑ ์๊ฐ | ~2๋ถ | ~18๋ถ | ~2.8์๊ฐ |
| ๋ง์ถคํ Ollama+ChromaDB | ๋์คํฌ ์ ์ฅ์ | ~40 MB | ~310 MB | ~3.2 GB |
| ๋ง์ถคํ Ollama+ChromaDB | ์ฟผ๋ฆฌ p50 / p95 | ~240 / 540 ms (์ฌ๋ญํน ํฌํจ) | ~340 / 760 ms | ~520 / 1,100 ms |
| Ollama + Qdrant | ์ธ๋ฑ์ฑ ์๊ฐ | ~2๋ถ | ~17๋ถ | ~2.6์๊ฐ |
| Ollama + Qdrant | ๋์คํฌ ์ ์ฅ์ | ~55 MB | ~410 MB | ~4.4 GB |
| Ollama + Qdrant | ์ฟผ๋ฆฌ p50 / p95 | ~220 / 480 ms | ~310 / 690 ms | ~410 / 920 ms |
์ ์ฅ์ ํฌ๊ธฐ ๋ฐ ํ๋์จ์ด ์๊ตฌ์ฌํญ
์ ์ฅ์๋ ๋ฌธ์ ์์ ์ ํ์ผ๋ก ํ์ฅ๋์ง๋ง RAM์ ๋๋ถ๋ถ์ ๊ฒ์ ์์ง์ด ์์ ํ ๋ก๋ํ๋ ๋์ ์ธ๋ฑ์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ ๋งคํํ๊ธฐ ๋๋ฌธ์ ์๋ธ์ ํ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ๋ค์ ์ซ์๋ nomic-embed-text-v1.5(768 ์ฐจ์)์ 200 ๊ฒน์นจ์ 1,000 ํ ํฐ ์ฒญํฌ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๋์คํฌ ๊ณต๊ฐ์ ์์ ์ฝํผ์ค ํฌ๊ธฐ์ 3โ5๋ฐฐ๋ฅผ ๊ณํํ์ญ์์ค.
- 1,000๊ฐ PDF(๊ฐ ~12ํ์ด์ง)์ ์์ ํ ์คํธ: ~50โ150 MB์ ์ถ์ถ๋ ํ ์คํธ. ๋ฐ๋์ ๋ฐ๋ผ ๋งค์ฐ ๊ฐ๋ณ์ ์ ๋๋ค.
- 1,000๊ฐ ๋ฌธ์์์์ ๋ฒกํฐ: HNSW ์ธ๋ฑ์ค ์ค๋ฒํค๋๋ฅผ ํฌํจํ์ฌ ๋์คํฌ์ ~300โ400 MB. HNSW ์ธ๋ฑ์ค๋ฅผ ์๋ตํ๊ณ ๋ธ๋ฃจํธ ํฌ์ค ๊ฒ์์ ์ฌ์ฉํ๋ฉด ~120โ180 MB(5,000๊ฐ ๋ฌธ์ ๋ฏธ๋ง์์ ํ์ฉ).
- 10,000๊ฐ ๋ฌธ์์์์ ๋ฒกํฐ: ๋์คํฌ์ ~3โ5 GB. HNSW ๊ตฌ์ฑ์๋ ํ๋ CPU์์ 10โ30๋ถ์ด ์์๋ฉ๋๋ค.
- 50,000๊ฐ ๋ฌธ์์์์ ๋ฒกํฐ: ๋์คํฌ์ ~15โ25 GB. ์ธ๋ฑ์ค ๊ตฌ์ฑ ์๊ฐ์ด ๋ณ๋ชฉ์ ๋๋ค โ ์ผํ์ฑ CPU ์์ ์ 2โ4์๊ฐ์ ๊ณํํ์ญ์์ค.
- ์ฟผ๋ฆฌ ์ค RAM: ๋ฐ์ง ๊ฒ์์ ๋ฎ์ ์ง์ฐ์๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ํด ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ธ๋ฑ์ค์ ~30โ50%๊ฐ ํ์ํฉ๋๋ค. 5 GB ์ธ๋ฑ์ค๋ HNSW๋ก 8โ16 GB RAM์ผ๋ก ํธ์ํ๊ฒ ์ฟผ๋ฆฌ๋ฉ๋๋ค; ๋ธ๋ฃจํธ ํฌ์ค๋ ์ธ๋ฑ์ค ์ ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ํ์ํฉ๋๋ค.
- ์ธ๋ฑ์ฑ ์ค RAM: ์๋ฒ ๋ฉ ๋ชจ๋ธ ํฌ๊ธฐ(nomic-embed-text์ ๊ฒฝ์ฐ ~600 MB)์ 2โ3๋ฐฐ ํ๋ฌ์ค ๋ฐฐ์น๋น ํ ์คํธ๋ก ๊ธ์ฆํฉ๋๋ค. 8 GB์ ์ฌ์ RAM์ด ์ธ๋ฑ์ฑ ํจ์ค์ ์ถฉ๋ถํฉ๋๋ค.
- GPU vs CPU: ์๋ฒ ๋ฉ ์ฒ๋ฆฌ๋์ ๋ ๋ฆฝ GPU ๋๋ Apple Silicon์์ 4โ8๋ฐฐ ๋น ๋ฆ ๋๋ค. 10,000๊ฐ+ ๋ฌธ์์ ์ผํ์ฑ ์ธ๋ฑ์ฑ์์ GPU๊ฐ 1โ3์๊ฐ์ ์ ์ฝํฉ๋๋ค. ์ฟผ๋ฆฌ ์ ์๋ฒ ๋ฉ(ํ ๋ฒ์ ํ๋์ ์ฟผ๋ฆฌ)์์๋ CPU๋ก ์ถฉ๋ถํฉ๋๋ค.
- ๋์คํฌ ์ ํ์ด ์ค์ํฉ๋๋ค: NVMe SSD๋ 5,000๊ฐ+ ๋ฌธ์์์ ์ค์ฉ์ ์ธ ์ต์ ์๊ฑด์ ๋๋ค. SATA SSD๋ ์ฝ๋ ์ฟผ๋ฆฌ ์ง์ฐ์๊ฐ์ 30โ100%๋ฅผ ์ถ๊ฐํฉ๋๋ค; ํ์ ๋์คํฌ๋ ~2,000๊ฐ ๋ฌธ์ ์ด์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ฆ๋ถ ์ธ๋ฑ์ฑ ๋ฐ ์ค๋ณต ์ ๊ฑฐ
10,000๊ฐ ๋ฌธ์ ์ธ๋ฑ์ค์ 100๊ฐ์ ์ PDF๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ ์ฒด 10,000๊ฐ๋ฅผ ์ฌ์ธ๋ฑ์ฑํ๋๋ก ์๊ตฌํด์๋ ์ ๋ฉ๋๋ค. ์ด ๊ฐ์ด๋์ ๋ชจ๋ ์ํคํ ์ฒ๋ ์ฆ๋ถ ์ถ๊ฐ๋ฅผ ์ง์ํฉ๋๋ค. ๋ ์ด๋ ค์ด ๋ฌธ์ ๋ ์กฐ์ฉํ ๋ ๋ฐฐ์ ์ฒญํฌ๋ฅผ ์ธ๊ณ ๊ฒ์์ ํผ๋์ํค๋ ๊ฑฐ์ ์ค๋ณต๋ ๋ฌธ์๋ฅผ ๊ฐ์งํ๊ณ ์ค๋ณต ์ ๊ฑฐํ๋ ๊ฒ์ ๋๋ค.
- ์์ง ์ ์ ํํ ํด์ ๊ธฐ๋ฐ ์ค๋ณต ์ ๊ฑฐ: ์์ ํ์ผ ๋ฐ์ดํธ์ SHA-256. ํด์๊ฐ ์ด๋ฏธ ์ธ๋ฑ์ค์ ์๋ ํ์ผ์ ๊ฑด๋๋๋๋ค. ์ ๋ ดํ๊ณ , ๋์ผํ ํ์ผ์ ์ก์ง๋ง ๊ฑฐ์ ์ค๋ณต(๋์ผํ ์ค์บ์ ๋ค๋ฅธ OCR ํจ์ค, ํ์ ๋ณํ)์ ๋์นฉ๋๋ค.
- ์ฝํ ์ธ ํด์ ์ค๋ณต ์ ๊ฑฐ: ๊ณต๋ฐฑ์ ์ ๊ฑฐํ ํ ์ถ์ถ๋ ์ผ๋ฐ ํ ์คํธ์ SHA-256. ๋ค๋ฅธ ํ์ผ ํ์์ ๋์ผํ ๋ฌธ์๋ฅผ ์ก์ต๋๋ค. ์์ง์์ ํ์ผ๋น ~5 ms๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๊ฑฐ์ ์ค๋ณต์ ์ํ MinHash: ๋์ผํ ๋ฌธ์์ ์ฌ๋ฌ ์ด์์ด ์์ด๋ ๋ฒ์ , ํ๋ฌธ์ ์ฝํผ์ค์ ๊ฒฝ์ฐ MinHash ์๋ช (~128 ๋ฐ์ดํธ/๋ฌธ์)์ ๊ณ์ฐํ๊ณ ๊ธฐ์กด ํญ๋ชฉ์ Jaccard ์ ์ฌ๋ ์๊ณ๊ฐ ๋ด์ ์๋ ํ์ผ์ ๊ฑด๋๋๋๋ค.
- ๋ฌธ์ ID๋ ์๊ตฌ์ ์ ๋๋ค: ์ญ์ ํ ๋ฌธ์ ID๋ฅผ ์ฌ์ฌ์ฉํ์ง ๋ง์ญ์์ค. ๋ฒกํฐ ์คํ ์ด๋ ์ข ์ข ์ ์ ๊ณ ์ ๋ฒกํฐ๋ฅผ ์ ์งํฉ๋๋ค. ID ์ฌ์ฌ์ฉ์ ์กฐ์ฉํ ํผ๋์ ์ผ๊ธฐํฉ๋๋ค. UUID ๋๋ ํด์ ๊ธฐ๋ฐ ID๋ฅผ ์ฌ์ฉํ์ญ์์ค.
- ์๋ฒ ๋ ๋ณ๊ฒฝ ์ ์ฌ์๋ฒ ๋ฉ: ๋ชจ๋ ์ํคํ ์ฒ๋ ์๋ฒ ๋ฉ ๋ชจ๋ธ์ ๋ณ๊ฒฝํ ๋ ์์ ํ ์ฌ์ธ๋ฑ์ฑ์ ๊ฐ์ ํฉ๋๋ค. 10,000๊ฐ ๋ฌธ์๋ฅผ ์ธ๋ฑ์ฑํ๊ธฐ ์ ์ ์ต์ 1๋ ๋์ ์ฝ์ ํ ์๋ฒ ๋ ์ ํ์ ๊ณํํ์ญ์์ค.
- ์ญ์ : ChromaDB์ Qdrant๋ ID๋ณ ํฌ์ธํธ ์ญ์ ๋ฅผ ์ง์ํฉ๋๋ค. LanceDB๋ ๋์คํฌ ๊ณต๊ฐ์ ํ์ํ๊ธฐ ์ํ ์์ถ ๋จ๊ณ๊ฐ ํ์ํฉ๋๋ค โ ์๋ณ๋ก ์ฝํผ์ค์ ~5% ์ด์์ ์ญ์ ํ๋ ๊ฒฝ์ฐ ์ฃผ๊ฐ ์ผ์ ์ ์ก์ผ์ญ์์ค.
โ ๏ธWarning: ์ฅ๊ธฐ ์คํ ๊ฐ์ธ RAG ์์คํ ์์ ๊ฐ์ฅ ํํ ์กฐ์ฉํ ์คํจ๋ ์ค๋ณต ์์ง์ ๋๋ค: ๋ ๊ฐ์ง ๋ค๋ฅธ ํ์์ผ๋ก ์ถ๊ฐ๋ ๋์ผํ ๊ธฐ์ฌ, ๋๋ ๋ ๋ฒ ๋ด๋ณด๋ธ ๋์ผํ ์ํค ํ์ด์ง. ์ฆ์์๋ "๋ชจ๋ธ์ด ๊ฐ์ ์ฒญํฌ๋ฅผ ๊ณ์ ์ธ ๋ฒ ์ธ์ฉํ๋ค"์ "ํฉ์ฑ ์ฟผ๋ฆฌ๊ฐ ์ด์ํ๊ฒ ๋ฐ๋ณต์ ์ด ๋๋ค"๊ฐ ํฌํจ๋ฉ๋๋ค. 1,000๊ฐ ๋ฌธ์๋ฅผ ์ด๊ณผํ๊ธฐ ์ ์ ์ฝํ ์ธ ํด์ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ์ถ๊ฐํ์ญ์์ค.
๊ท๋ชจ์์์ RAG ํ์ง ๋ชจ๋ํฐ๋ง
10,000๊ฐ ๋ฌธ์ RAG ์์คํ ์ ๋ฌธ์๋ฅผ ์ถ๊ฐํ๊ณ , ๋ชจ๋ธ์ ๋ณ๊ฒฝํ๊ณ , ์ฃ์ง ์ผ์ด์ค๋ฅผ ๋ฐ๊ฒฌํ๋ฉด์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์กฐ์ฉํ ์ ํ๋ฉ๋๋ค. ํด๊ฒฐ์ฑ ์ ์ํ ํ๊ฐ ํ๋ค์ค์ ๋๋ค โ ์ ์คํ๊ฒ ์ ํ๋ 30โ50๊ฐ์ ์ฟผ๋ฆฌ/์๋ต ์ โ ๊ฐ ์ค์ํ ๋ณ๊ฒฝ ์ ์ฌ์คํ๋ฉ๋๋ค. 5๋ถ์ ํ๊ฐ๊ฐ ๋ช ์ฃผ์ ํผ๋์ค๋ฌ์ด ๊ฒ์์ ๋ฐฉ์งํฉ๋๋ค.
- ์ํ ๊ณจ๋ ์ธํธ ๊ตฌ์ถ: ์ฌ๋ฐ๋ฅธ ๋ต์ ์๊ณ ์๋ ์ค์ ์ฌ์ฉ์์ ์ถ์ถํ 30โ50๊ฐ์ ์ฟผ๋ฆฌ. ํฉํธ ๊ฒ์(5โ10๊ฐ), ํฉ์ฑ(5โ10๊ฐ), ๊ต์ฐจ ๋ฌธ์(5โ10๊ฐ), ์ฃ์ง ์ผ์ด์ค(5โ10๊ฐ), ์ฝํผ์ค์ ์๋ ์ฟผ๋ฆฌ์ ๋ํ ์๋ ค์ง ๋ฏธ์ค(5โ10๊ฐ)๋ฅผ ํฌํจํ์ญ์์ค.
- ์ฟผ๋ฆฌ๋น ์ธ ๊ฐ์ง ์งํ ์ถ์ : ๊ฒ์ ์ฌํ์จ(์ฌ๋ฐ๋ฅธ ์ฒญํฌ๊ฐ top-K์ ๋ํ๋ฌ์ต๋๊น?), ์์ฑ ์ถฉ์ค๋(์๋ต์ด ์ฒญํฌ์ ์ผ์นํฉ๋๊น?), ๊ฑฐ๋ถ์จ(์์คํ ์ด ์๋ ค์ง ๋ฏธ์ค ์ฟผ๋ฆฌ์ ๋ํด "์ฝํผ์ค์ ์์ต๋๋ค"๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋งํฉ๋๊น?).
- ๊ฐ ์ค์ํ ๋ณ๊ฒฝ ์ ์ฌ์คํ: ์ ์์ง ๋ฐฐ์น, ์๋ฒ ๋ ๋ณ๊ฒฝ, ์ฒญํฌ ํฌ๊ธฐ ๋ณ๊ฒฝ, ํ๋กฌํํธ ์กฐ์ . ์ด์ ์คํ๊ณผ ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํฉ๋๋ค. ๊ฒ์ ์ฌํ์จ์ด๋ ์๋ต์ด ๋ณ๊ฒฝ๋ ์ฟผ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค.
- ์๋ํ๋ ํ๊ฐ ํ๋ ์์ํฌ๋ก Trulens ๋๋ RAGAS. ๋ ๋ค ๋ก์ปฌ๋ก ์คํ๋๊ณ LlamaIndex์ ํตํฉ๋ฉ๋๋ค. 30โ50๊ฐ ์ฟผ๋ฆฌ์ ์๋ ์ ์ ๋งค๊ธฐ๊ธฐ๋ ์ ํจํ๋ฉฐ ์ข ์ข ๋ ์ ํํฉ๋๋ค.
- ์ง์ฐ์๊ฐ ์์ฐ: ์๊ฐ ๊ฒฝ๊ณผ์ ๋ฐ๋ผ p50 ๋ฐ p95 ์ฟผ๋ฆฌ ์ง์ฐ์๊ฐ์ ์ถ์ ํฉ๋๋ค. p95์์ 50% ๊ธ์ฆ์ ์ผ๋ฐ์ ์ผ๋ก ์ธ๋ฑ์ค๊ฐ RAM์ ์ด๊ณผํ์์ ์๋ฏธํฉ๋๋ค โ ๋ค์ ์ํคํ ์ฒ ์์ค์ผ๋ก ์ด๋ํด์ผ ํ๋ค๋ ์กฐ๊ธฐ ์ ํธ.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
RAG ๊ธฐ๋ณธ ์ค์ ์ ๋ช ๊ฐ์ ๋ฌธ์์์ ์คํจํฉ๋๊น?
๊ธฐ๋ณธ ์ค์ (512 ํ ํฐ ์ฒญํฌ, ๊ฒน์นจ ์์, ๊ธฐ๋ณธ ์๋ฒ ๋, top-K 4)์ด ์๋ 16 GB ๋ ธํธ๋ถ์์ ๊ฒ์ ํ์ง์ 1,000โ2,000๊ฐ ๋ฌธ์ ์ฃผ๋ณ์์ ๋์ ๋๊ฒ ์ ํ๋๊ธฐ ์์ํ๊ณ 5,000๊ฐ ์ด์์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ ๊ฐ์ง ์คํจ ๋ชจ๋๋ "์ฌ๋ฐ๋ฅธ ๋ฌธ์, ์๋ชป๋ ์ฒญํฌ"(๊ท๋ชจ์์ ๋๋ฌด ์ข์ top-K)์ ์ธ๋ฑ์ค๊ฐ RAM์ ์ด๊ณผํ ๋ ์กฐ์ฉํ ์ฌํ์จ ํ๋ฝ์ ๋๋ค. AnythingLLM์ ์กฐ์ ๋ ์ค์ (์ฒญํฌ 1,000/200 + nomic-embed-text-v1.5)์ ์ ๋ฒฝ์ ~3,000๊ฐ ๋ฌธ์๋ก ์ฌ๋ฆฝ๋๋ค. ๊ทธ ์ด์์์๋ ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์๊ณผ ์ฌ๋ญ์ปค๊ฐ ํ์ํฉ๋๋ค.
ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์(BM25 + ๋ฒกํฐ)์ ์ฌ์ฉํด์ผ ํฉ๋๊น?
์, 1,000๊ฐ ๋ฌธ์ ์ด์์์. ์์ ๋ฐ์ง ๊ฒ์์ ๋๋ฌธ ๊ณ ์ ๋ช ์ฌ, ๋ฒ๋ น ๋ฒํธ, ํน์ ์๋ณ์(์: "Section 230(c)(1)" ๋๋ ๊ณ์ฝ MSA ๋ฒํธ)๊ฐ ์๋ ์ฟผ๋ฆฌ๋ฅผ ๋์นฉ๋๋ค. ์์ BM25๋ ํจ๋ฌํ๋ ์ด์ฆ๋ ์ฟผ๋ฆฌ๋ฅผ ๋์นฉ๋๋ค. ๋ ๊ฐ์ ์์ 25๊ฐ ๋ชฉ๋ก์ Reciprocal Rank Fusion์ด ํ์ค ๊ฒฐํฉ์์ ๋๋ค. Qdrant์ Weaviate๋ ๊ธฐ๋ณธ ํ์ด๋ธ๋ฆฌ๋๋ฅผ ์ง์ํฉ๋๋ค; ChromaDB๋ Whoosh ๋๋ Tantivy๊ฐ ์ถ๊ฐ๋ก ํ์ํฉ๋๋ค. ์ถ๊ฐ ๊ฒ์ ๋น์ฉ์ ~50โ100 ms; ํ์ง ํฅ์์ ์๋นํฉ๋๋ค.
์๋ฒ ๋ฉ ์์ฑ ํ 1,000๊ฐ PDF์ ์ผ๋ง๋ ๋ง์ ์ ์ฅ์๊ฐ ํ์ํฉ๋๊น?
1,000 ํ ํฐ ์ฒญํฌ์ 200 ํ ํฐ ๊ฒน์นจ์ผ๋ก nomic-embed-text-v1.5(768 ์ฐจ์)๋ฅผ ์ฌ์ฉํ ๋ฐ์ง ๋ฒกํฐ ์ธ๋ฑ์ค์ ๋์คํฌ์ ์ฝ 250โ400 MB. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์ฌ์ฉํ๋ฉด BM25 ์ธ๋ฑ์ค์ ~50โ150 MB, ๊ณ์ธต์ ๊ฒ์์ ์ฌ์ฉํ๋ฉด ๋ฌธ์๋น ์์ฝ์ ~50โ100 MB๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋ณธ PDF ์์ฒด๋ ๋๋ถ๋ถ์ ๋ฒกํฐ DB์ ์ ์ฅ๋์ง ์์ต๋๋ค โ ์ถ์ถ๋ ํ ์คํธ์ ์๋ฒ ๋ฉ๋ง. 10,000๊ฐ PDF ์ฝํผ์ค๋ ์๋ณธ PDF๊ฐ ์ฐจ์งํ๋ ๊ฒ ์ธ์ ๋ฒกํฐ์ ~3โ5 GB๊ฐ ํ์ํฉ๋๋ค.
์ฌ๋ญํน์ด ๊ท๋ชจ์์ ๋์์ด ๋ฉ๋๊น?
์ โ ์ฌ๋ญํน์ 5,000โ50,000๊ฐ ๋ฌธ์ ์ฌ์ด์์ ๋จ์ผ ์ต๋ ์ํฅ๋ ฅ ์ถ๊ฐ์ ๋๋ค. ์ฌ๋ญ์ปค ์์ด๋ "์ฌ๋ฐ๋ฅธ ๋ฌธ์, ์๋ชป๋ ์ฒญํฌ" ์คํจ๊ฐ ์ด ๊ท๋ชจ์์ ~15โ25%์ ๊ฒฝ์ฐ ๋ฐ์ํฉ๋๋ค. ํ์ด๋ธ๋ฆฌ๋ ๊ฒ์์ ์์ 50๊ฐ ํ๋ณด์ BGE-reranker-v2-m3๋ฅผ ์ฌ์ฉํ๋ฉด 5% ๋ฏธ๋ง์ผ๋ก ๋จ์ด์ง๋๋ค. ์ฌ๋ญ์ปค๋ CPU์์ ~200โ500 ms ๋๋ GPU์์ ~80โ150 ms๋ฅผ ์ถ๊ฐํฉ๋๋ค. 1,000๊ฐ ๋ฌธ์ ๋ฏธ๋ง์์๋ ํ์ง ํฅ์์ด ์ง์ฐ์๊ฐ ๋น์ฉ์ ์ ๋นํํ์ง ์์ต๋๋ค. 5,000๊ฐ ๋ฌธ์ ์ด์์์๋ ๊ทธ๊ฒ์ ์๋ตํ๋ฉด ์ค์ ์ฌํ์จ์ด ๋ฎ์์ง๋๋ค.
์ค๋ณต ๋๋ ๊ฑฐ์ ์ค๋ณต๋ ๋ฌธ์๋ฅผ ์ด๋ป๊ฒ ์ฒ๋ฆฌํฉ๋๊น?
์ธ ๋ ์ด์ด์์ ์ค๋ณต ์ ๊ฑฐ: ์์ ํ์ผ ๋ฐ์ดํธ์ SHA-256(๋์ผํ ํ์ผ์ ์ก์), ๊ณต๋ฐฑ์ ์ ๊ทํํ ํ ์ถ์ถ๋ ์ผ๋ฐ ํ ์คํธ์ SHA-256(๋ค๋ฅธ ํ์์ ๋์ผํ ์ฝํ ์ธ ๋ฅผ ์ก์), ~0.85 Jaccard ์๊ณ๊ฐ์ MinHash ์๋ช (์ฌ๋ฌ ์ด์์ด๋ OCR ๋ณํ ๊ฐ์ ๊ฑฐ์ ์ค๋ณต์ ์ก์). ์๋ฒ ๋ฉ ์ ์ ์์ง ์ ์ธ ๊ฐ์ง ๋ชจ๋ ์คํํฉ๋๋ค. ๋๋ฝ๋ ์ค๋ณต ์ ๊ฑฐ์ ๊ฐ์ฅ ํํ ์ฆ์์ "ํฉ์ฑ ์ฟผ๋ฆฌ๊ฐ ์ด์ํ๊ฒ ๋ฐ๋ณต์ ์ด ๋๋ค" โ ๋์ผํ ์ฒญํฌ๊ฐ ์ธ ๊ฐ์ ID ์๋์ ์ธ ๋ฒ ์ ์ฅ๋์ด LLM์ด ์ปจํ ์คํธ์์ ์ธ ๋ฒ ๋ด ๋๋ค.
์ ์ฒด๋ฅผ ์ฌ์ธ๋ฑ์ฑํ์ง ์๊ณ ์ฆ๋ถ์ผ๋ก ๋ฌธ์๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๊น?
์, ์ด ๊ฐ์ด๋์ ๋ชจ๋ ์ํคํ ์ฒ๋ ์ฆ๋ถ ์ถ๊ฐ๋ฅผ ์ง์ํฉ๋๋ค. ChromaDB์ Qdrant๋ ๊ฐ๋จํ ์ฝ์ ํธ์ถ๋ก ์ ์ฒญํฌ๋ฅผ ์๋ฝํฉ๋๋ค; LanceDB๋ ์ถ๊ฐ ์ ์ฉ ํ์ผ์ ์ถ๊ฐํฉ๋๋ค; LlamaIndex๋ ๊ทธ ์ค ์ด๋ ๊ฒ์ด๋ ๊ฐ์๋๋ค. ์์ธ๋ ์๋ฒ ๋ฉ ๋ชจ๋ธ ๋ณ๊ฒฝ์ ๋๋ค โ ํ๋์ ์ธ๋ฑ์ค์ ๋ ๋ชจ๋ธ ๋ฒ์ ์ ์๋ฒ ๋ฉ์ ํผํฉํ๋ฉด ๊ฒ์์ด ์กฐ์ฉํ ์ ํ๋๊ธฐ ๋๋ฌธ์ ์์ ํ ์ฌ์ธ๋ฑ์ฑ์ ๊ฐ์ ํฉ๋๋ค. 5,000๊ฐ ๋ฌธ์๋ฅผ ์ด๊ณผํ๊ธฐ ์ ์ ์๋ฒ ๋๋ฅผ ์ ํํ๊ณ ์ต์ 1๋ ๋์ ๊ทธ๊ฒ์ ์ฝ์ ํ์ญ์์ค.
๋ํ ์ปฌ๋ ์ ์ ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง์ ์ฌ์ฉํด์ผ ํฉ๋๊น?
์ โ ๋ฉํ๋ฐ์ดํฐ ํํฐ๋ง์ ๊ท๋ชจ์์ ๊ฐ์ฅ ์ ๋ ดํ 5โ10ร ๊ฐ์์
๋๋ค. ์ธ๋ฑ์ฑ ์ ๊ฐ ์ฒญํฌ์ source_filename, page_number, document_type, author, year, ๋ชจ๋ ๋๋ฉ์ธ๋ณ ํ๊ทธ๋ฅผ ์ฑ์ฐ์ญ์์ค. ์ฟผ๋ฆฌ ์ ๋ฒกํฐ ๊ฒ์์ด ์คํ๋๊ธฐ ์ ์ ํ์ด๋ก๋๋ก ์ฌ์ ํํฐ๋งํฉ๋๋ค. 10,000๊ฐ ๋ฌธ์ ์ฝํผ์ค์์ ์ผ๋ฐ์ ์ธ ํํฐ๋ ๊ฒ์ ๊ณต๊ฐ์ ํ์ง ์์ค ์์ด ์๋ฐฑ ๊ฐ์ ์ฒญํฌ๋ก ์ค์
๋๋ค. Qdrant์ Weaviate์๋ ์ผ๊ธ ํ์ด๋ก๋ ์ง์์ด ์์ต๋๋ค; ChromaDB์ LanceDB๋ ์ง์ํ์ง๋ง 100,000๊ฐ+ ์ฒญํฌ ์ด์์์๋ ํํฐ ์คํ์ด ๋ค์ ๋๋ฆฝ๋๋ค.
๊ท๋ชจ์์ RAG ํ์ง์ ์ด๋ป๊ฒ ๋ชจ๋ํฐ๋งํฉ๋๊น?
์ํ ๊ณจ๋ ์ธํธ๋ฅผ ๊ตฌ์ถํ์ญ์์ค โ ํฉํธ ๊ฒ์, ํฉ์ฑ, ๊ต์ฐจ ๋ฌธ์, ์ฃ์ง ์ผ์ด์ค, ์๋ ค์ง ๋ฏธ์ค ์ฟผ๋ฆฌ๋ฅผ ์ปค๋ฒํ๋ ์ค์ ์ฌ์ฉ์์ ์ ์คํ๊ฒ ์ ํ๋ 30โ50๊ฐ์ ์ฟผ๋ฆฌ/์๋ต ์ โ ๊ฐ ์ค์ํ ๋ณ๊ฒฝ(์ ์์ง, ์๋ฒ ๋ ๋ณ๊ฒฝ, ์ฒญํฌ ํฌ๊ธฐ ๋ณ๊ฒฝ, ํ๋กฌํํธ ์กฐ์ ) ์ ์ฌ์คํํฉ๋๋ค. ๊ฒ์ ์ฌํ์จ(์ฌ๋ฐ๋ฅธ ์ฒญํฌ๊ฐ top-K์ ๋ํ๋ฌ์ต๋๊น?), ์์ฑ ์ถฉ์ค๋(์๋ต์ด ์ฒญํฌ์ ์ผ์นํฉ๋๊น?), ๊ฑฐ๋ถ์จ(์์คํ ์ด "์ฝํผ์ค์ ์์ต๋๋ค"๋ผ๊ณ ํด์ผ ํ ๋ ๋งํฉ๋๊น?)์ ์ถ์ ํฉ๋๋ค. Trulens์ RAGAS๊ฐ ์ด๊ฒ์ ์๋ํํฉ๋๋ค. 30๊ฐ ์ฟผ๋ฆฌ์ ์๋ ์ ์ ๋งค๊ธฐ๊ธฐ๋ ์ ํจํ๋ฉฐ ์ข ์ข ๋ ์ ํํฉ๋๋ค.
10,000๊ฐ ๋ฌธ์์๋ ์ด๋ค ํ๋์จ์ด๊ฐ ํ์ํฉ๋๊น?
์ต์: 32 GB ์์คํ RAM, NVMe SSD์ 50+ GB ์ฌ์ ๊ณต๊ฐ, 8 GB+ VRAM์ ๋ ๋ฆฝ GPU ๋๋ 32 GB+ ํตํฉ ๋ฉ๋ชจ๋ฆฌ์ Apple Silicon. GPU/Apple Silicon์ ์ผํ์ฑ ์ธ๋ฑ์ฑ ์๋๋ฅผ ์ํ ๊ฒ์ ๋๋ค(10,000๊ฐ ๋ฌธ์ ์ธ๋ฑ์ฑ ํจ์ค์์ 1โ3์๊ฐ ์ ์ฝ); ์ฟผ๋ฆฌ ์ ์ถ๋ก ์ ์ธ๋ฑ์ค ๊ตฌ์ฑ ํ CPU์์ ์ ์๋ํฉ๋๋ค. SATA SSD๋ ํ์ฉ๋์ง๋ง ์ฝ๋ ์ฟผ๋ฆฌ ์ง์ฐ์๊ฐ์ 30โ100%๋ฅผ ์ถ๊ฐํฉ๋๋ค; ํ์ ๋์คํฌ๋ ~2,000๊ฐ ๋ฌธ์ ์ด์์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. RAM์ด ๋จผ์ ๋ํ๋๋ ์ ์ฝ์ ๋๋ค โ 5 GB ์ธ๋ฑ์ค๋ HNSW ์ธ๋ฑ์ฑ์ผ๋ก 16 GB RAM์์ ํธ์ํ๊ฒ ์ฟผ๋ฆฌ๋ฉ๋๋ค.
๋ก์ปฌ์์ ๋ฉํฐ ์ฌ์ฉ์ RAG๋ฅผ ์๋นํ ์ ์์ต๋๊น?
์ โ ์ด ๊ฐ์ด๋์ ์ํคํ ์ฒ ์ค ์ด๋ ๊ฒ ์์์๋ Open WebUI๋ฅผ ๋๊ฑฐ๋, ๋ง์ถค Python ์คํ์ ์ํ FastAPI ์๋น์ค๋ก ๊ฐ์ธ์ญ์์ค. ๋ฉํฐ ์ฌ์ฉ์๋ ์ด์ ์ด์ (์ธ์ฆ, ์ฌ์ฉ์๋ณ ๋ฌธ์ ๊ฒฉ๋ฆฌ, ์๋ ์ ํ, ์ ํ์ ์ฌ์ฉ์๋ณ ์ํฌ์คํ์ด์ค)์ ๋ฐ๊พธ์ง๋ง ๊ฒ์ ์ํคํ ์ฒ๋ ๋ฐ๊พธ์ง ์์ต๋๋ค. Open WebUI๋ ์ธ์ฆ, OAuth, ์ญํ ๊ธฐ๋ฐ ๋ฌธ์ ์ ๊ทผ์ ๊ธฐ๋ณธ์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. 10,000๊ฐ ๋ฌธ์ ์ฝํผ์ค์์ ๋์ 5+ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ์ธ๋ฑ์ฑ ์ค GPU์์ ์๋ฒ ๋๋ฅผ ์คํํ๊ณ QPS์ ๋ฐ๋ผ CPU ๋๋ GPU์์ ์ฟผ๋ฆฌ ์ ์๋ฒ ๋ฉ์ ๊ณํํ์ญ์์ค โ ๋จ์ผ CPU ์๋ฒ ๋๋ ~3โ5 QPS๋ฅผ ํธ์ํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.