1+ import operator
12from typing import TypedDict , Optional , Any , List
23from langgraph .graph import StateGraph , END
34from app .agent .nodes .retrieval import retrieve
45from app .agent .nodes .query_transform import transform_query
56from app .agent .nodes .generation import generate
67from app .agent .nodes .grading import grade_message , grade_documents
8+ from app .agent .nodes .brand_mapping import brand_mapping
79from langchain_core .documents import Document
810
911class AgentState (TypedDict ):
@@ -14,6 +16,9 @@ class AgentState(TypedDict):
1416 trigger_context : Optional [dict ]
1517 trigger_data : Optional [dict ] # 트리거 데이터 청크
1618 status : Optional [str ]
19+ product_contexts : List [dict ]
20+ review_contexts : List [dict ]
21+ grade_style_loop_count : int
1722
1823 question : str
1924 generation : str # 생성된 메시지
@@ -25,61 +30,60 @@ class AgentState(TypedDict):
2530 grade_style_loop_count : int
2631 feedback : str
2732
28- def build_graph ():
2933
30- # Conditional Edge for Document Grading
31- def decide_document (state ):
32- """문서 검색 로직
33- 1. 통과 -> 메시지 생성
34- 2. 탈락 -> 쿼리 수정 및 문서 재검색
35- 3. 탈락 2회 이상 -> 메시지 생성 (무한루프 방지)"""
36-
37- grade = state .get ("relevance_grade" )
38- grade_document_loop_count = state .get ("grade_document_loop_count" , 0 )
34+ # --- 1. 문서 검색 조건부 로직 (최대 2회) ---
35+ def decide_document (state ):
36+ """문서 검색 로직
37+ 1. 통과 -> 메시지 생성
38+ 2. 탈락 -> 쿼리 수정 및 문서 재검색
39+ 3. 탈락 2회 이상 -> 메시지 생성 (무한루프 방지)"""
40+
41+ grade = state .get ("relevance_grade" )
42+ grade_document_loop_count = state .get ("grade_document_loop_count" , 0 )
43+
44+ if grade == 'yes' :
45+ print ("검수 통과 -> 메시지 생성으로 넘어갑니다." )
46+ return "generate"
3947
40- if grade == 'yes' :
41- print ("검수 통과 -> 메시지 생성으로 넘어갑니다." )
42- return "generate"
48+ if grade_document_loop_count >= 2 :
49+ print ("재탐색 한계 도달 -> 문서 재검색 없이 메시지 생성으로 넘어갑니다." )
50+ return "generate"
4351
44- if grade_document_loop_count >= 2 :
45- print ("재탐색 한계 도달 -> 문서 재검색 없이 메시지 생성으로 넘어갑니다." )
46- return "generate"
52+ print ("검수 탈락 -> 쿼리 재작성 및 문서 재검색" )
53+ return "transform_query"
4754
48- print ("검수 탈락 -> 쿼리 재작성 및 문서 재검색" )
49- return "modify_query"
55+ # --- 2. 메시지 생성 조건부 로직 (최대 2회) ---
56+ def decide_generation (state ):
57+ """메시지 생성 로직
58+ 1. 통과 -> 최종 메시지 출력
59+ 2. 탈락 -> 피드백 반영해 메시지 재생성
60+ 3. 탈락 2회 이상 -> 최종 메시지 출력 (무한루프 방지)"""
5061
51-
52-
53- # Conditional Edge for Message Grading
54- def decide_generation (state ):
55- """메시지 생성 로직
56- 1. 통과 -> 최종 메시지 출력
57- 2. 탈락 -> 피드백 반영해 메시지 재생성
58- 3. 탈락 2회 이상 -> 최종 메시지 출력 (무한루프 방지)"""
62+ grade = state .get ("style_grade" )
63+ grade_style_loop_count = state .get ("grade_style_loop_count" , 0 )
5964
60- grade = state .get ("style_grade" )
61- grade_style_loop_count = state .get ("grade_style_loop_count" , 0 )
65+ if grade == 'yes' :
66+ print ("검수 통과 -> 메시지 생성 완료." )
67+ return "brand_mapping"
6268
63- if grade == 'yes' :
64- print ("검수 통과 -> 메시지 생성 완료 ." )
65- return END
69+ if grade_style_loop_count >= 2 :
70+ print ("재생성 한계 도달 -> 메시지 재생성 없이 출력 ." )
71+ return "brand_mapping"
6672
67- if grade_style_loop_count >= 2 :
68- print ("재생성 한계 도달 -> 메시지 재생성 없이 출력." )
69- return END
70-
71- print ("검수 탈락 -> 피드백 반영하여 메시지 재생성." )
72- return "generate"
73+ print ("검수 탈락 -> 피드백 반영하여 메시지 재생성." )
74+ return "generate"
7375
7476
75-
77+ # --- 3. 그래프 빌더 ---
78+ def build_graph ():
7679 workflow = StateGraph (AgentState )
7780
7881 workflow .add_node ("retrieve" , retrieve )
7982 workflow .add_node ("grade_documents" , grade_documents )
8083 workflow .add_node ("transform_query" , transform_query )
8184 workflow .add_node ("generate" , generate )
8285 workflow .add_node ("grade_message" , grade_message )
86+ workflow .add_node ("brand_mapping" , brand_mapping )
8387
8488 # Set entry point
8589 workflow .set_entry_point ("retrieve" )
@@ -88,22 +92,23 @@ def decide_generation(state):
8892 "grade_documents" ,
8993 decide_document ,
9094 {
91- "modify_query " : "transform_query" ,
95+ "transform_query " : "transform_query" ,
9296 "generate" : "generate"
9397 }
9498 )
9599 workflow .add_edge ("transform_query" , "retrieve" )
96100 workflow .add_edge ("generate" , "grade_message" )
101+
97102 workflow .add_conditional_edges (
98103 "grade_message" ,
99104 decide_generation ,
100105 {
101106 "generate" : "generate" ,
102- END : END
107+ "brand_mapping" : "brand_mapping"
103108 }
104109 )
105110
111+ workflow .add_edge ("brand_mapping" , END )
106112 return workflow .compile ()
107113
108-
109- agent_executor = build_graph ()
114+ agent_executor = build_graph ()
0 commit comments