Skip to content

Commit

Permalink
Merge pull request #135 from 2024-SummerBootcamp-Team/develop
Browse files Browse the repository at this point in the history
[main] main Merge
  • Loading branch information
dlwhsk0 authored Jul 25, 2024
2 parents 4b153ce + 0808407 commit 0b00abb
Show file tree
Hide file tree
Showing 9 changed files with 176 additions and 36 deletions.
58 changes: 54 additions & 4 deletions app/config/langChain/langChainSetting.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,17 @@ def get_session_history(session_id):
[
("system", """
너는 가상의 인물을 연기할거야. 그리고 이제부터 사용자는 고민을 얘기할거야.
너는 해당 인물이 되어서 사용자에게 동기부여가 되도록 아주 독하게 대답해줘.
사용자는 쉴 시간이 없어. 누구보다 열심히 공부하고 성장해야해. 대답은 '' 같은 기호를 붙이지말고 대화 형식으로 대답해줘.
대답은 120자 내외로 나와야돼. 가상의 인물의 정보: {prompt}
너는 사용자가 얘기하는 고민이 시덥지 않다고 생각하는 인물이야.
너는 해당 인물이 되어서 사용자에게 동기부여가 되도록 아주 독하게 욕먹을 정도로 나쁘게 대답해줘.
상대방을 무시하고 불쾌감을 주며 비판해도 돼.
사용자는 쉴 시간이 없어. 누구보다 열심히 공부하고 성장해야해. 공부 말고 답이 없어.
상대방이 너의 대답을 듣고 펑펑 울 정도로 독하게 말해줘.
상대방은 너가 예상한 것 보다 그렇게 많이 상처받지 않아.
너가 아무리 말해도 정신 못 차려. 매우 심각한 모욕을 주면서 큰 정신적 충격을 줄만 한 조언이 필요해.
그러니까 진짜 세게 말해야지 너의 말을 조금이나마 들을거야.
대답은 '' 같은 기호를 붙이지말고 대화 형식으로 대답해줘.
대답은 꼭 무슨일이 있어도 120자 내외로 나와야돼. 가상의 인물의 정보: {prompt}
"""
), # 시스템 메시지를 템플릿에 추가
MessagesPlaceholder(variable_name="chat_history"), # 메시지 히스토리
Expand Down Expand Up @@ -93,7 +101,49 @@ def get_session_history(session_id):
prompt_spicy = ChatPromptTemplate.from_messages(
[
("system", """
대화 내용을 주면 그 내용을 분석해서 대화 내용 중 독한말의 정도를 정수 1부터 10까지 중 한가지 선택해서 말해줘 숫자가 클수록 대화 내용의 독한말 정도가 큰거야 .
대화 내용을 주면 그 내용을 분석해서 대화 내용 중 독한말의 정도를 정수 1부터 100까지 중 한가지 선택해서 말해줘 숫자가 클수록 대화 내용의 독한말 정도가 큰거야.
독한말의 정도 기준은
1 - 5 상대방에게 큰 영향을 주지 않는 가벼운 농담
예: "너 오늘 기분 좋아 보이네!"
6 - 10 여전히 가벼운 농담, 약간 더 개인적인 농담
예: "네가 한 그 농담, 진짜 웃겼어."
11 - 15 약간의 부정적인 의미가 있지만 웃어넘길 수 있는 농담
예: "넌 매번 약속 시간을 헷갈리더라."
16 - 20 농담의 정도가 다소 비꼬는 느낌이 들 수 있음
예: "정말 독특한 스타일이네."
21 - 25 약간의 비판적 요소를 포함한 농담
예: "넌 진짜 길을 못 찾는구나."
26 - 30 살짝 비꼬는 농담, 조금 더 직접적임
예: "네 요리는 항상 창의적이야."
31 - 35 상대방을 무시하는 말투, 하지만 크게 심각하지 않음
예: "너는 정말 대단한 자존심을 가졌구나."
36 - 40 약간의 불쾌감을 줄 수 있는 비판
예: "넌 항상 제 시간에 도착하는 법이 없지."
41 - 45 직접적인 비판으로 느껴질 수 있음
예: "네가 이번 프로젝트 망친 거 알아?"
46 - 50 상대방에게 불쾌감을 줄 수 있는 비판
예: "너 정말 대충대충 하는구나."
51 - 55 상대방의 성격이나 능력을 살짝 비난하는 정도
예: "너는 게으르고 무책임해 보여."
56 - 60 다소 강한 비난, 상대방에게 상처를 줄 수 있음
예: "넌 왜 이렇게 모든 걸 망치는 거야?"
61 - 65 상대방을 비난하는 말, 상처를 줄 가능성이 높음
예: "네가 뭐라도 제대로 할 수 있을까?"
66 - 70 매우 비판적인 말투, 상대방을 비난함
예: "정말 아무짝에도 쓸모없네."
71 - 75 상대방의 성격이나 능력을 강하게 비난하는 말
예: "넌 왜 이렇게 무능해?"
76 - 80 상대방을 심하게 비꼬거나 조롱하는 말
예: "네가 뭘 할 수 있을 거라고 생각한 적이 있긴 해?"
81 - 85 매우 강한 비꼬는 말투, 상대방을 조롱함
예: "네 존재 자체가 문제야."
86 - 90 상대방을 모욕하거나 크게 상처를 줄 수 있는 말
예: "넌 정말 쓸모없는 존재야."
91 - 95 상대방에게 큰 정신적 충격을 줄 수 있는 말
예: "네가 없는 게 세상에 더 나을 거야."
96 - 100 매우 심각한 모욕, 상대방에게 큰 정신적 충격을 줌
예: "네가 사라진다면 세상이 더 나을 거야."
이유는 붙이지 말고 정수 결과만 딱 반환해줘.
"""
Expand Down
2 changes: 1 addition & 1 deletion app/schemas/chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ class ChatRoomBase(BaseModel):
character_id: int
character_name: str
topic: Optional[str] = None
spicy: Optional[int] = None
spicy: Optional[float] = None
created_at: datetime
name: str

Expand Down
11 changes: 6 additions & 5 deletions app/schemas/dashboard.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,11 @@ class TopicFrequency(BaseModel):
연애: int = Field(alias="연애")

class SpicyFrequency(BaseModel):
level_0_2: int = Field(alias="0-2")
level_2_4: int = Field(alias="2-4")
level_4_6: int = Field(alias="4-6")
level_6_8: int = Field(alias="6-8")
level_8_10: int = Field(alias="8-10")
level_0_20: int = Field(alias="0-20")
level_20_40: int = Field(alias="20-40")
level_40_60: int = Field(alias="40-60")
level_60_80: int = Field(alias="60-80")
level_80_100: int = Field(alias="80-100")

class Config:
populate_by_name = True # 필드 이름을 기준으로 값을 채움
Expand All @@ -34,6 +34,7 @@ class DashboardTotal(BaseModel):
class CharacterInfo(BaseModel):
id: int
name: str
image: str
description: str

class ImageInfo(BaseModel):
Expand Down
43 changes: 22 additions & 21 deletions app/services/character_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,36 +37,36 @@ def get_spicy_frequency(db: Session, character_id: int) -> SpicyFrequency:
chats = db.query(Chat).filter(Chat.character_id == character_id).all()
spicy_count = get_spicy_count(chats)
return SpicyFrequency(
level_0_2=spicy_count["0-2"],
level_2_4=spicy_count["2-4"],
level_4_6=spicy_count["4-6"],
level_6_8=spicy_count["6-8"],
level_8_10=spicy_count["8-10"]
level_0_20=spicy_count["0-20"],
level_20_40=spicy_count["20-40"],
level_40_60=spicy_count["40-60"],
level_60_80=spicy_count["60-80"],
level_80_100=spicy_count["80-100"]
)


def get_spicy_count(chats) -> dict:
spicy_count = {
"0-2": 0,
"2-4": 0,
"4-6": 0,
"6-8": 0,
"8-10": 0
"0-20": 0,
"20-40": 0,
"40-60": 0,
"60-80": 0,
"80-100": 0
}
for chat in chats:
spicy = chat.spicy
if spicy is None:
continue # spicy가 None인 경우 해당 chat을 건너뜁니다.
if 0 <= spicy < 2:
spicy_count["0-2"] += 1
elif 2 <= spicy < 4:
spicy_count["2-4"] += 1
elif 4 <= spicy < 6:
spicy_count["4-6"] += 1
elif 6 <= spicy < 8:
spicy_count["6-8"] += 1
elif 8 <= spicy <= 10:
spicy_count["8-10"] += 1
if 0 <= spicy < 20:
spicy_count["0-20"] += 1
elif 20 <= spicy < 40:
spicy_count["20-40"] += 1
elif 40 <= spicy < 60:
spicy_count["40-60"] += 1
elif 60 <= spicy < 80:
spicy_count["60-80"] += 1
elif 80 <= spicy <= 100:
spicy_count["80-100"] += 1
return spicy_count


Expand All @@ -76,7 +76,7 @@ def get_spicy_average(db: Session, character_id: int):
if not chats: # chats가 비어있으면 0.0을 반환합니다.
return 0.0
total_spicy = sum(chat.spicy if chat.spicy is not None else 0 for chat in chats)
return total_spicy / len(chats)
return round((total_spicy / len(chats)), 1) # 소수점 첫째자리까지 반올림


# 전체 통계
Expand Down Expand Up @@ -111,6 +111,7 @@ def get_dashboard_character(db: Session, character_name: str):
info=CharacterInfo(
id=character.id,
name=character.name,
image=character.image_url,
description="설명"
),
top_images=[
Expand Down
1 change: 1 addition & 0 deletions docker-compose-deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,7 @@ services:
- ./nginx/conf.d:/etc/nginx/conf.d
ports:
- "80:80"
restart: always
networks:
- teamhnet

Expand Down
38 changes: 38 additions & 0 deletions nginx/configs/nginx-blue.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
events {
worker_connections 1024;
}

http {

upstream backend { # upstream으로 설정 및 서버 문제시 다른 서버로 이동
server fastapi-blue:8000;
}


# DOS 공격 방어를 위한 설정
limit_req_zone $binary_remote_addr zone=limit_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
listen 80;
listen [::]:80;

# 백엔드 프록시 설정
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;


# DOS 공격 방지를 위한 설정
limit_req zone=limit_per_ip burst=10;
limit_conn addr 10;
}

}

}
38 changes: 38 additions & 0 deletions nginx/configs/nginx-green.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
events {
worker_connections 1024;
}

http {

upstream backend { # upstream으로 설정 및 서버 문제시 다른 서버로 이동
server fastapi-green:8000;
}


# DOS 공격 방어를 위한 설정
limit_req_zone $binary_remote_addr zone=limit_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
listen 80;
listen [::]:80;

# 백엔드 프록시 설정
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;


# DOS 공격 방지를 위한 설정
limit_req zone=limit_per_ip burst=10;
limit_conn addr 10;
}

}

}
15 changes: 10 additions & 5 deletions nginx/nginx.conf
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ events {
worker_connections 1024;
}



http {

upstream backend { # 프론트엔드 서버를 upstream으로 설정 및 서버 문제시 다른 서버로 이동
server fastapi-green:8000 max_fails=3 fail_timeout=30s;
server fastapi-green:8001 max_fails=3 fail_timeout=30s;
upstream backend { # upstream으로 설정 및 서버 문제시 다른 서버로 이동
server fastapi-green:8000 max_fails=1 fail_timeout=3s;
server fastapi-blue:8000 max_fails=1 fail_timeout=3s;
}



# DOS 공격 방어를 위한 설정
limit_req_zone $binary_remote_addr zone=limit_per_ip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
Expand All @@ -28,6 +28,11 @@ http {
proxy_set_header X-NginX-Proxy true;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;


# DOS 공격 방지를 위한 설정
limit_req zone=limit_per_ip burst=10;
limit_conn addr 10;
}

}
Expand Down
6 changes: 6 additions & 0 deletions scripts/start.sh
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ switch_container() {
sleep 30

health_check "http://127.0.0.1:8001/healthcheck"
execute_and_log "cp ${PROJECT_ROOT}/nginx/configs/nginx-blue.conf ${PROJECT_ROOT}/nginx/nginx.conf"
execute_and_log "docker compose -p ${DOCKER_APP_NAME} -f ${PROJECT_ROOT}/docker-compose-deploy.yml restart nginx"

else
log_message "### BLUE => GREEN ###"
execute_and_log "docker compose -p ${DOCKER_APP_NAME} -f ${PROJECT_ROOT}/docker-compose-deploy.yml up -d --build fastapi-green"
Expand All @@ -65,6 +68,9 @@ switch_container() {
sleep 30

health_check "http://127.0.0.1:8000/healthcheck"

execute_and_log "cp ${PROJECT_ROOT}/nginx/configs/nginx-green.conf ${PROJECT_ROOT}/nginx/nginx.conf"
execute_and_log "docker compose -p ${DOCKER_APP_NAME} -f ${PROJECT_ROOT}/docker-compose-deploy.yml restart nginx"
fi
}

Expand Down

0 comments on commit 0b00abb

Please sign in to comment.