Commit c7aa9bd3 authored by kihoon.lee's avatar kihoon.lee
Browse files

백업

parent 29b84657
......@@ -13,7 +13,7 @@ python generator.py --model LDCC/Chat-Mistral-Nemo-12B-32k --gpu_devices 2 --mod
#### 2. 모델 평가 with OpenAI
```bash
python evaluator.py -o generated/LDCC/Chat-Mistral-Nemo-12B-32k -k sk-### -t 30
python evaluator.py -o generated/LDCC/Chat-Mistral-Nemo-12B-32k -k sk-### -t 30 -j gpt-4o
```
......
import logging
import argparse
import os
import pandas as pd
from templates import PROMPT_STRATEGY
# Use aphrodite-engine or vLLM
try:
from aphrodite import LLM, SamplingParams
......@@ -15,22 +14,30 @@ except ImportError:
print("- Using vLLM")
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
parser = argparse.ArgumentParser()
parser.add_argument("-g", "--gpu_devices", help=" : CUDA_VISIBLE_DEVICES", default="0")
parser.add_argument(
"-m",
"--model",
help=" : Model to evaluate",
default="yanolja/EEVE-Korean-Instruct-2.8B-v1.0",
help=" : write huggingface model name to evaluate",
default="LDCC/Chat-Mistral-Nemo-12B-32k",
)
parser.add_argument(
"-ml", "--model_len", help=" : Maximum Model Length", default=4096, type=int
)
parser.add_argument("-ml", "--model_len", help=" : Maximum Model Length", default=4096, type=int)
args = parser.parse_args()
print(f"Args - {args}")
logger.info(f"Args - {args}")
os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu_devices
gpu_counts = len(args.gpu_devices.split(","))
# LLM 초기화
logger.info(f"Initializing LLM with model: {args.model}")
llm = LLM(
model=args.model,
tensor_parallel_size=gpu_counts,
......@@ -38,27 +45,44 @@ llm = LLM(
gpu_memory_utilization=0.8,
trust_remote_code=True, # !
)
logger.info("LLM initialized successfully")
sampling_params = SamplingParams(
temperature=0,
skip_special_tokens=True,
max_tokens=args.model_len,
stop=["<|endoftext|>", "[INST]", "[/INST]", "<|im_end|>", "<|end|>", "<|eot_id|>", "<end_of_turn>", "<eos>"],
stop=[
"<|endoftext|>",
"[INST]",
"[/INST]",
"<|im_end|>",
"<|end|>",
"<|eot_id|>",
"<end_of_turn>",
"<eos>",
],
)
# llm 객체를 생성한 후에 다음 코드를 추가합니다
# chat_temlate가 없다면 default로 세팅하는 과정
tokenizer = llm.llm_engine.tokenizer.tokenizer
if tokenizer.chat_template is None:
logger.info("chat template가 없으므로 default로 설정")
default_chat_template = "{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"
tokenizer.chat_template = default_chat_template
df_questions = pd.read_json("questions.jsonl", orient="records", encoding="utf-8-sig", lines=True)
# 문제 로드
logger.info("Loading questions from questions.jsonl")
df_questions = pd.read_json(
"questions.jsonl", orient="records", encoding="utf-8-sig", lines=True
)
logger.info(f"Loaded {len(df_questions)} questions")
if not os.path.exists("./generated/" + args.model):
os.makedirs("./generated/" + args.model)
for strategy_name, prompts in PROMPT_STRATEGY.items():
logger.info(f"Processing strategy: {strategy_name}")
def format_single_turn_question(question):
return tokenizer.apply_chat_template(
......@@ -66,12 +90,17 @@ for strategy_name, prompts in PROMPT_STRATEGY.items():
tokenize=False,
add_generation_prompt=True,
)
single_turn_questions = df_questions["questions"].map(format_single_turn_question)
print(single_turn_questions.iloc[0])
# 단일 턴 질문 처리
logger.info("Generating single-turn outputs")
single_turn_outputs = [
output.outputs[0].text.strip() for output in llm.generate(single_turn_questions, sampling_params)
output.outputs[0].text.strip()
for output in llm.generate(single_turn_questions, sampling_params)
]
logger.info(f"Generated {len(single_turn_outputs)} single-turn outputs")
def format_double_turn_question(question, single_turn_output):
return tokenizer.apply_chat_template(
......@@ -86,12 +115,19 @@ for strategy_name, prompts in PROMPT_STRATEGY.items():
)
multi_turn_questions = df_questions[["questions", "id"]].apply(
lambda x: format_double_turn_question(x["questions"], single_turn_outputs[x["id"] - 1]),
lambda x: format_double_turn_question(
x["questions"], single_turn_outputs[x["id"] - 1]
),
axis=1,
)
# 멀티 턴 질문 처리
logger.info("Generating multi-turn outputs")
multi_turn_outputs = [
output.outputs[0].text.strip() for output in llm.generate(multi_turn_questions, sampling_params)
output.outputs[0].text.strip()
for output in llm.generate(multi_turn_questions, sampling_params)
]
logger.info(f"Generated {len(multi_turn_outputs)} multi-turn outputs")
df_output = pd.DataFrame(
{
......@@ -102,9 +138,16 @@ for strategy_name, prompts in PROMPT_STRATEGY.items():
"references": df_questions["references"],
}
)
# 결과 저장
output_file = f"./generated/{args.model}/{strategy_name}.jsonl"
logger.info(f"Saving results to {output_file}")
df_output.to_json(
"./generated/" + os.path.join(args.model, f"{strategy_name}.jsonl"),
output_file,
orient="records",
lines=True,
force_ascii=False,
)
logger.info(f"Results saved for strategy: {strategy_name}")
logger.info("Generation process completed")
import logging
import argparse
import os
import pandas as pd
from templates import LOTTE_PROMPT_STRATEGY
try:
from aphrodite import LLM, SamplingParams
print("- Using aphrodite-engine")
except ImportError:
from vllm import LLM, SamplingParams
print("- Using vLLM")
# 로깅 설정
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
parser = argparse.ArgumentParser()
parser.add_argument("-g", "--gpu_devices", help=" : CUDA_VISIBLE_DEVICES", default="0")
parser.add_argument(
"-m",
"--model",
help=" : write huggingface model name to evaluate",
default="LDCC/Chat-Mistral-Nemo-12B-32k",
)
parser.add_argument(
"-ml", "--model_len", help=" : Maximum Model Length", default=4096, type=int
)
args = parser.parse_args()
logger.info(f"Args - {args}")
os.environ["CUDA_VISIBLE_DEVICES"] = args.gpu_devices
gpu_counts = len(args.gpu_devices.split(","))
# LLM 초기화
logger.info(f"Initializing LLM with model: {args.model}")
llm = LLM(
model=args.model,
tensor_parallel_size=gpu_counts,
max_model_len=args.model_len,
gpu_memory_utilization=0.8,
trust_remote_code=True, # !
)
logger.info("LLM initialized successfully")
sampling_params = SamplingParams(
temperature=0,
skip_special_tokens=True,
max_tokens=args.model_len,
stop=[
"<|endoftext|>",
"[INST]",
"[/INST]",
"<|im_end|>",
"<|end|>",
"<|eot_id|>",
"<end_of_turn>",
"<eos>",
],
)
# chat_temlate가 없다면 default로 세팅하는 과정
tokenizer = llm.llm_engine.tokenizer.tokenizer
if tokenizer.chat_template is None:
logger.info("chat template가 없으므로 default로 설정")
default_chat_template = "{% for message in messages %}{{'<|im_start|>' + message['role'] + '\n' + message['content'] + '<|im_end|>\n'}}{% endfor %}{% if add_generation_prompt %}{{ '<|im_start|>assistant\n' }}{% endif %}"
tokenizer.chat_template = default_chat_template
# 문제 로드
logger.info("Loading questions from questions.jsonl")
df_questions = pd.read_json(
"questions.jsonl", orient="records", encoding="utf-8-sig", lines=True
)
logger.info(f"Loaded {len(df_questions)} questions")
if not os.path.exists("./generated/" + args.model):
os.makedirs("./generated/" + args.model)
logger.info("Processing LOTTE questions")
def format_lotte_question(row):
category = row['category']
question = row['questions'][0] # 첫 번째 질문만 사용
prompt = LOTTE_PROMPT_STRATEGY.get(category, "")
return tokenizer.apply_chat_template(
[
{"role": "system", "content": prompt},
{"role": "user", "content": question}
],
tokenize=False,
add_generation_prompt=True,
)
formatted_questions = df_questions.apply(format_lotte_question, axis=1)
logger.info("Generating LOTTE outputs")
lotte_outputs = [
output.outputs[0].text.strip()
for output in llm.generate(formatted_questions, sampling_params)
]
logger.info(f"Generated {len(lotte_outputs)} LOTTE outputs")
df_output = pd.DataFrame(
{
"id": df_questions["id"],
"category": df_questions["category"],
"questions": df_questions["questions"].apply(lambda x: x[0]), # 첫 번째 질문만 저장
"outputs": lotte_outputs,
"references": df_questions["references"].apply(lambda x: x[0] if x is not None else None), # 첫 번째 참조만 저장
}
)
# 결과 저장
output_file = f"./generated/{args.model}/lotte_single_turn.jsonl"
logger.info(f"Saving results to {output_file}")
df_output.to_json(
output_file,
orient="records",
lines=True,
force_ascii=False,
)
logger.info("LOTTE generation process completed")
{"id": 1, "category": "search_keyword", "questions": ["음 그렇다면 세입자가 먼저 확정일자 신고를 해서 전세자금 전체를 보호받고 있음에도 소액임차보증금을 변제하는건 이중변제 아닌가 싶은데 어떻게 생각해?"], "references": [null]}
{"id": 2, "category": "search_summary", "questions": ["## 검색 결과 :\n- 1.위험현장 사전 예측해 사고 예방…내년 1월 전면 시행 <b>서울</b>시가 전국 최초로 공공 공사장 <b>안전</b>수준을 파악해 사고를 예측하고 재해를 방지하는 '<b>안전지수제</b>'를 도입한다고 19일 밝혔다. 올해 연말까지 제도를 시범...\n - 2. <b>서울</b>시는 공공 공사장에서 발생할 수 있는 <b>안전</b>사고를 예방하기 위해서 전국 최초로 ‘<b>안전지수제</b>’를 도입한다고 19일 밝혔다. ‘<b>안전지수제</b>’는 <b>안전</b>학회, 전문가, 실무자가 2만5000건의 주요 재해 사고원인을 분석하여... \n- 3. 안전지수 평가점수가 3개월 연속 ‘매우 미흡’ 등급으로 평가되는 공사 현장은 안전 개선 의지가 없는 것으로 판단해 특별안전점검과 부실벌점 부과, 고용노동부에 과태료 부과를 의뢰한다. 2년간 서울시(도시기반시설본부)에서 발주하는 공사 입찰에 불이익을 줄 예정이다. 또 평가점수가 40점 미만의 공사장은 안전사고 위험이 크다고 판단해 즉시 공사를 중단한다.\n\n## 질문 : 서울시에서 안전지수제를 한다고하는데 이게 뭐야?"], "references": [null]}
{"id": 3, "category": "review_summary", "questions": ["리뷰 요약 문제입니다."], "references": [null]}
{"id": 4, "category": "meeting_summary", "questions": ["회의 요약 문제입니다."], "references": [null]}
{"id": 5, "category": "task_assistant_mail_meeting", "questions": ["회의 요청 메일 작성 문제입니다."], "references": [null]}
{"id": 6, "category": "task_assistant_mail_share", "questions": ["회의록 전달 메일 작성 문제입니다."], "references": [null]}
{"id": 7, "category": "task_assistant_mail_pr", "questions": ["홍보 메일 작성 문제입니다."], "references": [null]}
{"id": 8, "category": "task_assistant_mail_introduce", "questions": ["기업 소개 메일 작성 문제입니다."], "references": [null]}
{"id": 9, "category": "task_assistant_hire", "questions": ["조직 개요 작성 문제입니다."], "references": [null]}
{"id": 10, "category": "text2sql", "questions": ["SQL 생성 문제입니다."], "references": [null]}
{"id": 11, "category": "lotte_qa", "questions": ["롯데 QA 문제입니다."], "references": [null]}
{"id": 12, "category": "mrc", "questions": ["MRC 문제입니다."], "references": [null]}
......@@ -39,4 +39,4 @@
{"id": 39, "category": "문법(Grammar)", "questions": ["문장성분의 호응을 고려할 때 적절한 조사로 바꿔봐.\n\n나는 빠른 자동차을 보았다.", "위 문장을 안은문장과 안긴문장으로 나눠봐."], "references": ["나는 빠른 자동차를 보았다.", "안은문장 - 나는 보았다.\n안긴문장 - 자동차"]}
{"id": 40, "category": "문법(Grammar)", "questions": ["제26항 한자어에서, 'ㄹ' 받침 뒤에 연결되는 'ㄷ, ㅅ, ㅈ'은 된소리로 발음한다.\n제28항 표기상으로는 사이시옷이 없더라도, 관형격 기능을 지니는 사이시옷이 있어야 할(휴지가 성립되는) 합성어의 경우에는, 뒤 단어의 첫소리 'ㄱ, ㄷ, ㅂ, ㅅ, ㅈ'을 된소리로 발음한다.\n위을 참고할 때 다음 문장 중 넷과 다른 하나는?\n- [길가]에 개나리가 만개했다.에서 '길가'\n- 너희들이 그 모양이니 [발전]이 없는 거야. 에서 '발전'\n- [발바닥]에 땀이 나도록 뛰었다. 에서 '발바닥'\n- [초승달]이 뜬 저녁, 매화가 흐트러졌다. 에서 '초승달'\n- 민수는 [손재주]가 좋아 무엇이든 잘 만든다. 에서 '손재주'", "한국어 어휘에서 한자어, 고유어 중에서 무엇이 더 많이 존재하나?"], "references": ["너희들이 그 모양이니 [발전]이 없는 거야. 에서 '발전'", "한자어"]}
{"id": 41, "category": "문법(Grammar)", "questions": ["한국어에서는 비음이 아닌 ㄱ, ㄷ, ㅂ이 비음의 영향으로 ㅇ, ㄴ, ㅁ 으로 발음되는 현상이 있다. 이때 '쫓는'의 발음은 무엇인가?", "이러한 현상을 비음화라고 한다. 그렇다면 칼날이 [칼랄]로 발음되는 현상의 이름은 무엇일까?"], "references": ["쫀는", "유음화"]}
{"id": 42, "category": "문법(Grammar)", "questions": ["나는어제친구와김치찌개를먹었다.\n\n이 문장을 올바르게 띄어 써보아라.", "아래 문장의 높임 표현을 올바르게 수정보아라.\n\n할머니가 밥을 먹는다."], "references": ["나는 어제 친구와 김치찌개를 먹었다.", "할머니께서 진지를 잡수신다."]}
{"id": 42, "category": "문법(Grammar)", "questions": ["나는어제친구와김치찌개를먹었다.\n\n이 문장을 올바르게 띄어 써보아라.", "아래 문장의 높임 표현을 올바르게 수정보아라.\n\n할머니가 밥을 먹는다."], "references": ["나는 어제 친구와 김치찌개를 먹었다.", "할머니께서 진지를 잡수신다."]}
\ No newline at end of file
......@@ -95,6 +95,22 @@ git merge feature
"default": [],
}
LOTTE_PROMPT_STRATEGY={
"search_keyword":"인터넷 검색을 위한 키워드 생성해줘",
"search_summary":"다음 검색 결과를 바탕으로 사용자의 질문에 대답하세요. 검색 결과에 질문에 대한 정보가 없으면 관련 내용을 찾지 못했다고 답변하고 만약, 자체적으로 답변이 가능한 질문이면 답변하세요.",
"review_summary":"다음 상품 리뷰를 요약하시오. 요약 시 상품명이 반드시 들어가야 합니다. 부정적인 내용은 요약에 포함시키면 안됩니다.",
"meeting_summary":"다음 대화 스크립트를 핵심 내용만 남도록 요약하세요. 만약 대화 스크립트 내용이 없다면, 내용이 없다고 답하세요. 요약문 형식은 다음 형식을 꼭 따라야 합니다.\n#### [제목]\n- [요약문]\n- [요약문]\n제목 맨 앞에는 적절한 이모지를 꼭 넣어주세요.",
"task_assistant_mail_meeting":"아래 내용으로 회의를 요청하는 메일을 작성해줘.",
"task_assistant_mail_share":"아래 내용을 바탕으로 회의록을 전달하는 이메일을 작성해주세요. 이메일에는 회의록 내용을 포함 시켜 정확하고 명확한 정보 전달이 이루어지도록 해주세요.",
"task_assistant_mail_pr":"아래 사항을 반영하여 홍보 메일을 작성해주세요.",
"task_assistant_mail_introduce":"아래 내용을 바탕으로 정중하고 전문적인 어투로 기업을 소개하는 메일을 작성해 주세요. 웹사이트 주소가 있다면 웹사이트 주소를 포함해 주세요.",
"task_assistant_hire":"아래 세부 정보를 활용하여 조직의 매력적인 개요를 작성하십시오. 팀의 독특한 강점, 주요 프로젝트 및 주목할 만한 성취를 강조하고, 지정된 키워드에 대한 팀의 전문성이 그들의 책임과 프로젝트에서 어떻게 성공에 기여하는지를 강조합니다. 소개문은 설득력 있고, 팀의 정체성, 사명, 및 영향력에 대한 명확한 스냅샷을 제공해야 합니다.",
"text2sql":"DB 스키마 및 예시를 고려하여 질문에 적합한 SQL문을 단계별로 생각해가며 생성합니다. 답변은 조건을 반드시 만족해야 합니다.",
"lotte_qa":"",
"mrc":"다음 문서를 근거로 들면서 질문에 자세히 답변하세요. 문서 안에 질문에 대한 내용이 없으면 관련 내용을 찾을 수 없다고 답하세요.",
}
JUDGE_TEMPLATE = {
"single_turn": """너는 질문에 대한 한국어 언어 모델의 답변을 매우 꼼꼼히 평가할 것이다. 공정한 평가를 위해 아래의 규칙을 준수한다.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment