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 │ │
│ └──────────┴──────────┴──────────┘ │
│ │
│ [선택된 탭 내용 표시] │
│ │
└──────────────────────────────────────────────────────────────┘
주요 기능:
- 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, 테이블, 차트, 설명 등) │
└────────────────────────────────────────────────────────────┘
설정은 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: 문서 업데이트 가이드