OpenAI Function Calling

· Özellikler

 Chat Completions API'sine benzer şekilde, Assistants API de function calling'i destekler. Function calling, Assistants API'sine işlevleri tanımlamanıza ve onun, çağrılması gereken işlevleri argümanlarıyla birlikte akıllıca döndürmesini sağlamanıza olanak tanır.

Bu örnekte, bir hava durumu asistanı oluşturacağız ve Asistanın çağırabileceği araçlar olarak get_current_temperature ve get_rain_probability adında iki işlev tanımlayacağız. Paralel function calling kullanan örneğimizde, Asistana San Francisco'da bugün havanın nasıl olduğunu ve yağmur olasılığını soracağız. Ayrıca Asistanın yanıtının akışla nasıl çıktılanacağını da gösteriyoruz.

Asistanınızı oluştururken, önce işlevleri asistanın tools parametresi altında tanımlayacaksınız. 

Assistant := TsgcAIOpenAIAssistant.Create(nil);
Assistant.OpenAIOptions.ApiKey := 'sk-askdjfalskdjfl23kjkjasdefasdfj';
Assistant.AssistantOptions.Name := 'Delphi Weather Bot';
Assistant.AssistantOptions.Instructions.Text := 'You are a weather bot. Use the provided functions to answer questions.';
Assistant.AssistantOptions.Model := 'gpt-4o';
Assistant.AssistantOptions.Tools.Functions.Enabled := False;
Assistant.AssistantOptions.Tools.Functions.Functions.Text := '[{"type":"function","function":{"name":"get_current_temperature","description":"Get the current temperature for a specific location","parameters":{"type":"object","properties":{"location":{"type":"string","description":"The city and state, e.g., San Francisco, CA"},"unit":{"type":"string","enum":["Celsius","Fahrenheit"],"description":"The temperature unit to use. Infer this from the user location."}},"required":["location","unit"]}}},{"type":"function","function":{"name":"get_rain_probability","description":"Get the probability of rain for a specific location","parameters":{"type":"object","properties":{"location":{"type":"string","description":"The city and state, e.g., San Francisco, CA"}},"required":["location"]}}}]'
Assistant.AssistantOptions.Tools.FileSearch.Enabled := False;
Assistant.AssistantOptions.Tools.CodeInterpreter.Enabled := False; 

Adım 2: Bir Thread oluşturun ve Mesajlar ekleyin

Bir kullanıcı konuşma başlattığında bir Thread oluşturun ve kullanıcı soru sordukça Thread'e Mesajlar ekleyin. 

procedure SendMessage()
var
  i: Integer;
  oMessage: TsgcOpenAIClass_Message;
  oMessages: TsgcOpenAIClass_Response_List_Messages;
  oRun: TsgcOpenAIClass_Run;
begin
  DoLog('[user]: ' + memoMessage.Lines.Text);
  Screen.Cursor := crHourGlass;
  Try
    oMessage := Assistant.CreateMessageText('thread_id', 'What is the weather in San Francisco today and the likelihood it will rain?');
    if Assigned(oMessage) then
    begin
      oRun := Assistant.CreateRunAndWait('thread_id');
      if Assigned(oRun) then
      begin
        oMessages := Assistant.GetMessages('thread_id', oRun.Id);
        if Assigned(oMessages) and (Length(oMessages.Messages) > 0) then
        begin
          memoMessage.Lines.Text := '';
          for i := 0 to Length(oMessages.Messages) - 1 do
            DoLog('[assistant]: ' + DoFormatResponse(oMessages.Messages[i]
              .ContentText + #13#10));
        end;
      end;
    end;
  Finally
    Screen.Cursor := crDefault;
  End;
end;  

Adım 3: OnFunctionCall Olayını İşleyin

Bileşen bir işlev parametre değerinin gerekli olduğunu algıladığında, OnFunctionCall olayı çağrılır. İstek ayrıntılarını öğrenmek için Request._Function parametresini, yanıtı göndermek için Response.Output'u kullanın. 

procedure TFRMOpenAIAssistant.AssistantFunctionCall(Sender: TObject;
  const aRequest: TsgcOpenAIClass_ToolCall;
  const aResponse: TsgcHTTPOpenAI_ToolCall_Response);
begin
  if aRequest._Function._Name = 'get_current_temperature' then
    aResponse.Output := 30
  else if aRequest._Function._Name = 'get_rain_probability' then
    aResponse.Output := 10;
end; 
});

Delphi Demosu

Windows için derlenmiş delphi demosunu aşağıda bulabilirsiniz.