- ์ผ์ฑ ๋ท์ปด์ ์ฌ์ฉํด ๋์ฅ๊ณ ๋ฅผ ๊ฒ์ํ ๊ฒฝ์ฐ ๊ฐ์ ์ด๋ฆ์ด์ง๋ง ๋ค๋ฅธ ๊ฐ๊ฒฉ์ ์ ํ๋ค์ด ๋๋ฌด ๋ง์์ต๋๋ค.
- ๋ํ ๊ฐ๊ฒฉ์ด ๋ค๋ฅธ ์ ํ์ ์ ํ ๋ช ์ ๊ฐ์ง๋ง ์คํ ์ ๋ณด๊ฐ ์ด์ง ๋ค๋ฅธ ์ด์ ์๊ณ ๊ณ ๊ฐ๋ค์ด ์ด ์ ํ๋ค์ ๋ชจ๋ ๋น๊ตํ๊ธฐ์๋ ๋ถํธํจ์ด ์์์ต๋๋ค.
- ๋ํ ์ ํ์ ๋ํ ์ ๋ณด๋ฅผ ์ป๊ธฐ ์ํด์๋ ๊ฐ๊ฐ์ ์ ํ ์์ธ์ ๋ณด ํ์ด์ง์ ์ ๊ทผํด์ผ๋ง ํด๋น ์ ํ์ ๋ํ ์คํ์ ์์๋ผ์ ์๋ค๋ ์ ๋ ๋ถํธํ์ต๋๋ค.
- RAG ์ํคํ ์ฒ๋ฅผ ์ ์ฉํ ์ผ์ฑ ๋ท์ปด ์ฑ๋ด ChatDA ๊ฐ๋ฐ
- ๊ณ ๊ฐ์๊ฒ ์์ฐ์ค๋ฌ์ด ๋ํ๋ฅผ ํตํด ์ํ๋ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ์ฑ๋ด์ ๊ฐ๋ฐํ์ต๋๋ค. ๊ณ ๊ฐ์ ์ด๋ฅผ ํตํด์ ๊ธฐ์กด ์ฑ๋ด์์๋ ์ป์ง ๋ชปํ๋ ๋์ฅ๊ณ ์ ํ์ ๋ํ ์ ๋ณด๋ฅผ ๋ํ๋ฅผ ํตํด ์ป์ ์ ์์ผ๋ฉฐ, ๋ํ ์ ํ ๋น๊ต๊ฐ ํจ์ฌ ๊ฐํธํด์ง๋๋ค.
- ๋ํ ์ผ์ฑ๋ท์ปด์ ํ์ฉํ๋ฉฐ ๊ถ๊ธํ ์ ์ด ์๋ค๋ฉด ํธ์ถ์ด ์ธ์ ๊ธฐ๋ฅ(Hi ChatDA)์ ํตํด ChatDA๋ฅผ ํธ์ถํ ์ ์์ผ๋ฉฐ ์์ฑ ์ธ์ ๊ธฐ๋ฅ์ผ๋ก ๋ํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
| ์๋ค์ฐฌ (ํ์ฅ) | ์ด์น์ค | ์ด์น๋ฏผ | ๋ฐ์ด์ธ | ๋ํด๋ | ์ด์ง์ฑ |
|---|---|---|---|---|---|
๋ฐฑ์๋ |
๋ฐฑ์๋ |
๋ฐฑ์๋ |
๋ฐฑ์๋ |
ํ๋ก ํธ์๋ |
ํ๋ก ํธ์๋ |
- Front : React, TypeScript,
- Back-end : FastAPI, Uvicorn, Mysql
- ๋ฒ์ ๊ด๋ฆฌ : Gitlab
- ํ์ ํด : Notion, Jira
- ๋ฐฐํฌ : Jenkins, Docker
- ๋ชจ๋ํฐ๋ง : Elastic Search, Logstash, Beats, Kibana
- ํจํค์ง ๋ค์ด๋ก๋
$ pip install -r requirements.txt
- ์คํ
$ uvicorn chatdaAPI.main.app:app --host 0.0.0.0 --reload
- ํจํค์ง ๋ค์ด๋ก๋
$ npm i
- ๋น๋
$ npm run dev
| prefix | ์ค๋ช |
|---|---|
| feat | ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ |
| fix | ๋ฒ๊ทธ ์์ |
| docs | ๋ฌธ์ ์์ |
| style | ์ฝ๋ ํฌ๋งทํ , ์ธ๋ฏธ์ฝ๋ก ๋๋ฝ, ์ฝ๋ ๋ณ๊ฒฝ์ด ์๋ ๊ฒฝ์ฐ |
| refactor | ์ฝ๋ ๋ฆฌํํ ๋ง |
| test | ํ ์คํธ ์ฝ๋, ๋ฆฌํํ ๋ง ํ ์คํธ ์ฝ๋ ์ถ๊ฐ |
| chore | ๋น๋ ์ ๋ฌด ์์ , ํจํค์ง ๋งค๋์ ์์ |
| etc | ๊ธฐํ ์ ๋ฌด |
https://documenter.getpostman.com/view/32331322/2sA35K21LW
- FastAPI์์ ์ฑํ ๋ด์ญ์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉด SSE(Server Sent Event)๋ฅผ ํ์ฉํด ํ๊ธ์์ฉ ์ถ๋ ฅ์ด ๋๋๋ก ๊ธฐ๋ฅ์ ๊ตฌํํ์ต๋๋ค.
- ํ์ง๋ง ๋ก์ปฌ ํ๊ฒฝ์์ ํด๋น ์ด๋ฒคํธ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋๋ ๋ฌธ์ ๊ฐ ์์์ง๋ง ํด๋ผ์ฐ๋ ํ๊ฒฝ์์ ์๋น์ค๊ฐ ๋ฐฐํฌ ๋ ๊ฒฝ์ฐ ์ ์ฒด ๋ฐ์ดํฐ๊ฐ ํ๋ฒ์ ๋ฒํผ๋ง ๋์ด ๋ฐ์์ง๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- ์ด๋ฌํ ๋ฌธ์ ์ ์์ธ์ Event Stream์ ํ์ฉํ๋ฉฐ ๋ง์ฝ Event๋ฅผ ๋ณด๋ด๋ ๊ฐ๊ฒฉ์ด ๋๋ฌด ์งง์ ๊ฒฝ์ฐ AWS์ ๊ฐ์ ํด๋ผ์ฐ๋์์ ๋ฒํผ๋ง์ ํตํด ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ๋ณด๋ด๋ ๊ฒ์ด์์ต๋๋ค.
- ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฐ๊ฐ์ event ๋ค์ sleep(0.02)๋ก ์ฝ๊ฐ์ ๋๋ ์ด๋ฅผ ์ถ๊ฐ์ํด์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐ์์ผฐ์ต๋๋ค.
- ๊ฐ๊ฐ์ ์ฑํ ๋ด์ญ์ ์น์์ 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([{}])
- ํ์ด์ฌ ์ฝ๋์์๋ 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,
)















