From a8e853d5d02f7dfa3fd370c520d0062167f75382 Mon Sep 17 00:00:00 2001 From: ehddnr301 Date: Sun, 16 Mar 2025 11:07:41 +0000 Subject: [PATCH] feat: Integrate MLflow for SQL evaluation and enhance CLI functionality - Add MLflow dependency for tracking evaluation metrics - Implement evaluation command in CLI for SQL generation model - Create QADataset class for loading and managing evaluation datasets - Develop Evaluator class to handle SQL evaluation and logging to MLflow - Add documentation for MLflow setup and evaluation CLI usage - Introduce example dataset for testing evaluation functionality #15 --- .gitignore | 4 +- cli/__init__.py | 39 +++++++++++++- docs/evaluation.md | 24 +++++++++ docs/mlflow.png | Bin 0 -> 88980 bytes llm_evaluation/__init__.py | 0 llm_evaluation/dataset.py | 45 +++++++++++++++++ llm_evaluation/evaluator.py | 87 ++++++++++++++++++++++++++++++++ llm_evaluation/example.json | 13 +++++ llm_evaluation/llm_evaluator.py | 50 ++++++++++++++++++ llm_evaluation/mlflow_logger.py | 21 ++++++++ requirements.txt | 1 + setup.py | 1 + 12 files changed, 283 insertions(+), 2 deletions(-) create mode 100644 docs/evaluation.md create mode 100644 docs/mlflow.png create mode 100644 llm_evaluation/__init__.py create mode 100644 llm_evaluation/dataset.py create mode 100644 llm_evaluation/evaluator.py create mode 100644 llm_evaluation/example.json create mode 100644 llm_evaluation/llm_evaluator.py create mode 100644 llm_evaluation/mlflow_logger.py diff --git a/.gitignore b/.gitignore index 203a6db..38dd159 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,6 @@ __pycache__/ build/ lang2sql.egg-info/ dist/ -.pypirc \ No newline at end of file +.pypirc +mlruns +table_info_db \ No newline at end of file diff --git a/cli/__init__.py b/cli/__init__.py index 1fd9fec..d339cf2 100644 --- a/cli/__init__.py +++ b/cli/__init__.py @@ -1,6 +1,10 @@ import click import subprocess from llm_utils.tools import set_gms_server +from langchain_core.messages import HumanMessage +from llm_evaluation.evaluator import Evaluator +from llm_utils.graph import builder +import os @click.group() @@ -11,12 +15,17 @@ ) @click.option("--run-streamlit", is_flag=True, help="Run the Streamlit app.") @click.option("-p", "--port", type=int, default=8501, help="Streamlit port") -def cli(ctx, datahub_server, run_streamlit, port): +@click.option("--mlflow-tracking-uri", default=None, help="MLflow 트래킹 서버 URI") +def cli(ctx, datahub_server, run_streamlit, port, mlflow_tracking_uri): try: set_gms_server(datahub_server) except ValueError as e: click.echo(str(e)) ctx.exit(1) + + if mlflow_tracking_uri: + os.environ["MLFLOW_TRACKING_URI"] = mlflow_tracking_uri + if run_streamlit: run_streamlit_command(port) @@ -33,3 +42,31 @@ def run_streamlit_command(port): def run_streamlit(port): """Run the Streamlit app.""" run_streamlit_command(port) + + +@cli.command() +@click.argument("dataset_path", type=click.Path(exists=True)) +@click.option( + "--user-database-env", default="clickhouse", help="사용자 데이터베이스 환경" +) +def evaluate(dataset_path, user_database_env): + """SQL 생성 모델을 평가합니다.""" + click.echo(f"데이터셋 {dataset_path}로 평가를 시작합니다...") + + evaluator = Evaluator(dataset_path) + + def generated_sql_fn(question: str): + graph = builder.compile() + + res = graph.invoke( + input={ + "messages": [HumanMessage(content=question)], + "user_database_env": user_database_env, + "best_practice_query": "", + } + ) + + return res["generated_query"].content + + results = evaluator.evaluate(generated_sql_fn) + click.echo(f"평가 완료! {len(results)}개 쿼리 평가됨") diff --git a/docs/evaluation.md b/docs/evaluation.md new file mode 100644 index 0000000..ebb3ff3 --- /dev/null +++ b/docs/evaluation.md @@ -0,0 +1,24 @@ +# Evaluation + +## MLFlow + +### 실행 + +- `docker run --name mlflow_postgres -e POSTGRES_USER=postgres -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=mlflow_db -p 5430:5432 -d postgres` +- `mlflow server --backend-store-uri postgresql://postgres:postgres@localhost:5430/mlflow_db --default-artifact-root ./mlruns --host 0.0.0.0 --port 5000` + - `backed-store-uri`: MLflow가 메타데이터를 저장하는 데이터베이스의 URI를 지정합니다. 예를 들어, PostgreSQL 데이터베이스를 사용할 경우 `postgresql://:@:/` 형식으로 지정합니다. + - `default-artifact-root`: MLflow가 모델 아티팩트를 저장할 기본 경로를 지정합니다. 예를 들어, 로컬 파일 시스템을 사용할 경우 `./mlruns`와 같이 지정할 수 있습니다. + + +## 평가 실행하기 + +### CLI 명령어 + +SQL 생성 모델을 평가하기 위해 다음과 같은 CLI 명령어를 사용할 수 있습니다: +``` +lang2sql evaluate /path/to/dataset.json --user-database-env clickhouse +``` + +### 결과 예시 + +![MLFlow](./mlflow.png) diff --git a/docs/mlflow.png b/docs/mlflow.png new file mode 100644 index 0000000000000000000000000000000000000000..7fad7e3b16dd44596073029f7cd9bdab77067f56 GIT binary patch literal 88980 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 aV)>%3= date_sub(current_date(), interval 3 month) GROUP BY month ORDER BY month", + "SELECT COUNT(DISTINCT entity_id) AS total_hired_sdrs FROM company_stream_hired_sdr WHERE activity_ts >= now() - INTERVAL 3 MONTH", + "SELECT feature_json, COUNT(entity_id) AS user_count FROM client_stream_started_subscription WHERE feature_json LIKE '%\"free_users\"%' GROUP BY feature_json" + ] +} diff --git a/llm_evaluation/llm_evaluator.py b/llm_evaluation/llm_evaluator.py new file mode 100644 index 0000000..9ce1589 --- /dev/null +++ b/llm_evaluation/llm_evaluator.py @@ -0,0 +1,50 @@ +import os +from langchain_core.prompts import ChatPromptTemplate +from llm_utils.llm_factory import get_llm + + +def compare_sql_with_llm(generated_sql, ground_truth_sql, user_query): + """LLM을 사용하여 SQL 평가 (0 ~ 1 점수)""" + + # LLM 초기화 + llm = get_llm( + model_type="openai", + model_name="gpt-4o-mini", + openai_api_key=os.getenv("OPENAI_API_KEY"), + ) + + # 프롬프트 템플릿 생성 + prompt = ChatPromptTemplate.from_messages( + [ + ( + "system", + f""" + 당신은 SQL 전문가입니다. 다음 두 SQL 쿼리의 정확성과 유사성을 비교해주세요. + 유사성을 0(완전히 다름)에서 1(동일함) 사이의 척도로 평가해주세요. + + 입력 설명 (SQL이 수행해야 할 작업): + {user_query} + + 정답 SQL: + {ground_truth_sql} + + 생성된 SQL: + {generated_sql} + + 정답과의 유사성과 생성된 SQL이 입력 설명을 올바르게 처리하는지 모두 고려하세요. + 0과 1 사이의 유사성 점수만 반환하고, 소수점 둘째 자리까지 반올림하세요(예: 0.75, 0.42, 1.00). + 설명이나 추가 텍스트를 포함하지 마세요. + """, + ) + ] + ) + + # LLM 체인 실행 + chain = prompt | llm + response = chain.invoke({}) + + try: + score = float(response.content.strip()) + return max(0, min(score, 1)) # 0~1 사이 값으로 정규화 + except: + return 0.0 # 오류 발생 시 0점 처리 diff --git a/llm_evaluation/mlflow_logger.py b/llm_evaluation/mlflow_logger.py new file mode 100644 index 0000000..c9f32fa --- /dev/null +++ b/llm_evaluation/mlflow_logger.py @@ -0,0 +1,21 @@ +import os +import importlib.metadata +import mlflow +from dotenv import load_dotenv + +load_dotenv() + + +def log_to_mlflow( + question, generated_sql, ground_truth_sql, llm_metric, evaluation_type=None +): + """활성화된 run 내에서 평가 결과 기록 + + llm_metric은 dict 형태로 기록되며, mlflow.log_param은 내부적으로 문자열로 저장됩니다. + """ + mlflow.log_param("question", question) + mlflow.log_param("generated_sql", generated_sql) + mlflow.log_param("ground_truth_sql", ground_truth_sql) + mlflow.log_param("llm_evaluation_metric", llm_metric) + if evaluation_type is not None: + mlflow.log_param("evaluation_type", evaluation_type) diff --git a/requirements.txt b/requirements.txt index 2c506a8..7b17b47 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,6 +8,7 @@ streamlit==1.41.1 python-dotenv==1.0.1 faiss-cpu==1.10.0 pre_commit==4.1.0 +mlflow==2.21.0 setuptools wheel twine diff --git a/setup.py b/setup.py index d5e4805..bbf59f4 100644 --- a/setup.py +++ b/setup.py @@ -24,6 +24,7 @@ "streamlit==1.41.1", "python-dotenv==1.0.1", "faiss-cpu==1.10.0", + "mlflow==2.21.0", ], entry_points={ "console_scripts": [