Streamlit κΈ°λ° Lang2SQL λ°μ΄ν° λΆμ λꡬμ μ¬μ©μ μΈν°νμ΄μ€ λ μ΄μ΄μ λλ€.
interface/
βββ app_pages/ # Streamlit νμ΄μ§λ€
β βββ __init__.py
β βββ chatbot.py # AI ChatBot νμ΄μ§
β βββ graph_builder.py # LangGraph κ΅¬μ± νμ΄μ§
β βββ home.py # ν νμ΄μ§
β βββ lang2sql.py # Lang2SQL λ©μΈ νμ΄μ§
β βββ settings.py # μ€μ νμ΄μ§ (ν ꡬμ±)
β βββ sidebar_components/ # μ¬μ΄λλ° UI μ»΄ν¬λνΈ
β β βββ __init__.py
β β βββ chatbot_session_controller.py
β β βββ data_source_selector.py
β β βββ db_selector.py
β β βββ embedding_selector.py
β β βββ llm_selector.py
β β βββ README.md
β βββ settings_sections/ # μ€μ νμ΄μ§ μΉμ
λ€
β βββ __init__.py
β βββ data_source_section.py
β βββ db_section.py
β βββ llm_section.py
β βββ README.md
βββ core/ # ν΅μ¬ μΈν°νμ΄μ€ λ‘μ§
β βββ config/ # μ€μ κ΄λ¦¬
β β βββ __init__.py
β β βββ models.py # μ€μ λ°μ΄ν° λͺ¨λΈ
β β βββ paths.py # νμΌ κ²½λ‘ κ΄λ¦¬
β β βββ persist.py # λμ€ν¬ μ μ₯/λ‘λ
β β βββ registry_data_sources.py
β β βββ registry_db.py
β β βββ registry_llm.py
β β βββ settings.py # μ€μ μ
λ°μ΄νΈ API
β βββ dialects.py # SQL λ€μ΄μΌλ νΈ ν리μ
β βββ lang2sql_runner.py # Lang2SQL μ€ν λνΌ
β βββ result_renderer.py # κ²°κ³Ό μκ°ν
β βββ session_utils.py # μΈμ
κ΄λ¦¬
βββ pages_config.py # νμ΄μ§ ꡬμ±
βββ streamlit_app.py # λ©μΈ μ§μ
μ
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β streamlit_app.py β
β (λ©μΈ μ§μ
μ , νμ΄μ§ λ€λΉκ²μ΄μ
) β
ββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββ
β
ββββββββββ΄ββββββββββ
β pages_config.py β
β (νμ΄μ§ μ€μ ) β
ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ
β home.py β β lang2sql.py β β chatbot.py β
β (ν/μκ°) β β (λ©μΈ κΈ°λ₯) β β (AI μ±ν
) β
βββββββββββββββββ βββββββββ¬ββββββββ βββββββββββββββββ
β β
β ββββββββββ΄βββββββββ
β β β
βΌ βΌ βΌ
βββββββββββββββββ βββββββββββββββββ βββββββββββββββββ
βgraph_builder.pyβ β settings.py β βsidebar_componentsβ
β (κ·Έλν ꡬμ±) β β (μ€μ ) β β (μ¬μ΄λλ°) β
βββββββββββββββββ βββββββββ¬ββββββββ βββββββββ¬ββββββββ
β β
βΌ βΌ
ββββββββββββββββββ ββββββββββββββββββ
βsettings_sectionsβ β core/config/ β
β (μ€μ UI) β β (μ€μ κ΄λ¦¬) β
ββββββββββββββββββ ββββββββββ¬ββββββββ
β
βΌ
ββββββββββββββββββββ
β core/ β
β - dialects.py β
β - lang2sql_runnerβ
β - result_rendererβ
β - session_utils β
ββββββββββββββββββββ
Streamlit μ ν리μΌμ΄μ μ λ©μΈ μ§μ μ μ λλ€.
μν :
- μ ν리μΌμ΄μ μ μ μ€μ μ΄κΈ°ν (μ λͺ©, μμ΄μ½, λ μ΄μμ)
- νμ΄μ§ λ€λΉκ²μ΄μ κ΅¬μ± λ° μ€ν
μ£Όμ ν¨μ:
configure_app(): Streamlit μ μ μ€μ main(): μ ν리μΌμ΄μ μ§μ μ
μ¬μ© μμ:
# streamlit run interface/streamlit_app.pyμμ‘΄μ±:
interface.pages_config.PAGES: νμ΄μ§ λͺ©λ‘
Streamlit νμ΄μ§ κ΅¬μ± μ μ λͺ¨λμ λλ€.
μν :
- κ° νμ΄μ§μ κ²½λ‘μ μ λͺ© μ μ
- λ€λΉκ²μ΄μ μ μ¬μ©λλ νμ΄μ§ 리μ€νΈ μ 곡
λ΄μ©:
PAGES: 5κ° νμ΄μ§ μ μ- ν (home.py)
- Lang2SQL (lang2sql.py)
- κ·Έλν λΉλ (graph_builder.py)
- ChatBot (chatbot.py)
- μ€μ (settings.py)
μ¬μ©μ²:
streamlit_app.py(line 9, 37)
Streamlit μ ν리μΌμ΄μ μ κ° νμ΄μ§ λͺ¨λλ€μ λλ€.
ν νμ΄μ§λ‘ Lang2SQL λꡬ μκ° λ° μ¬μ© λ°©λ² μλ΄λ₯Ό μ 곡ν©λλ€.
μ£Όμ λ΄μ©:
- λꡬ μκ° λ° νμ λ©μμ§
- μ¬μ© λ°©λ² κ°μ΄λ
- μ£Όμ κΈ°λ₯ λ§ν¬ μλ΄
μ¬μ©μ²:
pages_config.py(line 18)
Lang2SQL λ©μΈ νμ΄μ§λ‘ μμ°μ΄ μ§μλ₯Ό SQL μΏΌλ¦¬λ‘ λ³ννκ³ κ²°κ³Όλ₯Ό μκ°νν©λλ€.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π Lang2SQL β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββ βββββββββββββββββββββββββ β
β β Sidebar β β Main Area β β
β β β β β β
β β ββββββββββββββββ β β βββββββββββββββββββββ β β
β β βData Source β β β β쿼리 μ
λ ₯ μμ β β β
β β βSelector β β β β β β β
β β ββββββββββββββββ β β β"κ³ κ° λ°μ΄ν°λ₯Ό..." β β β
β β ββββββββββββββββ β β βββββββββββββββββββββ β β
β β ββββββββββββββββ β β β β
β β βLLM Selector β β β βββββββββββββββββββββ β β
β β ββββββββββββββββ β β βDB μ ν λ° κ΄λ¦¬ β β β
β β ββββββββββββββββ β β βββββββββββββββββββββ β β
β β ββββββββββββββββ β β β β
β β βEmbedding Sel.β β β [κ²μκΈ° μ ν] β β
β β ββββββββββββββββ β β [Top-N κ°μ] β β
β β ββββββββββββββββ β β [λͺ¨λΈ μ€ν μ₯μΉ] β β
β β ββββββββββββββββ β β β β
β β βDB Selector β β β [쿼리 μ€ν] β β
β β ββββββββββββββββ β β β β
β β ββββββββββββββββ β β βββββββββββββββββββββ β β
β β Output Settings β β β κ²°κ³Ό νμ μμ β β β
β β β‘ Token Usage β β β - SQL 쿼리 β β β
β β β‘ Result Desc β β β - κ²°κ³Ό ν
μ΄λΈ β β β
β β β‘ Show SQL β β β - μ°¨νΈ β β β
β β ... β β βββββββββββββββββββββ β β
β β ββββββββββββββββ β β β β
β β μν¬νλ‘μ° μ ν β βββββββββββββββββββββββββ β
β β β κΈ°λ³Έ β β
β β β νμ₯ β β
β ββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
μ£Όμ κΈ°λ₯:
- μ¬μ΄λλ° μ€μ : λ°μ΄ν° μμ€, LLM, Embedding, DB μ ν
- μΆλ ₯ μ΅μ μ€μ (ν ν° μ¬μ©λ, SQL νμ, μ°¨νΈ λ±)
- μν¬νλ‘μ° μ ν (κΈ°λ³Έ/νμ₯)
- μμ°μ΄ μ§μ μ λ ₯ λ° SQL λ³ν μ€ν
- DB λ€μ΄μΌλ νΈ μ ν λ° νΈμ§
- κ²μκΈ° μ ν λ° Top-N μ€μ
- κ²°κ³Ό μκ°ν (ν μ΄λΈ, μ°¨νΈ)
μ£Όμ ν¨μ:
- νμ΄μ§ λ 벨μμ μ§μ μ€νλλ Streamlit UI μ½λ
μ¬μ© λͺ¨λ:
interface.core.dialects: λ€μ΄μΌλ νΈ ν리μ interface.core.lang2sql_runner: Lang2SQL μ€νinterface.core.result_renderer: κ²°κ³Ό μκ°νinterface.core.session_utils: κ·Έλν μ΄κΈ°νinterface.app_pages.sidebar_components: μ¬μ΄λλ° μ»΄ν¬λνΈ
μμ‘΄μ±:
engine.query_executor.execute_query: μ€μ 쿼리 μ€ν
LangGraph μν¬νλ‘μ°λ₯Ό ꡬμ±νκ³ μΈμ μ μ μ©νλ νμ΄μ§μ λλ€.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β LangGraph κ΅¬μ± UI β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β ν리μ
μ ν: β κΈ°λ³Έ β νμ₯ β 컀μ€ν
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β 컀μ€ν
μ΅μ
: β β
β β β PROFILE_EXTRACTION ν¬ν¨ β β
β β β CONTEXT_ENRICHMENT ν¬ν¨ β β
β β β QUERY_MAKER ν¬ν¨ β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β GET_TABLE_INFO μ€μ : β β
β β - ν
μ΄λΈ κ²μκΈ°: [λ²‘ν° κ²μ (κΈ°λ³Έ) βΌ] β β
β β - κ²μν ν
μ΄λΈ μ 보 κ°μ: [====β====] 5 β β
β β - λͺ¨λΈ μ€ν μ₯μΉ: [cpu βΌ] β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β μ€ν μμ: β β
β β GET_TABLE_INFO β PROFILE_EXTRACTION β ... β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β κ·Έλν μμ±: β β
β β βΉοΈ κ·Έλνκ° μΈμ
μ μ μ©λμμ΅λλ€. β β
β β [μΈμ
κ·Έλν μλ‘κ³ μΉ¨] β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β νμ¬ μΈμ
κ·Έλν μ€μ (expander) β β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
μ£Όμ κΈ°λ₯:
- ν리μ μ ν: κΈ°λ³Έ, νμ₯, 컀μ€ν
- λ Έλ μνμ€ κ΅¬μ± (GET_TABLE_INFO β PROFILE β CONTEXT β QUERY_MAKER)
- GET_TABLE_INFO μ€μ (κ²μκΈ°, Top-N, μ₯μΉ)
- κ·Έλν μΈμ μ μ μ© λ° μλ‘κ³ μΉ¨
- νμ¬ κ·Έλν μ€μ νμΈ
μ£Όμ ν¨μ:
build_selected_sequence(): ν리μ μ λ°λ₯Έ λ Έλ μνμ€ μμ±build_state_graph(): StateGraph λΉλ μμ±render_sequence(): μνμ€λ₯Ό λ¬Έμμ΄λ‘ λ³ν
μ¬μ© λͺ¨λ:
utils.llm.graph_utils.base: λ Έλ μ μ λ° κ·Έλν μ νΈ
AI ChatBot νμ΄μ§λ‘ LangGraph κΈ°λ° λνν μΈν°νμ΄μ€λ₯Ό μ 곡ν©λλ€.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π€ AI ChatBot β
βββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ€
β Sidebar β Chat Area β
β β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β βData Source Selector β β β μλ
νμΈμ! 무μμ... π€ β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β βLLM Selector β β β μ¬μ©μ: λ°μ΄ν°λ² μ΄μ€ ν
μ΄λΈ... β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β βEmbedding Selector β β β Assistant: κ΄λ ¨ ν
μ΄λΈμ... β β
β βββββββββββββββββββββββββ β β π€ λͺ¨λΈ: gpt-4o-mini β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββ β β
β βDB Selector β β βββββββββββββββββββββββββββββββ β
β βββββββββββββββββββββββββ β β μ¬μ©μ: [μ
λ ₯ μ€...] β β
β βββββββββββββββββββββββββ β βββββββββββββββββββββββββββββββ β
β π€ ChatBot μ€μ β β
β βββββββββββββββββββββββββ β β
β β Thread ID: uuid... β β β
β β [μ μΈμ
μμ] β β β
β βββββββββββββββββββββββββ β β
β βββββββββββββββββββββββββ β β
β λν κΈ°λ‘: β β
β - Thread ID β β
β - λ©μμ§ λͺ©λ‘ (JSON) β β
βββββββββββββββββββββββββββββ΄ββββββββββββββββββββββββββββββββββ
μ£Όμ κΈ°λ₯:
- OpenAI κΈ°λ° λνν AI μ±ν
- μ¬μ΄λλ° μ€μ : λ°μ΄ν° μμ€, LLM, Embedding, DB
- Thread ID κΈ°λ° μΈμ κ΄λ¦¬
- λν κΈ°λ‘ νμ λ° κ΄λ¦¬
- μ κ· μΈμ μμ κΈ°λ₯
μ£Όμ ν¨μ:
initialize_session_state(): μΈμ μν μ΄κΈ°ν λ° ChatBot μΈμ€ν΄μ€ μμ±
μ¬μ© λͺ¨λ:
utils.llm.chatbot.ChatBot: ChatBot ν΅μ¬ λ‘μ§interface.app_pages.sidebar_components: μ¬μ΄λλ° μ»΄ν¬λνΈinterface.core.config.load_config: μ€μ λ‘λ
μ μ½μ¬ν:
- νμ¬ OpenAIλ§ μ§μ
- OpenAI API ν€ νμ
μ€μ νμ΄μ§λ‘ λ°μ΄ν° μμ€, LLM, DB μ€μ μ νμΌλ‘ κ΄λ¦¬ν©λλ€.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β βοΈ μ€μ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ€
β β
β ββββββββββββ¬βββββββββββ¬βββββββββββ β
β βλ°μ΄ν° μμ€ β LLM β DB β β
β ββββββββββββ΄βββββββββββ΄βββββββββββ
8000
β
β β
β [μ νλ ν λ΄μ© νμ] β
β β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
μ£Όμ κΈ°λ₯:
- 3κ° νμΌλ‘ ꡬμ±: λ°μ΄ν° μμ€, LLM, DB
- κ° νμ settings_sections λͺ¨λ μ¬μ©
- μΈμ μ°μ μ€μ λ°μ
μ¬μ© λͺ¨λ:
interface.app_pages.settings_sections: κ° μ€μ μΉμ
μ¬μ΄λλ°μμ μ¬μ©λλ μ€μ μ ν μ»΄ν¬λνΈλ€μ λλ€.
λͺ¨λ ꡬ쑰:
data_source_selector.py: λ°μ΄ν° μμ€ μ ν (DataHub/VectorDB)llm_selector.py: LLM νλ‘νμΌ μ νembedding_selector.py: Embedding νλ‘νμΌ μ νdb_selector.py: DB νλ‘νμΌ μ νchatbot_session_controller.py: ChatBot μΈμ κ΄λ¦¬
μ¬μ©μ²:
lang2sql.py: λ©μΈ νμ΄μ§ μ¬μ΄λλ°chatbot.py: ChatBot νμ΄μ§ μ¬μ΄λλ°
μμΈν λ΄μ©: sidebar_components/README.md μ°Έκ³
μ€μ νμ΄μ§μ κ° μΉμ UI λͺ¨λλ€μ λλ€.
λͺ¨λ ꡬ쑰:
data_source_section.py: DataHub/VectorDB κ΄λ¦¬llm_section.py: LLM λ° Embedding μ€μ db_section.py: DB μ°κ²° μ€μ
μ¬μ©μ²:
settings.py: μ€μ νμ΄μ§ ν λ΄μ©
μμΈν λ΄μ©: settings_sections/README.md μ°Έκ³
ν΅μ¬ μΈν°νμ΄μ€ λ‘μ§μ λ΄λΉνλ λͺ¨λλ€μ λλ€.
SQL λ€μ΄μΌλ νΈ ν리μ μ μ λ° κ΄λ¦¬ λͺ¨λμ λλ€.
μ£Όμ λ΄μ©:
DialectOption: SQL μμ§ νΉμ± λ°μ΄ν°ν΄λμ€name: μμ§ νμ μ΄λ¦supports_ilike: ILIKE μ§μ μ¬λΆhints: μμ£Ό μ°μ΄λ ν¨μ λͺ©λ‘
PRESET_DIALECTS: 9κ° SQL μμ§ ν리μ - PostgreSQL, ClickHouse, Trino, Snowflake, Redshift
- BigQuery, MSSQL, Oracle, DuckDB
μ¬μ©μ²:
lang2sql.py(line 19, 85-124): DB μ ν λ° νΈμ§ UI
Lang2SQL μ€ν λνΌ λͺ¨λμ λλ€.
μ£Όμ ν¨μ:
run_lang2sql(): μμ°μ΄ μ§μλ₯Ό SQLλ‘ λ³ν ν μ€ν
νλΌλ―Έν°:
query: μμ°μ΄ μ§λ¬Έdatabase_env: λ°μ΄ν°λ² μ΄μ€ νκ²½ μ΄λ¦retriever_name: κ²μκΈ° μ νtop_n: κ²μν ν μ΄λΈ μ 보 κ°μdevice: λͺ¨λΈ μ€ν μ₯μΉ
μ¬μ©μ²:
lang2sql.py(line 139-145): 쿼리 μ€ν
μμ‘΄μ±:
engine.query_executor.execute_query: μ€μ μ€ν λ‘μ§
Lang2SQL μ€ν κ²°κ³Ό μκ°ν λͺ¨λμ λλ€.
μ£Όμ ν¨μ:
display_result(): Streamlit UIλ‘ κ²°κ³Ό μΆλ ₯
νμ νλͺ©:
- Question Gate κ²°κ³Ό
- λ¬Έμ μ ν©μ± νκ°
- ν ν° μ¬μ©λ
- SQL 쿼리 λ° ν΄μ
- κ²°κ³Ό μ€λͺ
- μ¬ν΄μλ μ§λ¬Έ
- μ°Έκ³ ν μ΄λΈ λͺ©λ‘
- 쿼리 μ€ν κ²°κ³Ό ν μ΄λΈ
- κ²°κ³Ό μ°¨νΈ (Plotly)
μ¬μ© λͺ¨λ:
infra.observability.token_usage.TokenUtils: ν ν° μ¬μ©λutils.databases.DatabaseFactory: DB 컀λ₯ν°utils.llm.llm_response_parser.LLMResponseParser: SQL νμ±utils.visualization.display_chart.DisplayChart: μ°¨νΈ μμ±
μ¬μ©μ²:
lang2sql.py(line 146): κ²°κ³Ό νμ
Streamlit μΈμ μνμμ κ·Έλν λΉλλ₯Ό μ΄κΈ°ννλ λͺ¨λμ λλ€.
μ£Όμ ν¨μ:
init_graph(): κ·Έλν μ΄κΈ°ν λ° μΈμ μν κ°±μ
νλΌλ―Έν°:
use_enriched: νμ₯ κ·Έλν μ¬μ© μ¬λΆ
λ°νκ°:
- κ·Έλν μ ν λ¬Έμμ΄ ("νμ₯λ" λλ "κΈ°λ³Έ")
μ¬μ©μ²:
lang2sql.py(line 72, 76): κ·Έλν μ΄κΈ°ν
μμ‘΄μ±:
utils.llm.graph_utils.enriched_graph: νμ₯ κ·Έλνutils.llm.graph_utils.basic_graph: κΈ°λ³Έ κ·Έλν
μ€μ κ΄λ¦¬ ν¨ν€μ§λ‘ λ°μ΄ν° μμ€, DB, LLM, Embedding μ€μ μ κ΄λ¦¬ν©λλ€.
μν€ν μ²:
config/
βββ models.py # λ°μ΄ν° λͺ¨λΈ μ μ
β βββ Config # μ μ μ€μ
β βββ DataHubSource # DataHub μμ€
β βββ VectorDBSource # VectorDB μμ€
β βββ DataSourcesRegistry # λ°μ΄ν° μμ€ λ μ§μ€νΈλ¦¬
β βββ DBConnectionProfile # DB νλ‘νμΌ
β βββ DBConnectionsRegistry # DB λ μ§μ€νΈλ¦¬
β βββ LLMProfile # LLM νλ‘νμΌ
β βββ LLMRegistry # LLM λ μ§μ€νΈλ¦¬
β βββ EmbeddingProfile # Embedding νλ‘νμΌ
β βββ EmbeddingRegistry # Embedding λ μ§μ€νΈλ¦¬
β
βββ paths.py # νμΌ κ²½λ‘ κ΄λ¦¬
β βββ get_registry_file_path() # λ°μ΄ν° μμ€ λ μ§μ€νΈλ¦¬ κ²½λ‘
β βββ get_db_registry_file_path() # DB λ μ§μ€νΈλ¦¬ κ²½λ‘
β βββ get_llm_registry_file_path() # LLM λ μ§μ€νΈλ¦¬ κ²½λ‘
β βββ get_embedding_registry_file_path() # Embedding λ μ§μ€νΈλ¦¬ κ²½λ‘
β
βββ persist.py # λμ€ν¬ μ μ₯/λ‘λ
β βββ save_registry_to_disk() # λ°μ΄ν° μμ€ μ μ₯
β βββ load_registry_from_disk() # λ°μ΄ν° μμ€ λ‘λ
β βββ save_db_registry_to_disk() # DB μ μ₯
β βββ load_db_registry_from_disk() # DB λ‘λ
β βββ save_llm_registry_to_disk() # LLM μ μ₯
β βββ load_llm_registry_from_disk() # LLM λ‘λ
β βββ save_embedding_registry_to_disk() # Embedding μ μ₯
β βββ load_embedding_registry_from_disk() # Embedding λ‘λ
β
βββ settings.py # μ€μ μ
λ°μ΄νΈ API
β βββ load_config() # μ€μ λ‘λ
β βββ update_datahub_server() # DataHub μλ² μ
λ°μ΄νΈ
β βββ update_data_source_mode() # λ°μ΄ν° μμ€ λͺ¨λ μ
λ°μ΄νΈ
β βββ update_vectordb_settings() # VectorDB μ€μ μ
λ°μ΄νΈ
β βββ update_llm_settings() # LLM μ€μ μ
λ°μ΄νΈ
β βββ update_embedding_settings() # Embedding μ€μ μ
λ°μ΄νΈ
β βββ update_db_settings() # DB μ€μ μ
λ°μ΄νΈ
β
βββ registry_data_sources.py # λ°μ΄ν° μμ€ λ μ§μ€νΈλ¦¬ κ΄λ¦¬
β βββ get_data_sources_registry() # λ μ§μ€νΈλ¦¬ μ‘°ν
β βββ add_datahub_source() # DataHub μΆκ°
β βββ update_datahub_source() # DataHub μ
λ°μ΄νΈ
β βββ delete_datahub_source() # DataHub μμ
β βββ add_vectordb_source() # VectorDB μΆκ°
β βββ update_vectordb_source() # VectorDB μ
λ°μ΄νΈ
β βββ delete_vectordb_source() # VectorDB μμ
β
βββ registry_db.py # DB λ μ§μ€νΈλ¦¬ κ΄λ¦¬
β βββ get_db_connections_registry() # λ μ§μ€νΈλ¦¬ μ‘°ν
β βββ add_db_connection() # DB μΆκ°
β βββ update_db_connection() # DB μ
λ°μ΄νΈ
β βββ delete_db_connection() # DB μμ
β
βββ registry_llm.py # LLM/Embedding λ μ§μ€νΈλ¦¬ κ΄λ¦¬
β βββ get_llm_registry() # LLM λ μ§μ€νΈλ¦¬ μ‘°ν
β βββ save_llm_profile() # LLM νλ‘νμΌ μ μ₯
β βββ get_embedding_registry() # Embedding λ μ§μ€νΈλ¦¬ μ‘°ν
β βββ save_embedding_profile() # Embedding νλ‘νμΌ μ μ₯
β
βββ __init__.py # ν¨ν€μ§ κ³΅κ° API
μ€μ μ°μ μμ:
- μΈμ
μν (
st.session_state) - νκ²½ λ³μ (
os.getenv) - κΈ°λ³Έκ°
μ μ₯ μμΉ:
- κΈ°λ³Έ:
./config/λλ ν 리 - νκ²½ λ³μλ‘ μ€λ²λΌμ΄λ κ°λ₯:
LANG2SQL_REGISTRY_PATHLANG2SQL_DB_REGISTRY_PATHLANG2SQL_LLM_REGISTRY_PATHLANG2SQL_EMBEDDING_REGISTRY_PATH
μ¬μ© μμ:
from interface.core.config import load_config, get_data_sources_registry
# μ€μ λ‘λ
config = load_config()
# λ μ§μ€νΈλ¦¬ μ‘°ν
registry = get_data_sources_registry()
# DataHub μΆκ°
from interface.core.config import add_datahub_source
add_datahub_source(
name="Production",
url="http://datahub.prod:8080",
faiss_path="./prod/faiss",
note="νλ‘λμ
DataHub"
)ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β μ¬μ©μ μ
λ ₯ β
β (μμ°μ΄ μ§μ, μ€μ λ³κ²½ λ±) β
ββββββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Streamlit UI Layer β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β app_pages/ β β core/ β β config/ β β
β β - lang2sql β β - runner β β - settings β β
β β - chatbot β β - renderer β β - registry β β
β β - settings β β - dialects β β - persist β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
ββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Business Logic Layer β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β engine/ β β utils/llm/ β β utils/data/ β β
β β - executor β β - graph β β - databases β β
β β β β - factory β β - hub β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
ββββββββββββββββββββ¬ββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Data & External Services β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
β β DataHub β β Database β β LLM APIs β β
β β VectorDB β β (DBs) β β (OpenAI, β β
β β β β β β AWS, etc) β β
β βββββββββββββββ βββββββββββββββ βββββββββββββββ β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β κ²°κ³Ό λ°ν β
β (SQL, ν
μ΄λΈ, μ°¨νΈ, μ€λͺ
λ±) β
βββββββββββββββ
4D9A
βββββββββββββββββββββββββββββββββββββββββββββββ
μ€μ μ JSON νμΌλ‘ ./config/ λλ ν 리μ μ μ₯λ©λλ€.
data_sources.json: DataHub/VectorDB λ μ§μ€νΈλ¦¬db_connections.json: DB νλ‘νμΌ λ μ§μ€νΈλ¦¬llm_profiles.json: LLM νλ‘νμΌ λ μ§μ€νΈλ¦¬embedding_profiles.json: Embedding νλ‘νμΌ λ μ§μ€νΈλ¦¬
μμ: data_sources.json
{
"datahub": [
{
"name": "Local DataHub",
"url": "http://localhost:8080",
"faiss_path": "./dev/table_info_db",
"note": "λ‘컬 κ°λ° νκ²½"
}
],
"vectordb": [
{
"name": "Local FAISS",
"type": "faiss",
"location": "./dev/faiss_db",
"collection_prefix": null,
"note": "λ‘컬 λ²‘ν° DB"
}
]
}# λ©μΈ μ ν리μΌμ΄μ
μ€ν
streamlit run interface/streamlit_app.py
# λλ
python -m interface.streamlit_appfrom interface.core.config import (
load_config,
get_data_sources_registry,
add_datahub_source,
update_db_settings,
)
# μ€μ λ‘λ
config = load_config()
# DataHub μΆκ°
add_datahub_source(
name="Production",
url="http://datahub.prod:8080",
faiss_path="./prod/faiss"
)
# DB μ€μ μ
λ°μ΄νΈ
update_db_settings(
db_type="postgresql",
values={"host": "localhost", "port": "5432", "user": "admin"},
secrets={"password": "secret"}
)μ£Όμ ν¨ν€μ§:
streamlit: UI νλ μμν¬pandas: λ°μ΄ν° μ²λ¦¬plotly: μ°¨νΈ μκ°νlangchain_core: LLM λ©μμ§ μ²λ¦¬
νλ‘μ νΈ λ΄λΆ λͺ¨λ:
engine.query_executor: 쿼리 μ€νutils.llm: LLM κ΄λ ¨ μ νΈλ¦¬ν°utils.data: λ°μ΄ν° κ΄λ ¨ μ νΈλ¦¬ν°utils.databases: λ°μ΄ν°λ² μ΄μ€ μ νΈλ¦¬ν°infra.observability: λͺ¨λν°λ§ λ° κ΄μ°°μ±
app_pages/sidebar_components/README.md: μ¬μ΄λλ° μ»΄ν¬λνΈ μμΈapp_pages/settings_sections/README.md: μ€μ μΉμ μμΈREADME_UPDATE_CONDITION.md: λ¬Έμ μ λ°μ΄νΈ κ°μ΄λ