1
dayudayupao 2023-04-11 15:33:20 +08:00
学习一下 sse ,gpt 官网就是用这个做的打字机效果的
|
2
jethroX 2023-04-11 15:41:11 +08:00
可以问:Objective-C 如何实现 SSE 流式接收数据?
我试了下,能给出代码,但是我不知道实际运行起来是否可行。 我在接入的时候,实际上都会让 GPT 帮我写一部分代码。 |
3
ByteCat 2023-04-11 15:41:17 +08:00
了解一下 SSE ,如果你做服务端也可以转成 WebSocket 之类的来传,这样调用更方便一点,因为 SSE 规范只能用 GET 不能用 POST ,很多库没实现,要自己动手
|
4
chuhades 2023-04-11 15:41:30 +08:00
Objective-C 能够实现流式接收和逐字输出的效果。你可以使用 NSURLSession 来实现这一功能。以下是一个简单的示例,展示了如何使用 Objective-C 流式接收数据并逐字输出:
``` #import <Foundation/Foundation.h> @interface StreamDemo : NSObject <NSURLSessionDataDelegate> @property (nonatomic, strong) NSMutableData *receivedData; @end @implementation StreamDemo - (instancetype)init { self = [super init]; if (self) { _receivedData = [[NSMutableData alloc] init]; } return self; } - (void)startStreamingRequest { NSString *urlString = @"https://api.openai.com/v1/chat/completions?stream=true"; NSURL *url = [NSURL URLWithString:urlString]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; [request setHTTPMethod:@"POST"]; // 设置请求头信息 [request setValue:@"your-api-key" forHTTPHeaderField:@"Authorization"]; [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; // 设置请求体信息 NSDictionary *body = @{@"model": @"text-davinci-002", @"prompt": @"Your prompt here", @"max_tokens": @30}; NSError *error; NSData *bodyData = [NSJSONSerialization dataWithJSONObject:body options:0 error:&error]; if (error) { NSLog(@"Error creating request body: %@", error); return; } [request setHTTPBody:bodyData]; NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil]; NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request]; [dataTask resume]; } #pragma mark - NSURLSessionDataDelegate - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { [self.receivedData appendData:data]; // 在这里实现逐字输出的逻辑 NSString *receivedString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; NSLog(@"Received Data: %@", receivedString); } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if (error) { NSLog(@"Error: %@", error); } else { NSLog(@"Request completed successfully"); } } @end int main(int argc, const char * argv[]) { @autoreleasepool { StreamDemo *streamDemo = [[StreamDemo alloc] init]; [streamDemo startStreamingRequest]; // 等待请求完成 [[NSRunLoop currentRunLoop] run]; } return 0; } ``` 请注意,这个示例仅用于演示目的,你需要根据你的需求对其进行调整。在实际应用中,你可能需要将这个代码与你的 iOS 项目结合起来,实现逐字输出到前端界面。 |
5
churchill 2023-04-11 15:46:51 +08:00
说到底不就是一个长连接吗
这些人被 AI 替代属实不冤 |
8
brader OP @ByteCat 我当然了解 SSE 啊。。。不然我服务端怎么实现了接入 chatgpt 的 sse 格式的流响应,还把结果解析出来了,问题是前端不了解啊。。。他实现不出来,就说做不了
|
9
Alias4ck 2023-04-11 16:09:00 +08:00
|
11
jethroX 2023-04-11 17:28:25 +08:00
@ByteCat 这你就错了,我看了 ChatGPT 的请求,他就是用的 post 还有负载数据。我这边用的微软开源的一个 js sse 请求器。叫:@microsoft/fetch-event-source
|
12
ByteCat 2023-04-11 19:49:13 +08:00
@jethroX 是啊,我指的就是 OpenAI stream 不是规范的 SSE ,不能用原生的 EventSource 获取数据,因为只支持 GET ,微软或者第三方实现的「可能」会支持比如 POST 的用法,但这个也可以自己实现,SSE 本身数据格式就比较简单。
|
13
linhey 2023-04-11 21:39:16 +08:00
我这个库支持流式输出和 Tokenizer 估算
https://github.com/AxApp/OpenAI |
14
brader OP |
15
jethroX 2023-04-12 10:22:45 +08:00
@brader 那你的客户端没有和你的服务端流式传输?还是说用的 websocket 。如果是等着服务端获取完了消息再返回,那也太慢了吧。
|
16
brader OP |
17
Ansen678 2023-04-12 13:00:38 +08:00
ios 跟服务器进行 websoket 连接,服务器去请求 chatgpt
|