Skip to content

Commit 6038788

Browse files
committed
feat: 질문 생성 기능 및 유틸리티 함수 추가
1 parent 201a6c7 commit 6038788

File tree

7 files changed

+232
-0
lines changed

7 files changed

+232
-0
lines changed

data/questions/0.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"questions": [
3+
"이 데이터베이스에서 가장 최근에 등록된 고객 정보는 무엇인가요? ",
4+
"특정 날짜 범위 내의 주문 내역을 어떻게 조회하나요? ",
5+
"제품별 판매량을 내림차순으로 정렬하는 SQL 쿼리를 알려주세요. ",
6+
"고객의 이름과 연락처 정보를 한 번에 조회하는 방법은 무엇인가요? ",
7+
"주문 상태가 '배송완료'인 주문 건수는 몇 건인가요? ",
8+
"특정 고객의 구매 이력을 어떻게 분석할 수 있나요? ",
9+
"매출액이 높은 상위 10개 상품을 찾는 SQL 쿼리를 보여주세요. ",
10+
"날짜별 매출 추이를 그래프로 나타내려면 어떤 쿼리를 사용해야 하나요? ",
11+
"재고가 10개 이하인 상품 목록을 조회하는 방법은 무엇인가요? ",
12+
"고객 테이블과 주문 테이블을 조인하는 SQL 쿼리를 알려주세요."
13+
],
14+
"questions_md": "- 이 데이터베이스에서 가장 최근에 등록된 고객 정보는 무엇인가요? \n- 특정 날짜 범위 내의 주문 내역을 어떻게 조회하나요? \n- 제품별 판매량을 내림차순으로 정렬하는 SQL 쿼리를 알려주세요. \n- 고객의 이름과 연락처 정보를 한 번에 조회하는 방법은 무엇인가요? \n- 주문 상태가 '배송완료'인 주문 건수는 몇 건인가요? \n- 특정 고객의 구매 이력을 어떻게 분석할 수 있나요? \n- 매출액이 높은 상위 10개 상품을 찾는 SQL 쿼리를 보여주세요. \n- 날짜별 매출 추이를 그래프로 나타내려면 어떤 쿼리를 사용해야 하나요? \n- 재고가 10개 이하인 상품 목록을 조회하는 방법은 무엇인가요? \n- 고객 테이블과 주문 테이블을 조인하는 SQL 쿼리를 알려주세요.",
15+
"persona": {
16+
"name": "김민수",
17+
"department": "영업팀",
18+
"role": "영업 관리자",
19+
"background": "다양한 고객 데이터를 분석하여 매출 증대를 위한 전략 수립 경험이 풍부함."
20+
}
21+
}

data/questions/1.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"questions": [
3+
"이 테이블에서 특정 날짜 이후의 모든 데이터를 조회하는 SQL 쿼리를 어떻게 작성하나요? ",
4+
"고객 이름과 주문 금액만 선택하는 SQL 문을 만들어 주세요. ",
5+
"주문 테이블에서 주문 상태가 '완료'인 데이터만 필터링하는 방법은 무엇인가요? ",
6+
"특정 고객의 주문 내역을 검색하는 SQL 쿼리를 알려 주세요. ",
7+
"상품별 평균 가격을 계산하는 SQL 쿼리를 어떻게 작성하나요? ",
8+
"데이터베이스에서 중복된 레코드를 제거하는 SQL 문은 무엇인가요? ",
9+
"날짜별 주문 건수를 집계하는 SQL 쿼리를 만들어 주세요. ",
10+
"특정 조건에 맞는 데이터를 업데이트하는 SQL 문을 알려 주세요. ",
11+
"고객 테이블에서 이메일 주소가 비어 있지 않은 레코드만 선택하는 방법은 무엇인가요? ",
12+
"여러 테이블을 조인하여 고객 이름과 주문 내역을 함께 조회하는 SQL 쿼리를 작성해 주세요."
13+
],
14+
"questions_md": "- 이 테이블에서 특정 날짜 이후의 모든 데이터를 조회하는 SQL 쿼리를 어떻게 작성하나요? \n- 고객 이름과 주문 금액만 선택하는 SQL 문을 만들어 주세요. \n- 주문 테이블에서 주문 상태가 '완료'인 데이터만 필터링하는 방법은 무엇인가요? \n- 특정 고객의 주문 내역을 검색하는 SQL 쿼리를 알려 주세요. \n- 상품별 평균 가격을 계산하는 SQL 쿼리를 어떻게 작성하나요? \n- 데이터베이스에서 중복된 레코드를 제거하는 SQL 문은 무엇인가요? \n- 날짜별 주문 건수를 집계하는 SQL 쿼리를 만들어 주세요. \n- 특정 조건에 맞는 데이터를 업데이트하는 SQL 문을 알려 주세요. \n- 고객 테이블에서 이메일 주소가 비어 있지 않은 레코드만 선택하는 방법은 무엇인가요? \n- 여러 테이블을 조인하여 고객 이름과 주문 내역을 함께 조회하는 SQL 쿼리를 작성해 주세요.",
15+
"persona": {
16+
"name": "이수진",
17+
"department": "인사팀",
18+
"role": "인사 담당자",
19+
"background": "직원 정보와 인사 기록을 관리하며, 인사 정책에 대한 데이터 기반 의사결정을 수행함."
20+
}
21+
}

data/questions/2.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"questions": [
3+
"이 데이터베이스에서 가장 최근에 등록된 고객 정보는 무엇인가요? ",
4+
"특정 날짜 범위 내의 주문 내역을 어떻게 조회하나요? ",
5+
"제품별 판매량을 내림차순으로 정렬하는 SQL 쿼리를 알려주세요. ",
6+
"고객의 이름과 연락처 정보를 한 번에 조회하는 방법은 무엇인가요? ",
7+
"주문 상태가 '배송완료'인 주문 건수는 몇 건인가요? ",
8+
"특정 고객의 구매 이력을 어떻게 분석할 수 있나요? ",
9+
"매출액이 높은 상위 10개 상품을 찾는 SQL 쿼리를 보여주세요. ",
10+
"날짜별 매출 추이를 그래프로 나타내려면 어떤 쿼리를 사용해야 하나요? ",
11+
"재고가 10개 이하인 상품 목록을 조회하는 방법은 무엇인가요? ",
12+
"고객 테이블과 주문 테이블을 조인하는 SQL 쿼리를 알려주세요."
13+
],
14+
"questions_md": "- 이 데이터베이스에서 가장 최근에 등록된 고객 정보는 무엇인가요? \n- 특정 날짜 범위 내의 주문 내역을 어떻게 조회하나요? \n- 제품별 판매량을 내림차순으로 정렬하는 SQL 쿼리를 알려주세요. \n- 고객의 이름과 연락처 정보를 한 번에 조회하는 방법은 무엇인가요? \n- 주문 상태가 '배송완료'인 주문 건수는 몇 건인가요? \n- 특정 고객의 구매 이력을 어떻게 분석할 수 있나요? \n- 매출액이 높은 상위 10개 상품을 찾는 SQL 쿼리를 보여주세요. \n- 날짜별 매출 추이를 그래프로 나타내려면 어떤 쿼리를 사용해야 하나요? \n- 재고가 10개 이하인 상품 목록을 조회하는 방법은 무엇인가요? \n- 고객 테이블과 주문 테이블을 조인하는 SQL 쿼리를 알려주세요.",
15+
"persona": {
16+
"name": "박지훈",
17+
"department": "마케팅팀",
18+
"role": "마케팅 분석가",
19+
"background": "시장 트렌드와 고객 행동 데이터를 분석하여 마케팅 캠페인 최적화에 기여함."
20+
}
21+
}

data/questions/3.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"questions": [
3+
"이 테이블에서 특정 날짜 이후의 모든 데이터를 조회하는 SQL 쿼리를 어떻게 작성하나요? ",
4+
"고객 이름과 주문 금액만 선택하는 SQL 문을 만들어 주세요. ",
5+
"주문 테이블에서 주문 상태가 '완료'인 데이터만 필터링하는 방법은 무엇인가요? ",
6+
"특정 고객의 주문 내역을 검색하는 SQL 쿼리를 알려 주세요. ",
7+
"상품별 평균 가격을 계산하는 SQL 쿼리를 어떻게 작성하나요? ",
8+
"데이터베이스에서 중복된 레코드를 제거하는 SQL 문은 무엇인가요? ",
9+
"날짜별 주문 건수를 집계하는 SQL 쿼리를 만들어 주세요. ",
10+
"특정 조건에 맞는 데이터를 업데이트하는 SQL 문을 알려 주세요. ",
11+
"고객 테이블에서 이메일 주소가 비어 있지 않은 레코드만 선택하는 방법은 무엇인가요? ",
12+
"여러 테이블을 조인하여 고객 이름과 주문 내역을 함께 조회하는 SQL 쿼리를 작성해 주세요."
13+
],
14+
"questions_md": "- 이 테이블에서 특정 날짜 이후의 모든 데이터를 조회하는 SQL 쿼리를 어떻게 작성하나요? \n- 고객 이름과 주문 금액만 선택하는 SQL 문을 만들어 주세요. \n- 주문 테이블에서 주문 상태가 '완료'인 데이터만 필터링하는 방법은 무엇인가요? \n- 특정 고객의 주문 내역을 검색하는 SQL 쿼리를 알려 주세요. \n- 상품별 평균 가격을 계산하는 SQL 쿼리를 어떻게 작성하나요? \n- 데이터베이스에서 중복된 레코드를 제거하는 SQL 문은 무엇인가요? \n- 날짜별 주문 건수를 집계하는 SQL 쿼리를 만들어 주세요. \n- 특정 조건에 맞는 데이터를 업데이트하는 SQL 문을 알려 주세요. \n- 고객 테이블에서 이메일 주소가 비어 있지 않은 레코드만 선택하는 방법은 무엇인가요? \n- 여러 테이블을 조인하여 고객 이름과 주문 내역을 함께 조회하는 SQL 쿼리를 작성해 주세요.",
15+
"persona": {
16+
"name": "최영희",
17+
"department": "재무팀",
18+
"role": "재무 분석가",
19+
"background": "재무 데이터와 보고서를 분석하여 회사의 재무 상태를 모니터링하고 보고함."
20+
}
21+
}

data/questions/4.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
{
2+
"questions": [
3+
"이 테이블에서 특정 날짜 이후의 모든 데이터를 조회하는 SQL 쿼리를 어떻게 작성하나요? ",
4+
"고객 이름과 주문 금액만 선택하는 SQL 문을 만들어 주세요. ",
5+
"주문 테이블에서 주문 상태가 '완료'인 데이터만 필터링하는 방법은 무엇인가요? ",
6+
"특정 고객의 주문 내역을 검색하는 SQL 쿼리를 알려 주세요. ",
7+
"상품별 평균 가격을 계산하는 SQL 쿼리를 어떻게 작성하나요? ",
8+
"데이터베이스에서 중복된 레코드를 제거하는 SQL 문은 무엇인가요? ",
9+
"날짜별 주문 건수를 집계하는 SQL 쿼리를 만들어 주세요. ",
10+
"특정 조건에 맞는 데이터를 업데이트하는 SQL 문을 알려 주세요. ",
11+
"고객 테이블에서 이메일 주소가 비어 있지 않은 레코드만 선택하는 방법은 무엇인가요? ",
12+
"여러 테이블을 조인하여 고객 이름과 주문 내역을 함께 조회하는 SQL 쿼리를 작성해 주세요."
13+
],
14+
"questions_md": "- 이 테이블에서 특정 날짜 이후의 모든 데이터를 조회하는 SQL 쿼리를 어떻게 작성하나요? \n- 고객 이름과 주문 금액만 선택하는 SQL 문을 만들어 주세요. \n- 주문 테이블에서 주문 상태가 '완료'인 데이터만 필터링하는 방법은 무엇인가요? \n- 특정 고객의 주문 내역을 검색하는 SQL 쿼리를 알려 주세요. \n- 상품별 평균 가격을 계산하는 SQL 쿼리를 어떻게 작성하나요? \n- 데이터베이스에서 중복된 레코드를 제거하는 SQL 문은 무엇인가요? \n- 날짜별 주문 건수를 집계하는 SQL 쿼리를 만들어 주세요. \n- 특정 조건에 맞는 데이터를 업데이트하는 SQL 문을 알려 주세요. \n- 고객 테이블에서 이메일 주소가 비어 있지 않은 레코드만 선택하는 방법은 무엇인가요? \n- 여러 테이블을 조인하여 고객 이름과 주문 내역을 함께 조회하는 SQL 쿼리를 작성해 주세요.",
15+
"persona": {
16+
"name": "장민호",
17+
"department": "IT팀",
18+
"role": "데이터베이스 관리자",
19+
"background": "데이터베이스 설계와 유지보수 경험이 있으며, 데이터의 무결성과 보안을 책임지고 있음."
20+
}
21+
}

evaluation/gen_question.py

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
from utils import load_persona_json, save_question_json
2+
from langchain_core.prompts import ChatPromptTemplate
3+
from langchain_openai.chat_models import ChatOpenAI
4+
from tqdm import tqdm
5+
6+
from argparse import ArgumentParser
7+
import os
8+
9+
10+
def get_persona_prompt(persona):
11+
return f"""
12+
Name: {persona.name}
13+
Department: {persona.department}
14+
Role: {persona.role}
15+
Background: {persona.background}
16+
"""
17+
18+
19+
def split_question(question):
20+
question = question.content
21+
# remove -
22+
question = question.replace("- ", "")
23+
return question.split("\n")
24+
25+
26+
def gen_question(persona):
27+
llm = llm = ChatOpenAI(model="gpt-4.1-nano", temperature=0)
28+
prompt = get_persona_prompt(persona)
29+
system_prompt = """당신은 <persona> 에 해당하는 사람이며 Text2SQL 서비스를 사용하고 있다. 궁금한 질문들을 아래 <format> 에 해당하는 형식으로 질문하라 질문은 다양하게 생성하라
30+
31+
<persona>
32+
{persona_prompt}
33+
</persona>
34+
35+
<format>
36+
- 질문 1
37+
- 질문 2
38+
- 질문 3
39+
...
40+
- 질문 n
41+
</format>
42+
"""
43+
prompt = ChatPromptTemplate.from_messages(
44+
[
45+
("system", system_prompt),
46+
]
47+
)
48+
49+
chain = prompt | llm
50+
result = {}
51+
52+
question = chain.invoke({"persona_prompt": prompt})
53+
result["questions"] = split_question(question)
54+
result["questions_md"] = question.content
55+
result["persona"] = persona
56+
return result
57+
58+
59+
def main(persona_path, output_dir):
60+
personas = load_persona_json(persona_path)
61+
for i, persona in tqdm(enumerate(personas.personas)):
62+
result = gen_question(persona)
63+
file_path = os.path.join(output_dir, f"{i}.json")
64+
save_question_json(result, file_path)
65+
66+
67+
if __name__ == "__main__":
68+
parser = ArgumentParser()
69+
parser.add_argument("--persona_path", type=str, default="data/personas.json")
70+
parser.add_argument("--output_dir", type=str, default="data/questions")
71+
args = parser.parse_args()
72+
main(args.persona_path, args.output_dir)

evaluation/utils.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import json
2+
from persona_class import PersonaList
3+
from glob import glob
4+
import os
5+
6+
7+
def save_persona_json(data, filepath):
8+
dir_path = os.path.dirname(filepath)
9+
if not os.path.exists(dir_path):
10+
os.makedirs(dir_path)
11+
with open(filepath, "w", encoding="utf-8") as f:
12+
json.dump(data.model_dump(), f, ensure_ascii=False, indent=4)
13+
14+
15+
def load_persona_json(filepath):
16+
with open(filepath, "r", encoding="utf-8") as f:
17+
return PersonaList(**json.load(f))
18+
19+
20+
def save_question_json(data, filepath):
21+
dir_path = os.path.dirname(filepath)
22+
if not os.path.exists(dir_path):
23+
os.makedirs(dir_path)
24+
data["persona"] = (
25+
data["persona"].model_dump()
26+
if hasattr(data["persona"], "model_dump")
27+
else data["persona"].__dict__
28+
)
29+
with open(filepath, "w", encoding="utf-8") as f:
30+
json.dump(data, f, ensure_ascii=False, indent=4)
31+
32+
33+
def load_question_json(dir_path):
34+
restult_path = glob(f"{dir_path}/*.json")
35+
results = []
36+
for path in restult_path:
37+
with open(path, "r") as f:
38+
results.append(json.load(f))
39+
return results
40+
41+
42+
def save_answer_json(data, filepath, index):
43+
if not os.path.exists(filepath):
44+
os.makedirs(filepath)
45+
with open(f"{filepath}/eval_result_{index}.json", "w", encoding="utf-8") as f:
46+
json.dump(data, f, indent=4, ensure_ascii=False)
47+
48+
49+
def pretty_print_persona(persona):
50+
return f"""
51+
Name: {persona.name}
52+
Department: {persona.department}
53+
Role: {persona.role}
54+
Background: {persona.background}
55+
"""

0 commit comments

Comments
 (0)