Search code examples
ropenai-apichatgpt-apigpt-3

openai API in R: Error in chat completion - how to locate the issue?


I'm trying to classify a large number of newspaper articles with the OpenAI API's chat completion function in R. Usually, it works quite well but with a number of articles, I get an error that I don't understand.

This is the error I get:

Error in is.na(output) || !is.character(output) :
'length = 3' in coercion to 'logical(1)'

One example is:

# libraries loaded at that moment
library(tidyverse)
library(httr)
library(tidytext)
library(purrr)

system_task <- "You will be provided one article per prompt by the Austrian Newspaper Der Standard. The article is written in German. Each prompt only contains one article. All of these mention the justice system (or actors in the justice system such as Staatsanwalt, WKSta, Richter or Gericht) or the Austrian Constitutional Court (called VfGH or Verfassungsgerichtshof). We want you to take multiple steps for each of these articles: 1) Summarize the article in 3 sentences.  Answer this question with the prefix '1)'. 2) Does the article mention that politicians critisize the judiciary or the VfGH? Answer this question with the prefix '2)'.3) Does the article mention that politicians attack the judiciary or the VfGH?  Answer this question with the prefix '3)' 4) If 2) or 3) is answered with yes: Who is criticized or attacked by whom, name the actors. Remember that we are not interested in conflict between politicians, only between politicians and the judiciary. Answer this question with the prefix '4)'"

article <- 'In der Adventzeit rücken Armut, Flucht, Krankheit und Obdachlosigkeit vermehrt in den Fokus der Öffentlichkeit. Nicht nur in der Weihnachtsgeschichte geht es um Armut, Flucht, Krankheit und Obdachlosigkeit. Im Advent rücken diese Themen wiederholt in das Blickfeld der Öffentlichkeit, denn für viele Familien ist Weihnachten aus finanziellen und gesundheitlichen Gründen keine besinnliche Zeit. Rund 140.000 Menschen in Österreich könnten ihre Wohnung nicht ausreichend heizen. Das sagte Caritas-Präsident Michael Landau am Sonntagvormittag in der ORF-"Pressestunde". Das Ziel der neuen Regierung müsse sein, Kinderarmut und Altersarmut zu senken. Landau hatte der türkis-blauen Regierung während der vergangenen Legislaturperiode eine "Demontage" des Sozialstaats vorgeworfen. Im ORF-Studio betonte er wiederholt seine "Erleichterung" über den Entscheid des Verfassungsgerichtshofs, die Kernpunkte der neuen Sozialhilfe von Türkis-Blau zu kippen. Die Höchstrichter hatten am Dienstag sowohl die starken Kürzungen für kinderreiche Familien als auch für Menschen mit schlechten Deutsch- oder Englischkenntnissen gekippt. "Die Mindestsicherung muss Armut vermeiden", sagte Landau. Eine Kürzung der Familienzuschläge auf 44 Euro ab dem dritten Kind – wie in der neuen Sozialhilfe von Türkis-Blau vorgesehen – "entspricht nicht der Lebenswirklichkeit von Menschen". Alleinerzieherinnen und kinderreiche, einkommensschwache Familien seien sowieso schon "in besonderer Weise armutsgefährdet". Die VfGH-Entscheidung sei eine Chance, Landau plädiert für eine Neuregelung unter Einbindung der Praktiker und Hilfsorganisationen. Auch im Pflegebereich brauche man dringend neue Lösungen. Die vorige Bundesregierung habe völlig zu Recht erkannt, dass dieses Thema viele Menschen berühre. Österreich ist pflegebedürftig, so Landau – er hoffe auf die neue Regierung, egal wie sie aussehe. Es brauche einen vergleichbaren Qualitäts-, Versorgungs- und Finanzierungsrahmen. Der Zugang zur Pflege müsse für alle flächendeckend leistbar sein und es brauche auch Anstrengungen, damit sich Menschen für den Pflegeberuf entscheiden. Die Zahl der pflegebedürftigen Menschen in Österreich ist gestiegen, damit haben sich laut Statistik Austria auch die Kosten für die Betreuung kräftig erhöht. Die Pflegekosten des Staats sind seit 2013 um ein Drittel angestiegen, zeigen aktuelle Zahlen. 13.000 Menschen mehr als im Vorjahr waren in Heimen und Pflegehäusern untergebracht. Bei den Hausbesuchen durch Pflegefachkräfte war der Anstieg geringer. Neben dem Plus der älteren, pflegebedürftigen Menschen habe sich aber auch die Abschaffung des Pflegeregress ausgewirkt. Sozialministerin Brigitte Zarfl hatte im November zwei Studien zur Zukunft der Pflege in Österreich präsentiert. Die Zahlen deuteten auf einen bevorstehenden Personalmangel hin. (red, 22.12.2019)'

expr <- POST(
      # API Link
      url = "https://api.openai.com/v1/chat/completions",
      # Authorizatiob
      add_headers(Authorization = paste("Bearer", chatGPT_API)),
      # output in json
      content_type_json(),
      # encode the value to json format
      encode = "json",
      # low randomness of answers
      temperature = 0,
      stop = none,
      # Controlling what to show as the output
      body = list(
        model = "gpt-3.5-turbo",
        messages = list(list(role = "user", content = article),
                        list(role = "system", content = system_task))))

Does anyone have the idea where the issue might lie and how to fix it?

I tried wrapping it in a tryCatch but that didn't work either:

chatGPT_response <- tryCatch(
    
    # Try to retrieve answer for OpenAI API
    expr = {
      POST(
      # API Link
      url = "https://api.openai.com/v1/chat/completions",
      # Authorizatiob
      add_headers(Authorization = paste("Bearer", chatGPT_API)),
      # output in json
      content_type_json(),
      # encode the value to json format
      encode = "json",
      # low randomness of answers
      temperature = 0,
      stop = none,
      # Controlling what to show as the output
      body = list(
        model = "gpt-3.5-turbo",
         messages = list(list(role = "user", content = article),
                        list(role = "system", content = system_task)
                        )))
      },
    # In case an error occurs while using API
    error = function(e){
      message(paste("For article there was an error."))
      return(NA)
    },
    # Notify about a possible warning while using API
    warning = function(w){
      message(paste("For article there was a warning."))
    }
  )

Solution

  • What helped in the end was to switch to the openai package.

    library(tidyverse)
    library(openai)
    library(tidytext)
    library(purrr)
    
    system_task <- "You will be provided one article per prompt by the Austrian Newspaper Der Standard. The article is written in German. Each prompt only contains one article. All of these mention the justice system (or actors in the justice system such as Staatsanwalt, WKSta, Richter or Gericht) or the Austrian Constitutional Court (called VfGH or Verfassungsgerichtshof). We want you to take multiple steps for each of these articles: 1) Summarize the article in 3 sentences.  Answer this question with the prefix '1)'. 2) Does the article mention that politicians critisize the judiciary or the VfGH? Answer this question with the prefix '2)'.3) Does the article mention that politicians attack the judiciary or the VfGH?  Answer this question with the prefix '3)' 4) If 2) or 3) is answered with yes: Who is criticized or attacked by whom, name the actors. Remember that we are not interested in conflict between politicians, only between politicians and the judiciary. Answer this question with the prefix '4)'"
    
    article <- 'In der Adventzeit rücken Armut, Flucht, Krankheit und Obdachlosigkeit vermehrt in den Fokus der Öffentlichkeit. Nicht nur in der Weihnachtsgeschichte geht es um Armut, Flucht, Krankheit und Obdachlosigkeit. Im Advent rücken diese Themen wiederholt in das Blickfeld der Öffentlichkeit, denn für viele Familien ist Weihnachten aus finanziellen und gesundheitlichen Gründen keine besinnliche Zeit. Rund 140.000 Menschen in Österreich könnten ihre Wohnung nicht ausreichend heizen. Das sagte Caritas-Präsident Michael Landau am Sonntagvormittag in der ORF-"Pressestunde". Das Ziel der neuen Regierung müsse sein, Kinderarmut und Altersarmut zu senken. Landau hatte der türkis-blauen Regierung während der vergangenen Legislaturperiode eine "Demontage" des Sozialstaats vorgeworfen. Im ORF-Studio betonte er wiederholt seine "Erleichterung" über den Entscheid des Verfassungsgerichtshofs, die Kernpunkte der neuen Sozialhilfe von Türkis-Blau zu kippen. Die Höchstrichter hatten am Dienstag sowohl die starken Kürzungen für kinderreiche Familien als auch für Menschen mit schlechten Deutsch- oder Englischkenntnissen gekippt. "Die Mindestsicherung muss Armut vermeiden", sagte Landau. Eine Kürzung der Familienzuschläge auf 44 Euro ab dem dritten Kind – wie in der neuen Sozialhilfe von Türkis-Blau vorgesehen – "entspricht nicht der Lebenswirklichkeit von Menschen". Alleinerzieherinnen und kinderreiche, einkommensschwache Familien seien sowieso schon "in besonderer Weise armutsgefährdet". Die VfGH-Entscheidung sei eine Chance, Landau plädiert für eine Neuregelung unter Einbindung der Praktiker und Hilfsorganisationen. Auch im Pflegebereich brauche man dringend neue Lösungen. Die vorige Bundesregierung habe völlig zu Recht erkannt, dass dieses Thema viele Menschen berühre. Österreich ist pflegebedürftig, so Landau – er hoffe auf die neue Regierung, egal wie sie aussehe. Es brauche einen vergleichbaren Qualitäts-, Versorgungs- und Finanzierungsrahmen. Der Zugang zur Pflege müsse für alle flächendeckend leistbar sein und es brauche auch Anstrengungen, damit sich Menschen für den Pflegeberuf entscheiden. Die Zahl der pflegebedürftigen Menschen in Österreich ist gestiegen, damit haben sich laut Statistik Austria auch die Kosten für die Betreuung kräftig erhöht. Die Pflegekosten des Staats sind seit 2013 um ein Drittel angestiegen, zeigen aktuelle Zahlen. 13.000 Menschen mehr als im Vorjahr waren in Heimen und Pflegehäusern untergebracht. Bei den Hausbesuchen durch Pflegefachkräfte war der Anstieg geringer. Neben dem Plus der älteren, pflegebedürftigen Menschen habe sich aber auch die Abschaffung des Pflegeregress ausgewirkt. Sozialministerin Brigitte Zarfl hatte im November zwei Studien zur Zukunft der Pflege in Österreich präsentiert. Die Zahlen deuteten auf einen bevorstehenden Personalmangel hin. (red, 22.12.2019)'
    
    gpt_response <- create_chat_completion(
                model = "gpt-3.5-turbo",
                messages = list(
                  list(
                    "role" = "system",
                    "content" = system_task
                  ),
                  list(
                    "role" = "user",
                    "content" = article
                  )
                )
              )
    
    response_text <- gpt_response |> 
          pluck('choices') |> 
          pull(message.content)