kanana-ko-rag / README.md
sooh098's picture
Update README.md
e81606f verified
|
Raw
History Blame Contribute Delete
7.73 kB
---
license: apache-2.0
language:
- ko
tags:
- korean
- kanana
- grammar-correction
- 국립국어원
- 말평
base_model:
- kakaocorp/kanana-1.5-2.1b-instruct-2505
pipeline_tag: text-generation
library_name: transformers
---
# 🏛️ 과제 개요
본 모델은 **국립국어원 ‘AI 말평 경진대회’**의 「2025 한국어 어문 규범 기반 생성 (RAG) (가 유형)」 과제를 위해 개발되었습니다.
해당 과제는 한국어 어문 규범 관련 질문에 대해 정답과 그 이유를 문장으로 생성하는 모델을 요구하며, **RAG 기반 문서 활용이 핵심 요소**입니다.
> **🧑‍💻 팀명: 다마고치**
---
# 🔤 Korean Language RAG Model (한국어 어문 규범 QA)
본 모델은 위 과제 수행을 위해 설계된 RAG 기반 한국어 QA 모델입니다.
어문 규범 정보를 효과적으로 검색 및 활용하기 위해서는 규범 문서 검색기(Retriever)와 생성형 언어 모델(LLM)을 조합해야 합니다.
---
## 📌 모델 개요
- **베이스 모델**: `kakaocorp/kanana-1.5-2.1b-instruct-2505`
- **파인튜닝 방식**: Full fine-tuning "[아홀로틀 사용](https://github.com/axolotl-ai-cloud/axolotl)"
- **사용 목적**: 한국어 어문 규범 기반의 QA 태스크 (교정형, 선택형)
- **RAG 구성**: 규범 규칙 DB 기반 검색기(ChromaDB) + LLM 생성기
---
## 🧪 모델 사용 예시
```python
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_path = "sooh098/kanana-ko-rag"
tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_path, trust_remote_code=True).eval()
instruction = """당신은 한국어 어문 규범(맞춤법, 띄어쓰기, 표준어, 문장부호, 외래어 표기법 등)에 따라 문장에서 올바른 표현을 선택하고 그 이유를 설명하는 AI입니다.
- 틀린 표현을 정확히 찾아 수정하되, 그 외 표현은 변경하지 마십시오.
- 답변은 반드시 다음 형식을 따라야 합니다:
"{수정문}이 옳다. {이유}"
[예시]
문제: 다음 문장에서 어문 규범에 부합하지 않는 부분을 찾아 고치고, 그렇게 고친 이유를 설명하세요.
"어서 쾌차하시길 바래요."
정답: "어서 쾌차하시길 바라요."가 옳다. 동사 '바라다'에 어미 '-아요'가 결합한 형태이므로 '바라요'로 써야 한다. '바래요'는 비표준어다."""
question = "\"나는 그를 본 적이 있음을 {기억해냈다/기억해 냈다}.\" 가운데 올바른 것을 선택하고, 그 이유를 설명하세요."
# 참고 규범을 추가할 경우 프롬프트 형식은 다음과 같이 변경됩니다.
# input_text = f"[참고 규범]\n{retrieved_rules}\n=====\n문제: {question}\n정답:"
prompt = (
"<|begin_of_text|>\n"
f"[|system|]{instruction}<|eot_id|>\n"
f"[|user|]문제: {question}\n정답:<|eot_id|>\n"
"[|assistant|]"
)
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
inputs.pop("token_type_ids", None)
with torch.no_grad():
outputs = model.generate(
**inputs,
max_new_tokens=256,
do_sample=False,
eos_token_id=tokenizer.eos_token_id,
pad_token_id=tokenizer.pad_token_id
)
result = tokenizer.decode(outputs[0][inputs.input_ids.shape[1]:], skip_special_tokens=True)
print(result)
```
---
## 🔎 RAG 활용 방식
**본 과제에서는** 정답 생성 시 어문 규범 정보를 효과적으로 반영하기 위해 사전에 구축된 **규범 문서 DB**에서 관련 규범을 검색하고 이를 LLM 입력에 포함하는 **RAG(Retrieval-Augmented Generation)** 방식을 사용하였습니다.
- 검색에는 **dense retrieval 방식**을 적용하였고,
- 한국어 전용 임베딩 모델과 **ChromaDB 기반의 규범 문서 벡터 DB**를 결합하여 구현하였습니다.
---
### ✅ 규범 검색 방식
```python
def retrieve_context(query_text, top_k=3):
query_vec = embed_query(query_text)
results = collection.query(query_embeddings=[query_vec], n_results=top_k * 4)
seen_rules = set()
contexts = []
for doc, meta in zip(results["documents"][0], results["metadatas"][0]):
rule_text = meta.get("rule", "").strip()
if rule_text not in seen_rules:
seen_rules.add(rule_text)
context = f"[{meta['title']}]\n{rule_text}"
contexts.append(context)
if len(contexts) == top_k:
break
return "\n\n".join(contexts)
```
- **임베딩 모델**: [`dragonkue/snowflake-arctic-embed-l-v2.0-ko`](https://huggingface.co/dragonkue/snowflake-arctic-embed-l-v2.0-ko)
- **문서 저장소**: ChromaDB로 구축된 규범 벡터 DB
- **검색 대상**: 띄어쓰기, 맞춤법, 표준어 등 규칙 본문
---
### 🧾 프롬프트 내 규범 삽입 예시
검색된 규범은 다음과 같이 모델 입력에 포함됩니다:
```python
question = "가축을 기를 때에는 {먹이량/먹이양}을 조절해 주어야 한다."
input_text = f"[참고 규범]\n{retrieved_rules}\n=====\n문제: {question}\n정답:"
```
---
## 📑 인스트럭션 포맷
모델은 아래와 같은 프롬프트 구성을 사용하여 질의에 응답합니다. 이는 ‘AI 말평 경진대회’ 과제에서 요구한 형식을 반영한 구조입니다.
### 교정형
```
당신은 한국어 어문 규범(맞춤법, 띄어쓰기, 표준어, 문장부호, 외래어 표기법 등)에 따라 문장을 교정하고 그 이유를 설명하는 AI입니다.
[문제 유형: 교정형]
- 문제와 함께 관련 규범이 주어질 수 있으나, 규범의 타당성을 스스로 판단하여 정답을 도출해야 합니다.
- 제시된 문장은 반드시 어문 규범에 어긋난 표현을 포함하고 있습니다.
- 틀린 표현을 정확히 찾아 수정하되, 그 외 표현은 변경하지 마십시오.
- 답변은 반드시 다음 형식을 따라야 합니다:
"{수정문}이 옳다. {이유}"
[예시]
문제: 다음 문장에서 어문 규범에 부합하지 않는 부분을 찾아 고치고, 그렇게 고친 이유를 설명하세요.
"어서 쾌차하시길 바래요."
정답: "어서 쾌차하시길 바라요."가 옳다. 동사 '바라다'에 어미 '-아요'가 결합한 형태이므로 '바라요'로 써야 한다. '바래요'는 비표준어다."
```
### 선택형
```
당신은 한국어 어문 규범(맞춤법, 띄어쓰기, 표준어, 문장부호, 외래어 표기법 등)에 따라 문장에서 올바른 표현을 선택하고 그 이유를 설명하는 AI입니다.
[문제 유형: 선택형]
- 문제와 함께 관련 규범이 주어질 수 있으나, 규범의 타당성을 스스로 판단하여 정답을 도출해야 합니다.
- 보기 중 단 하나의 정답이 있으며, 반드시 어문 규범에 따라 하나의 표현만 선택해야 합니다.
- 선택한 표현 이외의 문장 구성은 수정하지 마십시오.
- 답변은 반드시 다음 형식을 따라야 합니다:
"{정답문}이 옳다. {이유}"
[예시]
문제: "가축을 기를 때에는 {먹이량/먹이양}을 조절해 주어야 한다." 가운데 올바른 것을 선택하고, 그 이유를 설명하세요.
정답: "가축을 기를 때에는 먹이양을 조절해 주어야 한다."가 옳다. '먹이'는 고유어이므로, 한자어 '量'은 두음 법칙에 따라 '양'으로 표기해야 한다.
```
### 사용자
```
[참고 규범]
{retrieved_rules}
=====
문제: {question}
정답:
```
## 📎 참고
- 데이터 출처: [국립국어원 문화·규범 QA 말뭉치 V1.0](https://kli.korean.go.kr/benchmark/taskOrdtm/taskList.do?taskOrdtmId=182)