|
|
Google Colab में चलाएं
|
|
|
GitHub पर सोर्स देखें
|
Gemma जैसे जनरेटिव आर्टिफ़िशियल इंटेलिजेंस (एआई) मॉडल का इस्तेमाल करते समय, आपको प्रोग्रामिंग इंटरफ़ेस को ऑपरेट करने के लिए मॉडल का इस्तेमाल करना पड़ सकता है. ऐसा टास्क पूरे करने या सवालों के जवाब देने के लिए किया जाता है. प्रोग्रामिंग इंटरफ़ेस तय करके मॉडल को निर्देश देना और फिर उस इंटरफ़ेस का इस्तेमाल करके अनुरोध करना, फ़ंक्शन कॉलिंग कहलाता है.
इस गाइड में, Hugging Face के इकोसिस्टम में Gemma 4 का इस्तेमाल करने का तरीका बताया गया है.
यह नोटबुक, T4 GPU पर चलेगी.
Python पैकेज इंस्टॉल करना
Gemma मॉडल को चलाने और अनुरोध करने के लिए, Hugging Face की ज़रूरी लाइब्रेरी इंस्टॉल करें.
# Install PyTorch & other librariespip install torch accelerate# Install the transformers librarypip install transformers
मॉडल लोड करें
transformers लाइब्रेरी का इस्तेमाल करके, processor और model का एक इंस्टेंस बनाएं. इसके लिए, AutoProcessor और AutoModelForImageTextToText क्लास का इस्तेमाल करें. जैसा कि यहां दिए गए कोड के उदाहरण में दिखाया गया है:
MODEL_ID = "google/gemma-4-E2B-it" # @param ["google/gemma-4-E2B-it","google/gemma-4-E4B-it", "google/gemma-4-31B-it", "google/gemma-4-26B-A4B-it"]
from transformers import AutoProcessor, AutoModelForMultimodalLM
model = AutoModelForMultimodalLM.from_pretrained(MODEL_ID, dtype="auto", device_map="auto")
processor = AutoProcessor.from_pretrained(MODEL_ID)
Loading weights: 0%| | 0/2011 [00:00<?, ?it/s]
पासिंग टूल
tools आर्ग्युमेंट के ज़रिए, apply_chat_template() फ़ंक्शन का इस्तेमाल करके मॉडल को टूल पास किए जा सकते हैं. इन टूल को तय करने के दो तरीके हैं:
- JSON स्कीमा: फ़ंक्शन का नाम, ब्यौरा, और पैरामीटर (टाइप और ज़रूरी फ़ील्ड शामिल हैं) तय करने वाली JSON डिक्शनरी को मैन्युअल तरीके से बनाया जा सकता है.
- रॉ Python फ़ंक्शन: आपके पास Python के असल फ़ंक्शन पास करने का विकल्प होता है. सिस्टम, फ़ंक्शन के टाइप हिंट, आर्ग्युमेंट, और डॉकस्ट्रिंग को पार्स करके, ज़रूरी JSON स्कीमा अपने-आप जनरेट करता है. बेहतर नतीजों के लिए, डॉकस्ट्रिंग को Google की Python स्टाइल गाइड के मुताबिक होना चाहिए.
यहाँ JSON स्कीमा का उदाहरण दिया गया है.
from transformers import TextStreamer
weather_function_schema = {
"type": "function",
"function": {
"name": "get_current_temperature",
"description": "Gets the current temperature for a given location.",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
},
"required": ["location"],
},
}
}
message = [
{
"role": "system", "content": "You are a helpful assistant."
},
{
"role": "user", "content": "What's the temperature in London?"
}
]
text = processor.apply_chat_template(message, tools=[weather_function_schema], tokenize=False, add_generation_prompt=True)
inputs = processor(text=text, return_tensors="pt").to(model.device)
streamer = TextStreamer(processor)
outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=64)
<bos><|turn>system
You are a helpful assistant.<|tool>declaration:get_current_temperature{description:<|"|>Gets the current temperature for a given location.<|"|>,parameters:{properties:{location:{description:<|"|>The city name, e.g. San Francisco<|"|>,type:<|"|>STRING<|"|>} },required:[<|"|>location<|"|>],type:<|"|>OBJECT<|"|>} }<tool|><turn|>
<|turn>user
What's the temperature in London?<turn|>
<|turn>model
<|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>
साथ ही, रॉ Python फ़ंक्शन का इस्तेमाल करके इसी उदाहरण को दिखाया गया है.
from transformers.utils import get_json_schema
def get_current_temperature(location: str):
"""
Gets the current temperature for a given location.
Args:
location: The city name, e.g. San Francisco
"""
return "15°C"
message = [
{
"role": "user", "content": "What's the temperature in London?"
}
]
text = processor.apply_chat_template(message, tools=[get_json_schema(get_current_temperature)], tokenize=False, add_generation_prompt=True)
inputs = processor(text=text, return_tensors="pt").to(model.device)
streamer = TextStreamer(processor)
outputs = model.generate(**inputs, streamer=streamer, max_new_tokens=256)
<bos><|turn>system
<|tool>declaration:get_current_temperature{description:<|"|>Gets the current temperature for a given location.<|"|>,parameters:{properties:{location:{description:<|"|>The city name, e.g. San Francisco<|"|>,type:<|"|>STRING<|"|>} },required:[<|"|>location<|"|>],type:<|"|>OBJECT<|"|>} }<tool|><turn|>
<|turn>user
What's the temperature in London?<turn|>
<|turn>model
<|tool_call>call:get_current_temperature{location:<|"|>London<|"|>}<tool_call|><|tool_response>
फ़ंक्शन कॉल करने का पूरा क्रम
इस सेक्शन में, मॉडल को बाहरी टूल से कनेक्ट करने के लिए तीन चरणों वाला साइकल दिखाया गया है: मॉडल का टर्न, जिसमें फ़ंक्शन कॉल ऑब्जेक्ट जनरेट किए जाते हैं. डेवलपर का टर्न, जिसमें कोड को पार्स और एक्ज़ीक्यूट किया जाता है. जैसे, मौसम का एपीआई. फ़ाइनल जवाब, जिसमें मॉडल, टूल के आउटपुट का इस्तेमाल करके उपयोगकर्ता के सवाल का जवाब देता है.
मॉडल की बारी
यहां उपयोगकर्ता का प्रॉम्प्ट "Hey, what's the weather in Tokyo right now?" और टूल [get_current_weather] दिया गया है. Gemma, फ़ंक्शन कॉल ऑब्जेक्ट को इस तरह जनरेट करता है.
# Define a function that our model can use.
def get_current_weather(location: str, unit: str = "celsius"):
"""
Gets the current weather in a given location.
Args:
location: The city and state, e.g. "San Francisco, CA" or "Tokyo, JP"
unit: The unit to return the temperature in. (choices: ["celsius", "fahrenheit"])
Returns:
temperature: The current temperature in the given location
weather: The current weather in the given location
"""
return {"temperature": 15, "weather": "sunny"}
prompt = "Hey, what's the weather in Tokyo right now?"
tools = [get_current_weather]
message = [
{
"role": "system", "content": "You are a helpful assistant."
},
{
"role": "user", "content": prompt
},
]
text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)
inputs = processor(text=text, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128)
generated_tokens = out[0][len(inputs["input_ids"][0]):]
output = processor.decode(generated_tokens, skip_special_tokens=False)
print(f"Prompt: {prompt}")
print(f"Tools: {tools}")
print(f"Output: {output}")
Prompt: Hey, what's the weather in Tokyo right now?
Tools: [<function get_current_weather at 0x7cef824ece00>]
Output: <|tool_call>call:get_current_weather{location:<|"|>Tokyo, JP<|"|>}<tool_call|><|tool_response>
डेवलपर की बारी
आपके ऐप्लिकेशन को मॉडल के जवाब को पार्स करना चाहिए, ताकि फ़ंक्शन का नाम और आर्ग्युमेंट निकाले जा सकें. साथ ही, assistant भूमिका के साथ tool_calls और tool_responses को जोड़ा जा सके.
import re
import json
def extract_tool_calls(text):
def cast(v):
try: return int(v)
except:
try: return float(v)
except: return {'true': True, 'false': False}.get(v.lower(), v.strip("'\""))
return [{
"name": name,
"arguments": {
k: cast((v1 or v2).strip())
for k, v1, v2 in re.findall(r'(\w+):(?:<\|"\|>(.*?)<\|"\|>|([^,}]*))', args)
}
} for name, args in re.findall(r"<\|tool_call>call:(\w+)\{(.*?)\}<tool_call\|>", text, re.DOTALL)]
calls = extract_tool_calls(output)
if calls:
# Call the function and get the result
#####################################
# WARNING: This is a demonstration. #
#####################################
# Using globals() to call functions dynamically can be dangerous in
# production. In a real application, you should implement a secure way to
# map function names to actual function calls, such as a predefined
# dictionary of allowed tools and their implementations.
results = [
{"name": c['name'], "response": globals()[c['name']](**c['arguments'])}
for c in calls
]
message.append({
"role": "assistant",
"tool_calls": [
{"function": call} for call in calls
],
"tool_responses": results
})
print(json.dumps(message[-1], indent=2))
{
"role": "assistant",
"tool_calls": [
{
"function": {
"name": "get_current_weather",
"arguments": {
"location": "Tokyo, JP"
}
}
}
],
"tool_responses": [
{
"name": "get_current_weather",
"response": {
"temperature": 15,
"weather": "sunny"
}
}
]
}
"tool_responses": [
{
"name": function_name,
"response": function_response
}
]
एक से ज़्यादा स्वतंत्र अनुरोधों के मामले में:
"tool_responses": [
{
"name": function_name_1,
"response": function_response_1
},
{
"name": function_name_2,
"response": function_response_2
}
]
आखिरी जवाब
आखिर में, Gemma टूल के जवाब को पढ़ता है और उपयोगकर्ता को जवाब देता है.
text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)
inputs = processor(text=text, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128)
generated_tokens = out[0][len(inputs["input_ids"][0]):]
output = processor.decode(generated_tokens, skip_special_tokens=True)
print(f"Output: {output}")
message[-1]["content"] = output
Output: The current weather in Tokyo is 15 degrees and sunny.
चैट का पूरा इतिहास यहां देखा जा सकता है.
# full history
print(json.dumps(message, indent=2))
print("-"*80)
output = processor.decode(out[0], skip_special_tokens=False)
print(f"Output: {output}")
[
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hey, what's the weather in Tokyo right now?"
},
{
"role": "assistant",
"tool_calls": [
{
"function": {
"name": "get_current_weather",
"arguments": {
"location": "Tokyo, JP"
}
}
}
],
"tool_responses": [
{
"name": "get_current_weather",
"response": {
"temperature": 15,
"weather": "sunny"
}
}
],
"content": "The current weather in Tokyo is 15 degrees and sunny."
}
]
--------------------------------------------------------------------------------
Output: <bos><|turn>system
You are a helpful assistant.<|tool>declaration:get_current_weather{description:<|"|>Gets the current weather in a given location.<|"|>,parameters:{properties:{location:{description:<|"|>The city and state, e.g. "San Francisco, CA" or "Tokyo, JP"<|"|>,type:<|"|>STRING<|"|>},unit:{description:<|"|>The unit to return the temperature in.<|"|>,enum:[<|"|>celsius<|"|>,<|"|>fahrenheit<|"|>],type:<|"|>STRING<|"|>} },required:[<|"|>location<|"|>],type:<|"|>OBJECT<|"|>} }<tool|><turn|>
<|turn>user
Hey, what's the weather in Tokyo right now?<turn|>
<|turn>model
<|tool_call>call:get_current_weather{location:<|"|>Tokyo, JP<|"|>}<tool_call|><|tool_response>response:get_current_weather{temperature:15,weather:<|"|>sunny<|"|>}<tool_response|>The current weather in Tokyo is 15 degrees and sunny.<turn|>
सूझ-बूझ वाले मॉडल की मदद से फ़ंक्शन कॉल करना
मॉडल, तर्क करने की अपनी प्रोसेस का इस्तेमाल करके, फ़ंक्शन कॉल करने की क्षमता को काफ़ी हद तक बेहतर बनाता है. इससे यह तय करने में ज़्यादा आसानी होती है कि टूल को कब ट्रिगर करना है और उसके पैरामीटर कैसे तय करने हैं.
prompt = "Hey, I'm in Seoul. Is it good for running now?"
message = [
{
"role": "system", "content": "You are a helpful assistant."
},
{
"role": "user", "content": prompt
},
]
text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True, enable_thinking=True)
inputs = processor(text=text, return_tensors="pt").to(model.device)
input_len = inputs["input_ids"].shape[-1]
out = model.generate(**inputs, max_new_tokens=1024)
output = processor.decode(out[0][input_len:], skip_special_tokens=False)
result = processor.parse_response(output)
for key, value in result.items():
if key == "role":
print(f"Role: {value}")
elif key == "thinking":
print(f"\n=== Thoughts ===\n{value}")
elif key == "content":
print(f"\n=== Answer ===\n{value}")
elif key == "tool_calls":
print(f"\n=== Tool Calls ===\n{value}")
else:
print(f"\n{key}: {value}...\n")
Role: assistant
=== Thoughts ===
1. **Analyze the Request:** The user is asking if it's "good for running now" in "Seoul".
2. **Identify Necessary Information:** To determine if it's good for running, I need current weather information (temperature, precipitation, etc.) for Seoul.
3. **Examine Available Tools:** The available tool is `get_current_weather(location, unit)`.
4. **Determine Tool Arguments:**
* `location`: The user specified "Seoul".
* `unit`: The user did not specify a unit (Celsius or Fahrenheit).
5. **Formulate the Tool Call:** I need to call `get_current_weather` with the location. Since the user didn't specify a unit, I can either omit it (if the tool defaults are acceptable) or choose a common one. However, the tool definition requires `location` but `unit` is optional.
6. **Construct the Response Strategy:**
* Call the tool to get the weather data for Seoul.
* Once the data is received, I can advise the user on whether it's suitable for running.
7. **Generate Tool Call:**
```json
{
"toolSpec": {
"name": "get_current_weather",
"args": {
"location": "Seoul"
}
}
}
```
(Self-correction: The `unit` parameter is optional in the definition, so just providing the location is sufficient to proceed.)
8. **Final Output Generation:** Present the tool call to the user/system.
=== Tool Calls ===
[{'type': 'function', 'function': {'name': 'get_current_weather', 'arguments': {'location': 'Seoul'} } }]
टूल कॉल को प्रोसेस करना और फ़ाइनल जवाब पाना.
calls = extract_tool_calls(output)
if calls:
# Call the function and get the result
#####################################
# WARNING: This is a demonstration. #
#####################################
# Using globals() to call functions dynamically can be dangerous in
# production. In a real application, you should implement a secure way to
# map function names to actual function calls, such as a predefined
# dictionary of allowed tools and their implementations.
results = [
{"name": c['name'], "response": globals()[c['name']](**c['arguments'])}
for c in calls
]
message.append({
"role": "assistant",
"tool_calls": [
{"function": call} for call in calls
],
"tool_responses": results
})
text = processor.apply_chat_template(message, tools=tools, tokenize=False, add_generation_prompt=True)
inputs = processor(text=text, return_tensors="pt").to(model.device)
out = model.generate(**inputs, max_new_tokens=128)
generated_tokens = out[0][len(inputs["input_ids"][0]):]
output = processor.decode(generated_tokens, skip_special_tokens=True)
print(f"Output: {output}")
message[-1]["content"] = output
print("-"*80)
print("Full History")
print("-"*80)
print(json.dumps(message, indent=2))
Output: The current weather in Seoul is 15 degrees Celsius and sunny. That sounds like great weather for a run!
--------------------------------------------------------------------------------
Full History
--------------------------------------------------------------------------------
[
{
"role": "system",
"content": "You are a helpful assistant."
},
{
"role": "user",
"content": "Hey, I'm in Seoul. Is it good for running now?"
},
{
"role": "assistant",
"tool_calls": [
{
"function": {
"name": "get_current_weather",
"arguments": {
"location": "Seoul"
}
}
}
],
"tool_responses": [
{
"name": "get_current_weather",
"response": {
"temperature": 15,
"weather": "sunny"
}
}
],
"content": "The current weather in Seoul is 15 degrees Celsius and sunny. That sounds like great weather for a run!"
}
]
अहम चेतावनी: ऑटोमैटिक स्कीमा बनाम मैन्युअल स्कीमा
Python फ़ंक्शन से JSON स्कीमा में अपने-आप होने वाले कन्वर्ज़न पर भरोसा करने पर, ऐसा हो सकता है कि जनरेट किया गया आउटपुट, जटिल पैरामीटर के बारे में आपकी उम्मीदों के मुताबिक न हो.
अगर कोई फ़ंक्शन, किसी कस्टम ऑब्जेक्ट (जैसे कि कॉन्फ़िगरेशन क्लास) को आर्ग्युमेंट के तौर पर इस्तेमाल करता है, तो अपने-आप कन्वर्ज़न करने वाला टूल, उसे सिर्फ़ एक सामान्य "ऑब्जेक्ट" के तौर पर दिखा सकता है. इसमें उसकी इंटरनल प्रॉपर्टी के बारे में जानकारी नहीं दी जाती.
इन मामलों में, JSON स्कीमा को मैन्युअल तरीके से तय करना बेहतर होता है. इससे यह पक्का किया जा सकता है कि नेस्ट की गई प्रॉपर्टी (जैसे कि कॉन्फ़िगरेशन ऑब्जेक्ट में थीम या फ़ॉन्ट_साइज़) को मॉडल के लिए साफ़ तौर पर तय किया गया हो.
import json
from transformers.utils import get_json_schema
class Config:
def __init__(self):
self.theme = "light"
self.font_size = 14
def update_config(config: Config):
"""
Updates the configuration of the system.
Args:
config: A Config object
Returns:
True if the configuration was successfully updated, False otherwise.
"""
update_config_schema = {
"type": "function",
"function": {
"name": "update_config",
"description": "Updates the configuration of the system.",
"parameters": {
"type": "object",
"properties": {
"config": {
"type": "object",
"description": "A Config object",
"properties": {"theme": {"type": "string"}, "font_size": {"type": "number"} },
},
},
"required": ["config"],
},
},
}
print(f"--- [Automatic] ---")
print(json.dumps(get_json_schema(update_config), indent=2))
print(f"\n--- [Manual Schemas] ---")
print(json.dumps(update_config_schema, indent=2))
--- [Automatic] ---
{
"type": "function",
"function": {
"name": "update_config",
"description": "Updates the configuration of the system.",
"parameters": {
"type": "object",
"properties": {
"config": {
"type": "object",
"description": "A Config object"
}
},
"required": [
"config"
]
}
}
}
--- [Manual Schemas] ---
{
"type": "function",
"function": {
"name": "update_config",
"description": "Updates the configuration of the system.",
"parameters": {
"type": "object",
"properties": {
"config": {
"type": "object",
"description": "A Config object",
"properties": {
"theme": {
"type": "string"
},
"font_size": {
"type": "number"
}
}
}
},
"required": [
"config"
]
}
}
}
खास जानकारी और अगले चरण
आपने ऐसा ऐप्लिकेशन बनाने का तरीका जान लिया है जो Gemma 4 की मदद से फ़ंक्शन कॉल कर सकता है. यह वर्कफ़्लो, चार चरणों वाले साइकल के ज़रिए पूरा किया जाता है:
- टूल तय करना: ऐसे फ़ंक्शन बनाएं जिनका इस्तेमाल आपका मॉडल कर सकता है.साथ ही, उनके आर्ग्युमेंट और ब्यौरे तय करें. उदाहरण के लिए, मौसम की जानकारी देने वाला फ़ंक्शन.
- मॉडल का जवाब: मॉडल को उपयोगकर्ता का प्रॉम्प्ट और उपलब्ध टूल की सूची मिलती है. इसके बाद, मॉडल सादे टेक्स्ट के बजाय, स्ट्रक्चर्ड फ़ंक्शन कॉल ऑब्जेक्ट दिखाता है.
- डेवलपर की बारी: डेवलपर, फ़ंक्शन के नाम और आर्ग्युमेंट निकालने के लिए, रेगुलर एक्सप्रेशन का इस्तेमाल करके इस आउटपुट को पार्स करता है. इसके बाद, वह Python कोड को एक्ज़ीक्यूट करता है और टूल की खास भूमिका का इस्तेमाल करके, चैट के इतिहास में नतीजे जोड़ता है.
- आखिरी जवाब: मॉडल, टूल के एक्ज़ीक्यूशन के नतीजे को प्रोसेस करता है, ताकि उपयोगकर्ता के लिए सामान्य भाषा में आखिरी जवाब जनरेट किया जा सके.
ज़्यादा जानकारी के लिए, यहां दिया गया दस्तावेज़ देखें.
Google Colab में चलाएं
GitHub पर सोर्स देखें