ailiteracynepal 🇳🇵
पाठ आकार

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

Tools र external data

Tool use / function calling — जब तपाईंले LLM लाई बाह्य APIs, database, वा calculators call गर्न दिनुहुन्छ। यसले वास्तविक-संसार लाई कसरी real-world प्रश्नहरू सम्बोधन गर्न सक्षम बनाउँछ, र यसलाई प्रयोग गर्ने standard pattern।

अब सम्म तपाईंको सहायकले जान्दा — दुबै तपाईंले प्रदान गर्ने संदर्भ र यो लाई तालिम दिइएको ज्ञानको आधारमा जवाफ दिन्छ। तर धेरै वास्तविक प्रश्नहरूको लागि मोडेलले प्रश्न पछ्याउन आवश्यक पर्दछ: वास्तविक-समयको मूल्य लुकआप गर्नुहोस्, गणना गर्नुहोस्, एक database प्रश्न गर्नुहोस्, एक transaction सुरु गर्नुहोस्। यसलाई हामी tool use — वा function calling भन्छौँ। यो modern LLM apps को दोस्रो सबैभन्दा महत्त्वपूर्ण pattern हो, RAG पछि। यो खण्डले तपाईंलाई तपाईंको सहायकलाई real-world capabilities कसरी दिनुहुन्छ हिडाउँछ।

विचार

Tool use सरल छ: तपाईं LLM लाई function calls को एउटा सूची दिनुहुन्छ जुन तपाईंले लागू गर्न सक्नुहुन्छ। एक प्रयोगकर्ता प्रश्नमा, मोडेलले निर्णय गर्न सक्दछ, “यसको जवाफ दिन, म get_stock_price("NABIL") कल गर्नुपर्छ।” तपाईंको कोडले त्यो function लाई कल गर्दछ, परिणाम पाउँछ, र मोडेल लाई फिर्ता पास गर्दछ। मोडेलले परिणाम पढ्दछ र सामान्य भाषा जवाफ लेख्दछ।

Flow:

User: "आज Nabil Bank को समापन मूल्य के थियो?"

Claude: "मैले get_stock_price(symbol='NABIL') call गर्नुपर्छ।"

Your code: call the actual API → {"price": 852.50, "close": "2026-06-27"}

Claude: "The closing price of Nabil Bank on 27 June 2026 was NPR 852.50."

यो त्यति नै हो। LLM एउटा orchestrator हो — यसले निर्णय गर्दछ जब आवश्यक हुन्छ। तपाईंको कोड actual work गर्दछ।

एक ठोस उदाहरण

आउनुहोस् nepse-mitra निर्माण गरौँ जुन वास्तविक मूल्यहरू कल गर्न सक्दछ। हामी एक कल्पित (काल्पनिक) NEPSE API प्रयोग गर्नेछौँ।

import os
from dotenv import load_dotenv
from anthropic import Anthropic

load_dotenv()
client = Anthropic()


# Define the tool
tools = [
    {
        "name": "get_stock_price",
        "description": (
            "Get the latest closing price and basic info for a stock "
            "listed on NEPSE (Nepal Stock Exchange). Only accepts NEPSE symbols."
        ),
        "input_schema": {
            "type": "object",
            "properties": {
                "symbol": {
                    "type": "string",
                    "description": "The NEPSE symbol, e.g. NABIL, NRIC, ADBL",
                },
            },
            "required": ["symbol"],
        },
    },
]


# The actual function that does the work
def get_stock_price(symbol: str) -> dict:
    """Mock — in reality, this would call the NEPSE API."""
    fake_data = {
        "NABIL": {"price": 852.50, "change": +5.25, "volume": 12450, "date": "2026-06-27"},
        "NRIC":  {"price": 1240.00, "change": -8.00, "volume": 7830, "date": "2026-06-27"},
        "ADBL":  {"price": 421.75, "change": +2.50, "volume": 22100, "date": "2026-06-27"},
    }
    if symbol.upper() in fake_data:
        return fake_data[symbol.upper()]
    return {"error": f"Symbol {symbol} not found on NEPSE."}


# The tool-using conversation
def ask_nepse_mitra(user_message: str) -> str:
    messages = [{"role": "user", "content": user_message}]

    while True:
        response = client.messages.create(
            model="claude-3-5-sonnet-latest",
            max_tokens=800,
            tools=tools,
            messages=messages,
            system="You are nepse-mitra, a helpful assistant for NEPSE prices.",
        )

        # If Claude wants to use a tool
        if response.stop_reason == "tool_use":
            tool_use_block = next(
                b for b in response.content if b.type == "tool_use"
            )
            tool_name = tool_use_block.name
            tool_input = tool_use_block.input

            print(f"[tool call: {tool_name}({tool_input})]")

            # Execute the function
            if tool_name == "get_stock_price":
                result = get_stock_price(tool_input["symbol"])
            else:
                result = {"error": f"Unknown tool: {tool_name}"}

            # Feed the result back
            messages.append({"role": "assistant", "content": response.content})
            messages.append({
                "role": "user",
                "content": [{
                    "type": "tool_result",
                    "tool_use_id": tool_use_block.id,
                    "content": str(result),
                }],
            })
            continue

        # Otherwise, we have the final answer
        return next(
            block.text for block in response.content if hasattr(block, "text")
        )


# Try it
print(ask_nepse_mitra("आज Nabil Bank को समापन मूल्य के थियो?"))

Output:

[tool call: get_stock_price({'symbol': 'NABIL'})]
Nabil Bank को 27 जुन 2026 को समापन मूल्य NPR 852.50 थियो,
अघिल्लो दिन भन्दा +5.25 पोइन्ट माथि, 12,450 शेयरहरूको volume सँग।

काम गर्छ। मोडेलले सही function छानेको, यसलाई सही तर्क सँग कल गर्यो, परिणाम पढ्यो, र नेपाली मा एक स्पष्ट जवाफ बनायो।

Multiple tools

बहु-चरण कार्यहरूको लागि, तपाईं धेरै tools परिभाषित गर्नुहुन्छ र मोडेलले चयन गर्दछ (र क्रमबद्ध रूपमा प्रयोग गर्दछ):

tools = [
    {
        "name": "get_stock_price",
        "description": "Get NEPSE stock price by symbol.",
        "input_schema": {...},
    },
    {
        "name": "get_company_profile",
        "description": "Get basic company info (sector, description, market cap) for a NEPSE symbol.",
        "input_schema": {...},
    },
    {
        "name": "get_index_value",
        "description": "Get the current value of a NEPSE index (NEPSE, NEPSE-50, sensitive).",
        "input_schema": {...},
    },
]

अब प्रयोगकर्ताले “Nabil Bank बारे मलाई बताउनुहोस् — मूल्य र profile दुबै” सोध्दछन्, र मोडेलले दुई फंक्शन कल गर्नेछन्, दुई परिणामहरू पाउँछन्, र एक integrated जवाफ लेख्दछन्। यो orchestration free आउँछ।

Tool descriptions सधैँ सबैभन्दा महत्त्वपूर्ण छन्

मोडेलले तपाईंको description field पढ्दछ र त्यसको आधारमा निर्णय गर्दछ जब tool प्रयोग गर्ने। खराब वर्णनहरू खराब निर्णयहरू ल्याउँदछन्।

खराब:

"Get stock price."

राम्रो:

"Get the latest closing price and basic info for a stock listed on
NEPSE (Nepal Stock Exchange). Only accepts NEPSE symbols. Do NOT use
this for NSE/BSE (Indian markets) or non-Nepalese exchanges."

राम्रो version मा मोडेललाई थाहा छ कब प्रयोग गर्ने, र कब नहीं। “Do NOT use for X” पंक्ति सामान्य प्रयोग नगरिने प्रयोग कतरा करदैन।

Similarly parameters:

"symbol": {
    "type": "string",
    "description": "The NEPSE symbol in uppercase (e.g. NABIL, ADBL, NRIC). Symbols are typically 4-5 uppercase Latin characters.",
}

Tools को लागि सुरक्षा

Tools ले तपाईंको LLM लाई क्रियाहरू लिन दिन्छ। यसले साथ साथै एक शक्ति र जिम्मेवारी दुबै आउँछ। सुरक्षा नियमहरू:

  • कल गरिएका functions मा rate limit। एक malicious वा confused user ले मोडेललाई infinite loop मा फंसाउन सक्दछ जुन तपाईंको API लाई पगाल्दछ। प्रति-conversation, प्रति-user, वा प्रति-hour cap लगाउनुहोस्।

  • कल गरिएका functions मा input validate गर्नुहोस्। मोडेलले कहिलेकाहीँ अजीब arguments उत्पन्न गर्दछ। कल गरिएको function मा त्यसलाई पहिलो जस्तै मान्य नबनाइनुहोस्।

  • लेखन क्रियाहरू विशेष सावधानीसँग गर्नुहोस्। यदि तपाईंको सहायकले email, transfer money, वा data delete गर्ने function हरू छन्, तिनीहरूलाई प्रयोगकर्ता confirmation पछाडि गेट गर्नुहोस्। “म Rs 5,000 XYZ लाई पठाउने छु — पुष्टि गर्नुहोस्?” सर्वदा।

  • Sensitive data को exposure limit गर्नुहोस्। यदि तपाईंको function ले एक user को account balance फर्काउँछ, यो एक ठाउँमा नकल हुनुहुँदैन जहाँ अन्य प्रयोगकर्ताहरू पहुँच गर्न सक्दछन्।

जब tools कल नगर्ने

सबै-कुरा-एक-tool को लागी सजिलो हुन्छ। यहाँ भन्दा नि तपाईंलाई सामान्य पर्दैन:

  • यसलाई gener वा जान्न सक्दछ जब। “P/E ratio के हो व्याख्या गर्नुहोस्” लाई API कल आवश्यक पर्दैन। मोडेलले पहिले नै जान्दछ।
  • जब semantic search नेटो fit हो। कागजात Q&A को लागि RAG (Chapter 5) प्रयोग गर्नुहोस्, tool कल गर्न कागजातहरू फर्काउने होइन।
  • Latency आवश्यक हुँदा। प्रत्येक tool कल एक LLM round trip थप्दछ। साना Q&A को लागि, tool use ले 5-सेकेन्ड जवाफ लाई 15 मा बदल्न सक्दछ।

Rule of thumb: यदि जवाफ एक ज्ञान प्रश्न हो, त्यसलाई सीधा जवाफ दिनुहोस्। यदि जवाफले real-time वा प्रयोगकर्ता-specific डाटा आवश्यक पर्दछ, एक tool प्रयोग गर्नुहोस्।

अब के आउँछ

तपाईंको सहायक अब real-world data र क्रियाहरूको साथ interact गर्न सक्दछ। अन्तिम खण्ड सुरक्षा र मूल्यांकनमा जान्दछ: कसरी वास्तविक-सांसारमा जान्नु अघि तपाईंको सहायक adversarial परीक्षण गर्ने, कसरी biases र गलत जवाफहरू catches गर्ने, र किन Nepal-specific परीक्षणले शिपिंग गर्नु अघि आवश्यक हुन्छ।