CoolFace
Modelpublic

hushpond/llama-3-seoul-culture-lora-rag

sourceHugging Facemitupdated 10mo agoView on Hugging Face
0likes
Model Card

<h1>๐ŸŽญ Seoul Culture Event Recommendation RAG System (LoRA Adapter)</h1>

<div align="center"> <img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/peft/lora_diagram.png" alt="LoRA Architecture" width="600"/> </div>

<h2>๐Ÿ“– Model Overview</h2> <p> ์ด ๋ชจ๋ธ์€ <strong>์„œ์šธ์‹œ ๋ฌธํ™” ํ–‰์‚ฌ ์ •๋ณด</strong>๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งž์ถคํ˜• ๋‹ต๋ณ€์„ ์ œ๊ณตํ•˜๋Š” <strong>RAG(Retrieval-Augmented Generation)</strong> ์‹œ์Šคํ…œ์„ ์œ„ํ•ด ๋ฏธ์„ธ์กฐ์ •(Fine-tuning)๋œ Llama-3 ๊ธฐ๋ฐ˜์˜ <strong>LoRA Adapter</strong>์ž…๋‹ˆ๋‹ค. </p> <p> ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋‹จ์ˆœํžˆ LLM์˜ ๋‚ด๋ถ€ ์ง€์‹์œผ๋กœ ๋‹ต๋ณ€ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(<code>culture.csv</code>)์—์„œ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๊ฒ€์ƒ‰๋œ(Retrieved) ์ •ํ™•ํ•œ ํ–‰์‚ฌ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. </p>

<ul> <li><strong>Base Model:</strong> <code>beomi/Llama-3-Open-Ko-8B</code></li> <li><strong>Fine-tuning Method:</strong> QLoRA (4-bit quantization + LoRA)</li> <li><strong>Target Task:</strong> ์„œ์šธ ๋ฌธํ™” ํ–‰์‚ฌ ์ถ”์ฒœ ๋ฐ ์ •๋ณด ์•ˆ๋‚ด (Instruction Following)</li> <li><strong>Dataset Source:</strong> ์„œ์šธ์‹œ ๋ฌธํ™” ํ–‰์‚ฌ ์ •๋ณด (4,275๊ฐœ ๋ฐ์ดํ„ฐ)</li> </ul>

<hr>

<h2>๐Ÿ› ๏ธ How to Use</h2> <p>์ด ๋ชจ๋ธ์€ <strong>LoRA Adapter</strong>์ด๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ๋ฒ ์ด์Šค ๋ชจ๋ธ๊ณผ ํ•จ๊ป˜ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.</p>

<h3>1. Install Dependencies</h3> <pre><code>pip install torch transformers peft bitsandbytes pandas accelerate</code></pre>

<h3>2. Run Inference Code</h3> <pre><code class="language-python">import torch from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig from peft import PeftModel

1. Base Model Load (4-bit Quantization for efficiency)

basemodelid = "beomi/Llama-3-Open-Ko-8B" bnbconfig = BitsAndBytesConfig( loadin4bit=True, bnb4bitquanttype="nf4", bnb4bitcompute_dtype=torch.float16 )

basemodel = AutoModelForCausalLM.frompretrained( basemodelid, quantizationconfig=bnbconfig, devicemap="auto" ) tokenizer = AutoTokenizer.frompretrained(basemodelid)

2. Load LoRA Adapter

โš ๏ธ [YOURHUGGINGFACEID/YOURMODELNAME] ๋ถ€๋ถ„์„ ๋ณธ์ธ ๋ชจ๋ธ ID๋กœ ์ˆ˜์ •ํ•˜์„ธ์š”!

adaptermodelid = "YOURHUGGINGFACEID/YOURMODELNAME" model = PeftModel.frompretrained(basemodel, adaptermodelid)

3. Define Inference Function

def generateresponse(context, persona, query): inputtext = f"Context: {context} Persona: [{persona}] ์งˆ๋ฌธ: [{query}]" prompt = f"""### Instruction: {persona} ํ†ค์œผ๋กœ ๋‹ต๋ณ€ํ•ด ์ฃผ์„ธ์š”.

Input:

{input_text}

Output:

""" inputs = tokenizer(prompt, returntensors="pt").to(model.device) with torch.nograd(): outputs = model.generate( **inputs, maxnewtokens=300, temperature=0.7, topp=0.9, eostokenid=tokenizer.eostokenid ) return tokenizer.decode(outputs, skipspecial_tokens=True).split("### Output:")[-1].strip()

4. Test

contextdata = "[์„œ์šธ ํ•ธ๋“œ ๋ฉ”์ด๋“œ ํŽ˜์–ด 2025, ์‚ฌ์ „ ์˜ˆ๋งค: 8,000์›, ์„œ์šธ ์‚ผ์„ฑ๋™ ์ฝ”์—‘์Šค 1์ธต Bํ™€]" print(generateresponse(context_data, "์นœ์ ˆํ•œ ๋ฌธํ™” ๊ฐ€์ด๋“œ", "๊ฐ•๋‚จ๊ตฌ์—์„œ ์—ด๋ฆฌ๋Š” ํ•ธ๋“œ๋ฉ”์ด๋“œ ํ–‰์‚ฌ ์•Œ๋ ค์ค˜.")) </code></pre>

<hr>

<h2>๐Ÿ“Š Training Details</h2>

<h3>Dataset</h3> <ul> <li><strong>Source:</strong> ์„œ์šธ์—ด๋ฆฐ๋ฐ์ดํ„ฐ๊ด‘์žฅ (๋ฌธํ™” ํ–‰์‚ฌ ์ •๋ณด)</li> <li><strong>Size:</strong> 4,275 rows (Original CSV), Augmented for training</li> <li><strong>Format:</strong> <code>Instruction</code> (ํŽ˜๋ฅด์†Œ๋‚˜ ์ง€์‹œ), <code>Input</code> (Context + Question), <code>Output</code> (Answer)</li> <li><strong>Preprocessing:</strong> UTF-8 / CP949 ์ธ์ฝ”๋”ฉ ์ž๋™ ์ฒ˜๋ฆฌ, ๊ฒฐ์ธก์น˜ ์ œ๊ฑฐ, 512 ํ† ํฐ ๊ธธ์ด ์ œํ•œ</li> </ul>

<h3>Hyperparameters</h3> <table border="1" cellpadding="5"> <thead> <tr> <th>Parameter</th> <th>Value</th> <th>Reason</th> </tr> </thead> <tbody> <tr> <td><strong>LoRA Rank (r)</strong></td> <td><code>32</code></td> <td>์ดˆ๊ธฐ Rank 8/16 ์‹คํ—˜ ๊ฒฐ๊ณผ, Rank 32์—์„œ Loss 1.51๋กœ ๊ฐ€์žฅ ์šฐ์ˆ˜ํ•œ ์„ฑ๋Šฅ ๊ธฐ๋ก</td> </tr> <tr> <td><strong>LoRA Alpha</strong></td> <td><code>32</code></td> <td>Scaling factor</td> </tr> <tr> <td><strong>Target Modules</strong></td> <td><code>qproj</code>, <code>kproj</code>, <code>vproj</code>, <code>oproj</code>, <code>gateproj</code>, <code>upproj</code>, <code>downproj</code></td> <td>๋ชจ๋“  Linear Layer ํ•™์Šต์œผ๋กœ ์ถ”๋ก  ๋Šฅ๋ ฅ ๊ทน๋Œ€ํ™”</td> </tr> <tr> <td><strong>Batch Size</strong></td> <td><code>1</code></td> <td>Colab T4 GPU ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ ๊ทน๋ณต</td> </tr> <tr> <td><strong>Gradient Accumulation</strong></td> <td><code>8</code></td> <td>์‹ค์ œ Batch Size 8 ํšจ๊ณผ (์•ˆ์ •์  ์ˆ˜๋ ด)</td> </tr> <tr> <td><strong>Learning Rate</strong></td> <td><code>2e-4</code></td> <td>-</td> </tr> <tr> <td><strong>Epochs</strong></td> <td><code>3</code></td> <td>-</td> </tr> <tr> <td><strong>Optimizer</strong></td> <td><code>pagedadamw_8bit</code></td> <td>๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ ์ตœ์ ํ™”</td> </tr> </tbody> </table>

<h3>Performance Metrics</h3> <ul> <li><strong>Validation Loss:</strong> <code>1.5152</code> (Rank 32 ๊ธฐ์ค€) <ul> <li>Rank 8 Loss: 2.1565</li> <li>Rank 16 Loss: 1.7950</li> <li><strong>Rank 32 Loss: 1.5152 (Best)</strong></li> </ul> </li> <li><strong>ROUGE-L Score:</strong> <code>0.83</code> (๋†’์€ ๋‹ต๋ณ€ ์ •ํ™•๋„ ๋ฐ ์ผ๊ด€์„ฑ ํ™•์ธ)</li> <li><strong>Temperature Analysis:</strong> Temperature 0.5~0.7 ๊ตฌ๊ฐ„์—์„œ ROUGE ์ ์ˆ˜ ์ตœ์ ํ™” ํ™•์ธ (๋„ˆ๋ฌด ๋‚ฎ์œผ๋ฉด ๋ฐ˜๋ณต, ๋„ˆ๋ฌด ๋†’์œผ๋ฉด ํ™˜๊ฐ ๋ฐœ์ƒ)</li> </ul>

<div align="center"> <table border="1" cellpadding="5"> <tr> <th>Rank</th> <th>Validation Loss</th> </tr> <tr> <td>8</td> <td>2.1565</td> </tr> <tr> <td>16</td> <td>1.7950</td> </tr> <tr> <td><b>32</b></td> <td><b>1.5152</b></td> </tr> </table> </div>

<hr>

<h2>โš ๏ธ Limitations & Future Work</h2> <ol> <li><strong>Hallucination (ํ™˜๊ฐ ํ˜„์ƒ):</strong> <ul> <li>๋ชจ๋ธ์ด ํ•™์Šตํ•˜์ง€ ์•Š์€ ์™ธ๋ถ€ ์ •๋ณด(Unknown Data)์— ๋Œ€ํ•ด ์•ฝ <strong>50%์˜ ํ™˜๊ฐ ๋ฐœ์ƒ๋ฅ </strong>์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.</li> <li>RAG ์‹œ์Šคํ…œ์—์„œ ๊ฒ€์ƒ‰๋˜์ง€ ์•Š์€ ์ •๋ณด์— ๋Œ€ํ•ด "์•Œ ์ˆ˜ ์—†์Œ"์ด๋ผ๊ณ  ๋‹ต๋ณ€ํ•˜๋„๋ก ์ถ”๊ฐ€ ํ•™์Šต(Negative Sampling)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.</li> </ul> </li> <li><strong>Hardware Constraints:</strong> <ul> <li>Colab T4 (free tier) ํ™˜๊ฒฝ์˜ ์ œ์•ฝ์œผ๋กœ ์ธํ•ด Batch Size๋ฅผ 1๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋” ํฐ VRAM ํ™˜๊ฒฝ์—์„œ Full Fine-tuning ์‹œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค.</li> </ul> </li> <li><strong>Scope:</strong> <ul> <li>ํ˜„์žฌ ์„œ์šธ์‹œ ๋ฐ์ดํ„ฐ์— ํŠนํ™”๋˜์–ด ์žˆ์–ด, ํƒ€ ์ง€์—ญ ํ–‰์‚ฌ๋‚˜ ์ผ๋ฐ˜ ์ƒ์‹ ์งˆ๋ฌธ์—๋Š” ๋‹ต๋ณ€ ํ’ˆ์งˆ์ด ๋‚ฎ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.</li> </ul> </li> </ol>

<hr>

<h2>๐Ÿ“œ Citation & License</h2> <ul> <li><strong>License:</strong> Llama 3 Community License</li> <li><strong>Base Model:</strong> <a href="https://huggingface.co/beomi/Llama-3-Open-Ko-8B">beomi/Llama-3-Open-Ko-8B</a></li> </ul>