Skip to content

Commit 752dbec

Browse files
committed
refactor: 상수를 constants 디렉토리 내에 정의
1 parent 85097f8 commit 752dbec

8 files changed

Lines changed: 98 additions & 74 deletions

File tree

.DS_Store

2 KB
Binary file not shown.

core/.DS_Store

8 KB
Binary file not shown.

core/tariff_prediction/agent/tariff_prediction_agent.py

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from core.tariff_prediction.tools.parse_user_input import parse_user_input
1010
from core.tariff_prediction.tools.parse_hs_results import parse_hs6_result, generate_hs10_candidates
1111
from core.tariff_prediction.tools.parse_tariff_result import parse_tariff_result
12+
from core.tariff_prediction.constants import SUPPORTED_COUNTRIES, SCENARIOS, OFF_TOPIC_KEYWORDS, CORRECTION_KEYWORDS, SESSION_TERMINATION_KEYWORDS
1213

1314
# 전역 워크플로우 매니저
1415
class WorkflowManager:
@@ -45,22 +46,9 @@ def __init__(self):
4546
}
4647

4748
# 환율 지원 국가 목록
48-
self.supported_countries = {
49-
'미국': 'USD', '일본': 'JPY', '유럽연합': 'EUR', '중국': 'CNY',
50-
'독일': 'EUR', '프랑스': 'EUR', '이탈리아': 'EUR', '스페인': 'EUR',
51-
'네덜란드': 'EUR', '벨기에': 'EUR', '오스트리아': 'EUR', '그리스': 'EUR',
52-
'포르투갈': 'EUR', '아일랜드': 'EUR', '핀란드': 'EUR', '룩셈부르크': 'EUR',
53-
'스웨덴': 'EUR', '덴마크': 'EUR', '폴란드': 'EUR', '체코': 'EUR',
54-
'헝가리': 'EUR', '슬로바키아': 'EUR', '슬로베니아': 'EUR', '에스토니아': 'EUR',
55-
'라트비아': 'EUR', '리투아니아': 'EUR', '몰타': 'EUR', '키프로스': 'EUR',
56-
'크로아티아': 'EUR', '루마니아': 'EUR', '불가리아': 'EUR'
57-
}
49+
self.supported_countries = SUPPORTED_COUNTRIES
5850

59-
self.scenarios = {
60-
'1': '해외직구',
61-
'2': '해외체류 중 구매',
62-
'3': '해외배송'
63-
}
51+
self.scenarios = SCENARIOS
6452

6553
def reset_session(self):
6654
"""세션을 초기화합니다."""
@@ -95,7 +83,7 @@ def parse_user_input(self, user_input: str) -> Dict[str, Any]:
9583

9684
def handle_correction_request(self, user_input: str) -> str:
9785
"""수정 요청을 처리합니다."""
98-
if any(word in user_input for word in ['수정', '잘못', '다시', '틀렸']):
86+
if any(word in user_input for word in CORRECTION_KEYWORDS):
9987
if self.state['current_step'] == 'scenario_selection':
10088
return "어떤 정보를 수정하시겠습니까?\n1. 시나리오\n2. 상품 정보\n3. 처음부터 다시 시작"
10189
elif self.state['current_step'] == 'input_collection':
@@ -109,20 +97,14 @@ def handle_correction_request(self, user_input: str) -> str:
10997

11098
def is_off_topic(self, user_input: str) -> bool:
11199
"""관세 계산과 관련 없는 주제인지 확인합니다."""
112-
off_topic_keywords = [
113-
'날씨', '음식', '영화', '음악', '운동', '취미', '가족', '친구',
114-
'일', '학교', '공부', '시험', '여행', '휴가', '주말', '주중',
115-
'아침', '점심', '저녁', '잠', '병원', '약', '건강', '운동'
116-
]
117-
118100
input_lower = user_input.lower()
119-
return any(keyword in input_lower for keyword in off_topic_keywords)
101+
return any(keyword in input_lower for keyword in OFF_TOPIC_KEYWORDS)
120102

121103
def process_user_input(self, user_input: str) -> str:
122104
"""사용자 입력을 처리하고 적절한 응답을 반환합니다."""
123105

124106
# 세션 중단 요청 확인
125-
if any(word in user_input for word in ['중단', '그만', '취소', '종료']):
107+
if any(word in user_input for word in SESSION_TERMINATION_KEYWORDS):
126108
self.reset_session()
127109
return "관세 계산을 중단하겠습니다. 다른 질문이 있으시면 언제든 말씀해 주세요."
128110

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
# Constants package for tariff prediction module
2+
3+
from .constants import (
4+
SUPPORTED_COUNTRIES,
5+
SCENARIOS,
6+
VALID_SCENARIOS,
7+
OFF_TOPIC_KEYWORDS,
8+
REMOVE_KEYWORDS,
9+
CORRECTION_KEYWORDS,
10+
SESSION_TERMINATION_KEYWORDS,
11+
PRICE_PATTERNS,
12+
QUANTITY_PATTERNS
13+
)
14+
15+
__all__ = [
16+
'SUPPORTED_COUNTRIES',
17+
'SCENARIOS',
18+
'VALID_SCENARIOS',
19+
'OFF_TOPIC_KEYWORDS',
20+
'REMOVE_KEYWORDS',
21+
'CORRECTION_KEYWORDS',
22+
'SESSION_TERMINATION_KEYWORDS',
23+
'PRICE_PATTERNS',
24+
'QUANTITY_PATTERNS'
25+
]
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# 관세 예측 모듈 통합 상수 파일
2+
3+
# 환율 지원 국가 목록
4+
SUPPORTED_COUNTRIES = {
5+
'미국': 'USD', '일본': 'JPY', '유럽연합': 'EUR', '중국': 'CNY',
6+
'독일': 'EUR', '프랑스': 'EUR', '이탈리아': 'EUR', '스페인': 'EUR',
7+
'네덜란드': 'EUR', '벨기에': 'EUR', '오스트리아': 'EUR', '그리스': 'EUR',
8+
'포르투갈': 'EUR', '아일랜드': 'EUR', '핀란드': 'EUR', '룩셈부르크': 'EUR',
9+
'스웨덴': 'EUR', '덴마크': 'EUR', '폴란드': 'EUR', '체코': 'EUR',
10+
'헝가리': 'EUR', '슬로바키아': 'EUR', '슬로베니아': 'EUR', '에스토니아': 'EUR',
11+
'라트비아': 'EUR', '리투아니아': 'EUR', '몰타': 'EUR', '키프로스': 'EUR',
12+
'크로아티아': 'EUR', '루마니아': 'EUR', '불가리아': 'EUR'
13+
}
14+
15+
# 시나리오 관련 상수
16+
SCENARIOS = {
17+
'1': '해외직구',
18+
'2': '해외체류 중 구매',
19+
'3': '해외배송'
20+
}
21+
22+
VALID_SCENARIOS = ['해외직구', '해외체류 중 구매', '해외배송']
23+
24+
# 키워드 관련 상수
25+
OFF_TOPIC_KEYWORDS = [
26+
'날씨', '음식', '영화', '음악', '운동', '취미', '가족', '친구',
27+
'일', '학교', '공부', '시험', '여행', '휴가', '주말', '주중',
28+
'아침', '점심', '저녁', '잠', '병원', '약', '건강', '운동'
29+
]
30+
31+
REMOVE_KEYWORDS = [
32+
'원', '달러', '엔', '위안', '유로', '만원', '천원',
33+
'개', '개씩', '개를', '샀', '구매', '에서', '에서 샀', '에서 구매'
34+
]
35+
36+
CORRECTION_KEYWORDS = ['수정', '잘못', '다시', '틀렸']
37+
38+
SESSION_TERMINATION_KEYWORDS = ['중단', '그만', '취소', '종료']
39+
40+
# 정규표현식 패턴 상수
41+
PRICE_PATTERNS = [
42+
r'(\d+)[,\s]*원',
43+
r'(\d+)[,\s]*달러',
44+
r'(\d+)[,\s]*엔',
45+
r'(\d+)[,\s]*위안',
46+
r'(\d+)[,\s]*유로',
47+
r'(\d+)[,\s]*만원',
48+
r'(\d+)[,\s]*천원'
49+
]
50+
51+
QUANTITY_PATTERNS = [
52+
r'(\d+)[\s]*개',
53+
r'(\d+)[\s]*개씩',
54+
r'(\d+)[\s]*개를',
55+
r'(\d+)[\s]*개 샀',
56+
r'(\d+)[\s]*개 구매'
57+
]

core/tariff_prediction/tools/detect_scenario.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from langchain_core.tools import tool
22
from langchain_core.messages import HumanMessage
33
from core.shared.utils.llm import get_llm
4+
from core.tariff_prediction.constants import VALID_SCENARIOS
45

56
@tool
67
def detect_scenario_from_input(user_input: str) -> str | None:
@@ -27,21 +28,20 @@ def detect_scenario_from_input(user_input: str) -> str | None:
2728
result = result.strip()
2829

2930
# 응답에서 시나리오 추출 (따옴표나 "답변:" 등의 접두사 제거)
30-
valid_scenarios = ['해외직구', '해외체류 중 구매', '해외배송']
3131

3232
# 직접 매칭 시도
33-
if result in valid_scenarios:
33+
if result in VALID_SCENARIOS:
3434
return result
3535

3636
# 응답에서 시나리오 추출 시도
37-
for scenario in valid_scenarios:
37+
for scenario in VALID_SCENARIOS:
3838
if scenario in result:
3939
return scenario
4040

4141
# "답변:" 접두사 제거 후 시도
4242
if result.startswith('답변:'):
4343
clean_result = result.replace('답변:', '').strip().strip('"').strip("'")
44-
if clean_result in valid_scenarios:
44+
if clean_result in VALID_SCENARIOS:
4545
return clean_result
4646

4747
return None

core/tariff_prediction/tools/get_exchange_rate_info.py

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,7 @@
66
import os
77

88
from core.tariff_prediction.constants.api_config import KOREAEXIM_API_URL, KOREAEXIM_API_KEY
9-
10-
# 환율 지원 국가 목록
11-
SUPPORTED_COUNTRIES = {
12-
'미국': 'USD', '일본': 'JPY', '유럽연합': 'EUR', '중국': 'CNY',
13-
'독일': 'EUR', '프랑스': 'EUR', '이탈리아': 'EUR', '스페인': 'EUR',
14-
'네덜란드': 'EUR', '벨기에': 'EUR', '오스트리아': 'EUR', '그리스': 'EUR',
15-
'포르투갈': 'EUR', '아일랜드': 'EUR', '핀란드': 'EUR', '룩셈부르크': 'EUR',
16-
'스웨덴': 'EUR', '덴마크': 'EUR', '폴란드': 'EUR', '체코': 'EUR',
17-
'헝가리': 'EUR', '슬로바키아': 'EUR', '슬로베니아': 'EUR', '에스토니아': 'EUR',
18-
'라트비아': 'EUR', '리투아니아': 'EUR', '몰타': 'EUR', '키프로스': 'EUR',
19-
'크로아티아': 'EUR', '루마니아': 'EUR', '불가리아': 'EUR'
20-
}
9+
from core.tariff_prediction.constants import SUPPORTED_COUNTRIES
2110

2211
def is_supported_country(country: str) -> bool:
2312
"""지원되는 국가인지 확인합니다."""

core/tariff_prediction/tools/parse_user_input.py

Lines changed: 5 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,15 @@
22
import re
33
from langchain_core.tools import tool
44

5-
# 환율 지원 국가 목록
6-
SUPPORTED_COUNTRIES = {
7-
'미국': 'USD', '일본': 'JPY', '유럽연합': 'EUR', '중국': 'CNY',
8-
'독일': 'EUR', '프랑스': 'EUR', '이탈리아': 'EUR', '스페인': 'EUR',
9-
'네덜란드': 'EUR', '벨기에': 'EUR', '오스트리아': 'EUR', '그리스': 'EUR',
10-
'포르투갈': 'EUR', '아일랜드': 'EUR', '핀란드': 'EUR', '룩셈부르크': 'EUR',
11-
'스웨덴': 'EUR', '덴마크': 'EUR', '폴란드': 'EUR', '체코': 'EUR',
12-
'헝가리': 'EUR', '슬로바키아': 'EUR', '슬로베니아': 'EUR', '에스토니아': 'EUR',
13-
'라트비아': 'EUR', '리투아니아': 'EUR', '몰타': 'EUR', '키프로스': 'EUR',
14-
'크로아티아': 'EUR', '루마니아': 'EUR', '불가리아': 'EUR'
15-
}
5+
from core.tariff_prediction.constants import SUPPORTED_COUNTRIES, REMOVE_KEYWORDS, PRICE_PATTERNS, QUANTITY_PATTERNS
166

177
@tool
188
def parse_user_input(user_input: str) -> Dict[str, Any]:
199
"""자연어 입력을 파싱하여 상품 정보를 추출합니다."""
2010
parsed = {}
2111

2212
# 가격 정보 추출 (숫자 + 원/달러/엔/위안 등)
23-
price_patterns = [
24-
r'(\d+)[,\s]*원',
25-
r'(\d+)[,\s]*달러',
26-
r'(\d+)[,\s]*엔',
27-
r'(\d+)[,\s]*위안',
28-
r'(\d+)[,\s]*유로',
29-
r'(\d+)[,\s]*만원',
30-
r'(\d+)[,\s]*천원'
31-
]
32-
33-
for pattern in price_patterns:
13+
for pattern in PRICE_PATTERNS:
3414
matches = re.findall(pattern, user_input)
3515
if matches:
3616
price_str = matches[0].replace(',', '')
@@ -43,15 +23,7 @@ def parse_user_input(user_input: str) -> Dict[str, Any]:
4323
break
4424

4525
# 수량 정보 추출
46-
quantity_patterns = [
47-
r'(\d+)[\s]*개',
48-
r'(\d+)[\s]*개씩',
49-
r'(\d+)[\s]*개를',
50-
r'(\d+)[\s]*개 샀',
51-
r'(\d+)[\s]*개 구매'
52-
]
53-
54-
for pattern in quantity_patterns:
26+
for pattern in QUANTITY_PATTERNS:
5527
matches = re.findall(pattern, user_input)
5628
if matches:
5729
parsed['quantity'] = int(matches[0])
@@ -67,15 +39,14 @@ def parse_user_input(user_input: str) -> Dict[str, Any]:
6739
# 상품 묘사 추출 (가격, 수량, 국가 정보를 제외한 나머지 부분)
6840
# 먼저 가격, 수량, 국가 관련 키워드를 제거
6941
cleaned_input = user_input
70-
for pattern in price_patterns + quantity_patterns:
42+
for pattern in PRICE_PATTERNS + QUANTITY_PATTERNS:
7143
cleaned_input = re.sub(pattern, '', cleaned_input)
7244

7345
for country in countries:
7446
cleaned_input = cleaned_input.replace(country, '')
7547

7648
# 일반적인 키워드 제거
77-
remove_keywords = ['원', '달러', '엔', '위안', '유로', '만원', '천원', '개', '개씩', '개를', '샀', '구매', '에서', '에서 샀', '에서 구매']
78-
for keyword in remove_keywords:
49+
for keyword in REMOVE_KEYWORDS:
7950
cleaned_input = cleaned_input.replace(keyword, '')
8051

8152
# 상품 묘사로 사용할 부분 추출

0 commit comments

Comments
 (0)