tweek.ninja

// me?
const tweek: Promise<any> = Promise.resolve(
  `Hi, I'm tweek โ€” a pretty good developer๐Ÿ˜Ž`
).then(checkMyProject)
:::::

TALKIE๐Ÿค”

๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ๋™์ž‘ํ•˜๋Š” RAG LLM, ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋‹ต๋ณ€๊นŒ์ง€ ์ด์–ด์ค๋‹ˆ๋‹ค.

Overview


์‚ฌ์šฉ์ž๊ฐ€ ๋ฌธ์„œ๋ฅผ ์—…๋กœ๋“œํ•˜๋ฉด, ์‹œ์Šคํ…œ์€ ์ด๋ฅผ ์ž„๋ฒ ๋”ฉยท์ธ๋ฑ์‹ฑํ•˜์—ฌ ๋ฒกํ„ฐDB์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
์ดํ›„ ์งˆ๋ฌธ ์‹œ ๊ฒ€์ƒ‰๋œ ๋งฅ๋ฝ์„ ๋ฐ”ํƒ•์œผ๋กœ LLM์ด ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.


๋ชฉํ‘œ

  • ๋‹จ์ˆœ ๊ธฐ๋Šฅ ๊ตฌํ˜„์„ ๋„˜์–ด์„œ ํŒ€/์กฐ์ง์˜ ์ง€์‹ ๊ฒ€์ƒ‰์„ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์œผ๋กœ ์„ค๊ณ„
  • ๋น ๋ฅธ ์‘๋‹ต์„ฑ๊ณผ ์šด์˜ ๊ฐ€์‹œ์„ฑ ํ™•๋ณด โ†’ ํ˜„์—… ์ ์šฉ ๊ฐ€๋Šฅ

ํŠน์ง•

  • ์—”๋“œํˆฌ์—”๋“œ ์ž๋™ํ™”: ์—…๋กœ๋“œ โ†’ ์ธ๋ฑ์‹ฑ โ†’ ๊ฒ€์ƒ‰/์ƒ์„ฑ ํ๋ฆ„์ด ์‚ฌ์šฉ์ž๊ฐ€ ์˜์‹ํ•˜์ง€ ์•Š์•„๋„ ๋™์ž‘
  • ์šด์˜ ์ค‘์‹ฌ ์„ค๊ณ„: JWT ์ธ์ฆ์œผ๋กœ ์ ‘๊ทผ ์ œ์–ด, Grafana ์—ฐ๋™์œผ๋กœ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ยท์ง€์—ฐ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง
  • ํ™•์žฅ์„ฑ ๊ณ ๋ ค: Kafka ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ์™€ Redis ์บ์‹œ๋กœ ๋™์‹œ ์š”์ฒญ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ
  • ๊ฐœ๋ฐœ์ž ์นœํ™”์„ฑ: Next.js & NestJS ๊ฒŒ์ดํŠธ์›จ์ด๋กœ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ํ™•๋ณดํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ ์ตœ์†Œํ™”
  • ๋กœ์ปฌ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ๊ตฌํ˜„: ์˜จํ”„๋ ˆ๋ฏธ์Šคยท์‚ฌ๋‚ด๋ง ํ™˜๊ฒฝ์—์„œ๋„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ฐฐํฌยท์šด์˜ ๊ฐ€๋Šฅ

Architecture


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



ํ”„๋ก ํŠธ์—”๋“œ / ๊ฒŒ์ดํŠธ์›จ์ด

  • Next.js UI์™€ NestJS Gateway๋กœ ์‚ฌ์šฉ์ž ์š”์ฒญ์„ ์ˆ˜์ง‘ํ•˜๊ณ , GraphQL/REST ์ธํ„ฐํŽ˜์ด์Šค์™€ JWT ์ธ์ฆ์„ ์ฒ˜๋ฆฌ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„œ๋ฒ„

  • FastAPI ๊ธฐ๋ฐ˜ ์š”์ฒญ ์ฒ˜๋ฆฌ, Kafka๋ฅผ ํ†ตํ•ด ๋น„๋™๊ธฐ ์ž‘์—…์„ ์›Œ์ปค๋กœ ์œ„์ž„

์›Œํฌํ”Œ๋กœ์šฐ & ์›Œ์ปค

  • ๋ฌธ์„œ ์—…๋กœ๋“œ โ†’ ์ž„๋ฒ ๋”ฉ โ†’ ๋ฒกํ„ฐDB ์ธ๋ฑ์‹ฑ
  • LangChain์„ ํ™œ์šฉํ•ด ๋ฒกํ„ฐ ๊ฒ€์ƒ‰๊ณผ LLM ํ˜ธ์ถœ์„ ์ฒด์ธ ๋‹จ์œ„๋กœ ์กฐํ•ฉ, ๋ชจ๋“ˆ ๊ฐ„ ์—ฐ๊ฒฐ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๋‹จ์ˆœํ™”

๋ฐ์ดํ„ฐ ๊ณ„์ธต

  • Redis: ์บ์‹ฑ, ์„ธ์…˜ ๊ด€๋ฆฌ ๋ฐ Streams ๊ธฐ๋ฐ˜ ์ด๋ฒคํŠธ ํŒŒ์ดํ”„๋ผ์ธ
  • Postgres: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ ๋Œ€ํ™” ํžˆ์Šคํ† ๋ฆฌ ์ €์žฅ
  • Weaviate: ๋ฒกํ„ฐDB๋กœ ๋ฌธ์„œ ๊ฒ€์ƒ‰ ์ธ๋ฑ์‹ฑ
  • MinIO: ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€, ์—…๋กœ๋“œ๋œ ์›๋ณธ ํŒŒ์ผ ๋ฐ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ณด๊ด€

LLM ์—ฐ๊ฒฐ

  • ํ”„๋กฌํ”„ํŠธ์™€ ๊ฒ€์ƒ‰๋œ ๋งฅ๋ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ต๋ณ€ ์ƒ์„ฑ

์šด์˜/๋ชจ๋‹ˆํ„ฐ๋ง

  • Grafana๋กœ ํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰, ์ง€์—ฐ ์‹œ๊ฐ„, RAG ํžˆํŠธ์œจ ๋ชจ๋‹ˆํ„ฐ๋ง

๐Ÿ’ป Frontend

Next.js, TypeScript, Zustand, Apollo

๐Ÿ›ก๏ธ Gateway

NestJS (GraphQL/REST), Zod, JWT

๐Ÿ”ง Backend/Infra

FastAPI, LangChain, Weaviate, Kafka, Redis, Postgres, Minio, Docker

Features


1. ์ž๋™ ์ž„๋ฒ ๋”ฉ & ๋ฒกํ„ฐ ์ธ๋ฑ์‹ฑ

  • ํŒŒ์ผ ์—…๋กœ๋“œ ์‹œ ์ž๋™์œผ๋กœ ๋ฒกํ„ฐํ™”ยท๋ฒกํ„ฐ DB ์ธ๋ฑ์‹ฑ
  • ์›๋ณธ์€ MinIO์— ์ €์žฅ, Weaviate์— ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ๊ธฐ๋ก

2. RAG ๊ธฐ๋ฐ˜ ์งˆ์˜ ์‘๋‹ต

  • FastAPI๊ฐ€ ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๋ฅผ LLM์— ์ „๋‹ฌํ•˜๊ณ , ๋งฅ๋ฝ ๊ธฐ๋ฐ˜ ์‘๋‹ต์„ ์ƒ์„ฑ

3. ์‹ค์‹œ๊ฐ„ ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต (SSE + Redis Stream)

  • LLM ํ† ํฐ์„ ์ˆœ์ฐจ ์ „์†กํ•ด ๋น ๋ฅธ ์‘๋‹ต๊ณผ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™” ๊ฒฝํ—˜ ์ œ๊ณต

4. ๋ณด์•ˆ ๋ฐ ์šด์˜

  • JWT ๊ธฐ๋ฐ˜ ์ธ์ฆ/์ธ๊ฐ€, Grafana ์—ฐ๋™์œผ๋กœ ์š”์ฒญยทํ† ํฐ ์‚ฌ์šฉ๋Ÿ‰ยท์ง€์—ฐ ์‹œ๊ฐ„ ๋ชจ๋‹ˆํ„ฐ๋ง

Demo


General Search


  • ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ์—†์ด ์ฟผ๋ฆฌ๋ฅผ LLM์— ์ง์ ‘ ์ „๋‹ฌ
  • ์‘๋‹ต์€ Redis์— ์บ์‹ฑ ํ›„ ์›Œ์ปค๋ฅผ ํ†ตํ•ด DB์— ์ ์žฌ
  • ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ๋ชฉ๊ณผ ํ•จ๊ป˜ ์„ธ์…˜ ์ƒ์„ฑ

Document Embedding


  • ํŒŒ์ผ์„ S3 ํ”„๋ฆฌ์‚ฌ์ธ URL๋กœ ์—…๋กœ๋“œ
  • ํŒŒ์ผ ์›Œ์ปค๊ฐ€ ์ฒญํ‚น ์ฒ˜๋ฆฌ
  • ์ž„๋ฒ ๋”ฉ ์›Œ์ปค๊ฐ€ ๋ฒกํ„ฐํ™” ์ˆ˜ํ–‰ ํ›„ DB์— ์ ์žฌ

RAG Search


  • ์ฟผ๋ฆฌ๋ฅผ ๋ฒกํ„ฐํ™”ํ•˜์—ฌ ๋ฒกํ„ฐ DB์—์„œ ์œ ์‚ฌ ๋ฌธ์„œ ๊ฒ€์ƒ‰
  • ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ์™€ ์ฟผ๋ฆฌ๋ฅผ ํ•จ๊ป˜ LLM์— ์ „๋‹ฌ
  • ์‘๋‹ต์€ Redis์— ์บ์‹ฑ ํ›„ ์›Œ์ปค๋ฅผ ํ†ตํ•ด DB์— ์ ์žฌ
  • ์‚ฌ์šฉ์ž ํ”„๋กฌํ”„ํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ๋ชฉ๊ณผ ํ•จ๊ป˜ ์„ธ์…˜ ์ƒ์„ฑ