Skip to content

Commit 96861bf

Browse files
committed
챗봇 도구에서 get_weather 및 get_famous_opensource 제거, get_query_examples 추가.
1 parent 1f439a4 commit 96861bf

File tree

3 files changed

+128
-70
lines changed

3 files changed

+128
-70
lines changed

utils/llm/chatbot.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,9 @@
1313
from langgraph.prebuilt import ToolNode
1414

1515
from utils.llm.tools import (
16-
get_weather,
17-
get_famous_opensource,
1816
search_database_tables,
1917
get_glossary_terms,
18+
get_query_examples,
2019
)
2120

2221

@@ -67,9 +66,8 @@ def __init__(
6766
# SQL 생성을 위한 데이터베이스 메타데이터 조회 도구
6867
self.tools = [
6968
search_database_tables, # 데이터베이스 테이블 정보 검색
70-
get_weather, # 테스트용 도구 (추후 제거 가능)
71-
get_famous_opensource, # 테스트용 도구 (추후 제거 가능)
7269
get_glossary_terms, # 용어집 조회 도구
70+
get_query_examples, # 쿼리 예제 조회 도구
7371
]
7472
self.llm = self._setup_llm() # LLM 인스턴스 설정
7573
self.app = self._setup_workflow() # LangGraph 워크플로우 설정
@@ -132,9 +130,10 @@ def call_model(state: ChatBotState):
132130
6. 충분히 구체화되면 최종 질문 확정
133131
134132
# 도구 사용 가이드
135-
- **search_database_tables**: 사용자와의 대화를 데이터와 연관짓기 위해 관련 테이블을 적극적으로 확인
136-
- **get_glossary_terms**: 사용자가 사용한 용어의 정확한 의미를 확인할 때 사용
137-
- 도구를 사용하면 더 정확하고 구체적인 질문을 만들 수 있습니다
133+
- **search_database_tables**: 사용자와의 대화를 데이터와 연관짓기 위해 관련 테이블을 적극적으로 확인할 수 있는 도구
134+
- **get_glossary_terms**: 사용자가 사용한 용어의 정확한 의미를 확인할 때 사용가능한 도구
135+
- **get_query_examples**: 조직내 저장된 쿼리 예제를 조회하여 참고할 수 있는 도구
136+
- 답변하기 전에 최대한 많은 도구를 적극 활용하여 정보를 수집하세요
138137
- 불확실한 정보가 있다면 추측하지 말고 도구를 사용하여 확인하세요
139138
140139
# 예시
@@ -145,6 +144,9 @@ def call_model(state: ChatBotState):
145144
- 항상 친절하고 명확하게 대화합니다
146145
- 이전 대화 맥락을 고려하여 일관성 있게 응답합니다
147146
- 한 번에 너무 많은 것을 물어보지 않고 단계적으로 진행합니다
147+
- **중요: 사용자가 말한 내용이 충분히 구체화되지 않거나 의도가 명확히 파악되지 않을 경우, 추측하지 말고 모든 도구(get_glossary_terms, get_query_examples, search_database_tables)를 적극적으로 사용하여 맥락을 파악하세요**
148+
- 도구를 통해 수집한 정보를 바탕으로 사용자에게 구체적인 방향성과 옵션을 제안하세요
149+
- 불확실한 정보가 있다면 추측하지 말고 도구를 사용하여 확인한 후 답변하세요
148150
149151
---
150152
다음은 사용자와의 대화입니다:"""

utils/llm/tools/__init__.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,16 @@
55
)
66

77
from utils.llm.tools.chatbot_tool import (
8-
get_weather,
9-
get_famous_opensource,
108
search_database_tables,
119
get_glossary_terms,
10+
get_query_examples,
1211
)
1312

1413
__all__ = [
1514
"set_gms_server",
1615
"get_info_from_db",
1716
"get_metadata_from_db",
18-
"get_weather",
19-
"get_famous_opensource",
2017
"search_database_tables",
2118
"get_glossary_terms",
19+
"get_query_examples",
2220
]

utils/llm/tools/chatbot_tool.py

Lines changed: 117 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,7 @@
66
from utils.llm.retrieval import search_tables
77
from utils.data.datahub_services.base_client import DataHubBaseClient
88
from utils.data.datahub_services.glossary_service import GlossaryService
9-
10-
11-
@tool
12-
def get_weather(city: str) -> str:
13-
"""
14-
특정 도시의 현재 날씨 정보를 조회합니다.
15-
16-
이 함수는 도시 이름을 입력받아 해당 도시의 날씨 정보를 반환합니다.
17-
사용자가 날씨, 기상, weather 등의 키워드와 함께 도시 이름을 언급하면 이 도구를 사용하세요.
18-
19-
Args:
20-
city (str): 날씨를 확인하고 싶은 도시의 이름입니다.
21-
예: "Seoul", "New York", "Tokyo", "서울", "부산" 등
22-
영문과 한글 도시명을 모두 지원합니다.
23-
24-
Returns:
25-
str: 해당 도시의 날씨 정보를 담은 문자열입니다.
26-
현재는 항상 맑은 날씨를 반환합니다.
27-
28-
Examples:
29-
>>> get_weather("Seoul")
30-
'Seoul is sunny'
31-
32-
>>> get_weather("서울")
33-
'서울 is sunny'
34-
35-
Note:
36-
이 도구는 다음과 같은 경우에 사용하세요:
37-
- "서울 날씨 어때?"
38-
- "What's the weather in New York?"
39-
- "도쿄의 날씨를 알려줘"
40-
- "부산 날씨 확인해줘"
41-
"""
42-
return f"{city} is sunny"
43-
44-
45-
@tool
46-
def get_famous_opensource() -> str:
47-
"""
48-
가장 유명한 오픈소스 프로젝트를 조회합니다.
49-
50-
이 함수는 현재 가장 유명한 오픈소스 프로젝트의 이름을 반환합니다.
51-
사용자가 유명한 오픈소스, 인기있는 오픈소스, 최고의 오픈소스 등을 물어보면 이 도구를 사용하세요.
52-
53-
Returns:
54-
str: 가장 유명한 오픈소스 프로젝트 이름
55-
56-
Examples:
57-
>>> get_famous_opensource()
58-
'Lang2SQL'
59-
60-
Note:
61-
이 도구는 다음과 같은 경우에 사용하세요:
62-
- "제일 유명한 오픈소스가 뭐야?"
63-
- "가장 인기있는 오픈소스는?"
64-
- "최고의 오픈소스 프로젝트 알려줘"
65-
- "유명한 오픈소스 추천해줘"
66-
"""
67-
return "Lang2SQL"
9+
from utils.data.datahub_services.query_service import QueryService
6810

6911

7012
@tool
@@ -253,3 +195,119 @@ def get_glossary_terms(gms_server: str = "http://35.222.65.99:8080") -> list:
253195
return {"error": True, "message": f"DataHub 서버 연결 실패: {str(e)}"}
254196
except Exception as e:
255197
return {"error": True, "message": f"용어집 조회 중 오류 발생: {str(e)}"}
198+
199+
200+
@tool
201+
def get_query_examples(
202+
gms_server: str = "http://35.222.65.99:8080",
203+
start: int = 0,
204+
count: int = 10,
205+
query: str = "*",
206+
) -> list:
207+
"""
208+
DataHub에서 저장된 쿼리 예제들을 조회합니다.
209+
210+
이 함수는 DataHub 서버에 연결하여 저장된 SQL 쿼리 목록을 가져옵니다.
211+
조직에서 실제로 사용되고 검증된 쿼리 패턴을 참고하여 더 정확한 SQL을 생성할 수 있습니다.
212+
213+
**중요**: 사용자의 질문이나 대화에서 다음과 같은 상황이 발생하면 반드시 이 도구를 사용하세요:
214+
1. 일반적인 SQL 패턴으로 해결하기 어려운 복잡한 쿼리 요청일 때
215+
2. 조직 특화된 비즈니스 로직이나 데이터 처리 방식이 필요할 때
216+
3. 특정 도메인의 표준 쿼리 패턴이나 관례를 따라야 할 때
217+
4. 여러 테이블 간의 복잡한 JOIN이나 집계가 필요할 때
218+
5. 사용자가 과거 실행했던 쿼리와 유사한 작업을 요청할 때
219+
6. 조직 내에서 검증된 쿼리 작성 방식을 확인해야 할 때
220+
221+
Args:
222+
gms_server (str, optional): DataHub GMS 서버 URL입니다.
223+
기본값은 "http://35.222.65.99:8080"
224+
start (int, optional): 조회 시작 위치입니다. 기본값은 0
225+
count (int, optional): 조회할 쿼리 개수입니다. 기본값은 10
226+
query (str, optional): 검색 쿼리입니다. 기본값은 "*" (모든 쿼리)
227+
228+
Returns:
229+
list: 쿼리 정보 리스트입니다.
230+
각 항목은 name, description, statement 필드를 포함합니다.
231+
232+
예시 형태:
233+
[
234+
{
235+
"name": "고객별 주문 수 조회",
236+
"description": "각 고객별 주문 건수를 집계하는 쿼리",
237+
"statement": "SELECT customer_id, COUNT(*) as order_count FROM orders GROUP BY customer_id"
238+
},
239+
{
240+
"name": "월별 매출 현황",
241+
"description": "월별 총 매출을 계산하는 쿼리",
242+
"statement": "SELECT DATE_TRUNC('month', order_date) as month, SUM(amount) FROM orders GROUP BY month"
243+
}
244+
]
245+
246+
Examples:
247+
>>> get_query_examples()
248+
[{'name': '고객별 주문 수 조회', 'description': '...', 'statement': 'SELECT ...'}]
249+
250+
>>> get_query_examples(count=5)
251+
# 5개의 쿼리 예제만 조회
252+
253+
Note:
254+
이 도구는 다음과 같은 경우에 **반드시** 사용하세요:
255+
256+
[명시적 요청]
257+
- "쿼리 예제를 보여줘"
258+
- "저장된 쿼리들을 알려줘"
259+
- "과거 쿼리 내역을 보고 싶어"
260+
- "SQL 예제가 있어?"
261+
262+
[도메인/조직 특화 패턴 감지 - 매우 중요!]
263+
- 조직 특화된 데이터 처리 방식이나 계산 로직이 필요할 때
264+
- 특정 도메인의 관례적인 쿼리 패턴을 따라야 할 때
265+
- 데이터 품질 규칙이나 비즈니스 룰이 반영된 쿼리가 필요할 때
266+
- 조직 내에서 표준화된 쿼리 작성 방식을 확인해야 할 때
267+
268+
[쿼리 작성 참고]
269+
- "이런 유형의 쿼리는 어떻게 작성해?"
270+
- "비슷한 쿼리 있어?"
271+
- "다른 사람들은 어떻게 쿼리를 작성했어?"
272+
- "참고할만한 쿼리가 있을까?"
273+
- "이 테이블들을 어떻게 조인해야 해?"
274+
275+
**핵심**: SQL 쿼리를 생성하기 전에 사용자의 요청이 복잡하거나,
276+
조직 특화된 비즈니스 로직이 필요하거나, 일반적인 패턴으로 커버하기
277+
어렵다고 판단되면, 먼저 이 도구를 호출하여 조직에서 검증된
278+
쿼리 예제를 참고하세요. 이는 더 정확하고 조직의 표준을 따르는
279+
SQL을 생성하는 데 큰 도움이 됩니다.
280+
"""
281+
try:
282+
# DataHub 클라이언트 초기화
283+
client = DataHubBaseClient(gms_server=gms_server)
284+
285+
# QueryService 초기화
286+
query_service = QueryService(client)
287+
288+
# 쿼리 데이터 가져오기
289+
result = query_service.get_query_data(start=start, count=count, query=query)
290+
291+
# 오류 체크
292+
if "error" in result and result["error"]:
293+
return {"error": True, "message": result.get("message")}
294+
295+
# name, description, statement만 추출하여 리스트 생성
296+
simplified_queries = []
297+
for query_item in result.get("queries", []):
298+
simplified_query = {
299+
"name": query_item.get("name"),
300+
"description": query_item.get("description", ""),
301+
"statement": query_item.get("statement", ""),
302+
}
303+
simplified_queries.append(simplified_query)
304+
305+
return simplified_queries
306+
307+
except ValueError as e:
308+
return {"error": True, "message": f"DataHub 서버 연결 실패: {str(e)}"}
309+
except Exception as e:
310+
return {
311+
"error": True,
312+
"message": f"쿼리 예제 조회 중 오류 발생: {str(e)}",
313+
}

0 commit comments

Comments
 (0)