Skip to content
@PersonaBook

PersonaBook

๐Ÿ“š AI ์ฑ—๋ด‡ ๊ธฐ๋ฐ˜ ๊ฐœ์ธํ™” ํ•™์Šต ์ง€์› ์„œ๋น„์Šค

Spring Boot + Thymleaf + FastAPI + LangChain + MySQL + Elasticsearch๋ฅผ ํ™œ์šฉํ•œ AI ์ฑ—๋ด‡ ๊ธฐ๋ฐ˜ ๊ฐœ์ธํ™” ํ•™์Šต ์ง€์› ์„œ๋น„์Šค


๐Ÿง  ์ฃผ์š” ์„œ๋น„์Šค ๊ฐœ์š”

์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์—…๋กœ๋“œํ•œ ๊ต์žฌ(PDF)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ, ๊ฐœ์ธ์˜ ์ดํ•ด๋„์— ๋งž์ถ˜ ๋ฌธ์ œ ์ƒ์„ฑ, ๊ฐœ๋… ์„ค๋ช… ๋“ฑ์„ ์ œ๊ณตํ•˜๋Š” AI ์ฑ—๋ด‡ ๊ธฐ๋ฐ˜ ๊ฐœ์ธํ™” ํ•™์Šต ์ง€์› ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. LangChain๊ณผ GPT-4๋ฅผ ํ™œ์šฉํ•ด, ๋‹จ์ˆœํ•œ ์ฑ—๋ด‡์ด ์•„๋‹Œ ๋Œ€ํ™” ํ๋ฆ„์— ๋”ฐ๋ผ ๋ฐ˜๋ณต ํ•™์Šต๊ณผ ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ ๋ฃจํ”„๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด Spring Boot โ†” FastAPI(LangChain) โ†” Elasticsearch๊ฐ€ ์œ ๊ธฐ์ ์œผ๋กœ ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค.


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

System Architecture


๐Ÿ–ผ๏ธ ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ

https://www.figma.com/board/Xw0B6VFKSx0Uj0tRNO2FgA/Untitled?node-id=0-1&p=f&t=8jBj2pGFQPkSKXHv-0


๐Ÿ–ผ๏ธ ํ™”๋ฉด ์ •์˜์„œ

https://www.figma.com/design/XE0okH23BBH3Sgld85ljAA/4-1%EC%A1%B0-Chatbot-Project?node-id=0-1&p=f&t=QVZlIA1iFr26CEnJ-0


๐Ÿงฑ ์‹œ์Šคํ…œ ๊ฐœ์š”

๋ณธ ์‹œ์Šคํ…œ์€ Docker Compose ๋„คํŠธ์›Œํฌ ๊ธฐ๋ฐ˜์˜ ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ์•„ํ‚คํ…์ฒ˜๋กœ, Spring Boot, FastAPI, MySQL, Elasticsearch ๋“ฑ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค:

  • โœ๏ธ ๋…ธํŠธ/๋ฉ”๋ชจ ๊ธฐ๋ฐ˜ ํ•™์Šต ์ง€์›
  • ๐Ÿ’ฌ ์ƒํƒœ ๊ธฐ๋ฐ˜ ์ฑ—๋ด‡๊ณผ์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™” ํ๋ฆ„
  • ๐Ÿง  LangChain ๊ธฐ๋ฐ˜ ๋ฌธ์ œ ์ƒ์„ฑ ๋ฐ ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ
  • ๐Ÿ” Elasticsearch๋ฅผ ํ†ตํ•œ ๊ต์žฌ ๊ฒ€์ƒ‰ ๋ฐ ์œ ์‚ฌ ๋ฌธ์„œ ํƒ์ƒ‰

โš™๏ธ ๊ธฐ์ˆ  ์Šคํƒ

๊ตฌ๋ถ„ ๊ธฐ์ˆ 
ํ”„๋ก ํŠธ์—”๋“œ Thymeleaf (Spring ๊ธฐ๋ฐ˜ SSR)
๋ฐฑ์—”๋“œ (๋ฉ”์ธ) Spring Boot (Java 17)
AI ์„œ๋ฒ„ FastAPI (Python 3.10) + LangChain
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค MySQL 8.0
๊ฒ€์ƒ‰์—”์ง„ Elasticsearch 8.x
์ปจํ…Œ์ด๋„ˆํ™” Docker, Docker Compose
LLM ์—ฐ๋™ OpenAI GPT-4 API
๋ฌธ์„œ ๊ฒ€์ƒ‰ ์ตœ์ ํ™” RAG (Retrieval-Augmented Generation) ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ

๐Ÿ“Œ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์—ญํ• 

๊ตฌ์„ฑ ์š”์†Œ ์—ญํ• 
๐Ÿ‘ฅ ์‚ฌ์šฉ์ž ์›น UI์—์„œ ์ฑ—๋ด‡๊ณผ ์ƒํ˜ธ์ž‘์šฉ, ๋…ธํŠธ ์ž‘์„ฑ, PDF ์—ด๋žŒ
๐ŸŒฑ Spring Boot + Thymleaf ์ƒํƒœ ์ œ์–ด, ์‚ฌ์šฉ์ž ์ธ์ฆ, PDF ๋ Œ๋”๋ง ๋ฐ ๋…ธํŠธ ๊ด€๋ฆฌ
โšก FastAPI (LangChain) ์˜ˆ์ƒ ๋ฌธ์ œ ์ƒ์„ฑ, ์˜ค๋‹ต ๋ถ„์„, ๊ฐœ๋… ์„ค๋ช… (LLM ํ˜ธ์ถœ)
๐Ÿ”Ž Elasticsearch ๊ต์žฌ ๋ฌธ์„œ ์ž„๋ฒ ๋”ฉ ๋ฐ RAG ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰
๐Ÿฌ MySQL ์‚ฌ์šฉ์ž/๋…ธํŠธ/์ด๋ ฅ ์ •๋ณด ์ €์žฅ
๐ŸŒ ์™ธ๋ถ€ API ์œ„ํ‚ค/๋ฐฑ๊ณผ ๋“ฑ์„ ํ†ตํ•œ ๊ฐœ๋… ์„ค๋ช… ๋ณด๊ฐ•

๐Ÿ” ์ฃผ์š” ์‹œ๋‚˜๋ฆฌ์˜ค ํ๋ฆ„

๐Ÿค– ์ฑ—๋ด‡ ์„œ๋น„์Šค ํ๋ฆ„ ๋ฐ ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ

[์‚ฌ์šฉ์ž ์š”์ฒญ]
     โ†“
[Spring ChatService: ์ƒํƒœ ํŒ๋‹จ + ํ๋ฆ„ ์ œ์–ด]
     โ†“                     โ†˜๏ธ
[์ƒํƒœ ์ „์ด์— ๋”ฐ๋ฅธ ๋กœ์ง ์ฒ˜๋ฆฌ]  โ†’ (ํ•„์š” ์‹œ) [FastAPI (/chat)] ํ˜ธ์ถœ
     โ†“
[๋‹ค์Œ ์ƒํƒœ + ๋ฉ”์‹œ์ง€ ๊ฒฐ์ •]
     โ†“
[ChatHistory ์ €์žฅ + ์‘๋‹ต ๋ฐ˜ํ™˜]

Sequence Diagram

๐Ÿค– AI ํ•™์Šต ๋„์šฐ๋ฏธ ์ฑ—๋ด‡(์ƒํƒœ ๊ธฐ๋ฐ˜ ํ๋ฆ„)

๐Ÿ“ START โ†’ WAITING_USER_SELECT_FEATURE
         // ๊ธฐ๋Šฅ ์„ ํƒ ๋Œ€๊ธฐ (1. ๋ฌธ์ œ ์ƒ์„ฑ / 2. ํŽ˜์ด์ง€ ์ฐพ๊ธฐ / 3. ๊ฐœ๋… ์„ค๋ช…)

         โ”œโ”€ 1. ์˜ˆ์ƒ ๋ฌธ์ œ ์ƒ์„ฑ
         โ”‚   โ†’ WAITING_PROBLEM_CRITERIA_SELECTION
         โ”‚     // ๋ฌธ์ œ ๊ธฐ์ค€ ์„ ํƒ ์š”์ฒญ
         โ”‚     โ†’ WAITING_PROBLEM_CONTEXT_INPUT
         โ”‚       // ์ฑ•ํ„ฐ/๊ฐœ๋… ์ž…๋ ฅ ์š”์ฒญ
         โ”‚       โ†’ โšก GENERATING_QUESTION_WITH_RAG
         โ”‚         // FastAPI ํ˜ธ์ถœ๋กœ ๋ฌธ์ œ ์ƒ์„ฑ
         โ”‚         โ†’ โšก EVALUATING_ANSWER_AND_LOGGING
         โ”‚           // FastAPI ํ˜ธ์ถœ๋กœ ์ •์˜ค๋‹ต ํŒ๋‹จ ๋ฐ ํ•ด์„ค ํฌํ•จ
         โ”‚           โ†’ WAITING_CONCEPT_RATING
         โ”‚             // ํ•ด์„ค์— ๋Œ€ํ•œ ์ดํ•ด๋„ ํ‰๊ฐ€ ์š”์ฒญ
         โ”‚             โ”œโ”€ 4~5์  โ†’ WAITING_NEXT_ACTION_AFTER_LEARNING
         โ”‚             โ”‚           // ๋‹ค์Œ ํ–‰๋™ ์„ ํƒ (1. ๋‹ค์Œ ๋ฌธ์ œ / 2. ๊ธฐ๋Šฅ ์„ ํƒ)
         โ”‚             โ”‚           โ”œโ”€ 1. ๋‹ค์Œ ๋ฌธ์ œ โ†’ โšก GENERATING_ADDITIONAL_QUESTION_WITH_RAG
         โ”‚             โ”‚           โ”‚                        โ†’ โšก EVALUATING_ANSWER_AND_LOGGING โ†’ ...
         โ”‚             โ”‚           โ””โ”€ 2. ๊ธฐ๋Šฅ ์„ ํƒ โ†’ WAITING_USER_SELECT_FEATURE
         โ”‚             โ””โ”€ 1~3์  โ†’ WAITING_REASON_FOR_LOW_RATING
         โ”‚                          // ๋‚ฎ์€ ์ ์ˆ˜ ์ด์œ  ์š”์ฒญ
         โ”‚                          โ†’ โšก REEXPLAINING_CONCEPT
         โ”‚                            // FastAPI ํ˜ธ์ถœ๋กœ ๋ณด์ถฉ ์„ค๋ช…
         โ”‚                            โ†’ WAITING_CONCEPT_RATING (๋ฐ˜๋ณต)

         โ”œโ”€ 2. ํŽ˜์ด์ง€ ์ฐพ๊ธฐ
         โ”‚   โ†’ WAITING_KEYWORD_FOR_PAGE_SEARCH
         โ”‚     // ํ‚ค์›Œ๋“œ ์ž…๋ ฅ ๋Œ€๊ธฐ
         โ”‚     โ†’ โšก PROCESSING_PAGE_SEARCH_RESULT
         โ”‚       // FastAPI ํ˜ธ์ถœ๋กœ ํŽ˜์ด์ง€/์ฑ•ํ„ฐ ์ถ”์ฒœ
         โ”‚       โ†’ WAITING_USER_SELECT_FEATURE (๋ฃจํ”„)

         โ””โ”€ 3. ๊ฐœ๋… ์„ค๋ช…
             โ†’ WAITING_CONCEPT_INPUT
             // ๊ฐœ๋… ์ž…๋ ฅ ๋Œ€๊ธฐ
               โ†’ โšก PRESENTING_CONCEPT_EXPLANATION
               // FastAPI ํ˜ธ์ถœ๋กœ ๊ฐœ๋… ์„ค๋ช…
                 โ†’ WAITING_CONCEPT_RATING
                   // ์„ค๋ช…์— ๋Œ€ํ•œ ํ‰๊ฐ€
                   โ”œโ”€ 4~5์  โ†’ WAITING_NEXT_ACTION_AFTER_LEARNING โ†’ (์„ ํƒ์— ๋”ฐ๋ผ ๋ฃจํ”„)
                   โ””โ”€ 1~3์  โ†’ WAITING_REASON_FOR_LOW_RATING โ†’ โšก REEXPLAINING_CONCEPT โ†’ WAITING_CONCEPT_RATING (๋ฐ˜๋ณต)

๐Ÿ“‚ ํ”„๋กœ์ ํŠธ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ

๐Ÿ“ฆKDT_BE12_Toy_Project4/
โ”œโ”€ ๐Ÿ“ application-server/             # Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
โ”‚  โ””โ”€ ๐Ÿ“ application/                 # ํ•ต์‹ฌ ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“ˆ
โ”‚     โ”œโ”€ ๐Ÿ“ src/                      # Java ์†Œ์Šค ์ฝ”๋“œ
โ”‚     โ”œโ”€ ๐Ÿ“œ build.gradle              # Gradle ๋นŒ๋“œ ์Šคํฌ๋ฆฝํŠธ
โ”‚     โ”œโ”€ ๐Ÿ“œ Dockerfile                # Spring Boot Dockerfile
โ”‚     โ””โ”€ ...
โ”‚
โ”œโ”€ ๐Ÿ“ langchain-server/              # FastAPI + LangChain ๊ธฐ๋ฐ˜ AI ์„œ๋ฒ„
โ”‚  โ”œโ”€ ๐Ÿ“ app/                         # FastAPI ๋ผ์šฐํ„ฐ ๋ฐ ์„œ๋น„์Šค ์ฝ”๋“œ
โ”‚  โ”œโ”€ ๐Ÿ“ tests/                       # ํ…Œ์ŠคํŠธ ์ฝ”๋“œ
โ”‚  โ”œโ”€ ๐Ÿ“œ Dockerfile                   # FastAPI Dockerfile
โ”‚  โ”œโ”€ ๐Ÿ“œ Dockerfile.elasticsearch     # Elasticsearch ํฌํ•จ ๋นŒ๋“œ์šฉ Dockerfile
โ”‚  โ””โ”€ ๐Ÿ“œ pyproject.toml              # Python ํ”„๋กœ์ ํŠธ ์„ค์ •
โ”‚
โ”œโ”€ ๐Ÿ“œ docker-compose.yml             # ์ „์ฒด ๋ฉ€ํ‹ฐ ์ปจํ…Œ์ด๋„ˆ ๊ตฌ์„ฑ ํŒŒ์ผ
โ”œโ”€ ๐Ÿ“œ .env.dev                        # ๊ฐœ๋ฐœ์šฉ ํ™˜๊ฒฝ ๋ณ€์ˆ˜
โ”œโ”€ ๐Ÿ“œ .env.prod                       # ์šด์˜์šฉ ๋ฏผ๊ฐ ์ •๋ณด (Git ์ œ์™ธ ๊ถŒ์žฅ)
โ”œโ”€ ๐Ÿ“œ README.md
โ””โ”€ ...

๐Ÿณ Docker ๊ธฐ๋ฐ˜ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

๐Ÿ“‚ ์ฃผ์š” ์„œ๋น„์Šค ์š”์•ฝ

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช… ํ˜ธ์ŠคํŠธ ํฌํŠธ โ†’ ์ปจํ…Œ์ด๋„ˆ ํฌํŠธ
Spring Boot ์‚ฌ์šฉ์ž API / View ๋ Œ๋”๋ง 8080:8080
MySQL ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค 3307:3306
FastAPI (LangChain) AI ๊ธฐ๋ฐ˜ ์‘๋‹ต ์ฒ˜๋ฆฌ 8000:8000
Elasticsearch ๊ฒ€์ƒ‰ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ 9200:9200

๐Ÿงญ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ

  • ๋ชจ๋“  ์ปจํ…Œ์ด๋„ˆ๋Š” Docker Compose์˜ backend ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐ
  • ๋‚ด๋ถ€ DNS ์ด๋ฆ„ (mysql, langchain, elasticsearch)์œผ๋กœ ์„œ๋กœ ์ ‘๊ทผ

๐Ÿ” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ด€๋ฆฌ ์ „๋žต

ํŒŒ์ผ๋ช… ๋ชฉ์  ๋น„๊ณ 
.env.dev ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์šฉ ์„ค์ • (DB ํฌํŠธ, ์„œ๋น„์Šค ์ด๋ฆ„ ๋“ฑ) ๋กœ์ปฌ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ณตํ†ต์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก Git์— ํฌํ•จ
.env.prod ์šด์˜ ๋˜๋Š” ๋ฐฐํฌ์šฉ ๋ฏผ๊ฐ ์ •๋ณด (API ํ‚ค, ์‹œํฌ๋ฆฟ ๋“ฑ) ๋ณด์•ˆ์ƒ Git์— ํฌํ•จ โŒ, ๋กœ์ปฌ ๋˜๋Š” ์„œ๋ฒ„์—์„œ ๊ฐœ๋ณ„ ๊ด€๋ฆฌ ํ•„์š”

.env.prod ์˜ˆ์‹œ

OPENAI_API_KEY=sk-xxxxxxxxxxxx
OPENAI_MODEL_NAME=gpt-4

GEMINI_API_KEY=xxxxxxxxxxxx
GOOGLE_SEARCH_API_KEY=xxxxxxxxxxxx
GOOGLE_CSE_ID=xxxxxxxxxxxx

๐Ÿ“Œ ์ด์Šˆ ์‚ฌํ•ญ

  • ํ˜„์žฌ API ํ‚ค ๋งŒ๋ฃŒ ์ƒํƒœ(langchain-server์˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์ง€ ๋ชปํ•จ)
    • API ํ‚ค ๋งŒ๋ฃŒ๋กœ PDF ์ž„๋ฒ ๋”ฉ์ด ๋˜์ง€ ์•Š์Œ
    • BookEmbeddingService.java์—์„œ PDF ์ž„๋ฒ ๋”ฉ ์š”์ฒญ ๋กœ์ง ์ˆ˜์ • ํ•„์š”
    • ์ด ์™ธ์—๋Š” langchain-server์˜ ํ…Œ์ŠคํŠธ ํ•„์š”
  • ...

Popular repositories Loading

  1. persona-book persona-book Public

    Python

  2. .github .github Public

Repositories

Showing 2 of 2 repositories

Top languages

Loadingโ€ฆ

Most used topics

Loadingโ€ฆ