Skip to content

Commit 32e3174

Browse files
committed
다이얼렉트 정보 추가 및 DB 선택 기능 개선
1 parent 92c50aa commit 32e3174

File tree

4 files changed

+101
-6
lines changed

4 files changed

+101
-6
lines changed

engine/query_executor.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,26 @@ def execute_query(
8282
"retriever_name": retriever_name,
8383
"top_n": top_n,
8484
"device": device,
85+
# 다이얼렉트 정보 주입 (있다면 세션에서, 없으면 기본값)
86+
"dialect_name": (
87+
session_state.get("selected_dialect_option", {}).get("name")
88+
if session_state is not None
89+
else database_env
90+
),
91+
"supports_ilike": (
92+
bool(
93+
session_state.get("selected_dialect_option", {}).get(
94+
"supports_ilike", False
95+
)
96+
)
97+
if session_state is not None
98+
else False
99+
),
100+
"dialect_hints": (
101+
session_state.get("selected_dialect_option", {}).get("hints", [])
102+
if session_state is not None
103+
else []
104+
),
85105
}
86106
)
87107

interface/lang2sql.py

Lines changed: 66 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,9 @@
88
import re
99

1010
import streamlit as st
11-
from langchain.chains.sql_database.prompt import SQL_PROMPTS
1211
from langchain_core.messages import AIMessage
12+
from interface.dialects import PRESET_DIALECTS, DialectOption
13+
from copy import deepcopy
1314

1415
from db_utils import get_db_connector
1516
from db_utils.base_connector import BaseConnector
@@ -344,11 +345,70 @@ def _as_float(value):
344345
"쿼리를 입력하세요:",
345346
value=DEFAULT_QUERY,
346347
)
347-
user_database_env = st.selectbox(
348-
"DB 환경정보를 입력하세요:",
349-
options=SQL_PROMPTS.keys(),
350-
index=0,
351-
)
348+
349+
# DB 프리셋을 세션에 로드(편집 가능)
350+
if "dialects" not in st.session_state:
351+
st.session_state["dialects"] = {k: v.to_dict() for k, v in PRESET_DIALECTS.items()}
352+
353+
st.markdown("### DB 선택 및 관리")
354+
cols = st.columns(2)
355+
356+
# 공통 변수 최소화
357+
dialects = st.session_state["dialects"]
358+
keys = list(dialects.keys())
359+
active = st.session_state.get("active_dialect", keys[0])
360+
361+
with cols[0]:
362+
user_database_env = st.selectbox(
363+
"사용할 DB를 선택하세요:",
364+
options=keys,
365+
index=(keys.index(active) if active in keys else 0),
366+
)
367+
st.session_state["active_dialect"] = user_database_env
368+
st.session_state["selected_dialect_option"] = dialects.get(
369+
user_database_env, dialects[keys[0]]
370+
)
371+
372+
with cols[1]:
373+
st.caption("선택된 DB 설정을 편집하거나 새로 추가할 수 있습니다.")
374+
375+
with st.expander("DB 편집"):
376+
edit_key = st.selectbox(
377+
"편집할 DB를 선택하세요:",
378+
options=keys,
379+
index=(
380+
keys.index(st.session_state["active_dialect"])
381+
if st.session_state.get("active_dialect") in keys
382+
else 0
383+
),
384+
key="dialect_edit_selector",
385+
)
386+
# 편집 대상 선택 시 메인 선택과 동기화
387+
st.session_state["active_dialect"] = edit_key
388+
st.session_state["selected_dialect_option"] = dialects[edit_key]
389+
390+
current = deepcopy(dialects[edit_key])
391+
_supports_ilike = st.checkbox(
392+
"ILIKE 지원", value=bool(current.get("supports_ilike", False))
393+
)
394+
# limit_syntax 제거: hints로 사용자가 커버
395+
_hints_text = st.text_area(
396+
"hints (쉼표로 구분)",
397+
value=", ".join(current.get("hints", [])),
398+
help="예약어/함수/문법 힌트를 쉼표로 구분하여 입력",
399+
)
400+
if st.button("변경사항 저장", key="btn_save_dialect_edit"):
401+
st.session_state["dialects"][edit_key] = DialectOption(
402+
name=edit_key,
403+
supports_ilike=_supports_ilike,
404+
hints=[s.strip() for s in _hints_text.split(",") if s.strip()],
405+
).to_dict()
406+
# 저장 후 선택된 다이얼렉트 옵션도 최신 값으로 동기화
407+
st.session_state["selected_dialect_option"] = st.session_state["dialects"][
408+
edit_key
409+
]
410+
st.success(f"{edit_key} DB가 업데이트되었습니다.")
411+
352412

353413
_device_options = ["cpu", "cuda"]
354414
_default_device = st.session_state.get("default_device", "cpu")

llm_utils/graph_utils/base.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,10 @@ class QueryMakerState(TypedDict):
3838
top_n: int
3939
device: str
4040
question_gate_result: dict
41+
# 다이얼렉트 정보
42+
dialect_name: str
43+
supports_ilike: bool
44+
dialect_hints: list[str]
4145

4246

4347
# 노드 함수: QUESTION_GATE 노드
@@ -245,6 +249,10 @@ def query_maker_node(state: QueryMakerState):
245249
"user_input": combined_input,
246250
"user_database_env": state["user_database_env"],
247251
"searched_tables": searched_tables_json,
252+
# 다이얼렉트 변수 전달
253+
"dialect_name": state.get("dialect_name", ""),
254+
"supports_ilike": state.get("supports_ilike", False),
255+
"dialect_hints": ", ".join(state.get("dialect_hints", [])),
248256
}
249257
)
250258
state["generated_query"] = res

prompt/query_maker_prompt.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
# 주의사항
77
- 사용자의 질문이 다소 모호하더라도, 주어진 데이터를 참고하여 합리적인 가정을 통해 SQL 쿼리를 완성하세요.
88
- 불필요한 재질문 없이, 가능한 가장 명확한 분석 쿼리를 만들어 주세요.
9+
- 반드시 입력된 다이얼렉트 변수들을 준수하여 문법을 선택하세요.
910
- 최종 출력 형식은 반드시 아래와 같아야 합니다.
1011

1112
# Output Example
@@ -34,7 +35,13 @@
3435
- 관련 테이블 및 컬럼 정보:
3536
{searched_tables}
3637

38+
- 다이얼렉트 정보:
39+
- dialect_name: {dialect_name}
40+
- supports_ilike: {supports_ilike}
41+
- dialect_hints: {dialect_hints}
42+
3743
# Notes
3844

3945
- 위 입력을 바탕으로 최적의 SQL을 생성하세요.
46+
- {dialect_hints}를 참고하여 엔진에 맞는 함수/연산자를 우선 사용하세요.
4047
- 출력은 위 '최종 형태 예시'와 동일한 구조로만 작성하세요.

0 commit comments

Comments
 (0)