我試圖在向 GPT3 open ai 端點發出發布請求后顯示回應。
這是一個示例 JSON 回應:
{
"id": "cmpl-4R7o3DcLSOGjjWHs5CrKXecNAoRDL",
"object": "text_completion",
"created": 1642370211,
"model": "davinci:2020-05-03",
"choices": [
{
"text": "\n\nA neutron star is a star that is so dense that it has collapsed into a sphere.\n\nA neutron star is the collapsed core of a massive supergiant star, which had a total mass of between 10 and 25 solar masses, possibly more if the star was especially metal-rich",
"index": 0,
"logprobs": null,
"finish_reason": "length"
}
]
}
我特別想顯示回應的文本。為此,我根據https://app.quicktype.io/為普通型別回傳的內容創建了兩個結構。
struct Response: Codable, Identifiable{
var id = String()
var model = String()
var choices: [Choice]
}
struct Choice: Codable{
var finish_reason = String()
var index = Int()
var text = String()
}
然后我創建了一個類來呼叫端點,解碼 JSON 并通過完成處理程式回傳資料:
class GPT3TextComepletion: ObservableObject{
@Published var response = Response.self
func textCompletion(promptText:String, completion:@escaping (Response) -> ()) {
let token = "redacted"
let url = URL(string: "https://api.openai.com/v1/engines/davinci/completions")!
// prepare json data
var json: [String: Any] = [
"temperature": 0.7,
"max_tokens": 60,
"top_p": 1.0,
"frequency_penalty": 0,
"presence_penalty": 0]
json["prompt"] = promptText
let jsonData = try? JSONSerialization.data(withJSONObject: json)
// create post request
var request = URLRequest(url: url)
request.httpMethod = "POST"
// insert json data to the request
request.httpBody = jsonData
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
request.addValue("application/json", forHTTPHeaderField: "Accept")
request.setValue( "Bearer \(token)", forHTTPHeaderField: "Authorization")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
guard let data = data, error == nil else {
print(error?.localizedDescription ?? "No data")
return
}
let response = try! JSONDecoder().decode(Response.self, from: data)
let choice = response.choices
print(choice)
DispatchQueue.main.async {
completion(response)
}
}
task.resume()
}
}
我可以通過以下方式訪問不在選擇陣列中的任何資料,即模型:
@State var response: Response? = nil
Button(action: {GPT3TextComepletion().textCompletion(promptText: prompt, completion: {(response) in self.response = response })})
Text(response?.model ?? "some data")
但是我無法從選擇結構中訪問資料(我可以列印資料但不顯示它)。我收到的錯誤是:
Initializer 'init(_:)' requires that 'Choice' conform to 'StringProtocol'
由于 Choice 結構是一個陣列,我嘗試對其進行迭代但沒有成功或訪問陣列的第三個元素:
Text(response!.choices[2])
如果有人可以提供幫助,我想顯示選擇結構中的資料(特別是文本變數)。
謝謝!
uj5u.com熱心網友回復:
Text(response!.choices[2])
此行回傳一個不能表示字串的 Choice 結構。您需要更深入地訪問它的文本屬性。
Text(response!.choices[2].text)
我假設您為了示例的緣故已經硬編碼并強制解包。否則請遵循安全編碼實踐:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/421120.html
標籤:
