Code refactoring

app.data.rdbms.location.py

generate_location_response

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
๋ชจ๋“ˆํ™”db_model, schema_model ์ถ”์ถœ์„ .get()์œผ๋กœํ‚ค ๋ฏธ์Šค ๋ฐœ์ƒ ์‹œ ์—๋Ÿฌ ๋ฐฉ์ง€ ๋ฐ ๋กœ๊น…
๋กœ๊น… ์ˆ˜์ค€ ์กฐ์ •logger.exception ์‚ฌ์šฉstack trace ํฌํ•จํ•˜์—ฌ ๊ธฐ๋ก, ๋””๋ฒ„๊น… ์šฉ์ด
๋ฌธ์ž์—ด ํฌ๋งทf-string ํ†ต์ผ, ์ค‘๋ณต ์ œ๊ฑฐ์ง๊ด€์ ์ด๋ฉฐ ์œ ์ง€๋ณด์ˆ˜์— ์œ ๋ฆฌ
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€๊ณ ์ •๋œ str โ†’ ๋™์  ๋ฉ”์‹œ์ง€์–ด๋–ค location์—์„œ ์‹คํŒจํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ
์ถœ๋ ฅ ๊ตฌ์กฐactionValue dict ๋ณ‘ํ•ฉ ๋ฐฉ์‹ ๊ฐœ์„ ์˜๋ฏธ ๋ช…ํ™•ํ™” ๋ฐ ๊ตฌ์กฐ ์ผ๊ด€์„ฑ ์œ ์ง€

get_closet_place

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
๋กœ๊น… ํฌ๋งท[get_closest_place] prefix ์‚ฌ์šฉ๋กœ๊ทธ ์ถ”์ ์„ฑ๊ณผ ํ•„ํ„ฐ๋ง ํ–ฅ์ƒ
์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ.first() ์‚ฌ์šฉ.all()[0]๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ณ  ๋ช…ํ™•
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€.exception() ์‚ฌ์šฉstack trace ํฌํ•จํ•˜์—ฌ ๋””๋ฒ„๊น… ์šฉ์ด
๋ชจ๋ธ ๊ณตํ†ต ํ•„๋“œ ์ถ”์ถœgetattr() ์‚ฌ์šฉํ•„๋“œ ์œ ๋ฌด ์ฒดํฌ + ๊ฐ€๋…์„ฑ ํ™•๋ณด
์—๋Ÿฌ ๊ฐ€๋…์„ฑDB ์กฐํšŒ ์‹คํŒจ ์‹œ ValueError์‹คํŒจ ์›์ธ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„

app.data.vectorDB.py

vector_store_initialize

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๊ฒ€์ฆ ํ•จ์ˆ˜ validate_env() ์ถ”๊ฐ€None ์ฒดํฌ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ˆ˜ํ–‰๋Ÿฐํƒ€์ž„ ์‹œ ๋ถˆ๋ช…ํ™•ํ•œ KeyError ์˜ˆ๋ฐฉ
๋ถ„๊ธฐ๋ฌธ if-elif ๊ตฌ์กฐ๋กœ ๋ณ€๊ฒฝ๋”•์…”๋„ˆ๋ฆฌ config ์ œ๊ฑฐ์ค‘๋ณต ์ œ๊ฑฐ๋ณด๋‹ค ๋กœ์ง ํ๋ฆ„๊ณผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ค‘์š”
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ช…์‹œ ๋กœ๋”ฉ (load_dotenv).env ์‚ฌ์šฉ ์‹œ ๋ช…ํ™•ํžˆ ๋กœ๋“œํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์˜๋„๋œ ๋กœ๋”ฉ ๋ณด์žฅ
์—๋Ÿฌ ๋ฉ”์‹œ์ง€ ๊ฐœ์„ ์–ด๋–ค ๊ฐ’์ด ๋ˆ„๋ฝ๋˜์—ˆ๋Š”์ง€ ๋ช…์‹œ๋ฌธ์ œ ์ถ”์  ์šฉ์ด
ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
์–ธ์–ด ๊ฐ์ง€ ํ•จ์ˆ˜ ๋ถ„๋ฆฌprocess_query โ†’ _translate_to_korean_if_needed๋‹จ์ผ ์ฑ…์ž„ ์›์น™ ์ ์šฉ, ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
๋ฌธ์ž์—ด ์ฒ˜๋ฆฌ ์˜ˆ์™ธ ๋ช…ํ™•ํ™”strip() ๊ฒ€์‚ฌ โ†’ ValueError์กฐ๊ธฐ ์‹คํŒจ(Fail Fast) ์›์น™
ํƒ€์ž… ํžŒํŠธ ๋ช…ํ™•ํ™”List[Document] ๋“ฑ ์ ์šฉ์ž๋™์™„์„ฑ + ๋””๋ฒ„๊น… ํ–ฅ์ƒ
try-catch ๋ฒ”์œ„ ์ถ•์†Œ๋ฒˆ์—ญ ๋กœ์ง, ์ „์ฒด ๋กœ์ง์— ๊ฐœ๋ณ„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฌธ์ œ ์›์ธ ํŒŒ์•… ์šฉ์ด
์ถœ๋ ฅ ํฌ๋งท ๊ฐœ์„ ๋ฆฌ์ŠคํŠธ ์ปดํ”„๋ฆฌํ—จ์…˜ ๊ธฐ๋ฐ˜ join()๊ฐ€๋…์„ฑ + ์„ฑ๋Šฅ ๋ชจ๋‘ ๊ฐœ์„ 
๋ถˆํ•„์š” ์ฃผ์„/print ์ œ๊ฑฐ์‹ค์ œ ์„œ๋น„์Šค ์ฝ”๋“œ์—์„œ๋Š” ์ถœ๋ ฅ ์ œ๊ฑฐ์ฝ˜์†” ๋…ธ์ด์ฆˆ ๋ฐฉ์ง€

vector_insert

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
๊ฒฝ๋กœ ์ฒ˜๋ฆฌos.path.join() ์‚ฌ์šฉOS ๊ฐ„ ํ˜ธํ™˜์„ฑ ํ™•๋ณด (Windows/Linux/Mac)
๋นˆ ํŒŒ์ผ ์ฒ˜๋ฆฌstrip() ์ฒดํฌ๋กœ ๊ฑด๋„ˆ๋œ€๋ถˆํ•„์š”ํ•œ ์‚ฝ์ž… ๋ฐฉ์ง€
ํŒŒ์ผ ์กด์žฌ ํ™•์ธif not txt_files ์ฒดํฌ๋ถˆํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ๋ฐฉ์ง€
๊ณตํ†ต Splitter ์žฌ์‚ฌ์šฉfor ๋ฃจํ”„ ๋ฐ–์— ์„ ์–ธ์„ฑ๋Šฅ ์ตœ์ ํ™”, ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฐฉ์ง€
ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ž๋™ ์ถ”๊ฐ€"source": filename์ถ”์ ์„ฑ๊ณผ ๊ด€๋ฆฌ ํŽธ์˜์„ฑ
์—๋Ÿฌ ํ•ธ๋“ค๋ง๊ฐœ๋ณ„ ํŒŒ์ผ try-catch์ „์ฒด ์ค‘๋‹จ ์—†์ด ์‹คํŒจ ํŒŒ์ผ๋งŒ skip

app.langgraph_chatbot.graph.chatbot_graph.py

ํ•ญ๋ชฉ๊ฐœ์„  ์ „๊ฐœ์„  ํ›„์ด์œ 
๋…ธ๋“œ ์ •์˜.add_node() ์—ฐ์† ํ˜ธ์ถœNODE_DEFINITIONS ๋”•์…”๋„ˆ๋ฆฌ๋…ธ๋“œ ์ถ”๊ฐ€๊ฐ€ ๋งŽ์•„์ ธ๋„ ์œ ์ง€๋ณด์ˆ˜ ์‰ฌ์›€
์—ฃ์ง€ ์ •์˜.add_edge() ์—ฐ์† ํ˜ธ์ถœEDGE_DEFINITIONS ๋ฆฌ์ŠคํŠธ์ถ”ํ›„ ๊ตฌ์กฐ์  ์‹œ๊ฐํ™”๋‚˜ ์ถ”์ ์— ์œ ๋ฆฌ
์กฐ๊ฑด๋ถ€ ์—ฃ์ง€์ง์ ‘ .add_conditional_edges() ํ˜ธ์ถœCONDITIONAL_EDGES ๋งคํ•‘๋ถ„๊ธฐ ์กฐ๊ฑด์ด ๋งŽ์„ ๋•Œ ์ผ๊ด€์„ฑ ์œ ์ง€
๋กœ๊น… ๊ตฌ์กฐapp.logger ์‚ฌ์šฉํ‘œ์ค€ Python logger๋กœ ๊ต์ฒดํ…Œ์ŠคํŠธ ๋ฐ ๋…๋ฆฝ ์‹คํ–‰ ์‹œ ์œ ์—ฐ์„ฑ ํ™•๋ณด
์ฝ”๋“œ ์ผ๊ด€์„ฑํ•จ์ˆ˜/๊ฐ์ฒด ์ง์ ‘ ์—ฐ๊ฒฐ๋ชจ๋“  ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ์ •์˜๊ธฐ๋Šฅ/๋กœ์ง๊ณผ ๊ตฌ์„ฑ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ชจ๋“ˆํ™” ๊ฐ€๋Šฅ

app.langgraph_chatbot.chat_engine.py

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
์ค‘๋ณต ์ œ๊ฑฐ_build_initial_state(), _execute_graph()์ดˆ๊ธฐ ์ƒํƒœ ๋กœ์ง ๊ณตํ†ตํ™”, ์ฝ”๋“œ ๊ฐ„๊ฒฐํ™”
์˜ˆ์™ธ ๋ฉ”์‹œ์ง€ ๋ช…ํ™•ํ™”๋ฉ”์„œ๋“œ๋ณ„ prefix ([respond_all], [message_stream] ๋“ฑ)์—๋Ÿฌ ๋กœ๊น… ํ•„ํ„ฐ๋ง/๋””๋ฒ„๊น… ํ–ฅ์ƒ
์˜ต์…”๋„ ๋ฐ˜ํ™˜ ํƒ€์ž…Optional[List[ResponseButtonModel]]ํƒ€์ž… ์•ˆ์ •์„ฑ๊ณผ ๋ช…ํ™•ํ•œ ์˜๋ฏธ ์ „๋‹ฌ
try-except ๋ถ„๋ฆฌ์™ธ๋ถ€ ํ˜ธ์ถœ๊ณผ ๋‚ด๋ถ€ ์ƒํƒœ ๊ตฌ๋ถ„์‹คํŒจ ์›์ธ ์ถ”์  ์šฉ์ด
Kakao ๋Œ€์‘ ๋ถ„๋ฆฌUserInfoModel ์ž„์‹œ ์ƒ์„ฑ ์œ„์น˜ ๋ณ€๊ฒฝ์ฝ”๋“œ ์ผ๊ด€์„ฑ๊ณผ ์žฌ์‚ฌ์šฉ์„ฑ ํ–ฅ์ƒ

app.langgraph_chatbot.utils.chatbot_classify.py

translate_input

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
ํƒ€์ž… ๋ช…์‹œinput_text: str, target_lang: strํƒ€์ž… ์•ˆ์ „์„ฑ๊ณผ IDE ์ง€์› ํ–ฅ์ƒ
๋นˆ ๋ฌธ์ž์—ด ์ฒ˜๋ฆฌif not input_text.strip()์˜ค๋ฅ˜ ๋ฐฉ์ง€ ๋ฐ ์กฐ๊ธฐ ๋ฆฌํ„ด
target_lang ํŒŒ๋ผ๋ฏธํ„ฐํ™”"en" ๊ณ ์ • ์ œ๊ฑฐ๋ฒ”์šฉ์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€
์–ธ์–ด ๋กœ๊ทธ ์ถ”๊ฐ€logger.info(f"Detected...")์šด์˜ ์ค‘ ๋‹ค๊ตญ์–ด ์ž…๋ ฅ ๋ถ„ํฌ ํ™•์ธ ๊ฐ€๋Šฅ
์—๋Ÿฌ ๋ ˆ๋ฒจ ๊ตฌ๋ถ„๊ฐ์ง€ ์‹คํŒจ = warning, ๋ฒˆ์—ญ ์‹คํŒจ = error๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ ์˜ํ–ฅ๋„ ๊ธฐ์ค€ ๋ถ„๋ฅ˜ ๊ฐ€๋Šฅ

load_spacy_model

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
Lock ์‚ฌ์šฉthreading.Lock ๋„์ž…๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ race condition ๋ฐฉ์ง€
double-checked lockingif _NLP is None 2๋ฒˆ ํ™•์ธ๋ถˆํ•„์š”ํ•œ Lock ํš๋“ ๋ฐฉ์ง€ (์„ฑ๋Šฅ ์ตœ์ ํ™”)
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€try-except ๋ฌธ๋ชจ๋ธ ๋กœ๋”ฉ ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋กœ๊ทธ ๋ฐ ๋ช…ํ™•ํ•œ ์ถ”์  ๊ฐ€๋Šฅ
๋ช…ํ™•ํ•œ ํƒ€์ž… ํžŒํŠธ-> Language, _NLP: Optional[Language]์ฝ”๋“œ ์ž๋™์™„์„ฑ๊ณผ ํƒ€์ž… ๊ฒ€์‚ฌ ์ง€์›

QueryClassifier

ํ•ญ๋ชฉ๋ณ€๊ฒฝ ๋‚ด์šฉ์ด์œ 
spaCy ๋ชจ๋ธ ๋กœ๋”ฉ ์ตœ์†Œํ™”load_spacy_model() 1ํšŒ๋งŒ ํ˜ธ์ถœ๋ถˆํ•„์š”ํ•œ IO ๋ฐ ์„ฑ๋Šฅ ๋‚ญ๋น„ ๋ฐฉ์ง€
์ค‘๋ณต ์ •๊ทœ์‹ ์ตœ์ ํ™”re.compile() ํŒจํ„ด ์ •์ œ์ปดํŒŒ์ผ ์ˆ˜ ๊ฐ์†Œ, ์„ฑ๋Šฅ ์ตœ์ ํ™”
ํ•จ์ˆ˜ ์ฑ…์ž„ ๋ถ„๋ฆฌdetect_location_question, extract_main_nounํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์‰ฌ์›€
ํ•˜๋“œ์ฝ”๋”ฉ ๊ฐ’ ์ƒ์ˆ˜ํ™”_location_patterns, _location_verbs, _threshold ๋“ฑ๊ฐ€๋…์„ฑ๊ณผ ์ˆ˜์ • ์šฉ์ด์„ฑ ํ–ฅ์ƒ
๋ฉ”์„œ๋“œ ์ค‘์‹ฌ ์„ค๊ณ„ํด๋ž˜์Šค ์™ธ๋ถ€ ์˜์กด ์ตœ์†Œํ™”์œ ๋‹›ํ…Œ์ŠคํŠธ ๋ฐ ์บก์Аํ™” ์ ํ•ฉ

LocationHandler

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
ํƒ€์ž… ํžŒํŠธ ๋ช…ํ™•ํ™”UserInfoModel, ResponseButtonModel, Optional[...]์ •์  ๋ถ„์„, ์ž๋™์™„์„ฑ, ํ…Œ์ŠคํŠธ์— ์œ ๋ฆฌ
์‚ฌ์šฉ์ž ์œ„์น˜ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌlatitude, longitude None ์ฒดํฌ์ž˜๋ชป๋œ ์œ„์น˜ ์ •๋ณด ์ฒ˜๋ฆฌ ๋ฐฉ์ง€
์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ถ”๊ฐ€try-except ๋„์ž…์„œ๋น„์Šค ์ค‘๋‹จ ๋ฐฉ์ง€, graceful degradation
๋กœ๊ทธ ์ถ”๊ฐ€warning / error ๊ตฌ๋ถ„์šด์˜ ์ค‘ ๋””๋ฒ„๊น… ๋ฐ ์‚ฌ์šฉ์ž ์ด์Šˆ ์ถ”์ ์— ์œ ์šฉ

app.langgraph_chatbot.node.retrieve.py

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
state.get("query", "").strip()query ์œ ํšจ์„ฑ ํ•œ ์ค„๋กœ ๊ฒ€์‚ฌ๋ช…ํ™•ํ•˜๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
logger.exception() ์‚ฌ์šฉ์ „์ฒด traceback ํฌํ•จ ๋กœ๊น…๋””๋ฒ„๊น… ์‹œ ๋” ๋งŽ์€ ์ •๋ณด ์ œ๊ณต
Lazy import ์œ„์น˜ ๋ช…ํ™•ํ™”from app.main import vector_store์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ ๋ฐฉ์ง€
๋กœ๊น… ์ผ๊ด€์„ฑ ํ–ฅ์ƒprefix ํฌํ•จ โ†’ [retrieve_context]๋กœ๊ทธ ํ•„ํ„ฐ๋ง/๊ฒ€์ƒ‰์— ์œ ๋ฆฌ
๋ถˆํ•„์š”ํ•œ ์ฝ”๋ฉ˜ํŠธ ์ œ๊ฑฐ์ฝ”๋“œ๊ฐ€ ์˜๋„๋ฅผ ์ž˜ ์„ค๋ช…ํ•จ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ

app.langgraph_chatbot.node.generate.py

ํ•ญ๋ชฉ๊ฐœ์„  ๋‚ด์šฉ์ด์œ 
๋นˆ ์ฟผ๋ฆฌ early returnquery.strip() ์ฒดํฌ๋ถˆํ•„์š”ํ•œ ์ฒ˜๋ฆฌ ๋ฐฉ์ง€ ๋ฐ UX ๊ฐœ์„ 
์–ธ์–ด ๊ฐ์ง€ fallback์‹คํŒจ ์‹œ ๋กœ๊ทธ + default ์–ธ์–ด๋‹ค๊ตญ์–ด ์ž…๋ ฅ ๋Œ€์‘ ์‹ ๋ขฐ์„ฑ ํ–ฅ์ƒ
prompt ํŒŒ์ผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌFileNotFoundError ๋ถ„๋ฆฌ์šด์˜ ์‹œ config ๋ˆ„๋ฝ ํƒ์ง€ ๊ฐ€๋Šฅ
๋ชจ๋ธ๋ช… ์ƒ์ˆ˜ํ™” ์ œ๊ฑฐ"gpt-4o-mini" ์ง์ ‘ ๋ช…์‹œํ…Œ์ŠคํŠธ ๋ฐ ๋ฆฌํŒฉํ† ๋ง ์œ ์—ฐ
๋กœ๊น… prefix ํ†ต์ผ[generate_response] ์‚ฌ์šฉ์ถ”์ ์„ฑ๊ณผ ํ•„ํ„ฐ๋ง ํ–ฅ์ƒ
๋ฉ”์‹œ์ง€ ์ž…๋ ฅ ๋ถ„๋ฆฌprompt_inputs ๋ณ€์ˆ˜ํ™”๊ฐ€๋…์„ฑ + ๋””๋ฒ„๊น… ์šฉ์ด
LCEL ์ ์šฉLCEL ๋ฌธ๋ฒ• ์ ์šฉ๊ฐ€๋…์„ฑ + ์œ ์—ฐํ•จ

app.main.py

ํ•ญ๋ชฉ๊ฐœ์„ ์ด์œ 
create_app() ํ•จ์ˆ˜ ๋ถ„๋ฆฌํ…Œ์ŠคํŠธ ์‹œ TestClient(create_app()) ๊ตฌ์กฐ ํ™œ์šฉDI ๋ฐ ์œ ๋‹› ํ…Œ์ŠคํŠธ ํŽธ์˜์„ฑ ํ–ฅ์ƒ
ํ™˜๊ฒฝ ๋ณ€์ˆ˜ setdefault()์ด๋ฏธ ์„ค์ •๋œ ๊ฐ’ ๋ฎ์–ด์“ฐ์ง€ ์•Š์Œ์œ ์—ฐํ•œ ํ™˜๊ฒฝ ๊ตฌ์„ฑ ๋Œ€์‘
lifespan() ๋‚ด ์˜ˆ์™ธ์ฒ˜๋ฆฌ ์ถ”๊ฐ€์ดˆ๊ธฐํ™” ์‹คํŒจ ์‹œ ๋กœ๊ทธ ๋ฐ ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ํ‘œ์‹œ์šด์˜ ์ค‘ ๋ฌธ์ œ ํƒ์ง€ ์šฉ์ด
๋ผ์šฐํ„ฐ ๋ฐ ๋ฏธ๋“ค์›จ์–ด ์ •๋ฆฌ๋ช…์‹œ์ ์ด๊ณ  ๋ชจ๋“ˆํ™”๋œ ๋“ฑ๋ก๊ธฐ๋Šฅ๋ณ„ ๋ถ„๋ฆฌ, ๊ด€๋ฆฌ ํŽธ์˜์„ฑ ์ฆ๊ฐ€
ํ—ฌ์Šค ์ฒดํฌ ์—”๋“œํฌ์ธํŠธ ๋ช…ํ™•ํ™”/ โ†’ read_root() ํ•จ์ˆ˜๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ ๊ธฐ๋ณธ ์‘๋‹ต ์šฉ์ด

Refactor ์ ์šฉ ์ „: 353.59s (42passed) Refactor ์ ์šฉ ํ›„: 310.05s (42passed)

ํ˜„์žฌ ๋ฌธ์ œ๋Š” ๋ฌด์—‡์ธ๊ฐ€? LangSmith๋ฅผ ํ†ตํ•ด ์ถ”์ ํ•˜๋ฉฐ ์–ด๋””์„œ ์‹œ๊ฐ„์ด ๋งŽ์ด ์†Œ์š”๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณธ ๊ฒฐ๊ณผ: LLM์˜ ์ตœ์ข… ๋‹ต๋ณ€ ์ƒ์„ฑ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ. ์™œ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”๊ฐ€? Retrieve ๋กœ ๊ฐ€์ ธ์˜จ ๋ฌธ์„œ์˜ ์–‘์ด ์ƒ๋‹นํ•ด์„œ. ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด๋‹น ๋ฌธ์„œ๋“ค์ด ๋ฐ˜๋“œ์‹œ ๊ด€๋ จ์ด ์žˆ๋Š”๊ฐ€? ๋˜ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹˜. ํ‚ค์˜ค์Šคํฌ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜๋ƒ๋Š” ์งˆ๋ฌธ์— ๊ฒฐํ˜ผ ๋น„์ž ๋ฌธ์„œ๋ถ€ํ„ฐ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ๋ณด๋ฉด ์•„๋‹Œ ๊ฒƒ์œผ๋กœ ๋ณด์ž„. ์ด์— ๊ฐœ์„  ์‚ฌํ•ญ์œผ๋กœ 2๊ฐ€์ง€ ์ •๋„๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  1. Retrieve ๊ฐœ์„ 
  2. classify node์—์„œ Fallback์œผ๋กœ ์ผ๋ฐ˜ ์งˆ๋ฌธ์ผ ๊ฒฝ์šฐ retrieveํ•˜์ง€ ์•Š๊ณ  ๋ฐ”๋กœ generate๋กœ ๊ฐ€๋Š” ๋ฐฉ๋ฒ•.