Skip to content
동욱 edited this page Mar 4, 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.140.137:8080 run-streamlit
  6. DataHub 대시보드 접속
    • http://34.125.140.137:9002
    • ID: datahub, PW: datahub
    • 현재 회사의 데이터 카탈로그를 확인할 수 있는 Datahub로 가정

사용되는 데이터 설명

  • 원본 프로젝트
  • 수정본 프로젝트
  • 원본의 프로젝트에다가 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

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

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

Clone this wiki locally