Transformers documentation

Araç kullanımı

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Araç kullanımı

Chat modelleri genellikle “function-calling” veya “tool-use” desteğiyle eğitilir. Araçlar, kullanıcının sağladığı ve modelin yanıtının bir parçası olarak çağırmayı seçebileceği işlevlerdir. Örneğin, modeller, hesaplamayı içsel olarak yapmak zorunda kalmadan aritmetik işlemler gerçekleştirmek için bir hesap makinesi aracına erişebilir.

Bu kılavuz, araçların nasıl tanımlanacağını, bunların bir sohbet modeline nasıl geçirileceğini ve model bir aracı çağırdığında modelin çıktısının nasıl işleneceğini gösterecektir.

Araçların iletilmesi

Bir model araç kullanımını destekliyorsa, fonksiyonları apply_chat_template() içindeki tools argümanına iletin. Araçlar, JSON şeması veya Python fonksiyonları olarak iletilir. Python fonksiyonları iletirseniz, JSON şemasının otomatik olarak oluşturulabilmesi için argümanlar, argüman türleri ve fonksiyon docstring'i ayrıştırılır.

Python işlevlerini geçmek çok pratik olsa da, ayrıştırıcı yalnızca Google tarzı doküman dizelerini işleyebilir. Araç için hazır bir işlevin nasıl biçimlendirileceğine dair aşağıdaki örnekleri inceleyin.

def get_current_temperature(location: str, unit: str):
    """
    Get the current temperature at a location.

    Args:
        location: The location to get the temperature for, in the format "City, Country"
        unit: The unit to return the temperature in. (choices: ["celsius", "fahrenheit"])
    """
    return 22.  # A real function should probably actually get the temperature!

def get_current_wind_speed(location: str):
    """
    Get the current wind speed in km/h at a given location.

    Args:
        location: The location to get the wind speed for, in the format "City, Country"
    """
    return 6.  # A real function should probably actually get the wind speed!

tools = [get_current_temperature, get_current_wind_speed]

İsteğe bağlı olarak docstring'e bir Returns: bloğu ve fonksiyon başlığına bir dönüş tipi ekleyebilirsiniz, ancak çoğu model bu bilgiyi kullanmaz. Ayrıştırıcı, fonksiyonun içindeki gerçek kodu da yoksayar!

Asıl önemli olan, fonksiyonun adını, argüman adlarını, argüman türlerini ve fonksiyonun amacını ile argümanlarının amacını açıklayan docstring'dir. Bunlar, modelin aracı çağıp çağırmayacağına karar verirken kullanacağı “imzayı” oluşturur.

Araç Çağırma Örneği

Araç kullanımını destekleyen bir model ve tokenizer yükleyin, örneğin NousResearch/Hermes-2-Pro-Llama-3-8B; ancak donanımınız destekliyorsa Command-R ve Mixtral-8x22B gibi daha büyük modelleri de değerlendirebilirsiniz.

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

checkpoint = "NousResearch/Hermes-2-Pro-Llama-3-8B"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
model = AutoModelForCausalLM.from_pretrained(checkpoint, dtype="auto", device_map="auto")

Bir sohbet geçmişi oluşturun.

messages = [
  {"role": "system", "content": "You are a bot that responds to weather queries. You should reply with the unit used in the queried location."},
  {"role": "user", "content": "Hey, what's the temperature in Paris right now?"}
]

Ardından messages ve bir araç listesini apply_chat_template() işlevine iletin. Sohbeti belirteçlere ayırın ve bir yanıt üretin.

inputs = tokenizer.apply_chat_template(messages, tools=tools, add_generation_prompt=True, return_dict=True, return_tensors="pt")
outputs = model.generate(**inputs.to(model.device), max_new_tokens=128)
print(tokenizer.decode(outputs[0][len(inputs["input_ids"][0]):]))
<tool_call>
{"arguments": {"location": "Paris, France", "unit": "celsius"}, "name": "get_current_temperature"}
</tool_call><|im_end|>

Sohbet modeli, get_current_temperature aracını docstring'den doğru parametrelerle çağırdı. Paris'e dayanarak konumun Fransa olduğunu ve sıcaklık birimi olarak Celsius kullanması gerektiğini çıkardı.

Bir model aslında aracı kendisi çağıramaz. Model bir araç çağrısı ister ve çağrıyı işleyip onu ve sonucunu sohbet geçmişine eklemek sizin görevinizdir. yanıt ayrıştırma destekleyen modellerde yanıt ayrıştırma otomatik olarak ele alınır ve araç çağrısını çıkarmak için yalnızca parse_response() kullanabilirsiniz. Diğer modeller için çıktı dizgesini manuel olarak bir araç çağrısı sözlüğüne dönüştürmeniz gerekir.

Hangi yaklaşımı kullanırsanız kullanın, araç çağrısı bir assistant mesajının tool_calls anahtarında yer almalıdır. Bu, önerilen API'dir ve çoğu araç kullanan modelin sohbet şablonu tarafından desteklenmelidir.

tool_calls OpenAI API'ye benzer olsa da, OpenAI API tool_calls biçimi olarak bir JSON dizisi kullanır. Bu, bir dict bekleyen Transformers'ta kullanıldığında hatalara veya garip model davranışlarına yol açabilir.

tool_call = {"name": "get_current_temperature", "arguments": {"location": "Paris, France", "unit": "celsius"}}
messages.append({"role": "assistant", "tool_calls": [{"type": "function", "function": tool_call}]})

Araç yanıtını tool rolüyle sohbet geçmişine ekleyin.

messages.append({"role": "tool", "content": "22"})  # Note that the returned content is always a string!

Son olarak, modelin araç yanıtını okumasına ve kullanıcıya yanıt vermesine izin verin.

inputs = tokenizer.apply_chat_template(messages, tools=tools, add_generation_prompt=True, return_dict=True, return_tensors="pt")
out = model.generate(**inputs.to(model.device), max_new_tokens=128)
print(tokenizer.decode(out[0][len(inputs["input_ids"][0]):]))
The temperature in Paris, France right now is 22°C.<|im_end|>

Asistan mesajındaki anahtar tool_calls olarak adlandırılmış olsa da, çoğu durumda modeller bir seferde yalnızca tek bir araç çağrısı üretir. Bazı eski modeller aynı anda birden fazla araç çağrısı üretir, ancak bu, birden fazla araç yanıtını aynı anda işlemeniz ve genellikle araç çağrısı kimliklerini kullanarak bunları ayırt etmeniz gerektiği için çok daha karmaşık bir süreçtir. Bir modelin araç çağrıları için hangi biçimi beklediğini görmek için model kartına başvurun.

JSON şemaları

Araçları tanımlamanın bir başka yolu, bir JSON şeması geçirmektir.

Python işlevlerini JSON şemalarına dönüştüren düşük seviye işlevleri manuel olarak da çağırabilir ve ardından oluşturulan şemaları kontrol edebilir veya düzenleyebilirsiniz. Bu genellikle gerekli değildir, ancak altta yatan mekanizmayı anlamak için faydalıdır. Araç tanımlarını oluşturmak için JSON şemasına erişmesi gereken sohbet şablonu yazarları için özellikle önemlidir.

apply_chat_template() yöntemi, Python çağrılabilirlerini JSON şemasına dönüştürmek için get_json_schema işlevini kullanır. Bu, yöntemleri içerir: self ve cls, örtük alıcı argümanları olarak ele alınır ve yok sayılır.

Tip ipuçları, int, float, str ve bool gibi temel tipler, Literal veya Enum sınıfları (ikisi de izin verilen değerlerin bir enum’una dönüşür) ve bunları içeren list, tuple, dict ile Union tipleri olabilir. Dataclass veya Pydantic modelleri gibi diğer sınıflar, beklenen JSON’ın ne olduğu bilinemediği için bir argüman tipi olarak kullanıldıklarında hata verir. Aracınız bunlardan birine ihtiyaç duyuyorsa, JSON şemasını elle yazın ve bunun yerine onu iletin. Dönüş tipleri daha esnektir, çünkü model bunları asla üretmek zorunda değildir: dönüş tipi ipucu dönüştürülemezse, şemadan çıkarılır.

from transformers.utils import get_json_schema

def multiply(a: float, b: float):
    """
    A function that multiplies two numbers

    Args:
        a: The first number to multiply
        b: The second number to multiply
    """
    return a * b

schema = get_json_schema(multiply)
print(schema)
{
  "type": "function",
  "function": {
    "name": "multiply",
    "description": "A function that multiplies two numbers",
    "parameters": {
      "type": "object",
      "properties": {
        "a": {
          "type": "number",
          "description": "The first number to multiply"
        },
        "b": {
          "type": "number",
          "description": "The second number to multiply"
        }
      },
      "required": ["a", "b"]
    }
  }
}

JSON şemasının kendisinin detaylarına burada girmeyeceğiz, çünkü zaten başka yerlerde çok iyi belgelenmiş durumda. Ancak, Python fonksiyonları yerine JSON şeması sözlüklerini apply_chat_template() fonksiyonunun tools argümanına iletebileceğinizi belirtmek isteriz:

# A simple function that takes no arguments
current_time = {
  "type": "function",
  "function": {
    "name": "current_time",
    "description": "Get the current local time as a string.",
    "parameters": {
      'type': 'object',
      'properties': {}
    }
  }
}

# A more complete function that takes two numerical arguments
multiply = {
  'type': 'function',
  'function': {
    'name': 'multiply',
    'description': 'A function that multiplies two numbers',
    'parameters': {
      'type': 'object',
      'properties': {
        'a': {
          'type': 'number',
          'description': 'The first number to multiply'
        },
        'b': {
          'type': 'number', 'description': 'The second number to multiply'
        }
      },
      'required': ['a', 'b']
    }
  }
}

model_input = tokenizer.apply_chat_template(
    messages,
    tools = [current_time, multiply]
)
Update on GitHub