Skip to content

mehot98/chat-da

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

519 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

image.png


๐Ÿ“† ๊ธฐ๊ฐ„

2024.02.19~2024.04.03

๐Ÿ’– ํ”„๋กœ์ ํŠธ ๊ธฐํš

  • ์‚ผ์„ฑ ๋‹ท์ปด์„ ์‚ฌ์šฉํ•ด ๋ƒ‰์žฅ๊ณ ๋ฅผ ๊ฒ€์ƒ‰ํ•  ๊ฒฝ์šฐ ๊ฐ™์€ ์ด๋ฆ„์ด์ง€๋งŒ ๋‹ค๋ฅธ ๊ฐ€๊ฒฉ์˜ ์ œํ’ˆ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ๊ฐ€๊ฒฉ์ด ๋‹ค๋ฅธ ์ œํ’ˆ์€ ์ œํ’ˆ ๋ช…์€ ๊ฐ™์ง€๋งŒ ์ŠคํŽ™ ์ •๋ณด๊ฐ€ ์‚ด์ง ๋‹ค๋ฅธ ์ด์œ ์˜€๊ณ  ๊ณ ๊ฐ๋“ค์ด ์ด ์ œํ’ˆ๋“ค์„ ๋ชจ๋‘ ๋น„๊ตํ•˜๊ธฐ์—๋Š” ๋ถˆํŽธํ•จ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์ œํ’ˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ๊ฐ์˜ ์ œํ’ˆ ์ƒ์„ธ์ •๋ณด ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•ด์•ผ๋งŒ ํ•ด๋‹น ์ œํ’ˆ์— ๋Œ€ํ•œ ์ŠคํŽ™์„ ์•Œ์•„๋‚ผ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋„ ๋ถˆํŽธํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’• ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

  • RAG ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ ์šฉํ•œ ์‚ผ์„ฑ ๋‹ท์ปด ์ฑ—๋ด‡ ChatDA ๊ฐœ๋ฐœ
  • ๊ณ ๊ฐ์—๊ฒŒ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ์›ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ฑ—๋ด‡์„ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๊ฐ์€ ์ด๋ฅผ ํ†ตํ•ด์„œ ๊ธฐ์กด ์ฑ—๋ด‡์—์„œ๋Š” ์–ป์ง€ ๋ชปํ–ˆ๋˜ ๋ƒ‰์žฅ๊ณ  ์ œํ’ˆ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜ํ•œ ์ œํ’ˆ ๋น„๊ต๊ฐ€ ํ›จ์”ฌ ๊ฐ„ํŽธํ•ด์ง‘๋‹ˆ๋‹ค.
  • ๋˜ํ•œ ์‚ผ์„ฑ๋‹ท์ปด์„ ํ™œ์šฉํ•˜๋ฉฐ ๊ถ๊ธˆํ•œ ์ ์ด ์žˆ๋‹ค๋ฉด ํ˜ธ์ถœ์–ด ์ธ์‹ ๊ธฐ๋Šฅ(Hi ChatDA)์„ ํ†ตํ•ด ChatDA๋ฅผ ํ˜ธ์ถœํ• ์ˆ˜ ์žˆ์œผ๋ฉฐ ์Œ์„ฑ ์ธ์‹ ๊ธฐ๋Šฅ์œผ๋กœ ๋Œ€ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๐Ÿƒ ๊ฐœ๋ฐœ ์ธ์›

์„œ๋‹ค์ฐฌ (ํŒ€์žฅ) ์ด์Šน์ค€ ์ด์Šน๋ฏผ ๋ฐ•์ด์–ธ ๋‚˜ํ•ด๋ž€ ์ด์ง„์„ฑ

๋ฐฑ์—”๋“œ

๋ฐฑ์—”๋“œ

๋ฐฑ์—”๋“œ

๋ฐฑ์—”๋“œ

ํ”„๋ก ํŠธ์—”๋“œ

ํ”„๋ก ํŠธ์—”๋“œ

๐Ÿ’› ๊ฐœ๋ฐœ ํ™˜๊ฒฝ

  • Front : React, TypeScript,
  • Back-end : FastAPI, Uvicorn, Mysql
  • ๋ฒ„์ „๊ด€๋ฆฌ : Gitlab
  • ํ˜‘์—… ํˆด : Notion, Jira
  • ๋ฐฐํฌ : Jenkins, Docker
  • ๋ชจ๋‹ˆํ„ฐ๋ง : Elastic Search, Logstash, Beats, Kibana

๋นŒ๋“œ ๋ฐฉ๋ฒ•

1. FastAPI

  • ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ
$ pip install -r requirements.txt
  • ์‹คํ–‰
$ uvicorn chatdaAPI.main.app:app --host 0.0.0.0 --reload

2. React

  • ํŒจํ‚ค์ง€ ๋‹ค์šด๋กœ๋“œ
$ npm i
  • ๋นŒ๋“œ
$ npm run dev

๐Ÿ’š ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜

prefix ์„ค๋ช…
feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
fix ๋ฒ„๊ทธ ์ˆ˜์ •
docs ๋ฌธ์„œ ์ˆ˜์ •
style ์ฝ”๋“œ ํฌ๋งทํŒ…, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ
refactor ์ฝ”๋“œ ๋ฆฌํŽ™ํ† ๋ง
test ํ…Œ์ŠคํŠธ ์ฝ”๋“œ, ๋ฆฌํŽ™ํ† ๋ง ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ถ”๊ฐ€
chore ๋นŒ๋“œ ์—…๋ฌด ์ˆ˜์ •, ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •
etc ๊ธฐํƒ€ ์—…๋ฌด

๐Ÿ’œERD

erd.png

๐Ÿ–คAPI

https://documenter.getpostman.com/view/32331322/2sA35K21LW

๐Ÿ’š Project Architecture

chatda_system_architecture.png

๐Ÿ’› ๊ธฐ๋Šฅ๋ณ„ ์†Œ๊ฐœ

1. ๋น„๊ตํ•˜๊ธฐ

๋ฒ„ํŠผ์„ ํ†ตํ•œ ๋น„๊ตํ•˜๊ธฐ

feature1.gif

์ฑ„ํŒ…์„ ํ†ตํ•œ ๋น„๊ตํ•˜๊ธฐ

feature2.gif

2. ์ œํ’ˆ ์ •๋ณด ๊ฒ€์ƒ‰

feature3.gif

3. ์ธ๊ธฐ ์ˆœ์œ„ ๋ฐ ์กฐ๊ฑด ๊ฒ€์ƒ‰

feature4.gif

4. ๋ฆฌ๋ทฐ ์š”์•ฝ & ์ œํ’ˆ ๋ณธ๋ฌธ ์š”์•ฝ

feature5.gif

5. ํ˜ธ์ถœ์–ด ์ธ์‹ ๊ธฐ๋Šฅ

feature6.gif

6. ๋ชจ๋‹ˆํ„ฐ๋ง

feature7.gif

๐Ÿ’™Bug Report

1. Cloudํ™˜๊ฒฝ Server Sent Event Buffering

  • FastAPI์—์„œ ์ฑ„ํŒ… ๋‚ด์—ญ์„ ์ฃผ๊ณ  ๋ฐ›์œผ๋ฉด SSE(Server Sent Event)๋ฅผ ํ™œ์šฉํ•ด ํ•œ๊ธ€์ž์”ฉ ์ถœ๋ ฅ์ด ๋˜๋„๋ก ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ํ•ด๋‹น ์ด๋ฒคํŠธ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค๊ฐ€ ๋ฐฐํฌ ๋  ๊ฒฝ์šฐ ์ „์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•œ๋ฒˆ์— ๋ฒ„ํผ๋ง ๋˜์–ด ๋ฐ›์•„์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์˜ ์›์ธ์€ Event Stream์„ ํ™œ์šฉํ•˜๋ฉฐ ๋งŒ์•ฝ Event๋ฅผ ๋ณด๋‚ด๋Š” ๊ฐ„๊ฒฉ์ด ๋„ˆ๋ฌด ์งง์„ ๊ฒฝ์šฐ AWS์™€ ๊ฐ™์€ ํด๋ผ์šฐ๋“œ์—์„œ ๋ฒ„ํผ๋ง์„ ํ†ตํ•ด ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ๋ฒˆ์— ๋ณด๋‚ด๋Š” ๊ฒƒ์ด์˜€์Šต๋‹ˆ๋‹ค.
  • ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ๊ฐ์˜ event ๋’ค์— sleep(0.02)๋กœ ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด๋ฅผ ์ถ”๊ฐ€์‹œํ‚ด์œผ๋กœ์จ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค.

2. useState ๊ฐ์ฒด ๋ฐฐ์—ด ๋ณต์‚ฌ ๋ฌธ์ œ

  • ๊ฐ๊ฐ์˜ ์ฑ„ํŒ… ๋‚ด์—ญ์€ ์›น์—์„œ SessionStorage์— ์ €์žฅ์ด ๋˜๊ณ  React์—์„œ๋Š” state๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ ์ด์ „ ๋‚ด์—ญ์„ ์ €์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ฑ„ํŒ… ๋‚ด์—ญ์„ ์ž…๋ ฅ ๋ฐ›์œผ๋ฉด์„œ Event Stream์„ ํ†ตํ•ด ํ•œ๊ธ€์ž์”ฉ ์ž…๋ ฅ์„ ๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ ๋Œ€ํ™” ๋‚ด์—ญ์— ๊ธ€์ž๊ฐ€ ํ•˜๋‚˜๋งŒ ์ถ”๊ฐ€๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
 const fetchMessage = async (message: string, tts = false) => {
    setMessages((prev) => [
      ...prev,
      { content: message, isUser: true },
      { isUser: false, isLoading: true },
    ]);
  • ํ•ด๋‹น ๋ฌธ์ œ๋Š” useState๋ฅผ ํ™œ์šฉํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ํ˜•์‹์˜ ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค.
const [messages, setMessages] = useState([])
  • ์œ„์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋ฉ”์„ธ์ง€ ๋‚ด์šฉ์„ ์ €์žฅํ–ˆ์ง€๋งŒ json๊ณผ ๊ฐ™์€ ํ˜•์‹์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ์ดˆ๊ธฐํ™”๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
const [messages, setMessages] = useState([{}])

3. FastAPI SnakeCase to CamelCase

  • ํŒŒ์ด์ฌ ์ฝ”๋“œ์—์„œ๋Š” snake_case๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์›น์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฅด๊ธฐ ์œ„ํ•ด์„œ๋Š” camelCase๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ด๋ฅผ ์œ„ํ•ด์„œ Pydantic์—์„œ BaseModel์„ ์‚ฌ์šฉํ• ๋•Œ ๋ณ„๋„์˜ CamelModel์ด๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•˜๊ณ  ํ•ด๋‹น ํด๋ž˜์Šค๊ฐ€ BaseModel์„ ์ƒ์†๋ฐ›์€ ๋’ค config์—์„œ ์™ธ๋ถ€๋กœ ๋…ธ์ถœ๋˜๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ๋Š” snake_case๋ฅผ camelCase๋กœ ๋ณ€ํ™˜ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
class CamelModel(BaseModel):
    model_config = ConfigDict(
        alias_generator=to_camel,
        populate_by_name=True,
        protected_namespaces=(),
        from_attributes=True,
    )

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 6