Skip to content

[기능] Agentic 쿼리 생성 기능 추가 제안 #175

Description

@seyoung4503

기능 설명 (Description)

  • LangGraph 기반의 Agentic Workflow를 도입하여 사용자의 자연어 질의를 단계적으로 분석하고, 필요시 사용자와 상호작용하며 정확한 SQL 쿼리를 생성하는 기능입니다. 기존의 단발성 Text2SQL 변환을 넘어, Agent가 스키마 탐색, 조건 명확화, 쿼리 검증을 자율적으로 수행하여 복잡한 쿼리 생성의 정확도를 향상시킵니다.

왜 필요한가요? (Motivation / Use Case)

  • 모호한 사용자 질의에 대해 즉시 SQL 생성 시도 → 부정확한 결과
  • 복잡한 JOIN이나 서브쿼리가 필요한 경우 한 번에 생성 실패
  • 테이블 선택이 잘못되어도 사용자 피드백 없이 진행
  • 생성된 쿼리의 타당성 검증 부재

제안하는 해결 방법 (Proposed Implementation)

  • 사용자와의 피드백, 쿼리 생성, 쿼리 조합, 검증에 대해 각각 에이전트로 구성

대안 (Alternatives)

  • ReAct Agent 활용

추가 고려사항 (Additional Context)

  • 성능:
    Agent 실행 시 여러 LLM 호출 발생 → 지연 시간 증가
    캐싱 전략 필요: 스키마 정보, 유사 쿼리 결과
    비용 모니터링: 토큰 사용량 추적 강화

  • 사용자 경험:
    명확화 질문이 너무 많으면 오히려 불편 → 최대 2-3회로 제한
    Agent 진행 상황 실시간 표시로 투명성 확보
    "Agent 추천 수락" 버튼으로 빠른 진행 가능

Activity

ehddnr301 commented on Oct 11, 2025

@ehddnr301
Collaborator

@seyoung4503 매번 좋은의견 내주셔서 감사합니다! 관련해서 현재 작업중이 아니시면(이슈에 연결되어 생성된 브랜치는 없는것 같아서요ㅎㅎ..!) 이번 주말에 제가 간단하게 작업을 해볼까하는데 괜찮을까요!? 작업을 해보고 진척이 있다면 관련해서는 이 이슈에 계속 이력 남겨볼게요!

seyoung4503 commented on Oct 11, 2025

@seyoung4503
CollaboratorAuthor

좋습니다!! 저도 같이 작업하면 좋을 것 같습니다!!!

added a commit that references this issue on Oct 12, 2025

ehddnr301 commented on Oct 12, 2025

@ehddnr301
Collaborator

@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



============================================================
✅ 처리 완료!
============================================================

감사합니다! 👋
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions