OpenAI Function Calling

· Funktionen

 Ähnlich wie die Chat-Completions-API unterstützt auch die Assistants-API Function Calling. Mit Function Calling kannst du der Assistants-API Funktionen beschreiben und bekommst intelligent zurückgeliefert, welche Funktionen mit welchen Argumenten aufgerufen werden müssen.

In diesem Beispiel erstellen wir einen Wetter-Assistenten und definieren zwei Funktionen, get_current_temperature und get_rain_probability, als Werkzeuge, die der Assistant aufrufen kann. In unserem Beispiel mit parallelem Function Calling fragen wir den Assistant, wie das Wetter heute in San Francisco ist und wie hoch die Regenwahrscheinlichkeit ist. Außerdem zeigen wir, wie sich die Antwort des Assistants per Streaming ausgeben lässt.

Beim Erstellen deines Assistants definierst du die Funktionen zuerst unter dem Tools-Parameter des Assistants. 

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; 

Schritt 2: Einen Thread erstellen und Messages hinzufügen

Erstelle einen Thread, sobald ein Nutzer ein Gespräch beginnt, und füge dem Thread Messages hinzu, sobald der Nutzer Fragen stellt. 

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;  

Schritt 3: OnFunctionCall-Ereignis behandeln

Wenn die Komponente erkennt, dass ein Funktionsparameter-Wert benötigt wird, wird das Ereignis OnFunctionCall aufgerufen. Über den Parameter Request._Function erfährst du die Details der Anfrage, und mit Response.Output sendest du die Antwort. 

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-Demo

Unten findest du die für Windows kompilierte Delphi-Demo.