-
Notifications
You must be signed in to change notification settings - Fork 3
Week1
동욱 edited this page Mar 26, 2025
·
6 revisions
- GitHub 저장소 클론
git clone https://github.com/CausalInferenceLab/Lang2SQL
- 프로젝트 디렉터리 이동
cd Lang2SQL
- 환경변수 설정 파일
.env
생성 및 설정# 필수 환경변수 (현재 ChatGPT만 지원됨) OPENAI_API_KEY=sk-proj-OJwm9QBxu~~ # LangSmith 관련 환경변수 LANGCHAIN_TRACING_V2=true LANGCHAIN_PROJECT=langgraph_tutorial LANGCHAIN_ENDPOINT=https://api.smith.langchain.com LANGCHAIN_API_KEY=lsv2_~~ # DataHub 서버 설정 DATAHUB_SERVER=http://localhost:8080
- 패키지 설치
pip install .
- Streamlit 서버 실행
lang2sql --datahub_server http://34.125.222.80:8080 run-streamlit
- DataHub 대시보드 접속
- http://34.125.222.80:9002
- ID:
datahub
, PW:datahub
- 현재 회사의 데이터 카탈로그를 확인할 수 있는 Datahub로 가정
- 데이터 설명 보강
- 현재는 datahub의 subscription 관련만 table 및 column description이 작성되어 있음 (추가작성 예정 + 영문 작업이 완료되면 한글화 버전 만들 예정)
- entity_id: 회원번호
- activity_ts: activity 발생 timestamp
- activity: 특정 행동 (구독시작, 구독해지 등등)
- revenue_impact: 매출 영향
- feature_json: 회원 segment 혹은 구독 구분 존재 (active_user: 활성회원, basic_plan: 기본구독 ...)
- clickhouse 접속하여 데이터 확인
-
http://34.125.222.80:8123/play
- ID:
clickhouse
, PW:clickhouse
- 현재 회사 데이터웨어하우스로 가정
- 테이블이 많지만 무슨데이터인지 잘 모르겠음 (이 문제를 저희가 해결하기 위한것이니 오히려 좋아...!)
-
show tables
,select * from client_stream_activated_on_product
...
- ID:
- 원본 프로젝트
- 수정본 프로젝트
- 원본의 프로젝트에다가 sql 과 schema 관련 yml을 일부 수정해서 회사 데이터로 가정
- 현재 schema를 정리한 부분은 subscription_activities 로 구독관련 더미데이터로 확인

-
사용자 입력 처리
-
query_refiner
노드에서 사용자 입력을 보다 구체적인 질의로 변환 - 예시:
- 입력:
구독서비스를 이용하는 유니크한 유저수
- 변환 결과:
"최근 3개월 동안 구독 서비스에 가입한 유니크한 유저 수를 월별로 분석하고, 이 중에서 반복적인 구독을 유지한 유저 비율을 파악하여 유저 유지율을 평가하고 싶다." 가정된 조건: - 분석 대상: 최근 3개월 간의 구독 활동 로그 - 유니크 유저 수: 각 월별로 중복되지 않는 사용자 수 - 반복 구독 유지율: 2회 이상 구독한 사용자 비율
- 입력:
-
-
테이블 검색 (
get_table_info
노드)- DataHub 데이터를 조회하여 FAISS를 이용해 벡터화
- 벡터 DB에서 재정의된 사용자 질문을 기반으로 유사한 테이블 검색 (
db.similarity_search
) - 검색된 테이블 목록
searched_tables
에 저장
-
쿼리 생성 (
query_maker
노드)- 다음 정보를 기반으로 SQL 쿼리 생성
- 첫 사용자 질문 (원본 입력)
- 재정의된 질문 (
query_refiner
노드에서 변환된 입력) - 검색된 테이블 목록 (
get_table_info
노드에서 찾은 값) -
user_database_env
값 (초기 사용자 입력값)
- 다음 정보를 기반으로 SQL 쿼리 생성
-
각자 하고싶은 부분 이슈 생성하기 입니다. 아래는 예시입니다.
- 반드시 직접 작업할 부분이 아니더라도 필요한 기능이나 개선이 필요한 부분에 대해 자유롭게 이슈를 생성할 수 있습니다.
-
이슈생성 + branch 생성
- 블로그를 참고하셔서 이슈생성 및 해당 이슈와 연결된 branch 생성 (branch 머지시 issue가 close)
- Issue에 포함되면 좋을 정보
- Why (이슈를 생성하는 이유) - 문제의 배경(Context)이나 필요성(Need)
- How (어떻게 개선 할것인지) - 개선 방향성이나 개선이 적용될 경우 기대효과
- What (이슈 해결을 위해 필요한 것) - 구체적인 To-Do List, 작업범위, 관련 문서 또는 참고자료
- Best Practice 쿼리 활용 기능 추가
class QueryMakerState(TypedDict):
messages: Annotated[list, add_messages]
user_database_env: str
searched_tables: dict[str, dict[str, str]]
best_practice_query: str
refined_input: str
generated_query: str
-
현재
best_practice_query
변수가 존재하지만 쿼리 생성에 사용되지 않음 -
best_practice_input
을 추가하여 과거 유사한 질문이 있었다면 이를 참고해 쿼리를 생성하도록 개선 -
혹은 해당 내용도 저장할 수 있다면 점점 답변의 퀄리티가 올라갈 가능성이 높음
-
openai_api_key 입력받도록 하기
llm = get_llm(
model_type="openai",
model_name="gpt-4o-mini",
openai_api_key=os.getenv("OPENAI_API_KEY"),
)
-
현재 환경변수에서
OPENAI_API_KEY
값을 가져오고 있음 -
Streamlit UI에서 API 키를 직접 입력할 수 있도록 개선 혹은 다른 모델 지원 (hugging-face ...)
-
프롬프트 강화하기 (쿼리를 생성하기엔 너무 간단한 프롬프트)
-
쿼리 실행부분 추가 (쿼리 생성 + 실행해서 시각화 + 분석 etc)
-
테이블 retrieval 강화 (reranking ...)
-
서버단 추가 (현재 streamlit에서 llm을 생성하고 있어서 여러 사용자가 사용하면 아마 꼬일듯합니다.)
-
etc...