Skip to content

Commit 9425a5d

Browse files
committed
기존 get_info_from 함수 수정 (get_table_schema)
1 parent 1deab04 commit 9425a5d

File tree

7 files changed

+88
-55
lines changed

7 files changed

+88
-55
lines changed

utils/llm/README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ utils/llm/
146146
**목적**: DataHub 메타데이터 수집 및 LangGraph ChatBot용 Tool 함수 제공
147147

148148
**주요 기능:**
149-
- `get_info_from_db()`: DataHub에서 테이블 메타데이터를 LangChain Document로 수집
149+
- `get_table_schema()`: DataHub에서 테이블 메타데이터를 dictionary 형태로 반환
150150
- `get_metadata_from_db()`: 전체 메타데이터 딕셔너리 반환
151151
- `search_database_tables()`: 벡터 검색 기반 테이블 정보 검색 Tool
152152
- `get_glossary_terms()`: 용어집 정보 조회 Tool
@@ -301,7 +301,7 @@ engine/query_executor.py
301301
│ └── utils/llm/retrieval.py
302302
│ └── utils/llm/vectordb/get_vector_db()
303303
│ ├── utils/llm/core/get_embeddings()
304-
│ └── utils/llm/tools/get_info_from_db()
304+
│ └── utils/llm/tools/get_table_schema()
305305
└── utils/llm/llm_response_parser.py
306306
```
307307

@@ -319,8 +319,8 @@ engine/query_executor.py
319319
- `retrieval.py``vectordb/get_vector_db()` 사용
320320

321321
**vectordb 모듈:**
322-
- `vectordb/faiss_db.py``core/get_embeddings()`, `tools/get_info_from_db()` 사용
323-
- `vectordb/pgvector_db.py``core/get_embeddings()`, `tools/get_info_from_db()` 사용
322+
- `vectordb/faiss_db.py``core/get_embeddings()`, `tools/get_table_schema()` 사용
323+
- `vectordb/pgvector_db.py``core/get_embeddings()`, `tools/get_table_schema()` 사용
324324

325325
**tools 모듈:**
326326
- `tools/datahub.py` → DataHub 메타데이터 수집

utils/llm/tools/README.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ utils/llm/tools/
2121

2222
**datahub 모듈에서**:
2323
- `set_gms_server`: GMS 서버 설정
24-
- `get_info_from_db`: LangChain Document 리스트로 테이블/컬럼 정보 반환
24+
- `get_table_schema`: LangChain Document 리스트로 테이블/컬럼 정보 반환
2525
- `get_metadata_from_db`: 전체 메타데이터 딕셔너리 리스트 반환
2626

2727
**chatbot_tool 모듈에서**:
@@ -39,7 +39,7 @@ utils/llm/tools/
3939
- 환경변수 `DATAHUB_SERVER`를 설정하고 DatahubMetadataFetcher 초기화
4040
- 유효하지 않은 서버 URL 시 ValueError 발생
4141

42-
2. **`get_info_from_db(max_workers: int = 8) -> List[Document]`**
42+
2. **`get_table_schema(max_workers: int = 8) -> List[Document]`**
4343
- DataHub에서 모든 테이블 메타데이터를 수집하여 LangChain Document 리스트 반환
4444
- 각 Document에는 테이블명, 설명, 컬럼 정보가 포함
4545
- 형식: `"{테이블명}: {설명}\nColumns:\n {컬럼명}: {컬럼설명}"`
@@ -157,10 +157,10 @@ utils/llm/tools/
157157
#### 1. DataHub 메타데이터 수집 (vectorDB 초기화)
158158

159159
```python
160-
from utils.llm.tools import get_info_from_db
160+
from utils.llm.tools import get_table_schema
161161

162162
# 모든 테이블 메타데이터를 LangChain Document로 수집
163-
documents = get_info_from_db(max_workers=8)
163+
documents = get_table_schema(max_workers=8)
164164

165165
# 각 document는 다음과 같은 형식:
166166
# "테이블명: 설명\nColumns:\n 컬럼1: 설명1\n 컬럼2: 설명2"
@@ -224,8 +224,8 @@ queries = get_query_examples(
224224

225225
**import하는 파일**:
226226
- `utils/llm/chatbot.py`: `from utils.llm.tools import search_database_tables, get_glossary_terms, get_query_examples`
227-
- `utils/llm/vectordb/faiss_db.py`: `from utils.llm.tools import get_info_from_db`
228-
- `utils/llm/vectordb/pgvector_db.py`: `from utils.llm.tools import get_info_from_db`
227+
- `utils/llm/vectordb/faiss_db.py`: `from utils.llm.tools import get_table_schema`
228+
- `utils/llm/vectordb/pgvector_db.py`: `from utils.llm.tools import get_table_schema`
229229
- `interface/core/config/settings.py`: `from utils.llm.tools import set_gms_server`
230230

231231
**내부 의존성**:
@@ -258,7 +258,7 @@ queries = get_query_examples(
258258

259259
#### 메타데이터 수집 흐름 (벡터DB 초기화 시)
260260

261-
1. `get_info_from_db()` 호출
261+
1. `get_table_schema()` 호출
262262
2. `_get_fetcher()`로 DatahubMetadataFetcher 인스턴스 생성
263263
3. `parallel_process()`로 병렬 테이블 정보 수집
264264
4. 각 테이블별로 컬럼 정보 추가 수집

utils/llm/tools/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from utils.llm.tools.datahub import (
2-
get_info_from_db,
2+
get_table_schema,
33
get_metadata_from_db,
44
set_gms_server,
55
)
@@ -12,7 +12,7 @@
1212

1313
__all__ = [
1414
"set_gms_server",
15-
"get_info_from_db",
15+
"get_table_schema",
1616
"get_metadata_from_db",
1717
"search_database_tables",
1818
"get_glossary_terms",

utils/llm/tools/datahub.py

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def _get_table_info(max_workers: int = 8) -> Dict[str, str]:
7676

7777

7878
def _get_column_info(
79-
table_name: str, urn_table_mapping: Dict[str, str], max_workers: int = 8
79+
table_name: str, urn_table_mapping: Dict[str, str]
8080
) -> List[Dict[str, str]]:
8181
target_urn = urn_table_mapping.get(table_name)
8282
if not target_urn:
@@ -103,7 +103,21 @@ def _extract_dataset_name_from_urn(urn: str) -> Optional[str]:
103103
return None
104104

105105

106-
def get_info_from_db(max_workers: int = 8) -> List[Document]:
106+
def get_metadata_from_db() -> List[Dict]:
107+
fetcher = _get_fetcher()
108+
urns = list(fetcher.get_urns())
109+
110+
metadata = []
111+
total = len(urns)
112+
for idx, urn in enumerate(urns, 1):
113+
print(f"[{idx}/{total}] Processing URN: {urn}")
114+
table_metadata = fetcher.build_table_metadata(urn)
115+
metadata.append(table_metadata)
116+
117+
return metadata
118+
119+
120+
def _prepare_datahub_metadata_mappings(max_workers: int = 8):
107121
table_info = _get_table_info(max_workers=max_workers)
108122

109123
fetcher = _get_fetcher()
@@ -118,20 +132,31 @@ def get_info_from_db(max_workers: int = 8) -> List[Document]:
118132
if parsed_name:
119133
display_name_by_table[original_name] = parsed_name
120134

121-
def process_table_info(item: tuple[str, str, str]) -> str:
122-
original_table_name, table_description, display_table_name = item
123-
# 컬럼 조회는 기존 테이블 이름으로 수행 (urn_table_mapping과 일치)
124-
column_info = _get_column_info(
125-
original_table_name, urn_table_mapping, max_workers=max_workers
126-
)
127-
column_info_str = "\n".join(
128-
[
129-
f"{col['column_name']}: {col['column_description']}"
130-
for col in column_info
131-
]
132-
)
133-
used_name = display_table_name or original_table_name
134-
return f"{used_name}: {table_description}\nColumns:\n {column_info_str}"
135+
return table_info, urn_table_mapping, display_name_by_table
136+
137+
138+
def _format_datahub_table_info(
139+
item: tuple[str, str, str], urn_table_mapping: Dict[str, str]
140+
) -> Dict:
141+
original_table_name, table_description, display_table_name = item
142+
# 컬럼 조회는 기존 테이블 이름으로 수행 (urn_table_mapping과 일치)
143+
column_info = _get_column_info(original_table_name, urn_table_mapping)
144+
145+
columns = {col["column_name"]: col["column_description"] for col in column_info}
146+
147+
used_name = display_table_name or original_table_name
148+
return {
149+
used_name: {
150+
"table_description": table_description,
151+
"columns": columns,
152+
}
153+
}
154+
155+
156+
def get_table_schema(max_workers: int = 8) -> List[Dict]:
157+
table_info, urn_table_mapping, display_name_by_table = (
158+
_prepare_datahub_metadata_mappings(max_workers)
159+
)
135160

136161
# 표시용 이름을 세 번째 파라미터로 함께 전달
137162
items_with_display = [
@@ -143,25 +168,15 @@ def process_table_info(item: tuple[str, str, str]) -> str:
143168
for name, desc in table_info.items()
144169
]
145170

146-
table_info_str_list = parallel_process(
171+
# parallel_process에 전달할 함수 래핑
172+
def process_fn(item):
173+
return _format_datahub_table_info(item, urn_table_mapping)
174+
175+
table_info_list = parallel_process(
147176
items_with_display,
148-
process_table_info,
177+
process_fn,
149178
max_workers=max_workers,
150179
desc="컬럼 정보 수집 중",
151180
)
152181

153-
return [Document(page_content=info) for info in table_info_str_list]
154-
155-
156-
def get_metadata_from_db() -> List[Dict]:
157-
fetcher = _get_fetcher()
158-
urns = list(fetcher.get_urns())
159-
160-
metadata = []
161-
total = len(urns)
162-
for idx, urn in enumerate(urns, 1):
163-
print(f"[{idx}/{total}] Processing URN: {urn}")
164-
table_metadata = fetcher.build_table_metadata(urn)
165-
metadata.append(table_metadata)
166-
167-
return metadata
182+
return table_info_list

utils/llm/vectordb/README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ utils/llm/vectordb/
5252
- `vectordb_path`: 저장 경로 (기본: `dev/table_info_db`)
5353
- 동작 방식:
5454
- 기존 DB가 있으면 `FAISS.load_local()`로 로드
55-
- 없으면 `get_info_from_db()`로 문서 수집 후 `FAISS.from_documents()` 생성 및 저장
55+
- 없으면 `get_table_schema()`로 문서 수집 후 `FAISS.from_documents()` 생성 및 저장
5656
- 반환: FAISS 벡터스토어 인스턴스
5757

5858
**의존성**:
5959
- `langchain_community.vectorstores.FAISS`: LangChain FAISS 래퍼
6060
- `utils.llm.core.get_embeddings`: 임베딩 모델 로드
61-
- `utils.llm.tools.get_info_from_db`: DataHub에서 테이블 메타데이터 수집
61+
- `utils.llm.tools.get_table_schema`: DataHub에서 테이블 메타데이터 수집
6262

6363
**특징**:
6464
- 로컬 디스크에 저장되어 네트워크 연결 불필요
@@ -84,7 +84,7 @@ utils/llm/vectordb/
8484
- `PGVECTOR_COLLECTION`: "lang2sql_table_info_db"
8585
- 동작 방식:
8686
- 기존 컬렉션이 있고 비어있지 않으면 로드
87-
- 없거나 비어있으면 `get_info_from_db()`로 문서 수집 후 `PGVector.from_documents()` 생성
87+
- 없거나 비어있으면 `get_table_schema()`로 문서 수집 후 `PGVector.from_documents()` 생성
8888
- 반환: PGVector 벡터스토어 인스턴스
8989

9090
2. **`_check_collection_exists(connection_string, collection_name)`**
@@ -96,7 +96,7 @@ utils/llm/vectordb/
9696
- `langchain_postgres.vectorstores.PGVector`: LangChain pgvector 래퍼
9797
- `psycopg2`: PostgreSQL 연결
9898
- `utils.llm.core.get_embeddings`: 임베딩 모델 로드
99-
- `utils.llm.tools.get_info_from_db`: DataHub에서 테이블 메타데이터 수집
99+
- `utils.llm.tools.get_table_schema`: DataHub에서 테이블 메타데이터 수집
100100

101101
**특징**:
102102
- PostgreSQL 데이터베이스에 저장되어 다중 서버 환경에 적합
@@ -181,7 +181,7 @@ export PGVECTOR_COLLECTION=lang2sql_table_info_db
181181

182182
**내부 의존성**:
183183
- `utils/llm/core/factory.py`: `get_embeddings()` - 임베딩 모델 로드
184-
- `utils/llm/tools/datahub.py`: `get_info_from_db()` - DataHub 메타데이터 수집
184+
- `utils/llm/tools/datahub.py`: `get_table_schema()` - DataHub 메타데이터 수집
185185

186186
**외부 의존성**:
187187
- `langchain_community.vectorstores.FAISS`: FAISS 벡터스토어

utils/llm/vectordb/faiss_db.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66
from typing import Optional
77

88
from langchain_community.vectorstores import FAISS
9+
from langchain.schema import Document
910

1011
from utils.llm.core import get_embeddings
11-
from utils.llm.tools import get_info_from_db
12+
from utils.llm.tools import get_table_schema
1213

1314

1415
def get_faiss_vector_db(vectordb_path: Optional[str] = None):
@@ -26,7 +27,15 @@ def get_faiss_vector_db(vectordb_path: Optional[str] = None):
2627
allow_dangerous_deserialization=True,
2728
)
2829
except:
29-
documents = get_info_from_db()
30+
raw_data = get_table_schema()
31+
documents = []
32+
for item in raw_data:
33+
for table_name, table_info in item.items():
34+
column_info_str = "\n".join(
35+
[f"{k}: {v}" for k, v in table_info["columns"].items()]
36+
)
37+
page_content = f"{table_name}: {table_info['table_description']}\nColumns:\n {column_info_str}"
38+
documents.append(Document(page_content=page_content))
3039
db = FAISS.from_documents(documents, embeddings)
3140
db.save_local(vectordb_path)
3241
print(f"VectorDB를 새로 생성했습니다: {vectordb_path}")

utils/llm/vectordb/pgvector_db.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,10 @@
77

88
import psycopg2
99
from langchain_postgres.vectorstores import PGVector
10+
from langchain.schema import Document
1011

1112
from utils.llm.core import get_embeddings
12-
from utils.llm.tools import get_info_from_db
13+
from utils.llm.tools import get_table_schema
1314

1415

1516
def _check_collection_exists(connection_string: str, collection_name: str) -> bool:
@@ -71,7 +72,15 @@ def get_pgvector_db(
7172
except Exception as e:
7273
print(f"exception: {e}")
7374
# 컬렉션이 없거나 불러오기에 실패한 경우, 문서를 다시 인덱싱
74-
documents = get_info_from_db()
75+
raw_data = get_table_schema()
76+
documents = []
77+
for item in raw_data:
78+
for table_name, table_info in item.items():
79+
column_info_str = "\n".join(
80+
[f"{k}: {v}" for k, v in table_info["columns"].items()]
81+
)
82+
page_content = f"{table_name}: {table_info['table_description']}\nColumns:\n {column_info_str}"
83+
documents.append(Document(page_content=page_content))
7584
vector_store = PGVector.from_documents(
7685
documents=documents,
7786
embedding=embeddings,

0 commit comments

Comments
 (0)