Skip to content

Commit 7371ea6

Browse files
Merge pull request #160 from CausalInferenceLab/159-restructure-dev-directory
refactor: 튜토리얼 관련 파일의 구조 변경
2 parents e72f426 + 1a74f51 commit 7371ea6

File tree

9 files changed

+163
-29
lines changed

9 files changed

+163
-29
lines changed

.gitignore

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,4 @@ test_lhm/
1111
.vscode
1212
table_info_db
1313
ko_reranker_local
14-
create_faiss.py
15-
*.csv
14+
*.csv

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ lang2sql --vectordb-type pgvector run-streamlit
127127

128128
# 위치 지정 예시
129129
# FAISS: 인덱스 디렉토리 경로 지정
130-
lang2sql --vectordb-type faiss --vectordb-location ./table_info_db run-streamlit
130+
lang2sql --vectordb-type faiss --vectordb-location ./dev/table_info_db run-streamlit
131131

132132
# pgvector: 연결 문자열 지정
133133
lang2sql --vectordb-type pgvector --vectordb-location "postgresql://user:pass@host:5432/db" run-streamlit

cli/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
"VectorDB 위치 설정\n"
7777
"- FAISS: 디렉토리 경로 (예: ./my_vectordb)\n"
7878
"- pgvector: 연결 문자열 (예: postgresql://user:pass@host:port/db)\n"
79-
"기본값: FAISS는 './table_info_db', pgvector는 환경변수 사용"
79+
"기본값: FAISS는 './dev/table_info_db', pgvector는 환경변수 사용"
8080
),
8181
)
8282
# pylint: disable=redefined-outer-name
@@ -278,7 +278,7 @@ def run_streamlit_cli_command(port: int) -> None:
278278
"VectorDB 위치 설정\n"
279279
"- FAISS: 디렉토리 경로 (예: ./my_vectordb)\n"
280280
"- pgvector: 연결 문자열 (예: postgresql://user:pass@host:port/db)\n"
281-
"기본값: FAISS는 './table_info_db', pgvector는 환경변수 사용"
281+
"기본값: FAISS는 './dev/table_info_db', pgvector는 환경변수 사용"
282282
),
283283
)
284284
def query_command(

dev/create_faiss.py

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
"""
2+
dev/create_faiss.py
3+
4+
CSV 파일에서 테이블과 컬럼 정보를 불러와 OpenAI 임베딩으로 벡터화한 뒤,
5+
FAISS 인덱스를 생성하고 로컬 디렉토리에 저장한다.
6+
7+
환경 변수:
8+
OPEN_AI_KEY: OpenAI API 키
9+
OPEN_AI_EMBEDDING_MODEL: 사용할 임베딩 모델 이름
10+
11+
출력:
12+
지정된 OUTPUT_DIR 경로에 FAISS 인덱스 저장
13+
"""
14+
15+
import csv
16+
import os
17+
from collections import defaultdict
18+
19+
from dotenv import load_dotenv
20+
from langchain_community.vectorstores import FAISS
21+
from langchain_openai import OpenAIEmbeddings
22+
23+
load_dotenv()
24+
# CSV 파일 경로
25+
CSV_PATH = "./dev/table_catalog.csv"
26+
# .env의 VECTORDB_LOCATION과 동일하게 맞추세요
27+
OUTPUT_DIR = "./dev/table_info_db"
28+
29+
tables = defaultdict(lambda: {"desc": "", "columns": []})
30+
with open(CSV_PATH, newline="", encoding="utf-8") as f:
31+
reader = csv.DictReader(f)
32+
for row in reader:
33+
t = row["table_name"].strip()
34+
tables[t]["desc"] = row["table_description"].strip()
35+
col = row["column_name"].strip()
36+
col_desc = row["column_description"].strip()
37+
tables[t]["columns"].append((col, col_desc))
38+
39+
docs = []
40+
for t, info in tables.items():
41+
cols = "\n".join([f"{c}: {d}" for c, d in info["columns"]])
42+
page = f"{t}: {info['desc']}\nColumns:\n {cols}"
43+
from langchain.schema import Document
44+
45+
docs.append(Document(page_content=page))
46+
47+
emb = OpenAIEmbeddings(
48+
model=os.getenv("OPEN_AI_EMBEDDING_MODEL"), openai_api_key=os.getenv("OPEN_AI_KEY")
49+
)
50+
db = FAISS.from_documents(docs, emb)
51+
os.makedirs(OUTPUT_DIR, exist_ok=True)
52+
db.save_local(OUTPUT_DIR)
53+
print(f"FAISS index saved to: {OUTPUT_DIR}")

dev/create_pgvector.py

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
"""
2+
dev/create_pgvector.py
3+
4+
CSV 파일에서 테이블과 컬럼 정보를 불러와 OpenAI 임베딩으로 벡터화한 뒤,
5+
pgvector에 적재한다.
6+
7+
환경 변수:
8+
OPEN_AI_KEY: OpenAI API 키
9+
OPEN_AI_EMBEDDING_MODEL: 사용할 임베딩 모델 이름
10+
VECTORDB_LOCATION: pgvector 연결 문자열
11+
PGVECTOR_COLLECTION: pgvector 컬렉션 이름
12+
"""
13+
14+
import csv
15+
import os
16+
from collections import defaultdict
17+
18+
from dotenv import load_dotenv
19+
from langchain.schema import Document
20+
from langchain_openai import OpenAIEmbeddings
21+
from langchain_postgres.vectorstores import PGVector
22+
23+
load_dotenv()
24+
# CSV 파일 경로
25+
CSV_PATH = "./dev/table_catalog.csv"
26+
# .env의 VECTORDB_LOCATION과 동일하게 맞추세요
27+
CONN = (
28+
os.getenv("VECTORDB_LOCATION")
29+
or "postgresql://pgvector:pgvector@localhost:5432/postgres"
30+
)
31+
COLLECTION = os.getenv("PGVECTOR_COLLECTION", "table_info_db")
32+
33+
tables = defaultdict(lambda: {"desc": "", "columns": []})
34+
with open(CSV_PATH, newline="", encoding="utf-8") as f:
35+
reader = csv.DictReader(f)
36+
for row in reader:
37+
t = row["table_name"].strip()
38+
tables[t]["desc"] = row["table_description"].strip()
39+
col = row["column_name"].strip()
40+
col_desc = row["column_description"]
41+
tables[t]["columns"].append((col, col_desc))
42+
43+
docs = []
44+
for t, info in tables.items():
45+
cols = "\n".join([f"{c}: {d}" for c, d in info["columns"]])
46+
docs.append(Document(page_content=f"{t}: {info['desc']}\nColumns:\n {cols}"))
47+
48+
emb = OpenAIEmbeddings(
49+
model=os.getenv("OPEN_AI_EMBEDDING_MODEL"), openai_api_key=os.getenv("OPEN_AI_KEY")
50+
)
51+
PGVector.from_documents(
52+
documents=docs, embedding=emb, connection=CONN, collection_name=COLLECTION
53+
)
54+
print(f"pgvector collection populated: {COLLECTION}")

docker/docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ services:
1313
- ../.env
1414
environment:
1515
- STREAMLIT_SERVER_PORT=8501
16-
- DATABASE_URL=postgresql://pgvector:pgvector@pgvector:5432/streamlit
16+
- DATABASE_URL=postgresql://pgvector:pgvector@localhost:5432/streamlit
1717
depends_on:
1818
- pgvector
1919

docs/tutorials/getting-started-without-datahub.md

Lines changed: 46 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ OPEN_AI_EMBEDDING_MODEL=text-embedding-3-large # 권장
3333

3434
# VectorDB (선택: 명시하지 않으면 기본값 동작)
3535
VECTORDB_TYPE=faiss
36-
VECTORDB_LOCATION=./table_info_db # FAISS 디렉토리 경로
36+
VECTORDB_LOCATION=dev/table_info_db # FAISS 디렉토리 경로
3737

3838
# (pgvector를 쓰는 경우)
3939
# VECTORDB_TYPE=pgvector
40-
# VECTORDB_LOCATION=postgresql://user:pass@host:5432/db
40+
# VECTORDB_LOCATION=postgresql://pgvector:pgvector@localhost:5432/postgres
4141
# PGVECTOR_COLLECTION=table_info_db
4242

4343
# DB 타입
@@ -46,9 +46,8 @@ DB_TYPE=clickhouse
4646

4747
중요: 코드상 OpenAI 키는 `OPEN_AI_KEY` 환경변수를 사용합니다. `.example.env``OPENAI_API_KEY`는 사용되지 않으니 혼동에 주의하세요.
4848

49-
### 2) 테이블/컬럼 메타데이터 준비(CSV 예시)
50-
- table_catalog.csv
51-
49+
### 2) 테이블/컬럼 메타데이터 준비 (CSV 예시)
50+
- dev/table_catalog.csv 파일을 생성합니다.
5251
```csv
5352
table_name,table_description,column_name,column_description
5453
customers,고객 정보 테이블,customer_id,고객 고유 ID
@@ -60,11 +59,12 @@ orders,주문 정보 테이블,amount,결제 금액
6059
orders,주문 정보 테이블,status,주문 상태
6160
```
6261

63-
### 3) FAISS 인덱스 생성(로컬)
64-
62+
### 3) FAISS 인덱스 생성 (로컬)
63+
- dev/create_faiss.py 파일을 실행합니다.
64+
- `python dev/create_faiss.py`
6565
```python
6666
"""
67-
create_faiss.py
67+
dev/create_faiss.py
6868
6969
CSV 파일에서 테이블과 컬럼 정보를 불러와 OpenAI 임베딩으로 벡터화한 뒤,
7070
FAISS 인덱스를 생성하고 로컬 디렉토리에 저장한다.
@@ -86,8 +86,10 @@ from langchain_community.vectorstores import FAISS
8686
from langchain_openai import OpenAIEmbeddings
8787

8888
load_dotenv()
89-
CSV_PATH = "./table_catalog.csv" # 위 CSV 파일 경로
90-
OUTPUT_DIR = "./table_info_db" # .env 파일의 VECTORDB_LOCATION 값과 동일하게 맞추세요.
89+
# CSV 파일 경로
90+
CSV_PATH = "./dev/table_catalog.csv"
91+
# .env의 VECTORDB_LOCATION과 동일하게 맞추세요
92+
OUTPUT_DIR = "./dev/table_info_db"
9193

9294
tables = defaultdict(lambda: {"desc": "", "columns": []})
9395
with open(CSV_PATH, newline="", encoding="utf-8") as f:
@@ -120,26 +122,47 @@ print(f"FAISS index saved to: {OUTPUT_DIR}")
120122

121123
```bash
122124
# Streamlit UI
123-
lang2sql --vectordb-type faiss --vectordb-location ./table_info_db run-streamlit
125+
lang2sql --vectordb-type faiss --vectordb-location ./dev/table_info_db run-streamlit
124126

125127
# CLI 예시
126-
lang2sql query "주문 수를 집계하는 SQL을 만들어줘" --vectordb-type faiss --vectordb-location ./table_info_db
128+
lang2sql query "주문 수를 집계하는 SQL을 만들어줘" --vectordb-type faiss --vectordb-location ./dev/table_info_db
127129

128130
# CLI 예시 (pgvector)
129-
lang2sql query "주문 수를 집계하는 SQL을 만들어줘" --vectordb-type pgvector --vectordb-location "postgresql://postgres:postgres@localhost:5431/postgres"
131+
lang2sql query "주문 수를 집계하는 SQL을 만들어줘" --vectordb-type pgvector --vectordb-location "postgresql://pgvector:pgvector@localhost:5432/postgres"
130132
```
131133

132134
### 5) (선택) pgvector로 적재하기
135+
- dev/create_pgvector.py 파일을 실행합니다.
136+
- `python dev/create_pgvector.py`
133137

134138
```python
139+
"""
140+
dev/create_pgvector.py
141+
142+
CSV 파일에서 테이블과 컬럼 정보를 불러와 OpenAI 임베딩으로 벡터화한 뒤,
143+
pgvector에 적재한다.
144+
145+
환경 변수:
146+
OPEN_AI_KEY: OpenAI API 키
147+
OPEN_AI_EMBEDDING_MODEL: 사용할 임베딩 모델 이름
148+
VECTORDB_LOCATION: pgvector 연결 문자열
149+
PGVECTOR_COLLECTION: pgvector 컬렉션 이름
150+
"""
151+
152+
import csv
153+
import os
135154
from collections import defaultdict
136-
import csv, os
155+
156+
from langchain.schema import Document
137157
from langchain_openai import OpenAIEmbeddings
138158
from langchain_postgres.vectorstores import PGVector
139-
from langchain.schema import Document
140159

141-
CSV_PATH = "./table_catalog.csv"
142-
CONN = os.getenv("VECTORDB_LOCATION") or "postgresql://user:pass@host:5432/db"
160+
# CSV 파일 경로
161+
CSV_PATH = "./dev/table_catalog.csv"
162+
# .env의 VECTORDB_LOCATION과 동일하게 맞추세요
163+
CONN = (
164+
os.getenv("VECTORDB_LOCATION") or "postgresql://pgvector:pgvector@localhost:5432/postgres"
165+
)
143166
COLLECTION = os.getenv("PGVECTOR_COLLECTION", "table_info_db")
144167

145168
tables = defaultdict(lambda: {"desc": "", "columns": []})
@@ -157,8 +180,12 @@ for t, info in tables.items():
157180
cols = "\n".join([f"{c}: {d}" for c, d in info["columns"]])
158181
docs.append(Document(page_content=f"{t}: {info['desc']}\nColumns:\n {cols}"))
159182

160-
emb = OpenAIEmbeddings(model=os.getenv("OPEN_AI_EMBEDDING_MODEL"), openai_api_key=os.getenv("OPEN_AI_KEY"))
161-
PGVector.from_documents(documents=docs, embedding=emb, connection=CONN, collection_name=COLLECTION)
183+
emb = OpenAIEmbeddings(
184+
model=os.getenv("OPEN_AI_EMBEDDING_MODEL"), openai_api_key=os.getenv("OPEN_AI_KEY")
185+
)
186+
PGVector.from_documents(
187+
documents=docs, embedding=emb, connection=CONN, collection_name=COLLECTION
188+
)
162189
print(f"pgvector collection populated: {COLLECTION}")
163190
```
164191

llm_utils/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ Lang2SQL 파이프라인에서 LLM, 검색(RAG), 그래프 워크플로우, DB
2727
### Depth 1.5: 벡터DB
2828

2929
- **`vectordb/factory.py``get_vector_db()`**: `VECTORDB_TYPE`(`faiss`|`pgvector`)에 따라 인스턴스 반환.
30-
- **`vectordb/faiss_db.py`**: 로컬 디스크 `table_info_db` 로드/없으면 `tools.get_info_from_db()`로 빌드 후 저장.
30+
- **`vectordb/faiss_db.py`**: 로컬 디스크 `dev/table_info_db` 로드/없으면 `tools.get_info_from_db()`로 빌드 후 저장.
3131
- **`vectordb/pgvector_db.py`**: PGVector 컬렉션 연결, 없거나 비면 `from_documents`로 재구성.
3232

3333
### Depth 2: 데이터 소스/메타 수집

llm_utils/vectordb/faiss_db.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33
"""
44

55
import os
6-
from langchain_community.vectorstores import FAISS
76
from typing import Optional
87

9-
from llm_utils.tools import get_info_from_db
8+
from langchain_community.vectorstores import FAISS
9+
1010
from llm_utils.llm import get_embeddings
11+
from llm_utils.tools import get_info_from_db
1112

1213

1314
def get_faiss_vector_db(vectordb_path: Optional[str] = None):
@@ -16,7 +17,7 @@ def get_faiss_vector_db(vectordb_path: Optional[str] = None):
1617

1718
# 기본 경로 설정
1819
if vectordb_path is None:
19-
vectordb_path = os.path.join(os.getcwd(), "table_info_db")
20+
vectordb_path = os.path.join(os.getcwd(), "dev/table_info_db")
2021

2122
try:
2223
db = FAISS.load_local(

0 commit comments

Comments
 (0)