Skip to content

Commit b2063df

Browse files
committed
README.md 및 CLI 코드 업데이트 #134
- 소스 설치 방법에 uv 사용 추가 및 pip 사용 방법 개선 - Graph Builder 페이지에 대한 설명 추가 - DataHub 없이 시작하기 튜토리얼 문서 새로 생성 - 환경 설정 관련 내용 수정 및 CLI 옵션 추가
1 parent 79084e8 commit b2063df

File tree

3 files changed

+167
-13
lines changed

3 files changed

+167
-13
lines changed

README.md

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,20 @@ pip install lang2sql
6262
### 소스에서 설치
6363

6464
```bash
65+
# 소스 클론
6566
git clone https://github.com/CausalInferenceLab/lang2sql.git
6667
cd lang2sql
67-
pip install -r requirements.txt
68-
python setup.py install
68+
69+
# (권장) uv 사용
70+
# uv 설치가 되어 있다면 아래 두 줄로 개발 모드 설치
71+
uv venv
72+
source .venv/bin/activate
73+
uv pip install -e .
74+
75+
# (대안) pip 사용
76+
python -m venv .venv
77+
source .venv/bin/activate
78+
pip install -e .
6979
```
7080

7181
---
@@ -86,6 +96,18 @@ lang2sql run-streamlit
8696
lang2sql --datahub_server http://your-datahub-server:8080 run-streamlit -p 8888
8797
```
8898

99+
참고: Streamlit 서버는 `0.0.0.0` 으로 바인딩되어 외부에서 접속 가능합니다.
100+
101+
### Graph Builder 페이지
102+
103+
Streamlit 앱은 멀티 페이지 구조입니다. 좌측 네비게이션에서 "Graph Builder" 페이지를 열어 LangGraph 워크플로우를 구성할 수 있습니다.
104+
105+
- 프리셋 선택: "기본" 또는 "확장"
106+
- 커스텀 옵션: `PROFILE_EXTRACTION`, `CONTEXT_ENRICHMENT`, `QUERY_MAKER` 포함 여부 토글
107+
- 선택이 바뀌면 그래프가 즉시 컴파일되어 세션에 적용됩니다
108+
- "세션 그래프 새로고침" 버튼으로 수동 재적용 가능
109+
- `QUERY_MAKER`를 비활성화하면 테이블 검색 정보만 표시됩니다
110+
89111
### VectorDB 선택
90112

91113
FAISS(로컬) 또는 pgvector(PostgreSQL) 중 선택:
@@ -96,8 +118,23 @@ lang2sql --vectordb-type faiss run-streamlit
96118

97119
# pgvector 사용
98120
lang2sql --vectordb-type pgvector run-streamlit
121+
122+
# 위치 지정 예시
123+
# FAISS: 인덱스 디렉토리 경로 지정
124+
lang2sql --vectordb-type faiss --vectordb-location ./table_info_db run-streamlit
125+
126+
# pgvector: 연결 문자열 지정
127+
lang2sql --vectordb-type pgvector --vectordb-location "postgresql://user:pass@host:5432/db" run-streamlit
99128
```
100129

130+
참고: DataHub 없이도 미리 준비된 VectorDB(FAISS 디렉토리 혹은 pgvector 컬렉션)를 바로 사용할 수 있습니다. 자세한 준비 방법은 [DataHub 없이 시작하기](docs/tutorials/getting-started-without-datahub.md)를 참고하세요.
131+
132+
### 처음 시작하기 (DataHub 없이)
133+
134+
튜토리얼 본문이 길어져 별도 문서로 분리되었습니다. 아래 문서를 참고하세요.
135+
136+
- [DataHub 없이 시작하기 튜토리얼](docs/tutorials/getting-started-without-datahub.md)
137+
101138
### 자연어 쿼리 실행
102139

103140
```bash
@@ -110,10 +147,11 @@ lang2sql query "고객 데이터를 기반으로 유니크한 유저 수를 카
110147

111148
### 환경 설정
112149

113-
- 현재는 pip 패키지 설치로 프로젝트 시작이 어려운 상황입니다.
114-
- `.env` 파일을 생성하여 설정 관리 (.env.example 참고)
115-
116-
---
150+
- `.env` 파일을 생성하여 설정을 관리합니다. (예시 파일이 있다면 참조)
151+
- 또는 CLI 옵션으로 환경을 지정할 수 있습니다:
152+
- `--env-file-path`: 환경 변수 파일 경로 지정
153+
- `--prompt-dir-path`: 프롬프트 템플릿(.md) 디렉토리 지정
154+
- `--datahub_server`: DataHub GMS 서버 URL 지정
117155

118156
## 🏗️ 아키텍처
119157

cli/__init__.py

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -266,11 +266,6 @@ def run_streamlit_cli_command(port: int) -> None:
266266
is_flag=True,
267267
help="확장된 그래프(프로파일 추출 + 컨텍스트 보강) 사용 여부",
268268
)
269-
@click.option(
270-
"--use-simplified-graph",
271-
is_flag=True,
272-
help="단순화된 그래프(QUERY_REFINER 제거) 사용 여부",
273-
)
274269
@click.option(
275270
"--vectordb-type",
276271
type=click.Choice(["faiss", "pgvector"]),
@@ -293,7 +288,6 @@ def query_command(
293288
top_n: int,
294289
device: str,
295290
use_enriched_graph: bool,
296-
use_simplified_graph: bool,
297291
vectordb_type: str = "faiss",
298292
vectordb_location: str = None,
299293
) -> None:
@@ -335,7 +329,6 @@ def query_command(
335329
top_n=top_n,
336330
device=device,
337331
use_enriched_graph=use_enriched_graph,
338-
use_simplified_graph=use_simplified_graph,
339332
)
340333

341334
# SQL 추출 및 출력
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
## DataHub 없이 시작하기 (튜토리얼)
2+
3+
이 문서는 DataHub 없이도 Lang2SQL을 바로 사용하기 위한 최소 절차를 설명합니다. CSV로 테이블/컬럼 설명을 준비해 FAISS 또는 pgvector에 적재한 뒤 Lang2SQL을 실행합니다.
4+
5+
### 1) .env 최소 설정 (OpenAI 기준)
6+
7+
```bash
8+
# LLM/임베딩
9+
LLM_PROVIDER=openai
10+
OPEN_AI_KEY=sk-... # OpenAI API Key (주의: OPENAI_API_KEY가 아니라 OPEN_AI_KEY)
11+
OPEN_AI_LLM_MODEL=gpt-4o # 또는 gpt-4.1 등
12+
EMBEDDING_PROVIDER=openai
13+
OPEN_AI_EMBEDDING_MODEL=text-embedding-3-large # 권장
14+
15+
# VectorDB (선택: 명시하지 않으면 기본값 동작)
16+
VECTORDB_TYPE=faiss
17+
VECTORDB_LOCATION=./table_info_db # FAISS 디렉토리 경로
18+
19+
# (pgvector를 쓰는 경우)
20+
# VECTORDB_TYPE=pgvector
21+
# VECTORDB_LOCATION=postgresql://user:pass@host:5432/db
22+
# PGVECTOR_COLLECTION=table_info_db
23+
```
24+
25+
중요: 코드상 OpenAI 키는 `OPEN_AI_KEY` 환경변수를 사용합니다. `.example.env``OPENAI_API_KEY`는 사용되지 않으니 혼동에 주의하세요.
26+
27+
### 2) 테이블/컬럼 메타데이터 준비(CSV 예시)
28+
29+
```csv
30+
table_name,table_description,column_name,column_description
31+
customers,고객 정보 테이블,customer_id,고객 고유 ID
32+
customers,고객 정보 테이블,name,고객 이름
33+
customers,고객 정보 테이블,created_at,가입 일시
34+
orders,주문 정보 테이블,order_id,주문 ID
35+
orders,주문 정보 테이블,customer_id,주문 고객 ID
36+
orders,주문 정보 테이블,amount,결제 금액
37+
orders,주문 정보 테이블,status,주문 상태
38+
```
39+
40+
### 3) FAISS 인덱스 생성(로컬)
41+
42+
```python
43+
from collections import defaultdict
44+
import csv, os
45+
from langchain_openai import OpenAIEmbeddings
46+
from langchain_community.vectorstores import FAISS
47+
48+
CSV_PATH = "./table_catalog.csv" # 위 CSV 파일 경로
49+
OUTPUT_DIR = "./table_info_db" # VECTORDB_LOCATION과 동일하게 맞추세요
50+
51+
tables = defaultdict(lambda: {"desc": "", "columns": []})
52+
with open(CSV_PATH, newline="", encoding="utf-8") as f:
53+
reader = csv.DictReader(f)
54+
for row in reader:
55+
t = row["table_name"].strip()
56+
tables[t]["desc"] = row["table_description"].strip()
57+
col = row["column_name"].strip()
58+
col_desc = row["column_description"].strip()
59+
tables[t]["columns"].append((col, col_desc))
60+
61+
docs = []
62+
for t, info in tables.items():
63+
cols = "\n".join([f"{c}: {d}" for c, d in info["columns"]])
64+
page = f"{t}: {info['desc']}\nColumns:\n {cols}"
65+
from langchain.schema import Document
66+
docs.append(Document(page_content=page))
67+
68+
emb = OpenAIEmbeddings(model=os.getenv("OPEN_AI_EMBEDDING_MODEL"), openai_api_key=os.getenv("OPEN_AI_KEY"))
69+
db = FAISS.from_documents(docs, emb)
70+
os.makedirs(OUTPUT_DIR, exist_ok=True)
71+
db.save_local(OUTPUT_DIR)
72+
print(f"FAISS index saved to: {OUTPUT_DIR}")
73+
```
74+
75+
### 4) 실행
76+
77+
```bash
78+
# Streamlit UI
79+
lang2sql --vectordb-type faiss --vectordb-location ./table_info_db run-streamlit
80+
81+
# CLI 예시
82+
lang2sql query "주문 수를 집계하는 SQL을 만들어줘" --vectordb-type faiss --vectordb-location ./table_info_db
83+
84+
# CLI 예시 (pgvector)
85+
lang2sql query "주문 수를 집계하는 SQL을 만들어줘" --vectordb-type pgvector --vectordb-location "postgresql://postgres:postgres@localhost:5431/postgres"
86+
```
87+
88+
### 5) (선택) pgvector로 적재하기
89+
90+
```python
91+
from collections import defaultdict
92+
import csv, os
93+
from langchain_openai import OpenAIEmbeddings
94+
from langchain_postgres.vectorstores import PGVector
95+
from langchain.schema import Document
96+
97+
CSV_PATH = "./table_catalog.csv"
98+
CONN = os.getenv("VECTORDB_LOCATION") or "postgresql://user:pass@host:5432/db"
99+
COLLECTION = os.getenv("PGVECTOR_COLLECTION", "table_info_db")
100+
101+
tables = defaultdict(lambda: {"desc": "", "columns": []})
102+
with open(CSV_PATH, newline="", encoding="utf-8") as f:
103+
reader = csv.DictReader(f)
104+
for row in reader:
105+
t = row["table_name"].strip()
106+
tables[t]["desc"] = row["table_description"].strip()
107+
col = row["column_name"].strip()
108+
col_desc = row["column_description"]
109+
tables[t]["columns"].append((col, col_desc))
110+
111+
docs = []
112+
for t, info in tables.items():
113+
cols = "\n".join([f"{c}: {d}" for c, d in info["columns"]])
114+
docs.append(Document(page_content=f"{t}: {info['desc']}\nColumns:\n {cols}"))
115+
116+
emb = OpenAIEmbeddings(model=os.getenv("OPEN_AI_EMBEDDING_MODEL"), openai_api_key=os.getenv("OPEN_AI_KEY"))
117+
PGVector.from_documents(documents=docs, embedding=emb, connection=CONN, collection_name=COLLECTION)
118+
print(f"pgvector collection populated: {COLLECTION}")
119+
```
120+
121+
주의: FAISS 디렉토리가 없으면 현재 코드는 DataHub에서 메타데이터를 가져와 인덱스를 생성하려고 시도합니다. DataHub를 사용하지 않는 경우 위 절차로 사전에 VectorDB를 만들어 두세요.
122+
123+

0 commit comments

Comments
 (0)