Skip to content

cyh5757/HackathonLLM

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

33 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ˜ SnackRAG: ๊ณผ์ž/์ฒจ๊ฐ€๋ฌผ GPT ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ

SnackRAG๋Š” ์‹ํ’ˆ ๋ฐ ์ฒจ๊ฐ€๋ฌผ ์ •๋ณด๋ฅผ OpenAI GPT-4o๋ฅผ ์ด์šฉํ•ด ์ž์—ฐ์–ด๋กœ ์งˆ๋ฌธํ•˜๊ณ , LangChain ๊ธฐ๋ฐ˜ RAG(Retrieval-Augmented Generation) ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋‹ต๋ณ€ํ•˜๋Š” FastAPI + Chainlit ํ”„๋กœ์ ํŠธ์ž…๋‹ˆ๋‹ค.


๐Ÿง  ๊ธฐ์ˆ  ์Šคํƒ

  • LLM: OpenAI GPT-4o via LangChain
  • Vector DB: PostgreSQL + PGVector
  • Embedding: text-embedding-3-small
  • Backend: FastAPI + SQLModel
  • Frontend: Chainlit (React ๊ธฐ๋ฐ˜ LLM ์ฑ„ํŒ… UI)
  • Streaming: SSE (Server-Sent Events)

๐Ÿš€ ์‹คํ–‰ ๋ฐฉ๋ฒ•

# Docker ์‹คํ–‰
docker-compose up --build

# Chainlit ์‹คํ–‰ (ํฌํŠธ 8502)
chainlit run chainlit/main.py --port 8502

๐Ÿ” ์ฃผ์š” API

Endpoint ์„ค๋ช…
/api/v1/snacks/test/rag ์ฟผ๋ฆฌ ๊ธฐ๋ฐ˜ GPT-4 ์‘๋‹ต ์ƒ์„ฑ
/api/v1/snacks/sse SSE ๊ธฐ๋ฐ˜ ์ŠคํŠธ๋ฆฌ๋ฐ ์‘๋‹ต
/api/v1/snacks/test/rag/context-only GPT ํ˜ธ์ถœ ์—†์ด ์œ ์‚ฌ ๋ฌธ์„œ๋งŒ ๊ฒ€์ƒ‰

๐Ÿงช ์˜ˆ์‹œ ์งˆ๋ฌธ

  • "MSG๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ณผ์ž๋ฅผ ์•Œ๋ ค์ค˜"
  • "์•„์ด๋“ค์—๊ฒŒ ์•ˆ์ „ํ•œ ๊ณผ์ž๋ฅผ ์ถ”์ฒœํ•ด์ค˜"
  • "์ด ์ฒจ๊ฐ€๋ฌผ์€ ์–ด๋–ค ์šฉ๋„์ธ๊ฐ€์š”?"

๐Ÿ—‚๏ธ ํด๋” ๊ตฌ์กฐ

  • app/ - ๋ฐฑ์—”๋“œ ์ „์ฒด ๊ตฌ์„ฑ
  • app/repository/ - PGVector ๋ฐ DB ์•ก์„ธ์Šค
  • app/services/ - RAG ๋กœ์ง, GPT ํ˜ธ์ถœ
  • chainlit/ - ํ”„๋ก ํŠธ์—”๋“œ UI
  • sql/ - ๋ฐ์ดํ„ฐ ์ดˆ๊ธฐํ™” ๋ฐ ์ž„๋ฒ ๋”ฉ ๋Œ€์ƒ

๐Ÿง  RAG ์‹œ์Šคํ…œ ๊ตฌ์„ฑ

SnackRAG๋Š” Retrieval-Augmented Generation ๊ตฌ์กฐ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค:

[User Query]
    โ†“
[Retriever] PGVector๋กœ ์œ ์‚ฌ ๋ฌธ์„œ ๊ฒ€์ƒ‰
    โ†“
[Context Builder] ๊ด€๋ จ ์ •๋ณด ๋ฌธ์ž์—ด ๊ตฌ์„ฑ
    โ†“
[Generator] LangChain ๊ธฐ๋ฐ˜ GPT-4o ํ˜ธ์ถœ
    โ†“
[Streaming Response] Chainlit ๋˜๋Š” FastAPI๋ฅผ ํ†ตํ•ด SSE ์ „์†ก
  • ๋ฌธ์„œ ์ž„๋ฒ ๋”ฉ: OpenAIEmbeddings(text-embedding-3-small)
  • LLM ์‘๋‹ต: ChatOpenAI(model="gpt-4o")
  • ๋ฒกํ„ฐ ๊ฒ€์ƒ‰: cosine ์œ ์‚ฌ๋„ ๊ธฐ๋ฐ˜
  • ๋ฌธ๋งฅ ์ฃผ์ž…: ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ๋‚ด {context} ํ™œ์šฉ

๐Ÿ”Ž ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชจ๋ธ ๊ฐœ์š”

ํ…Œ์ด๋ธ” ์„ค๋ช…
snack ๊ณผ์ž ๊ธฐ๋ณธ ์ •๋ณด
snack_additive ์ฒจ๊ฐ€๋ฌผ ์ •๋ณด ๋ฐ ๋“ฑ๊ธ‰
snack_item ๊ณผ์ž๋ณ„ ์˜์–‘ ์„ฑ๋ถ„
map_snack_item_additive ๊ณผ์ž-์ฒจ๊ฐ€๋ฌผ ๊ด€๊ณ„ N:M ๋งคํ•‘
pg_embedding ๋ฒกํ„ฐํ™”๋œ ๋ฌธ์„œ์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

๐Ÿงช ํ…Œ์ŠคํŠธ

pytest tests/

๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์˜ˆ์‹œ:

  • RAG ์‘๋‹ต์ด ์ •์ƒ์ ์œผ๋กœ ์ƒ์„ฑ๋˜๋Š”์ง€ ํ™•์ธ
  • ์‘๋‹ต์ด ๋ฌธ์ž์—ด์ด๊ณ , ํ•„์ˆ˜ ํ‚ค์›Œ๋“œ๋ฅผ ํฌํ•จํ•˜๋Š”์ง€ ๊ฒ€์ฆ

๐Ÿ“ฆ ํ–ฅํ›„ ๊ฐœ์„  ๋ฐฉํ–ฅ

  • โœ… LangSmith ์ถ”์  ํ™œ์„ฑํ™”
  • โœ… ๋ฌธ์„œ relevance ํ‰๊ฐ€ ๋ชจ๋ธ ๊ณ ๋„ํ™” (re-ranking)
  • โœ… ์‚ฌ์šฉ์ž ํ”„๋กœํŒŒ์ผ ๊ธฐ๋ฐ˜ ์ถ”์ฒœ ์‹œ์Šคํ…œ ์ ‘๋ชฉ
  • โœ… ํ”„๋กฌํ”„ํŠธ ๋‹ค์–‘ํ™” ๋ฐ ์•ˆ์ „์„ฑ ์ฒดํฌ ๋ชจ๋ธ ์ถ”๊ฐ€

๐Ÿง  RAG ์‹œ์Šคํ…œ ์ƒ์„ธ ์„ค๋ช…

์ด ํ”„๋กœ์ ํŠธ๋Š” Retrieval-Augmented Generation(RAG) ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ๋‹จ๊ณ„๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

1. ์‚ฌ์šฉ์ž ์งˆ๋ฌธ ์ž…๋ ฅ

Chainlit ๋˜๋Š” FastAPI API๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž์—ฐ์–ด ์งˆ๋ฌธ(query)์„ ์ž…๋ ฅ๋ฐ›์Šต๋‹ˆ๋‹ค.

2. ๋ฌธ์„œ ๊ฒ€์ƒ‰ (Retriever)

app/repository/pgvector_repository.py์—์„œ PGVector๋ฅผ ์ด์šฉํ•ด ์‚ฌ์šฉ์ž ์งˆ๋ฌธ์„ ์ž„๋ฒ ๋”ฉํ•˜๊ณ , cosine similarity ๊ธฐ๋ฐ˜์œผ๋กœ ๊ด€๋ จ ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค.

  • ์‚ฌ์šฉ ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ: text-embedding-3-small
  • ๋ฒกํ„ฐ ์ €์žฅ์†Œ: PostgreSQL + PGVector

3. ๋ฌธ๋งฅ ๊ตฌ์„ฑ (Context Builder)

๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ ๋ฆฌ์ŠคํŠธ๋Š” app/services/rag_service_test.py์—์„œ LangChain์˜ Document ํ˜•์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋˜๊ณ , ํ”„๋กฌํ”„ํŠธ ๋‚ด {context} ์ž๋ฆฌ์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค.

context = "\n\n".join([
  f"๋ฌธ์„œ {i + 1}:\n{doc.page_content}\n๋ฉ”ํƒ€๋ฐ์ดํ„ฐ: {doc.metadata}"
])

4. GPT ์‘๋‹ต ์ƒ์„ฑ (Generator)

LangChain์˜ ChatOpenAI(model="gpt-4o")๋ฅผ ์‚ฌ์šฉํ•ด ์™„์„ฑ๋œ ํ”„๋กฌํ”„ํŠธ๋ฅผ GPT์—๊ฒŒ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ† ํฐ ๋‹จ์œ„๋กœ ์ŠคํŠธ๋ฆฌ๋ฐ๋ฉ๋‹ˆ๋‹ค (StreamingResponse).

5. ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ์ „์†ก

/snacks/sse ๋˜๋Š” /snacks/test/rag/context ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. Chainlit์—์„œ๋Š” httpx.AsyncClient๋ฅผ ํ†ตํ•ด SSE๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ํด๋”๋ณ„ RAG ๊ด€๋ จ ์„ค๋ช…

๐Ÿ“‚ app/services

  • rag_service_test.py: RAG์˜ ํ•ต์‹ฌ ๊ตฌํ˜„ ์œ„์น˜. ๋ฌธ์„œ ๊ฒ€์ƒ‰ โ†’ ๋ฌธ๋งฅ ๊ตฌ์„ฑ โ†’ GPT ์‘๋‹ต ์ƒ์„ฑ.
  • pgvector_service.py: LLM ๊ธฐ๋ฐ˜ ๋ฌธ์„œ relevance ์žฌ์„ ์ • (LLM-based re-ranking).
  • rag_service.py: ๊ฒ€์ƒ‰๋œ ๋ฌธ์„œ + DB ์ƒ์„ธ์ •๋ณด๋ฅผ ํ•จ๊ป˜ ์‘๋‹ต (ํ˜ผํ•ฉํ˜• ์‘๋‹ต์šฉ).
  • generized_metadate_by_ID.py: LLM์„ ํ†ตํ•ด ๋ฒกํ„ฐ ๋ฌธ์„œ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒ์„ฑ ์ž๋™ํ™”.

๐Ÿ“‚ app/api

  • routes/snacks.py: /snacks/test/rag, /snacks/sse ๋“ฑ API ์—”๋“œํฌ์ธํŠธ ์ •์˜.
  • dto/models.py: RAG ์‘๋‹ต ํ˜•์‹ ์ •์˜ (SnackContextPayload, SnackRagDocument ๋“ฑ).
  • deps.py: DB ์„ธ์…˜ ๋ฐ ์˜์กด์„ฑ ์ฃผ์ž… ์ •์˜.

๐Ÿ“‚ app/core

  • agent_tools.py: GPT-4o ๋ชจ๋ธ, OpenAI ์ž„๋ฒ ๋”ฉ ๋ชจ๋ธ, PGVector ๋ฒกํ„ฐ์Šคํ† ์–ด ์ •์˜.
  • prompt.py: GPT ์ž…๋ ฅ์šฉ ํ”„๋กฌํ”„ํŠธ ํ…œํ”Œ๋ฆฟ ์ •์˜ (SEARCH_SELECT_INSTRUCTIONS, RAG_PROMPT).
  • db.py / config.py: DB ์—ฐ๊ฒฐ ์„ค์ • ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋กœ๋”ฉ ๋‹ด๋‹น.

๐Ÿ“Œ ์š”์•ฝ

์ด ํ”„๋กœ์ ํŠธ๋Š” ๋‹จ์ˆœ ๋ฌธ์„œ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์„ ๋„˜์–ด์„œ, ๊ตฌ์กฐํ™”๋œ ๊ณผ์ž/์ฒจ๊ฐ€๋ฌผ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒกํ„ฐํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๊ณ , LangChain + GPT-4o๋กœ ์˜๋ฏธ ์žˆ๋Š” ์งˆ์˜์‘๋‹ต์„ ์ œ๊ณตํ•˜๋Š” ์ •ํ˜• + ์ƒ์„ฑํ˜• ํ†ตํ•ฉํ˜• RAG ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๐Ÿ› ์ตœ์ข… ์•„ํ‚คํ…์ณ

๋™์ž‘ ์•„ํ‚คํ…์ณ

๐Ÿ† ํ•ด์ปคํ†ค ๋ฐ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€

์ฒซ ๊ฒฐ๊ณผ ์ด๋ฏธ์ง€

๋ณ€๊ฒฝ ์ด๋ฏธ์ง€

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors 2

  •  
  •