๊ฐœ์š”

ํ•™์Šต ๋ฐ์ดํ„ฐ

  • korean_language_rag_V1.0_train.json
  • korean_language_rag_V1.0_dev.json
  • ๊ตญ์–ด ์ง€์‹ ๊ธฐ๋ฐ˜ ์ƒ์„ฑ(RAG) ์ฐธ์กฐ ๋ฌธ์„œ.txt(pdf -> txt)

์‹คํ–‰๋ฐฉ๋ฒ•

  • vllm ์„ค์น˜
  • ์„ค์น˜ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ๋ชจ๋ธ ์„œ๋น™
  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
  • ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜ํ–‰
import json
import requests

from tqdm import tqdm

test_file = "../dataset/korean_language_rag_V1.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 make_addtional_user_format(input):
    # question type๋ณ„ instruction ์ •์˜
     type_instructions = {        
        "๊ต์ •ํ˜•": (
            "- [์งˆ๋ฌธ]์„ ์ž˜ ์ฝ๊ณ  ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜์‹œ์˜ค.\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 = type_instructions.get(input["question_type"], "")

    return instruction

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

    for idx, data in tqdm(enumerate(test_data), total=len(test_data)):
        query = data["input"]["question"].strip()
        system_prompt = SYSTEM_PROMPT.format(
            context_data="RAG๋กœ ๊ฒ€์ƒ‰๋œ chunks",
            user_prompt=make_addtional_user_format(data["input"]),
        )

        data = {
            "messages": [
                {"role": "system", "content": system_prompt},
                {"role": "user", "content": query},
            ],
            "model": "filot/kanana-1.5-8b-instruct-2505-rag",
            "presence_penalty": 0.2,
            "frequency_penalty": 0.2,
            "repetition_penalty": 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(test_data), total=len(test_data)):
    test_data[idx]["output"]["answer"] = data["output"]["answer"].strip()  
Downloads last month
38
Safetensors
Model size
8.03B params
Tensor type
BF16
ยท
Inference Providers NEW
This model isn't deployed by any Inference Provider. ๐Ÿ™‹ Ask for provider support

Model tree for filot/kanana-1.5-8b-instruct-2505-rag

Finetuned
(2)
this model