CoolFace
Modelpublic

filot/kanana-1.5-8b-instruct-2505-rag

sourceHugging Faceapache-2.0updated 1y agoView on Hugging Face
1likes10downloads
Model Card

개요

  • —과제명 : [[2025]한국어 어문 규범 기반 생성(RAG) 말평(가 유형)](https://kli.korean.go.kr/benchmark/taskOrdtm/taskList.do?taskOrdtmId=182)
  • —팀명 : filot

학습 데이터

  • —koreanlanguageragV1.0train.json
  • —koreanlanguageragV1.0dev.json
  • —국어 지식 기반 생성(RAG) 참조 문서.txt(pdf -> txt)

실행방법

  • —vllm 설치
  • —설치 후 아래 명령어로 모델 서빙

<pre> vllm serve filot/kanana-1.5-8b-instruct-2505-rag \ --port 8000 \ --enable-prefix-caching \ --enable-chunked-prefill \ --gpu-memory-utilization 0.95 \ --seed 42 \ --max-model-len 32K </pre>

  • —아래 코드를 수행

<pre> import json import requests

from tqdm import tqdm

testfile = "../dataset/koreanlanguageragV1.0_test.json" headers = {"Content-type": "application/json"}

SYSTEM_PROMPT = """---역할--- 당신은 띄어쓰기, 문장부호, 외래어 표기법, 한글 맞춤법, 표준어 규정 전문가입니다.

---목표--- 지식 기반(Knowledge Base)을 기반으로 간결한 응답을 생성하되, 현재 사용자의 질문을 고려하여 응답하세요.

---지식 그래프 및 문서 조각(Knowledge Graph and Document Chunks)--- {context_data}

---응답 규칙---

  • —한줄로만 답변을 하세요.
  • —사용자 질문의 언어에 맞춰서 응답하세요.
  • —정답을 모를 경우에는 모른다고 하세요.
  • —지식 그래프 및 문서 조각(Knowledge Graph and Document Chunks)만을 참조하여 답변하세요.
  • —당신이 알고 있는 한국어 띄어쓰기, 문장부호, 외래어 표기법, 한글 맞춤법, 표준어 규정만 활용하세요. {user_prompt}

Response:"""

def makeaddtionaluserformat(input): # question type별 instruction 정의 typeinstructions = { "교정형": ( "- [질문]을 잘 읽고 답변을 생성하시오.\n" "[지침]\n" "1. 문제를 그대로 출력하지 마시오.\n" "2. 질문에 문장 부호가 괄호( )인 경우, 알맞은 문장 부호를 작성하세요.\n" '3. 주어진 문장이 올바른지 판단하고, 틀린 경우 올바르게 교정하여 "~가 옳다." 형태로 답변하고, 그 이유를 300자 이내로 설명하시오.\n\n' "[예시#1]\n" '질문: 다음 문장에서 어문 규범에 부합하지 않는 부분을 찾아 고치고, 그 이유를 설명하세요.\n"오늘은 퍼즐 마추기를 해 볼 거예요."\n' "답변: \"오늘은 퍼즐 맞추기를 해 볼 거예요.\"가 옳다. '제자리에 맞게 붙이다, 주문하다, 똑바르게 하다, 비교하다' 등의 뜻이 있는 말은 '마추다'가 아닌 '맞추다'로 적는다.\n\n" "[예시#2]\n" '질문: 다음 문장에서 어문 규범에 부합하지 않는 부분을 찾아 고치고, 그 이유를 설명하세요."마지막 후예자인 웅카스 역시 다른 원주민 부족인 마구아에게 죽임을 당한 모습이예요."\n' "답변: \"마지막 후예자인 웅카스 역시 다른 원주민 부족인 마구아에게 죽임을 당한 모습이에요.\"가 옳다. '-에요'는 '이다'나 '아니다'의 어간 뒤에 붙는 어미로, '이다'에 '-에요'가 결합하면 '이에요'가 된다. '이에요'는 앞말에 받침이 없을 때 '예요'로 줄여 쓴다. 따라서 '모습'에 '이에요'가 붙는 경우 '모습이에요'라고 써야 한다." ), "선택형": ( "- [질문]을 잘 읽고 답변을 생성하시오\n" "[지침]\n" "1. 문제를 그대로 출력하지 마시오.\n" "2. 중괄호(""{}"")인 경우, 어문규범(맞춤법, 표준어 규정, 띄어쓰기, 문장 부호, 외래어 표기법)에 기반하여 선택하세요.\n" '3. 주어진 보기들 중에서 가장 적절한 것을 선택하여 "~가 옳다." 형태로 답변하고, 그 이유를 300자 이내로 설명하시오.\n\n' "[예시#1]\n" '질문: "나는 그를 본 적이 있음을 {기억해냈다/기억해 냈다}." 가운데 올바른 것을 선택하고, 그 이유를 설명하세요.\n' "답변: \"나는 그를 본 적이 있음을 기억해 냈다.\"가 옳다. '기억해 냈다'는 '기억하-+-아+냈다'의 구성이다. 이처럼 '본용언+-아/-어+보조 용언' 구성인 경우 본용언과 보조 용언을 붙여 쓰는 것이 허용되지만, 이러한 구성을 갖더라도 앞말이 3음절 이상의 합성어나 파생어라면 보조 용언을 붙여 쓰는 것이 허용되지 않는다. '기억하다'는 '기억'과 '-하다'가 결합한 파생어이며 '기억해'는 3음절이다. 따라서 '기억해'와 '냈다'는 띄어 써야 한다.\n\n" "[예시#2]\n" '질문: "{덤핑/둠핑} " 가운데 올바른 것을 선택하고, 그 이유를 설명하세요."\n' "답변: \"덤핑\"이 옳다. 덤핑(dumping)의 원어 발음은 [ˈdʌmpɪŋ]으로 [ʌ]는 '어'로 표기한다. 따라서 '덤핑'이 옳다." ), }

# question type에 따른 instruction 선택 instruction = typeinstructions.get(input["questiontype"], "")

return instruction

with open(testfile, "r") as reader, requests.Session() as session: testdata = json.load(reader)

for idx, data in tqdm(enumerate(testdata), total=len(testdata)): query = data["input"]["question"].strip() systemprompt = SYSTEMPROMPT.format( contextdata="RAG로 검색된 chunks", userprompt=makeaddtionaluser_format(data["input"]), )

data = { "messages": [ {"role": "system", "content": systemprompt}, {"role": "user", "content": query}, ], "model": "filot/kanana-1.5-8b-instruct-2505-rag", "presencepenalty": 0.2, "frequencypenalty": 0.2, "repetitionpenalty": 1.0, "temperature": 0.0, "top_p": 1.0, "seed": 42, }

response = session.post( "http://localhost:8000/v1/chat/completions", headers=headers, data=json.dumps(data), )

answer = response.json()["choices"][0]["message"]["content"].strip() test_data[idx]["output"] = {"answer": answer}

for idx, data in tqdm(enumerate(testdata), total=len(testdata)): test_data[idx]["output"]["answer"] = data["output"]["answer"].strip() </pre>