Skip to content

Commit ee7911f

Browse files
committed
feat: query prompt를 마크다운 형태로 관리
1 parent 51d58d8 commit ee7911f

File tree

5 files changed

+49
-64
lines changed

5 files changed

+49
-64
lines changed

interface/streamlit_app.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,8 @@ def summarize_total_tokens(data):
4444

4545
# 결과 출력
4646
st.write("총 토큰 사용량:", total_tokens)
47-
# st.write("결과:", res["generated_query"].content)
48-
st.write("결과:", "\n\n```sql\n" + res["generated_query"] + "\n```")
47+
st.write("결과:", res["generated_query"].content)
48+
# st.write("결과:", "\n\n```sql\n" + res["generated_query"] + "\n```")
4949
st.write("결과 설명:\n\n", res["messages"][-1].content)
5050
st.write("AI가 재해석한 사용자 질문:\n", res["refined_input"].content)
5151
st.write("참고한 테이블 목록:", res["searched_tables"])

llm_utils/chains.py

Lines changed: 7 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from .llm_factory import get_llm
55

66
from dotenv import load_dotenv
7+
from prompt.template_loader import get_prompt_template
78
import yaml
89

910
env_path = os.path.join(os.getcwd(), ".env")
@@ -13,6 +14,7 @@
1314
else:
1415
print(f"⚠️ 환경변수 파일(.env)이 {os.getcwd()}에 없습니다!")
1516

17+
1618
llm = get_llm(
1719
model_type="openai",
1820
model_name="gpt-4o-mini",
@@ -21,45 +23,12 @@
2123

2224

2325
def create_query_refiner_chain(llm):
26+
prompt = get_prompt_template('query_refiner_prompt')
2427
tool_choice_prompt = ChatPromptTemplate.from_messages(
2528
[
26-
(
27-
"system",
28-
"""
29-
당신은 데이터 분석 전문가(데이터 분석가 페르소나)입니다.
30-
현재 subscription_activities, contract_activities, marketing_activities,
31-
sales_activities, success_activities, support_activities, trial_activities 데이터를
32-
보유하고 있으며, 사용자의 질문이 모호할 경우에도 우리가 가진 데이터를 기반으로
33-
충분히 답변 가능한 형태로 질문을 구체화해 주세요.
34-
35-
주의:
36-
- 사용자에게 추가 정보를 요구하는 ‘재질문(추가 질문)’을 하지 마세요.
37-
- 질문에 포함해야 할 요소(예: 특정 기간, 대상 유저 그룹, 분석 대상 로그 종류 등)가
38-
불충분하더라도, 합리적으로 추론해 가정한 뒤
39-
답변에 충분한 질문 형태로 완성해 주세요.
40-
41-
예시:
42-
사용자가 "유저 이탈 원인이 궁금해요"라고 했다면,
43-
재질문 형식이 아니라
44-
"최근 1개월 간의 접속·결제 로그를 기준으로,
45-
주로 어떤 사용자가 어떤 과정을 거쳐 이탈하는지를 분석해야 한다"처럼
46-
분석 방향이 명확해진 질문 한 문장(또는 한 문단)으로 정리해 주세요.
47-
48-
최종 출력 형식 예시:
49-
------------------------------
50-
구체화된 질문:
51-
"최근 1개월 동안 고액 결제 경험이 있는 유저가
52-
행동 로그에서 이탈 전 어떤 패턴을 보였는지 분석"
53-
54-
가정한 조건:
55-
- 최근 1개월치 행동 로그와 결제 로그 중심
56-
- 고액 결제자(월 결제액 10만 원 이상) 그룹 대상으로 한정
57-
------------------------------
58-
""",
59-
),
29+
SystemMessagePromptTemplate.from_template(prompt),
6030
MessagesPlaceholder(variable_name="user_input"),
61-
(
62-
"system",
31+
SystemMessagePromptTemplate.from_template(
6332
"""
6433
위 사용자의 입력을 바탕으로
6534
분석 관점에서 **충분히 답변 가능한 형태**로
@@ -76,10 +45,10 @@ def create_query_refiner_chain(llm):
7645
# QueryMakerChain
7746
def create_query_maker_chain(llm):
7847
# SystemPrompt만 yaml 파일로 불러와서 사용
79-
prompt = load_prompt("../prompt/system_prompt.yaml", encoding="utf-8")
48+
prompt = get_prompt_template('query_maker_prompt')
8049
query_maker_prompt = ChatPromptTemplate.from_messages(
8150
[
82-
SystemMessagePromptTemplate.from_template(prompt.template),
51+
SystemMessagePromptTemplate.from_template(prompt),
8352
(
8453
"system",
8554
"아래는 사용자의 질문 및 구체화된 질문입니다:",
@@ -101,21 +70,6 @@ def create_query_maker_chain(llm):
10170
return query_maker_prompt | llm
10271

10372

104-
def create_query_maker_chain_from_chat_promt(llm):
105-
"""
106-
ChatPromptTemplate 형식으로 저장된 yaml 파일을 불러와서 사용 (코드가 간소화되지만, 별도의 후처리 작업이 필요)
107-
"""
108-
with open("../prompt/create_query_maker_chain.yaml", "r", encoding="utf-8") as f:
109-
chat_prompt_dict = yaml.safe_load(f)
110-
111-
messages = chat_prompt_dict['messages']
112-
template = messages[0]["prompt"].pop("template") if messages else None
113-
template = [tuple(item) for item in template]
114-
query_maker_prompt = ChatPromptTemplate.from_messages(template)
115-
116-
return query_maker_prompt | llm
117-
118-
11973
query_refiner_chain = create_query_refiner_chain(llm)
12074
query_maker_chain = create_query_maker_chain(llm)
12175

llm_utils/graph.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ class QueryMakerState(TypedDict):
3535

3636
# 노드 함수: QUERY_REFINER 노드
3737
def query_refiner_node(state: QueryMakerState):
38+
print('query_refiner_node 진입 [md]')
3839
res = query_refiner_chain.invoke(
3940
input={
4041
"user_input": [state["messages"][0].content],
@@ -60,6 +61,7 @@ def get_table_info_node(state: QueryMakerState):
6061
)
6162
except:
6263
documents = get_info_from_db()
64+
print("db_embedding 진입")
6365
db = FAISS.from_documents(documents, embeddings)
6466
db.save_local(os.getcwd() + "/table_info_db")
6567
print("table_info_db not found")
@@ -139,10 +141,10 @@ def query_maker_node_with_db_guide(state: QueryMakerState):
139141
# 노드 추가
140142
builder.add_node(QUERY_REFINER, query_refiner_node)
141143
builder.add_node(GET_TABLE_INFO, get_table_info_node)
142-
# builder.add_node(QUERY_MAKER, query_maker_node) # query_maker_node_with_db_guide
143-
builder.add_node(
144-
QUERY_MAKER, query_maker_node_with_db_guide
145-
) # query_maker_node_with_db_guide
144+
builder.add_node(QUERY_MAKER, query_maker_node) # query_maker_node_with_db_guide
145+
# builder.add_node(
146+
# QUERY_MAKER, query_maker_node_with_db_guide
147+
# ) # query_maker_node_with_db_guide
146148

147149
# 기본 엣지 설정
148150
builder.add_edge(QUERY_REFINER, GET_TABLE_INFO)

prompt/system_prompt.md renamed to prompt/query_maker_prompt.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
당신은 데이터 분석 전문가(데이터 분석가 페르소나)입니다.
44
사용자의 질문을 기반으로, 주어진 테이블과 컬럼 정보를 활용하여 적절한 SQL 쿼리를 생성하세요.
55

6-
# 주의사항:
6+
# 주의사항
77
- 사용자의 질문이 다소 모호하더라도, 주어진 데이터를 참고하여 합리적인 가정을 통해 SQL 쿼리를 완성하세요.
88
- 불필요한 재질문 없이, 가능한 가장 명확한 분석 쿼리를 만들어 주세요.
99
- 최종 출력 형식은 반드시 아래와 같아야 합니다.
@@ -20,7 +20,4 @@
2020
```plaintext (max_length_per_line=100)
2121
이 쿼리는 stg_users 테이블에서 고유한 사용자의 수를 계산합니다.
2222
사용자는 유니크한 user_id를 가지고 있으며
23-
중복을 제거하기 위해 COUNT(DISTINCT user_id)를 사용했습니다.
24-
25-
# Input Example
26-
{user_query}
23+
중복을 제거하기 위해 COUNT(DISTINCT user_id)를 사용했습니다.

prompt/query_refiner_prompt.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# Role
2+
3+
당신은 데이터 분석 전문가(데이터 분석가 페르소나)입니다.
4+
현재 subscription_activities, contract_activities, marketing_activities,
5+
sales_activities, success_activities, support_activities, trial_activities 데이터를
6+
보유하고 있으며, 사용자의 질문이 모호할 경우에도 우리가 가진 데이터를 기반으로
7+
충분히 답변 가능한 형태로 질문을 구체화해 주세요.
8+
9+
# 주의사항:
10+
- 사용자에게 추가 정보를 요구하는 ‘재질문(추가 질문)’을 하지 마세요.
11+
- 질문에 포함해야 할 요소(예: 특정 기간, 대상 유저 그룹, 분석 대상 로그 종류 등)가
12+
불충분하더라도, 합리적으로 추론해 가정한 뒤
13+
답변에 충분한 질문 형태로 완성해 주세요.
14+
예시:
15+
사용자가 "유저 이탈 원인이 궁금해요"라고 했다면,
16+
재질문 형식이 아니라
17+
"최근 1개월 간의 접속·결제 로그를 기준으로,
18+
주로 어떤 사용자가 어떤 과정을 거쳐 이탈하는지를 분석해야 한다"처럼
19+
분석 방향이 명확해진 질문 한 문장(또는 한 문단)으로 정리해 주세요.
20+
21+
# Output Example
22+
23+
최종 출력 형식 예시:
24+
------------------------------
25+
구체화된 질문:
26+
"최근 1개월 동안 고액 결제 경험이 있는 유저가
27+
행동 로그에서 이탈 전 어떤 패턴을 보였는지 분석"
28+
29+
가정한 조건:
30+
- 최근 1개월치 행동 로그와 결제 로그 중심
31+
- 고액 결제자(월 결제액 10만 원 이상) 그룹 대상으로 한정
32+
------------------------------

0 commit comments

Comments
 (0)