पाठ 13 / 29

Prompting, RAG या Fine-Tuning: निर्णय प्रक्रिया

लक्ष्य पूरा करने वाला सबसे सस्ता तरीक़ा चुनें, और जानें fine-tuning की क्या लागत है।

सिर्फ़ तब आगे बढ़ें जब मूल्यांकन कहे

व्यावहारिक सीढ़ी: (1) बेहतर prompts और उदाहरण, क्योंकि वे सबसे सस्ते और दोहराने में सबसे तेज़ हैं; (2) जब मॉडल के पास बदलने वाले या निजी तथ्य न हों तब retrieval (RAG); (3) मज़बूत या अलग मॉडल; (4) fine-tuning जब आपको एकसमान शैली, format या संकरा कौशल चाहिए, छोटे विशेषीकृत मॉडल से कम latency या लागत चाहिए, या ऐसा व्यवहार जो लंबे prompts नहीं दे सकते। Fine-tuning ताज़ा ज्ञान सस्ते में जोड़ने का तरीक़ा नहीं है; इसे गुणवत्तापूर्ण प्रशिक्षण डेटा (सही format में सैकड़ों से हज़ारों समीक्षित उदाहरण), मूल्यांकन set, प्रशिक्षण run और base मॉडल बदलने पर निरंतर रखरखाव चाहिए। LoRA जैसे parameter-efficient तरीक़े सारे weights की जगह छोटे adapter matrices प्रशिक्षित करते हैं, जिससे लागत तेज़ी से घटती है: एक 4096 गुणा 4096 matrix के लिए rank-8 adapter में 1.68 करोड़ के मुक़ाबले 65,536 प्रशिक्षण-योग्य parameters (0.39%) हैं। Fine-tuned मॉडल की तुलना हमेशा उसी मूल्यांकन set पर सर्वश्रेष्ठ prompted baseline से करें, क्योंकि baseline अक्सर काफ़ी होता है।

LoRA adapter कितना छोटा है, चलाकर

मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। 4096 x 4096 matrix के लिए rank 4, 8, 16 और 64 के adapters में पूरे matrix के parameters का 0.20%, 0.39%, 0.78% और 3.12% है। 32 परतों में से प्रत्येक के 4 matrices rank 8 पर अनुकूलित करने से लगभग 84 लाख parameters प्रशिक्षित होते हैं। परत और matrix संख्याएँ उदाहरण हैं, किसी विशिष्ट मॉडल की नहीं।

def full_params(d_in, d_out): return d_in * d_out
def lora_params(d_in, d_out, r): return r * (d_in + d_out)           # two thin matrices: (d_in x r) and (r x d_out)

d = 4096
for r in (4, 8, 16, 64):
    full, lora = full_params(d, d), lora_params(d, d, r)
    print(f"rank {r:2d}: {lora:>9,} trainable vs {full:,} in the full matrix -> {lora / full:.2%}")

layers, matrices_per_layer = 32, 4                                  # e.g. adapt 4 attention matrices in each of 32 layers
total = layers * matrices_per_layer * lora_params(d, d, 8)
print(f"adapting {matrices_per_layer} matrices in {layers} layers at rank 8: {total:,} trainable parameters ({total / 1e6:.1f} M)")

Output:

rank  4:    32,768 trainable vs 16,777,216 in the full matrix -> 0.20%
rank  8:    65,536 trainable vs 16,777,216 in the full matrix -> 0.39%
rank 16:   131,072 trainable vs 16,777,216 in the full matrix -> 0.78%
rank 64:   524,288 trainable vs 16,777,216 in the full matrix -> 3.12%
adapting 4 matrices in 32 layers at rank 8: 8,388,608 trainable parameters (8.4 M)

प्रशिक्षण से पहले fine-tuning डेटा जाँचना, चलाकर

मैंने यह सादे Python 3 (सिर्फ़ standard library) से चलाया। Validator chat-शैली format में हर JSONL पंक्ति जाँचता है: वैध JSON, कम से कम दो turns वाली messages सूची, ज्ञात भूमिकाएँ, ख़ाली न होने वाला अंतिम assistant उत्तर। सिर्फ़ पहला उदाहरण स्वीकार होता है; बाक़ी अलग कारणों से विफल होते हैं। असली providers अपने सटीक formats तय करते हैं, इसलिए उनका दस्तावेज़ मानें।

import json

def check_example(line):
    try: ex = json.loads(line)
    except json.JSONDecodeError as e: return f"bad JSON: {e.msg}"
    msgs = ex.get("messages")
    if not isinstance(msgs, list) or len(msgs) < 2: return "needs a messages list with at least 2 turns"
    if any(m.get("role") not in {"system", "user", "assistant"} for m in msgs): return "unknown role"
    if msgs[-1]["role"] != "assistant": return "last turn must be the assistant answer to learn"
    if not msgs[-1].get("content", "").strip(): return "empty assistant answer"
    return "ok"

lines = [
    '{"messages": [{"role": "user", "content": "Refund status?"}, {"role": "assistant", "content": "It is processed within 5 days."}]}',
    '{"messages": [{"role": "user", "content": "Hi"}]}',
    '{"messages": [{"role": "user", "content": "Hi"}, {"role": "assistant", "content": ""}]}',
    '{"messages": [{"role": "robot", "content": "Hi"}, {"role": "assistant", "content": "Hello"}]}',
    '{messages: nope}',
]
for i, l in enumerate(lines, 1): print(i, check_example(l))

Output:

1 ok
2 needs a messages list with at least 2 turns
3 empty assistant answer
4 unknown role
5 bad JSON: Expecting property name enclosed in double quotes

सर्वश्रेष्ठ prompted baseline से तुलना करें

Fine-tuned मॉडल को अपनी लागत जायज़ ठहराने के लिए अच्छी तरह prompted मज़बूत मॉडल को हराना होगा।

त्वरित जाँच: Fine-tuning किस ज़रूरत के लिए सबसे उपयुक्त है?

  • रोज़ बदलते तथ्य जोड़ना
  • एकसमान शैली, format या संकरा कौशल
  • किसी मूल्यांकन से बचना
  • Access control की जगह लेना
Answer

एकसमान शैली, format या संकरा कौशल — बदलते तथ्यों के लिए retrieval और स्थिर व्यवहार के लिए fine-tuning उपयोग करें।