Repository navigation
[기능] Agentic 쿼리 생성 기능 추가 제안 #175
Description
Activity
@seyoung4503 매번 좋은의견 내주셔서 감사합니다! 관련해서 현재 작업중이 아니시면(이슈에 연결되어 생성된 브랜치는 없는것 같아서요ㅎㅎ..!) 이번 주말에 제가 간단하게 작업을 해볼까하는데 괜찮을까요!? 작업을 해보고 진척이 있다면 관련해서는 이 이슈에 계속 이력 남겨볼게요!
좋습니다!! 저도 같이 작업하면 좋을 것 같습니다!!!
@seyoung4503 공유가 늦었습니다...! 방향성을 좀 정해보려고 뇌를 잠시 끄고 cursor에게 모든걸 일임한 작업물이라 646461d 커밋의 코드를 읽는건 좀 무가치할것 같구요! 스터디 시간에 내용을 공유해보고 작업방향을 정해보려 합니다아 (mcp, a2a, agent, subagent, 어디까지 agent에 일임할것인지 등등...)
테스트는 ~/Lang2SQL 경로에서
.env 세팅
DATAHUB_SERVER = 'http://35.222.65.99:8080'
DB_TYPE=trino
TRINO_HOST=pseudo.my
TRINO_PORT=30819
TRINO_USER=admin
TRINO_PASSWORD=admin123
TRINO_CATALOG=delta
TRINO_SCHEMA=default
VECTORDB_TYPE=faiss # faiss 또는 pgvector
LLM_PROVIDER=openai
OPEN_AI_KEY=sk-
OPEN_AI_LLM_MODEL=gpt-4o실행
# 실행
uv run chatbot_supervisor/main.py
# 첫 입력
총 이벤트 수
# 두번째 입력
2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트출력
Built lang2sql @ file:///home/dwlee/Lang2SQL
Uninstalled 1 package in 0.37ms
Installed 1 package in 0.81ms
openai
openai
============================================================
🤖 Text2SQL Supervisor Chatbot (v2)
Multi-Agent System with Supervisor Architecture
============================================================
📌 데이터베이스: trino
📌 검색 방식: Reranker
💬 질문을 입력하세요: 총 이벤트 수
============================================================
🎯 Supervisor가 적절한 Agent를 선택합니다...
============================================================
[DEBUG] ===== supervisor_node 시작 =====
[DEBUG] 현재 상태 (supervisor 진입 시):
- original_question: 총 이벤트 수
- is_question_complete: False
- error_count: 0
- incomplete_question_count: 0
- 메시지 수: 1
- 마지막 메시지: human - 총 이벤트 수...
[DEBUG] ====================================
2025-10-12 22:10:37 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] Event keys: dict_keys(['supervisor'])
[DEBUG] Node: supervisor
🎯 Supervisor: validate_question_tool 호출
[DEBUG] validate_question_tool - 검증할 질문: 총 이벤트 수
2025-10-12 22:10:38 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] validate_question_tool: 질문 불완전 → is_question_complete = False
[DEBUG] 질문 불완전 감지 (연속 1회)
[DEBUG] ===== tools_node 상태 업데이트 =====
[DEBUG] 업데이트할 상태:
- is_question_complete: False
- incomplete_question_count: 1
[DEBUG] =====================================
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 1
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: tool
[DEBUG] 마지막 Tool: validate_question_tool
[DEBUG] Tool 결과 미리보기: 🔍 질문이 불완전합니다.
이유: 측정값이나 기준이 부족합니다.
누락된 정보: 측정값, 필터 기준...
[DEBUG] validate_question_tool 실행 완료
[DEBUG] ✋ 질문 불완전 (validate_question_tool) → human_feedback으로
[DEBUG] incomplete_count: 1 (3회 이상이면 자동 human_feedback)
[DEBUG] Event keys: dict_keys(['tools'])
[DEBUG] Node: tools
🔧 Agent 실행 완료
💬 Agent 응답:
🔍 질문이 불완전합니다.
이유: 측정값이나 기준이 부족합니다.
누락된 정보: 측정값, 필터 기준
[DEBUG] human_feedback_node 시작
[DEBUG] is_question_complete: False
[DEBUG] error_count: 0
[DEBUG] incomplete_question_count: 1
[DEBUG] interrupt() 호출 전
[DEBUG] Event keys: dict_keys(['__interrupt__'])
============================================================
💬 추가 정보가 필요합니다
============================================================
[DEBUG] Interrupt 발생 원인:
- SQL 실행 에러 카운트: 0
- 질문 불완전 카운트: 1
🔍 질문이 불완전합니다.
이유: 측정값이나 기준이 부족합니다.
누락된 정보: 측정값, 필터 기준
💬 추가 정보를 입력하세요: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
[DEBUG] 사용자 입력: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
[DEBUG] update_state 호출 - 상태 리셋 및 새 질문 추가
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: human
[DEBUG] ⚠️ 기본값 → supervisor로
[DEBUG] Command(resume=...)로 interrupt 해제
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: human
[DEBUG] ⚠️ 기본값 → supervisor로
[DEBUG] stream 재개 - initial_state=None (checkpoint에서 이어서)
[DEBUG] ===== supervisor_node 시작 =====
[DEBUG] 현재 상태 (supervisor 진입 시):
- original_question: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
- is_question_complete: False
- error_count: 0
- incomplete_question_count: 0
- 메시지 수: 4
- 마지막 메시지: human - 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트...
[DEBUG] ====================================
2025-10-12 22:10:44 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] Event keys: dict_keys(['supervisor'])
[DEBUG] Node: supervisor
🎯 Supervisor: search_tables_tool 호출
cpu
🔄 ko-reranker 모델 로컬에서 로드 중...
openai
2025-10-12 22:10:45 [INFO] Loading faiss with AVX512 support.
2025-10-12 22:10:45 [INFO] Successfully loaded faiss with AVX512 support.
2025-10-12 22:10:45 [INFO] Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes.
2025-10-12 22:10:47 [INFO] HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
Batches: 100%|█████████████████████████████████████████████████████████████| 1/1 [00:01<00:00, 1.22s/it]
cpu
🔄 ko-reranker 모델 로컬에서 로드 중...
openai
2025-10-12 22:10:49 [INFO] HTTP Request: POST https://api.openai.com/v1/embeddings "HTTP/1.1 200 OK"
Batches: 100%|█████████████████████████████████████████████████████████████| 1/1 [00:01<00:00, 1.09s/it]
[DEBUG] ===== tools_node 상태 업데이트 =====
[DEBUG] 업데이트할 상태:
[DEBUG] =====================================
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: tool
[DEBUG] 마지막 Tool: search_tables_tool
[DEBUG] Tool 결과 미리보기: 📊 5개의 관련 테이블을 찾았습니다:
- delta.default.dm_activity_daily_org_repo (5개 컬럼)
- delta.default.dl_push_...
[DEBUG] ⚠️ 기본값 → supervisor로
[DEBUG] Event keys: dict_keys(['tools'])
[DEBUG] Node: tools
🔧 Agent 실행 완료
💬 Agent 응답:
📊 5개의 관련 테이블을 찾았습니다:
- delta.default.dm_activity_daily_org_repo (5개 컬럼)
- delta.default.dl_push_events (18개 컬럼)
- delta.default.dw_activity_daily (5개 컬럼)
- delta.default.dw_watch_daily (5개 컬럼)
- delta.default.dl_watch_events (6개 컬럼)
[DEBUG] ===== supervisor_node 시작 =====
[DEBUG] 현재 상태 (supervisor 진입 시):
- original_question: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
- is_question_complete: False
- error_count: 0
- incomplete_question_count: 0
- 메시지 수: 6
- 마지막 메시지: tool - 📊 5개의 관련 테이블을 찾았습니다:
- delta.default.dm_activity...
[DEBUG] ====================================
2025-10-12 22:10:51 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] Event keys: dict_keys(['supervisor'])
[DEBUG] Node: supervisor
🎯 Supervisor: generate_sql_tool 호출
2025-10-12 22:10:53 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] ===== tools_node 상태 업데이트 =====
[DEBUG] 업데이트할 상태:
[DEBUG] =====================================
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: tool
[DEBUG] 마지막 Tool: generate_sql_tool
[DEBUG] Tool 결과 미리보기: ✅ SQL 생성 완료:
```sql
SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = '2025-01-02...
[DEBUG] ⚠️ 기본값 → supervisor로
[DEBUG] Event keys: dict_keys(['tools'])
[DEBUG] Node: tools
🔧 Agent 실행 완료
💬 Agent 응답:
✅ SQL 생성 완료:
```sql
SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = '2025-01-02'
AND user_login = 'ehddnr301'
[DEBUG] ===== supervisor_node 시작 =====
[DEBUG] 현재 상태 (supervisor 진입 시):
- original_question: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
- is_question_complete: False
- error_count: 0
- incomplete_question_count: 0
- 메시지 수: 8
- 마지막 메시지: tool - ✅ SQL 생성 완료:
SELECT COUNT(*)
FROM delta.de...
[DEBUG] ====================================
2025-10-12 22:10:54 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] Event keys: dict_keys(['supervisor'])
[DEBUG] Node: supervisor
🎯 Supervisor: execute_sql_tool 호출
2025-10-12 22:10:54 [INFO] Successfully connected to Trino.
2025-10-12 22:10:54 [ERROR] Failed to execute SQL query on Trino: TrinoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 3:17: Cannot apply operator: date = varchar(10)", query_id=20251012_131054_00247_epnyx)
2025-10-12 22:10:54 [INFO] Cursor closed successfully.
2025-10-12 22:10:54 [INFO] Successfully connected to Trino.
2025-10-12 22:10:54 [ERROR] Failed to execute SQL query on Trino: TrinoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 3:17: Cannot apply operator: date = varchar(10)", query_id=20251012_131054_00248_epnyx)
2025-10-12 22:10:54 [INFO] Cursor closed successfully.
[DEBUG] 에러 타입 비교:
- 현재 에러: ❌ SQL 실행 중 오류 발생: TrinoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 3:17: Cannot apply operator: date = varchar(10)", query_id=*)...
- 이전 에러: ...
[DEBUG] 새로운 에러 타입 감지, 카운트 리셋: 1
[DEBUG] SQL 실행 에러 감지 (연속 1회)
[DEBUG] ===== tools_node 상태 업데이트 =====
[DEBUG] 업데이트할 상태:
- error_count: 1
- last_error_message: ❌ SQL 실행 중 오류 발생: TrinoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 3:17: Cannot apply operator: date = varchar(10)", query_id=20251012_131054_00247_epnyx)
[DEBUG] =====================================
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 1
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 🔧 SQL 실행 에러 1회 발생 → fix_sql_error로 (자동 수정 시도)
[DEBUG] Event keys: dict_keys(['tools'])
[DEBUG] Node: tools
🔧 Agent 실행 완료
💬 Agent 응답:
❌ SQL 실행 중 오류 발생: TrinoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 3:17: Cannot apply operator: date = varchar(10)", query_id=20251012_131054_00247_epnyx)
[DEBUG] ===== fix_sql_error_node 시작 =====
[DEBUG] 에러 수정 시도:
- error_count: 1
- database: trino
- SQL: SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = '2025-01-02'
AND user_login = 'e...
[DEBUG] LLM 호출 - SQL 에러 수정 요청
2025-10-12 22:10:55 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] LLM 응답: ```sql
SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = DATE '2025-01-02'
AND user_login = 'ehddnr301'
```...
[DEBUG] 수정된 SQL 추출 성공
[DEBUG] 수정된 SQL: SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = DATE '2025-01-02'
AND user_login = 'ehddnr301'
[DEBUG] Event keys: dict_keys(['fix_sql_error'])
[DEBUG] Node: fix_sql_error
🔧 SQL 자동 수정 실행
🔧 SQL 에러 자동 수정:
**원본 SQL**:
```sql
SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = '2025-01-02'
AND user_login = 'ehddnr301'수정된 SQL:
SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = DATE '2025-01-02'
AND user_login = 'ehddnr301'에러: ❌ SQL 실행 중 오류 발생: TrinoUserError(type=USER_ERROR, name=TYPE_MISMATCH, message="line 3:17: Cannot apply operator: date = varchar(10)", query_id=20251012_131054_00247_epnyx)...
[DEBUG] 수정된 SQL이 state에 업데이트됨
[DEBUG] SQL: SELECT COUNT(*)
FROM delta.default.dl_push_events
WHERE base_date = DATE '2025-01-02'
AND user_login...
[DEBUG] ===== supervisor_node 시작 =====
[DEBUG] 현재 상태 (supervisor 진입 시):
- original_question: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
- is_question_complete: False
- error_count: 1
- incomplete_question_count: 0
- 메시지 수: 11
- 마지막 메시지: ai - 🔧 SQL 에러 자동 수정:
원본 SQL:
SELECT COUNT(*...
[DEBUG] ====================================
2025-10-12 22:10:56 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] Event keys: dict_keys(['supervisor'])
[DEBUG] Node: supervisor
🎯 Supervisor: execute_sql_tool 호출
2025-10-12 22:10:56 [INFO] Successfully connected to Trino.
2025-10-12 22:10:56 [INFO] Cursor closed successfully.
2025-10-12 22:10:56 [INFO] Successfully connected to Trino.
2025-10-12 22:10:56 [INFO] Cursor closed successfully.
[DEBUG] SQL 실행 성공 - 에러 카운트 리셋
[DEBUG] ===== tools_node 상태 업데이트 =====
[DEBUG] 업데이트할 상태:
- error_count: 0
- last_error_message:
[DEBUG] =====================================
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: tool
[DEBUG] 마지막 Tool: execute_sql_tool
[DEBUG] Tool 결과 미리보기: ✅ SQL 실행 완료!
총 1개의 행이 반환되었습니다.
미리보기:
_col0
0...
[DEBUG] ✅ SQL 결과 있음 → supervisor로 (리포팅)
[DEBUG] Event keys: dict_keys(['tools'])
[DEBUG] Node: tools
🔧 Agent 실행 완료
💬 Agent 응답:
✅ SQL 실행 완료!
총 1개의 행이 반환되었습니다.
미리보기:
_col0
0
[DEBUG] ===== supervisor_node 시작 =====
[DEBUG] 현재 상태 (supervisor 진입 시):
- original_question: 2025-01-02 의 ehddnr301 유저의 총 푸시 이벤트 수 카운트
- is_question_complete: False
- error_count: 0
- incomplete_question_count: 0
- 메시지 수: 13
- 마지막 메시지: tool - ✅ SQL 실행 완료!
총 1개의 행이 반환되었습니다.
미리보기:
_col0
...
[DEBUG] ====================================
2025-10-12 22:10:57 [INFO] HTTP Request: POST https://api.openai.com/v1/chat/completions "HTTP/1.1 200 OK"
[DEBUG] Event keys: dict_keys(['supervisor'])
[DEBUG] Node: supervisor
🎯 Supervisor: format_table_tool 호출
[DEBUG] ===== tools_node 상태 업데이트 =====
[DEBUG] 업데이트할 상태:
[DEBUG] =====================================
[DEBUG] ===== should_ask_human 시작 =====
[DEBUG] 현재 상태:
- error_count: 0
- incomplete_question_count: 0
- is_question_complete: False
[DEBUG] 마지막 메시지 타입: tool
[DEBUG] 마지막 Tool: format_table_tool
[DEBUG] Tool 결과 미리보기: 📊 결과 요약:
- 총 1개의 행
- 1개의 컬럼: _col0
결과 미리보기:_col0
0
[DEBUG] ✅ 포맷팅 완료 → END
[DEBUG] Event keys: dict_keys(['tools'])
[DEBUG] Node: tools
🔧 Agent 실행 완료
💬 Agent 응답:
📊 결과 요약:
- 총 1개의 행
- 1개의 컬럼: _col0
결과 미리보기:
_col0
0
============================================================
✅ 처리 완료!
============================================================
감사합니다! 👋
기능 설명 (Description)
왜 필요한가요? (Motivation / Use Case)
제안하는 해결 방법 (Proposed Implementation)
대안 (Alternatives)
추가 고려사항 (Additional Context)
성능:
Agent 실행 시 여러 LLM 호출 발생 → 지연 시간 증가
캐싱 전략 필요: 스키마 정보, 유사 쿼리 결과
비용 모니터링: 토큰 사용량 추적 강화
사용자 경험:
명확화 질문이 너무 많으면 오히려 불편 → 최대 2-3회로 제한
Agent 진행 상황 실시간 표시로 투명성 확보
"Agent 추천 수락" 버튼으로 빠른 진행 가능