ailiteracynepal 🇳🇵
पाठ आकार

अध्याय ६ · खण्ड II · 36 मिनेट

सुरुदेखि अन्त्यसम्म बनाउने

एउटा पूर्ण परियोजना, खाली फोल्डरदेखि कार्यरत कार्यक्रमसम्म — NEPSE सारांशकर्ता। मार्गदर्शकका रूपमा पछ्याउनुहोस्, वा तपाईं वास्तवमै बनाउन चाहनुभएको परियोजनाका लागि संरचनालाई टेम्प्लेटका रूपमा प्रयोग गर्नुहोस्।

हामी पछिल्ला पाँच अध्यायका झन्डै हरेक टुक्रा प्रयोग गरेर एउटा सानो परियोजना सँगै, सुरुदेखि अन्त्यसम्म बनाउनेछौं। उदाहरण NEPSE सारांशकर्ता हो — एउटा स्क्रिप्ट जसले आजको NEPSE बन्द ल्याउँछ, भाषा मोडेललाई 3-वाक्यको नेपाली सारांशका लागि सोध्छ, र नतिजा प्रिन्ट गर्छ। यदि तपाईंसँग अहिले आफ्नो विचार छैन भने उही विचार पछ्याउनुहोस्। यदि छ भने, निर्माणको आकार लाई टेम्प्लेटका रूपमा लिनुहोस्, र विशिष्टता प्रतिस्थापन गर्नुहोस्।

चरण 1 — परियोजना सेट गर्ने

टर्मिनलमा, आफ्नो building-ai-notes मूल फोल्डरमा:

mkdir nepse-summariser
cd nepse-summariser

python3 -m venv .venv
source .venv/bin/activate

pip install requests anthropic python-dotenv
pip freeze > requirements.txt

आधारभूत परियोजना फाइलहरू बनाउनुहोस्:

touch summarise.py .env .gitignore README.md

.gitignore मा:

.venv/
__pycache__/
*.pyc
.env
.ipynb_checkpoints/

.env मा:

ANTHROPIC_API_KEY=sk-ant-api03-...your-key...

सुरुदेखि नै काम बचाउन रिपो सुरु गर्नुहोस्:

git init
git add .
git commit -m "Initial project structure and dependencies"

तपाईंले हरेक सफा चेकपोइन्टमा फेरि कमिट गर्नुहुनेछ। हरेक कमिट एउटा स्न्यापसट हो जुन तपाईं बिगारेपछि फर्किन सक्नुहुन्छ।

चरण 2 — डाटा ल्याउने

NEPSE Alpha API र अन्य धेरै सार्वजनिक सेवाहरूले दिनको इन्डेक्स बन्दलाई JSON का रूपमा एक्सपोज गर्छन्। यो उदाहरणका लागि हामी सानो endpoint नक्कली बनाउनेछौँ, किनभने दुई वर्षपछि पनि चल्ने प्रत्यक्ष-API कोड लेख्नु पराजय हो — र तरिका दुवै तरिकाले एउटै हो।

summarise.py मा थप्नुहोस्:

import requests


def fetch_nepse_close() -> dict:
    # वास्तविक संस्करणमा, सार्वजनिक NEPSE-इन्डेक्स API हिट गर्नुहोस्।
    # अहिलेलाई, बाँकी कार्यक्रम परीक्षण गर्न सकिने बनाउन सानो स्टब फिर्ता दिनुहोस्।
    return {
        "date": "2026-06-27",
        "close": 2142.1,
        "change_pct": 0.8,
        "leaders": ["Banking", "Hydropower"],
        "laggards": ["Microfinance"],
    }


if __name__ == "__main__":
    data = fetch_nepse_close()
    print(data)

चलाउनुहोस्:

python summarise.py

तपाईंले शब्दकोश प्रिन्ट भएको देख्नुपर्छ। एउटा सानो टुक्रा चल्छ। कमिट गर्नुहोस्:

git add summarise.py
git commit -m "Add NEPSE data fetch stub"

चरण 3 — प्रम्प्ट लेख्ने

मोडेलका लागि अनुरोधमा डाटा बदल्ने फङ्क्सन थप्नुहोस्। यो प्रम्प्ट हो, र कार्यक्रमको एकल सबैभन्दा महत्त्वपूर्ण टुक्रा हो:

def build_prompt(data: dict) -> str:
    return (
        f"You are explaining the day's NEPSE close to a small "
        f"shopkeeper in Itahari who reads Nepali but not English. "
        f"In 3 short sentences, in plain Nepali (Devanagari), say: "
        f"what happened to the index today, which sectors led, "
        f"and which lagged. Avoid jargon. Avoid English words.\n\n"
        f"Today's data:\n"
        f"  Date: {data['date']}\n"
        f"  Close: {data['close']}\n"
        f"  Change: {data['change_pct']}%\n"
        f"  Leaders: {', '.join(data['leaders'])}\n"
        f"  Laggards: {', '.join(data['laggards'])}\n"
    )

अध्याय 5 का उही तीन फ्रेमिङ ध्यान दिनुहोस्: भूमिका (इटहरीको पसले), लम्बाइ (3 छोटा वाक्य), र ढाँचा (सरल नेपाली, देवनागरी, बिनै शब्दजाल)। यी तीन लाइनले मोडेल आफै जत्तिकै काम गर्छन्।

एक्लै परीक्षण गर्नुहोस्:

if __name__ == "__main__":
    data = fetch_nepse_close()
    prompt = build_prompt(data)
    print(prompt)

चलाउनुहोस्, प्रम्प्ट पढ्नुहोस्, पठाउन चाहेको त्यही हो भनेर सन्तुष्ट हुनुहोस्। कमिट गर्नुहोस्।

चरण 4 — मोडेल कल गर्ने

अब Claude जोड्नुहोस्। माथि थप्नुहोस्:

import os
from dotenv import load_dotenv
import anthropic

load_dotenv()

र कल:

def summarise(prompt: str) -> str:
    client = anthropic.Anthropic()
    response = client.messages.create(
        model="claude-haiku-4-5-20251001",
        max_tokens=400,
        messages=[{"role": "user", "content": prompt}],
    )
    return response.content[0].text.strip()

र मुख्य प्रवाह:

if __name__ == "__main__":
    data = fetch_nepse_close()
    prompt = build_prompt(data)
    summary = summarise(prompt)
    print(summary)

चलाउनुहोस्:

python summarise.py

तीन नेपाली वाक्य देखापर्नुपर्छ। यदि देखापर्दैन — त्रुटि देख्नुहुन्छ भने — प्रतिक्रिया दिनुअघि ट्रेसब्याकको अन्तिम लाइन पढ्नुहोस् (अध्याय 4 खण्ड 3)। सामान्य कारण:

  • ANTHROPIC_API_KEY सेट छैन: के load_dotenv() ले .env फाइल भेट्यो? os.environ.get("ANTHROPIC_API_KEY") जाँच्नुहोस्।
  • anthropic.APIError: अनुरोध सर्भरमा पुग्यो तर विफल भयो। सन्देशले किन भन्छ — गलत मोडेल नाम, क्रेडिट सकियो, गलत बनेको अनुरोध।
  • ImportError: सक्रिय वातावरणभित्र pip install गर्नुभयो?

चल्न थालेपछि, कमिट गर्नुहोस्:

git add summarise.py
git commit -m "Add Claude summarisation call"

चरण 5 — खस्रा किनार थप्ने

स्क्रिप्ट सुरुदेखि अन्त्यसम्म चल्छ। अब खस्रा किनार सुधार्नुहोस् — साना स्पर्शहरू जुन “मैले एक पटक चलाएँ” र “मैले केही बनाएँ” बीच फरक पार्छ।

छुटेको डाटा सम्हाल्ने। fetch_nepse_close() ले API डाउन भएकाले None फिर्ता दिए के हुन्छ?

data = fetch_nepse_close()
if data is None:
    print("Could not fetch NEPSE data. Try again later.")
    sys.exit(1)

आउटपुटलाई फाइलमा पनि लेख्नुहोस्, प्रिन्ट गर्नुको अतिरिक्त। फाइल त्यो हो जुन तपाईंकी फुपूले भोलि बिहान फोनमा पढ्न सक्छिन्।

from pathlib import Path
from datetime import date

out = Path(f"summaries/{date.today().isoformat()}.txt")
out.parent.mkdir(parents=True, exist_ok=True)
out.write_text(summary, encoding="utf-8")

सन्दर्भका लागि हेडर थप्नुहोस्। टाइमस्ट्याम्प र कच्चा सङ्ख्या, ताकि सारांश पुन: उत्पादनयोग्य हुन्छ:

header = (
    f"NEPSE Summary — {data['date']}\n"
    f"Close: {data['close']}  ({data['change_pct']}%)\n"
    f"---\n"
)
print(header + summary)
out.write_text(header + summary, encoding="utf-8")

प्रत्येक दुई-तीन मिनेटको काम हो। कुनै पनि चम्किलो छैन। सँगसँगै यिनले स्क्रिप्टलाई सानो उत्पादनमा बदल्छन्।

फेरि कमिट:

git add .
git commit -m "Handle missing data, save summary to file, add header"

चरण 6 — स्टबलाई वास्तविक API कलले प्रतिस्थापन

अब, अन्ततः, नक्कली fetch_nepse_close() लाई वास्तविकले बदल्नुहोस्। ठ्याक्कै endpoint तपाईंले छान्ने सार्वजनिक NEPSE डाटा स्रोतमा निर्भर हुनेछ; आकार यस्तो हुन्छ:

def fetch_nepse_close() -> dict | None:
    try:
        response = requests.get(
            "https://example.nepse-api.com/index/today",
            timeout=10,
        )
        response.raise_for_status()
        raw = response.json()
        return {
            "date": raw["date"],
            "close": raw["close"],
            "change_pct": raw["change_pct"],
            "leaders": raw["leading_sectors"],
            "laggards": raw["lagging_sectors"],
        }
    except (requests.RequestException, KeyError) as e:
        print(f"Failed to fetch NEPSE data: {e}")
        return None

try/except ले यहाँ वास्तविक काम गर्दैछ — नेटवर्क कल विफल हुन्छन्; API ले आफ्नो JSON आकार बदल्छन्; दुवैलाई कार्यक्रम क्र्यास नगरीकन सम्हाल्नुपर्छ। हामीले अध्याय 4 खण्ड 3 मा ढाँचा छिचोल्यौं।

चरण 7 — सानो पालिस

स्क्रिप्ट वास्तविक डाटासँग सुरुदेखि अन्त्यसम्म चल्छ। तीन अन्तिम स्पर्श, प्रत्येकमा पाँच-पाँच मिनेट:

  1. फाइलको माथि docstring। एक अनुच्छेद: यसले के गर्छ, कसका लागि, कसरी चलाउने। छ महिनाको भविष्यको आफू कृतज्ञ हुनेछ।
  2. --date कमान्ड-लाइन आर्गुमेन्ट ताकि गत हप्ताको सारांश पुन: चलाउन सकिन्छ। Python को निर्मित argparse प्रयोग गर्नुहोस्।
  3. सुरुमा सानो प्रिन्ट कथन — “Fetching NEPSE close for 2026-06-27…” — ताकि कुर्दा कार्यक्रमले केही गरिरहेको छ प्रयोगकर्तालाई थाहा होस्।

प्रत्येक त्यो किसिमको कुरा हो जुन केही लाग्दैन र हेरचाहझैँ पढिन्छ। कमिट गर्नुहोस्, र git push — तपाईंको काम अब GitHub मा छ।

git add .
git commit -m "Add CLI args, status output, and module docstring"
git push

हामीले भर्खर बनाएको आकार

एक कदम पछि हट्नुहोस्। तपाईंले बनाएको आकार झन्डै हरेक आधुनिक एआई अनुप्रयोगको आकार हो:

  1. कतैबाट डाटा ल्याउनुहोस् — फाइल, API, छवि, डाटाबेस
  2. मोडेलका लागि डाटा तयार पार्नुहोस् — सफा गर्नुहोस्, प्रम्प्ट वा फिचर भेक्टरका रूपमा ढाँचा दिनुहोस्।
  3. मोडेल बोलाउनुहोस् — स्थानीय वा होस्ट गरिएको।
  4. प्रतिक्रिया प्रयोग गर्नुहोस् — प्रिन्ट, बचत, पठाउने, देखाउने।

बाँकी ट्र्याकको हरेक परियोजनाले यो ढाँचा पछ्याउँछ। टुक्राहरू बदलिन्छन् — फरक API, फरक मोडेल, धनी इन्टरफेस — तर आकार बस्छ। यदि तपाईं आफ्नो summarise.py पढेर हरेक लाइन कुन चरणमा बस्छ भन्न सक्नुहुन्छ भने, तपाईंले Course 01 मा सबैभन्दा महत्त्वपूर्ण कुरा सिक्नुभयो।

आफ्नो बुझाइ जाँच्नुहोस्

Quick check

यो खण्डले डाटा फेच स्टबलाई वास्तविक API कलले *अन्त्यमा*, *सुरुमा* होइन, प्रतिस्थापन गर्न किन सिफारिस गर्छ?

Quick check

खण्डले नाम दिएका चार चरण पढ्नुहोस् — ल्याउने, तयार पार्ने, बोलाउने, प्रयोग गर्ने। एउटा सानो कार्यक्रम 'नेपाली पाठको फोटोलाई अंग्रेजीमा अनुवाद गर्ने'। `तयार पार्ने` चरणसँग कुन कोड लाइन मिल्छ?

अब के आउँछ

तपाईंसँग सकिएको कार्यक्रम छ। अन्तिम र प्रायः छुटाइने चरण भनेको यसलाई यसरी लेख्ने हो कि अजान्ने व्यक्तिले बुझ्न सकोस् कि यसले के गर्छ, किन, र कसरी प्रयोग गर्ने — र अनि अजान्नेहरूले फेला पार्न सक्ने ठाउँमा राख्ने। त्यो अर्को खण्ड हो, र यो अस्तित्वमा रहेको कोड र गनिने कोडबीचको फरक हो।