가는중 2025. 3. 12. 09:59

https://github.com/CausalInferenceLab/Lang2SQL

 

GitHub - CausalInferenceLab/Lang2SQL

Contribute to CausalInferenceLab/Lang2SQL development by creating an account on GitHub.

github.com

 

프로젝트 설정

1. GitHub 저장소 클론

git clone https://github.com/CausalInferenceLab/Lang2SQL

 

 

2. 프로젝트 디렉터리 이동

cd Lang2SQL

 

3. 환경변수 설정 파일 .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

 

4. 패키지 설치

pip install .

 

5. Streamlit 서버 실행

lang2sql --datahub_server http://34.125.140.137:8080 run-streamlit

6. DataHub 대시보드 접속

  • http://34.125.140.137: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: 기본구독 ...)

7. clickhouse 접속하여 데이터 확인

  • http://34.125.140.137:8123/play
    • ID: clickhouse, PW: clickhouse
    • 현재 회사 데이터웨어하우스로 가정
    • 테이블이 많지만 무슨데이터인지 잘 모르겠음 (이 문제를 저희가 해결하기 위한것이니 오히려 좋아...!)
    • show tables, select * from client_stream_activated_on_product ...

사용되는 데이터 설명

  • 원본 프로젝트
  • 수정본 프로젝트
  • 원본의 프로젝트에다가 sql 과 schema 관련 yml을 일부 수정해서 회사 데이터로 가정
    • 현재 schema를 정리한 부분은 subscription_activities 로 구독관련 더미데이터로 확인

프로젝트 구조

  1. 사용자 입력 처리
    • query_refiner 노드에서 사용자 입력을 보다 구체적인 질의로 변환
    • 예시:
      • 입력: 구독서비스를 이용하는 유니크한 유저수
      • 변환 결과:
      • "최근 3개월 동안 구독 서비스에 가입한 유니크한 유저 수를 월별로 분석하고,
        이 중에서 반복적인 구독을 유지한 유저 비율을 파악하여 유저 유지율을 평가하고 싶다."
        
        가정된 조건:
        - 분석 대상: 최근 3개월 간의 구독 활동 로그
        - 유니크 유저 수: 각 월별로 중복되지 않는 사용자 수
        - 반복 구독 유지율: 2회 이상 구독한 사용자 비율

2. 테이블 검색 (get_table_info 노드)

  • DataHub 데이터를 조회하여 FAISS를 이용해 벡터화
  • 벡터 DB에서 재정의된 사용자 질문을 기반으로 유사한 테이블 검색 (db.similarity_search)
  • 검색된 테이블 목록 searched_tables에 저장

 

3. 쿼리 생성 (query_maker 노드)

  • 다음 정보를 기반으로 SQL 쿼리 생성
  • 첫 사용자 질문 (원본 입력)
  • 재정의된 질문 (query_refiner 노드에서 변환된 입력)
  • 검색된 테이블 목록 (get_table_info 노드에서 찾은 값)
  • user_database_env 값 (초기 사용자 입력값)

현재 진행정도 스크린샷

 

Week1 To-Do

  • 각자 하고싶은 부분 이슈 생성하기 입니다. 아래는 예시입니다.
    • 반드시 직접 작업할 부분이 아니더라도 필요한 기능이나 개선이 필요한 부분에 대해 자유롭게 이슈를 생성할 수 있습니다.

Issue 생성 및 PR 까지

  • 이슈생성 + branch 생성
    • 블로그를 참고하셔서 이슈생성 및 해당 이슈와 연결된 branch 생성 (branch 머지시 issue가 close)
  • Issue에 포함되면 좋을 정보
    • Why (이슈를 생성하는 이유) - 문제의 배경(Context)이나 필요성(Need)
    • How (어떻게 개선 할것인지) - 개선 방향성이나 개선이 적용될 경우 기대효과
    • What (이슈 해결을 위해 필요한 것) - 구체적인 To-Do List, 작업범위, 관련 문서 또는 참고자료

example

  • 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...
반응형