LLSJYY / pj-cloneGPT

2 stars 0 forks source link

πŸ’»cloneGPT

πŸ’»ν”„λ‘œμ νŠΈ κ°œμš”

openAI model gpt-3.5-turbo을 μ‚¬μš©ν•œ 인곡지λŠ₯ μ±„νŒ… μ›Ήμž…λ‹ˆλ‹€.

πŸ’» 회고 λ…Έμ…˜

ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ μ–΄λ €μ› λ˜ μ μ΄λ‚˜ μΆ”κ°€λ‘œ μ κ³ μ‹Άμ—ˆλ˜ 것듀을 μ μ—ˆμŠ΅λ‹ˆλ‹€.

πŸ’»Demo μ˜μƒ

https://user-images.githubusercontent.com/96014828/230020212-4bdb6b43-17c2-4442-a6a3-cd49f8d43c57.mp4

Demo 사진

image

기술 μŠ€νƒ

Badge Badge Badge Badge Badge Badge

πŸ’» 디렉토리 ꡬ쑰

pj-cloneGPT/src
.
β”œβ”€β”€ api / # api 톡신에 ν•„μš”ν•œ 파일 (`axios.post()`)
β”œβ”€β”€ asset 
β”œβ”€β”€ component 
β”œβ”€β”€ constant / # μƒμˆ˜λ₯Ό λͺ¨μ•„λ‘” 파일 (`"Explain quantum computing in simple terms" 와 같은 μ†Œκ°œκΈ€`)
β”œβ”€β”€ lib / # μƒνƒœ
β”œβ”€β”€ pages 
β”œβ”€β”€ style / # global style
└── utils / # customhook κ³Ό type (useApi,Types)

μœ„μ˜ 디렉토리 κ΅¬μ‘°λŠ” pj-cloneGPT λ ˆν¬μ§€ν† λ¦¬μ˜ 파일 및 폴더 ꡬ쑰와 κ°„λž΅ν•œ μ„€λͺ…κΈ€μž…λ‹ˆλ‹€.

πŸ’»μ£Όμš”κΈ°λŠ₯

ν•΄λ‹Ή ν”„λ‘œμ νŠΈλŠ” openAI model gpt-3.5-turbo을 μ‚¬μš©ν•œ 인곡지λŠ₯ μ±„νŒ… μ›Ήμž…λ‹ˆλ‹€.

λ‹€μ–‘ν•œ Form의 응닡값

ν•΄λ‹Ή λͺ¨λΈμ— μΆ”κ°€λœ κΈ°λŠ₯ roleκ³Ό contentλ₯Ό 미리 μ„€μ •ν•˜μ—¬, μ–΄λ–€ μš”μ²­μ΄ νŠΉμ • ν˜•νƒœμ˜ 응닡이 λ°˜ν™˜λ  경우 정해진 ν˜•μ‹μ˜ chat 으둜 λ‚˜νƒ€λ‚©λ‹ˆλ‹€.
ν˜„μž¬ κ΅¬ν˜„λœ 것은 κ°œλ°œμ½”λ“œ, μˆœμ„œκ°€ μžˆλŠ” μ‘λ‹΅κ°’μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μžλ©΄, κ³„λž€μ„ μ‚ΆλŠ” 방법을 μˆœμ„œλŒ€λ‘œ μ•Œλ €μ€˜ λΌλŠ” μš”μ²­μ΄ μžˆμ„κ²½μš° 응닡값이 ol,li tag둜 감싸진 μ±„λ‘œ μ œκ³΅λ©λ‹ˆλ‹€.

μ—¬λŸ¬κ°œμ˜ μ±„νŒ…

sideBar의 chatBoxλ₯Ό μ—¬λŸ¬κ°œλ₯Ό κ΅¬μ„±ν•˜μ—¬ 관심사 λ³„λ‘œ 진행할 수 μžˆμŠ΅λ‹ˆλ‹€

chatbox_0 => μ½”λ“œμ— κ΄€ν•œ chat 
chatbox_1 => μš”λ¦¬μ— κ΄€ν•œ chat 

πŸ’»μ΄μŠˆ 및 해결방법

λͺ¨λΈ μ—…κ·Έλ ˆμ΄λ“œ gpt model μ—…κ·Έλ ˆμ΄λ“œ κ΄€ν•œ Issue & PR

기쑴에 μ‚¬μš©ν–ˆλ˜ text-davinci-003 λͺ¨λΈμ΄ νŠΉμ • μ‚¬μ΄νŠΈμ—μ„œ μ œκ³΅ν•˜λ˜ 인곡지λŠ₯ 챗보닀 μ„±λŠ₯이 많이 λ–¨μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.
속도적인 뢀뢄은 많이 λΉ¨λžμœΌλ‚˜, 신뒰도가 많이 λ–¨μ–΄μ§€λŠ” μ‘λ‹΅κ°’μ˜ λΉˆλ„κ°€ λ†’μ•„ μœ νš¨μ„±κ²€μ‚¬λ₯Ό μ§„ν–‰ν•΄μ•Όλ§Œ ν–ˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ κ·Έκ³Όμ •μ—μ„œ λ„ˆλ¬΄λ‚˜ λ§Žμ€ 경우의 μˆ˜κ°€ μžˆμ–΄ κΌ­ κ°œμ„ μ΄ ν•„μš”ν–ˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μžλ©΄ isAlpha()와 같은 ν•¨μˆ˜λ₯Ό λ§Œλ“€μ–΄ μ•ŒνŒŒλ²³μœΌλ‘œ μ‹œμž‘ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μž¬μš”μ²­μ„ ν•˜λŠ” μ‹μœΌλ‘œ μ‚¬μš©ν•˜μ˜€μœΌλ‚˜, 정상적인 응닡값일지라도 μž¬μš”μ²­μ΄ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λŒ€μ•ˆμœΌλ‘œ λͺ¨λΈ μ—…κ·Έλ ˆμ΄λ“œλ₯Ό μ„ νƒν•˜μ˜€μœΌλ‚˜ 응닡속도가 많이 느렸고,νŠΉμ • ν˜•νƒœμ˜ 응닡이 λ°˜ν™˜λ  경우 정해진 ν˜•μ‹μ˜ chatForm으둜 ν‘œν˜„μ„ ν•˜κ³  μ‹Άμ—ˆκΈ° λ•Œλ¬Έμ—

응닡 > μœ νš¨μ„±μ²΄ν¬ > νŠΉμ •νΌμœΌλ‘œ λ³€ν™˜ > λ Œλ”λ§ 

둜 μ§„ν–‰λ˜μ–΄ 더 λŠ¦μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

ν•΄κ²°μ±…μœΌλ‘œ role,content 정보λ₯Ό 미리 μ‚½μž…ν•˜μ—¬ νŠΉμ • 응닡값이라면 λ―Έλ¦¬μ…‹νŒ…λœ νƒœκ·Έλ‘œ 감싸진 응닡값을 λ°˜ν™˜ν•˜κ²Œ μ„€μ •ν•˜μ˜€μŠ΅λ‹ˆλ‹€. ν˜„μž¬λŠ” dangerousSetInnerHTML 을 μ‚¬μš©ν•˜μ—¬ api 응닡값을 λ°”λ‘œ μ‚½μž…ν•˜μ—¬ 2가지 과정이 μƒλž΅λœ μƒνƒœμ—¬μ„œ μ†λ„λ¬Έμ œλ„ μ›ν™œν•˜κ²Œ ν•΄κ²°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

Type Form μž¬μ‚¬μš© Type μž¬μ‚¬μš© PR

image

μœ„ 이미지와 같이,img + Text 의 ν˜•μ‹μ„ 가진 κΈ°λŠ₯μ—μ„œ 같은 λ‘œμ§μ„ μ‚¬μš©ν•˜μ˜€μ§€λ§Œ typeκ°™μ€κ²½μš° 같은 Typeμ΄μ§€λ§Œ keyκ°’λ§Œ λ°”κΏ” μ‚¬μš©ν•˜λŠ”κ²ƒμ΄ λΆˆνŽΈν•˜μ—¬ κ°œμ„ μ˜ ν•„μš”μ„±μ„ λŠκΌˆμŠ΅λ‹ˆλ‹€ μ•„λž˜μ™€ 같이 key만 μ»€μŠ€ν…€ν•΄μ„œ μ‚¬μš©ν•  수 있게 λͺ¨λ“ˆν™” ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

type Data<T extends string> = `${T}Data`;
type Img<T extends string> = `${T}Img`;
type Detail<T extends string> = `${T}Detail`;

export type IMockData<T> = {
  [key: Data<string>]: string[];
  [key: Img<string>]: string[];
  [key: Detail<string>]: T;
};