Granite 3.0 عبارة عن عائلة مفتوحة المصدر وخفيفة الوزن من نماذج اللغات التوليدية المصممة لمجموعة من المهام على مستوى المؤسسة. وهو يدعم أصلاً وظائف متعددة اللغات، والترميز، والتفكير، واستخدام الأدوات، مما يجعله مناسبًا لبيئات المؤسسات.
لقد اختبرت تشغيل هذا النموذج لمعرفة المهام التي يمكنه التعامل معها.
لقد قمت بإعداد بيئة Granite 3.0 في Google Colab وقمت بتثبيت المكتبات اللازمة باستخدام الأوامر التالية:
!pip install torch torchvision torchaudio !pip install accelerate !pip install -U transformers
لقد قمت باختبار أداء كلا الطرازين 2B و8B من Granite 3.0.
قمت بتشغيل نموذج 2B. إليك نموذج التعليمات البرمجية لنموذج 2B:
import torch from transformers import AutoModelForCausalLM, AutoTokenizer device = "auto" model_path = "ibm-granite/granite-3.0-2b-instruct" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device) model.eval() chat = [ { "role": "user", "content": "Please list one IBM Research laboratory located in the United States. You should only output its name and location." }, ] chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True) input_tokens = tokenizer(chat, return_tensors="pt").to("cuda") output = model.generate(**input_tokens, max_new_tokens=100) output = tokenizer.batch_decode(output) print(output[0])
userPlease list one IBM Research laboratory located in the United States. You should only output its name and location. assistant1. IBM Research - Austin, Texas
يمكن استخدام النموذج 8B عن طريق استبدال 2b بـ 8b. فيما يلي نموذج التعليمات البرمجية بدون حقول الدور وإدخال المستخدم لنموذج 8B:
import torch from transformers import AutoModelForCausalLM, AutoTokenizer device = "auto" model_path = "ibm-granite/granite-3.0-8b-instruct" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device) model.eval() chat = [ { "content": "Please list one IBM Research laboratory located in the United States. You should only output its name and location." }, ] chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True) input_tokens = tokenizer(chat, add_special_tokens=False, return_tensors="pt").to("cuda") output = model.generate(**input_tokens, max_new_tokens=100) generated_text = tokenizer.decode(output[0][input_tokens["input_ids"].shape[1]:], skip_special_tokens=True) print(generated_text)
1. IBM Almaden Research Center - San Jose, California
لقد استكشفت ميزة استدعاء الوظائف، واختبرتها باستخدام وظيفة وهمية. هنا، يتم تعريف get_current_weather لإرجاع بيانات الطقس الوهمية.
import json def get_current_weather(location: str) -> dict: """ Retrieves current weather information for the specified location (default: San Francisco). Args: location (str): Name of the city to retrieve weather data for. Returns: dict: Dictionary containing weather information (temperature, description, humidity). """ print(f"Getting current weather for {location}") try: weather_description = "sample" temperature = "20.0" humidity = "80.0" return { "description": weather_description, "temperature": temperature, "humidity": humidity } except Exception as e: print(f"Error fetching weather data: {e}") return {"weather": "NA"}
لقد قمت بإنشاء مطالبة لاستدعاء الوظيفة:
functions = [ { "name": "get_current_weather", "description": "Get the current weather", "parameters": { "type": "object", "properties": { "location": { "type": "string", "description": "The city and country code, e.g. San Francisco, US", } }, "required": ["location"], }, }, ] query = "What's the weather like in Boston?" payload = { "functions_str": [json.dumps(x) for x in functions] } chat = [ {"role":"system","content": f"You are a helpful assistant with access to the following function calls. Your task is to produce a sequence of function calls necessary to generate response to the user utterance. Use the following function calls as required.{payload}"}, {"role": "user", "content": query } ]
باستخدام الكود التالي، قمت بإنشاء استجابة:
instruction_1 = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True) input_tokens = tokenizer(instruction_1, return_tensors="pt").to("cuda") output = model.generate(**input_tokens, max_new_tokens=1024) generated_text = tokenizer.decode(output[0][input_tokens["input_ids"].shape[1]:], skip_special_tokens=True) print(generated_text)
{'name': 'get_current_weather', 'arguments': {'location': 'Boston'}}
أكد هذا قدرة النموذج على إنشاء استدعاء الوظيفة الصحيح بناءً على المدينة المحددة.
يسمح Granite 3.0 بمواصفات التنسيق لتسهيل الاستجابات في التنسيقات المنظمة. يشرح هذا القسم استخدام [النطق] للاستجابات و[التفكير] للأفكار الداخلية.
من ناحية أخرى، نظرًا لأن استدعاء الوظائف يتم إخراجه كنص عادي، فقد يكون من الضروري تنفيذ آلية منفصلة للتمييز بين استدعاءات الوظائف والاستجابات النصية العادية.
إليك نموذج موجه لتوجيه مخرجات الذكاء الاصطناعي:
prompt = """You are a conversational AI assistant that deepens interactions by alternating between responses and inner thoughts.* Record spoken responses after the [UTTERANCE] tag and inner thoughts after the [THINK] tag. * Use [UTTERANCE] as a start marker to begin outputting an utterance. * After [THINK], describe your internal reasoning or strategy for the next response. This may include insights on the user's reaction, adjustments to improve interaction, or further goals to deepen the conversation. * Important: **Use [UTTERANCE] and [THINK] as a start signal without needing a closing tag.** Follow these instructions, alternating between [UTTERANCE] and [THINK] formats for responses. example> Please respond to the following user_input.Hello! What can you do? """
كود توليد الرد:
chat = [ { "role": "user", "content": prompt }, ] chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True) input_tokens = tokenizer(chat, return_tensors="pt").to("cuda") output = model.generate(**input_tokens, max_new_tokens=1024) generated_text = tokenizer.decode(output[0][input_tokens["input_ids"].shape[1]:], skip_special_tokens=True) print(generated_text)
النتيجة كالتالي:
[UTTERANCE]Hello! I'm here to provide information, answer questions, and assist with various tasks. I can help with a wide range of topics, from general knowledge to specific queries. How can I assist you today? [THINK]I've introduced my capabilities and offered assistance, setting the stage for the user to share their needs or ask questions.
تم استخدام علامتي [UTTERANCE] و[THINK] بنجاح، مما يسمح بتنسيق الاستجابة الفعال.
اعتمادًا على المطالبة، قد تظهر أحيانًا علامات الإغلاق (مثل [/UTTERANCE] أو [/THINK]) في الإخراج، ولكن بشكل عام، يمكن تحديد تنسيق الإخراج بشكل عام بنجاح.
دعونا نلقي نظرة أيضًا على كيفية إخراج استجابات البث.
يستخدم التعليمة البرمجية التالية مكتبات المزامنة والترابط لدفق الاستجابات بشكل غير متزامن من Granite 3.0.
import asyncio from threading import Thread from typing import AsyncIterator from transformers import ( AutoTokenizer, AutoModelForCausalLM, TextIteratorStreamer, ) device = "auto" model_path = "ibm-granite/granite-3.0-8b-instruct" tokenizer = AutoTokenizer.from_pretrained(model_path) model = AutoModelForCausalLM.from_pretrained(model_path, device_map=device) model.eval() async def generate(chat) -> AsyncIterator[str]: # Apply chat template and tokenize input chat = tokenizer.apply_chat_template(chat, tokenize=False, add_generation_prompt=True) input_tokens = tokenizer(chat, add_special_tokens=False, return_tensors="pt").to("cuda") # Set up the streamer streamer = TextIteratorStreamer( tokenizer, skip_prompt=True, skip_special_tokens=True, ) generation_kwargs = dict( **input_tokens, streamer=streamer, max_new_tokens=1024, ) # Generate response in a separate thread thread = Thread(target=model.generate, kwargs=generation_kwargs) thread.start() for output in streamer: if not output: continue await asyncio.sleep(0) yield output # Execute asynchronous generation in the main function async def main(): chat = [ { "role": "user", "content": "Please list one IBM Research laboratory located in the United States. You should only output its name and location." }, ] generator = generate(chat) async for output in generator: # Use async for to retrieve responses sequentially print(output, end="|") await main()
سيؤدي تشغيل الكود أعلاه إلى إنشاء استجابات غير متزامنة بالتنسيق التالي:
1. |IBM |Almaden |Research |Center |- |San |Jose, |California|
يوضح هذا المثال البث الناجح. يتم إنشاء كل رمز مميز بشكل غير متزامن ويتم عرضه بشكل تسلسلي، مما يسمح للمستخدمين بمشاهدة عملية الإنشاء في الوقت الفعلي.
يوفر Granite 3.0 استجابات قوية بشكل معقول حتى مع طراز 8B. تعمل أيضًا ميزات استدعاء الوظائف ومواصفات التنسيق بشكل جيد، مما يشير إلى إمكاناتها لمجموعة واسعة من التطبيقات.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3