Skip to content
동욱 edited this page Mar 26, 2025 · 6 revisions

Week1

프로젝트 설정

  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.222.80:8080 run-streamlit
  6. 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: 기본구독 ...)
  1. clickhouse 접속하여 데이터 확인
  • http://34.125.222.80:8123/play
    • ID: clickhouse, PW: clickhouse
    • 현재 회사 데이터웨어하우스로 가정
    • 테이블이 많지만 무슨데이터인지 잘 모르겠음 (이 문제를 저희가 해결하기 위한것이니 오히려 좋아...!)
    • show tables, select * from client_stream_activated_on_product ...

사용되는 데이터 설명

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

프로젝트 구조

image
  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 값 (초기 사용자 입력값)

현재 진행정도 스크린샷

image

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...