Skip to content

Commit 38e0bfc

Browse files
committed
Implement QueryRefinedAgainChain for enhanced query refinement process
- Added create_query_redefined_again_chain function to llm_utils/chains.py for generating refined queries based on user input and database context. - Integrated the new chain into llm_utils/graph.py, including a new node function for processing refined queries. - Updated state management to accommodate the refined input again, enhancing the query-making workflow.
1 parent 6fb7370 commit 38e0bfc

File tree

2 files changed

+80
-2
lines changed

2 files changed

+80
-2
lines changed

llm_utils/chains.py

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,61 @@ def create_query_refiner_chain(llm):
7272
return tool_choice_prompt | llm
7373

7474

75+
# QueryRefinedAgainChain
76+
def create_query_redefined_again_chain(llm):
77+
query_redefined_again_prompt = ChatPromptTemplate.from_messages(
78+
[
79+
(
80+
"system",
81+
"""
82+
당신은 데이터 분석 전문가(데이터 분석가 페르소나)입니다.
83+
사용자의 질문과 이미 구체화된 질문을 바탕으로, 실제 사용 가능한 테이블과 컬럼 정보를 검토하여
84+
더욱 정교하게 질문을 재정의해 주세요.
85+
86+
주의사항:
87+
- 이전에 구체화된 질문을 기반으로 하되, 실제 DB 환경에서 사용 가능한 테이블/컬럼을 고려해 현실적인 분석 방향을 제시하세요.
88+
- 불필요한 재질문 없이, 주어진 데이터로 최대한 분석 가능한 형태로 질문을 구체화하세요.
89+
- 테이블 구조에 맞게 분석 질문을 조정하고, 필요한 가정을 추가하세요.
90+
- 최종 출력 형식은 반드시 아래와 같아야 합니다.
91+
92+
최종 형태 예시:
93+
94+
<최종 구체화된 질문>
95+
```
96+
최근 30일간 결제 금액이 10만원 이상인 사용자들의 서비스 이용 패턴과 이탈율을 분석하여,
97+
어떤 활동 패턴을 보이는 고액 결제자가 이탈하는지 파악
98+
```
99+
100+
<분석 접근 방향>
101+
```
102+
1. subscription_activities와 contract_activities 테이블을 조인하여 고액 결제자 식별
103+
2. 해당 사용자들의 activity_type 분포 확인
104+
3. 이탈 사용자(30일 이상 미접속)와 활성 사용자의 행동 패턴 비교 분석
105+
4. 주요 이탈 지점 식별
106+
```
107+
""",
108+
),
109+
(
110+
"system",
111+
"아래는 사용자의 원래 질문 및 1차 구체화된 질문입니다:",
112+
),
113+
MessagesPlaceholder(variable_name="user_input"),
114+
MessagesPlaceholder(variable_name="refined_input"),
115+
(
116+
"system",
117+
"다음은 사용자의 DB 환경정보와 실제 사용 가능한 테이블 및 컬럼 정보입니다:",
118+
),
119+
MessagesPlaceholder(variable_name="user_database_env"),
120+
MessagesPlaceholder(variable_name="searched_tables"),
121+
(
122+
"system",
123+
"위 정보를 바탕으로 DB 구조에 맞게 더욱 구체화된 최종 질문과 분석 접근 방향을 최종 형태 예시와 같은 형식으로 작성해주세요.",
124+
),
125+
]
126+
)
127+
return query_redefined_again_prompt | llm
128+
129+
75130
# QueryMakerChain
76131
def create_query_maker_chain(llm):
77132
query_maker_prompt = ChatPromptTemplate.from_messages(
@@ -110,6 +165,7 @@ def create_query_maker_chain(llm):
110165
),
111166
MessagesPlaceholder(variable_name="user_input"),
112167
MessagesPlaceholder(variable_name="refined_input"),
168+
MessagesPlaceholder(variable_name="refined_input_again"),
113169
(
114170
"system",
115171
"다음은 사용자의 db 환경정보와 사용 가능한 테이블 및 컬럼 정보입니다:",
@@ -126,4 +182,5 @@ def create_query_maker_chain(llm):
126182

127183

128184
query_refiner_chain = create_query_refiner_chain(llm)
185+
query_redefined_again_chain = create_query_redefined_again_chain(llm)
129186
query_maker_chain = create_query_maker_chain(llm)

llm_utils/graph.py

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,15 @@
1010

1111
from llm_utils.chains import (
1212
query_refiner_chain,
13+
query_redefined_again_chain,
1314
query_maker_chain,
1415
)
1516

1617
from llm_utils.tools import get_info_from_db
1718

1819
# 노드 식별자 정의
1920
QUERY_REFINER = "query_refiner"
21+
QUERY_REFINED_AGAIN = "query_redefined_again"
2022
GET_TABLE_INFO = "get_table_info"
2123
TOOL = "tool"
2224
TABLE_FILTER = "table_filter"
@@ -30,6 +32,7 @@ class QueryMakerState(TypedDict):
3032
searched_tables: dict[str, dict[str, str]]
3133
best_practice_query: str
3234
refined_input: str
35+
refined_input_again: str
3336
generated_query: str
3437

3538

@@ -90,6 +93,20 @@ def get_table_info_node(state: QueryMakerState):
9093
return state
9194

9295

96+
def query_redefined_again_node(state: QueryMakerState):
97+
res = query_redefined_again_chain.invoke(
98+
input={
99+
"user_input": [state["messages"][0].content],
100+
"refined_input": [state["refined_input"]],
101+
"user_database_env": [state["user_database_env"]],
102+
"searched_tables": [json.dumps(state["searched_tables"])],
103+
}
104+
)
105+
state["refined_input_again"] = res
106+
print(state["refined_input_again"])
107+
return state
108+
109+
93110
# 노드 함수: QUERY_MAKER 노드
94111
def query_maker_node(state: QueryMakerState):
95112
res = query_maker_chain.invoke(
@@ -121,7 +138,9 @@ def query_maker_node_with_db_guide(state: QueryMakerState):
121138
res = chain.invoke(
122139
input={
123140
"input": "\n\n---\n\n".join(
124-
[state["messages"][0].content] + [state["refined_input"].content]
141+
[state["messages"][0].content]
142+
# + [state["refined_input"].content]
143+
+ [state["refined_input_again"].content]
125144
),
126145
"table_info": [json.dumps(state["searched_tables"])],
127146
"top_k": 10,
@@ -143,10 +162,12 @@ def query_maker_node_with_db_guide(state: QueryMakerState):
143162
builder.add_node(
144163
QUERY_MAKER, query_maker_node_with_db_guide
145164
) # query_maker_node_with_db_guide
165+
builder.add_node(QUERY_REFINED_AGAIN, query_redefined_again_node)
146166

147167
# 기본 엣지 설정
148168
builder.add_edge(QUERY_REFINER, GET_TABLE_INFO)
149-
builder.add_edge(GET_TABLE_INFO, QUERY_MAKER)
169+
builder.add_edge(GET_TABLE_INFO, QUERY_REFINED_AGAIN)
170+
builder.add_edge(QUERY_REFINED_AGAIN, QUERY_MAKER)
150171

151172
# QUERY_MAKER 노드 후 종료
152173
builder.add_edge(QUERY_MAKER, END)

0 commit comments

Comments
 (0)