在R中调用OpenAI Chat Completion报错:如何定位修复?
问题定位与修复方案
问题根源分析
- 逻辑判断错误:报错
'length = 3' in coercion to 'logical(1)'是因为你在处理API返回结果时使用了||运算符,该运算符要求左右两侧必须是长度为1的逻辑值,但你的代码中is.na(output)或!is.character(output)返回了长度为3的向量,导致类型转换失败。 - 错误捕获范围不足:你的
tryCatch仅包裹了POST请求本身,但错误发生在请求成功后的结果解析阶段,因此无法捕获到该错误。 - 语法参数错误:
POST的顶层参数stop = none是无效写法——none不是R的合法对象,且OpenAI API的stop参数应放在请求体(body列表)中。
修复步骤与完整代码
1. 修正POST请求参数
将stop参数移至body列表内,使用合法值(NULL表示不设置停止序列,或根据需求指定字符向量)。
2. 扩展错误捕获范围
将API请求、状态码检查、结果解析的完整流程都放入tryCatch,确保所有阶段的错误都能被捕获。
3. 修正逻辑判断的向量处理
使用any()和all()函数将向量转换为长度为1的逻辑值,适配||运算符的要求。
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)' # 修复后的处理逻辑 chatGPT_response <- tryCatch( expr = { # 发送API请求 resp <- POST( url = "https://api.openai.com/v1/chat/completions", add_headers(Authorization = paste("Bearer", chatGPT_API)), content_type_json(), encode = "json", body = list( model = "gpt-3.5-turbo", temperature = 0, stop = NULL, # 可根据需求改为c("\n")等停止序列 messages = list( list(role = "user", content = article), list(role = "system", content = system_task) ) ) ) # 检查HTTP请求是否成功 if (http_error(resp)) { stop("API请求失败,状态码: ", status_code(resp)) } # 解析返回内容 parsed_content <- content(resp, "parsed") output <- parsed_content$choices[[1]]$message$content # 修正逻辑判断:确保返回长度为1的逻辑值 if (any(is.na(output)) || !all(is.character(output))) { stop("返回内容格式异常") } # 返回处理后的结果 output }, error = function(e) { message(sprintf("处理文章时出错: %s", e$message)) return(NA_character_) }, warning = function(w) { message(sprintf("处理文章时收到警告: %s", w$message)) return(NA_character_) } )
额外优化建议
- 若批量处理文章列表,可使用
purrr::safely或purrr::possibly简化错误处理,避免重复编写tryCatch。 - 添加请求延迟(如
Sys.sleep(1)),避免触发OpenAI API的速率限制。
内容的提问来源于stack exchange,提问作者Jazz
相关产品推荐
相关产品推荐

