Use la tecnología SSE para llamar a la interfaz OPENAI y realizar la salida de transmisión, implementada en lenguaje PHP

Como proveedor de servicios de modelo de lenguaje de IA, OpenAI proporciona una serie de interfaces API, a la mayoría de las cuales se debe acceder a través de solicitudes HTTP. Para grandes cantidades de solicitudes de datos, las solicitudes sincrónicas tradicionales ralentizarán la respuesta de la red y no podrán satisfacer las necesidades de procesamiento y análisis de datos en tiempo real. Por lo tanto, para optimizar la eficiencia de las llamadas de estas interfaces, podemos usar la tecnología SSE (Eventos enviados por el servidor) para realizar la transmisión de salida, garantizar que los datos puedan llegar al cliente en tiempo real y mejorar la eficiencia del procesamiento de datos.

En el lenguaje PHP, podemos usar bibliotecas de herramientas como la biblioteca GuzzleHttp y la biblioteca ReactPHP para realizar la salida de llamada y transmisión de la interfaz API de OpenAI a través de la tecnología SSE. La siguiente es la implementación del código específico:

use GuzzleHttp\Client;
use GuzzleHttp\Event\CompleteEvent;
use GuzzleHttp\Event\MessageCompleteEvent;
use GuzzleHttp\Message\Response;
use GuzzleHttp\Stream\Stream;
use React\EventLoop\Factory as EventLoopFactory;
use React\EventLoop\LoopInterface;

$openaiAccessToken = 'YOUR_OPENAI_ACCESS_TOKEN'; // 请替换为真实的 Access Token,可以去chat.xingtupai.com获取

function openaiApiRequestWithSse($query): void
{
    global $openaiAccessToken;

    $loop = EventLoopFactory::create();
    $client = new Client();
    $request = $client->createRequest('POST', 'https://api.openai.com/v1/engines/davinci-codex/completions');
    $request->setHeader('Content-Type', 'application/json');
    $request->setHeader('Authorization', "Bearer {$openaiAccessToken}");
    $request->setBody(Stream::factory(json_encode($query)));

    $client->send($request)->then(function (Response $response) use ($loop) {
        echo 'data: ';

        $stream = $response->getBody()->detach();
        stream_set_blocking($stream, false);

        $loop->addReadStream($stream, function ($stream, LoopInterface $loop) {
            $data = '';

            while ($buffer = fgets($stream, 2048)) {
                $event = new MessageCompleteEvent(
                    new CompleteEvent(),
                    $response = new Response(200),
                    Stream::factory($buffer)
                );

                $data .= $buffer;

                if (strpos($buffer, "\n\n") !== false) {
                    $loop->removeReadStream($stream);

                    $event->response = new Response(200, [], Stream::factory($data));

                    echo $data . PHP_EOL;
                    break;
                }
            }
        });
    });

    $loop->run();
}

Expliquemos el código anterior en detalle. Primero, inicializamos un cliente HTTP Guzzle y luego creamos una solicitud de API OpenAI. A continuación, configuramos el encabezado de solicitud Autorización en la solicitud y pasamos el token de acceso proporcionado por OpenAI para asegurarnos de que tenemos derechos de acceso a la API. Luego, serializamos la condición de consulta JSON en el cuerpo de la solicitud y configuramos el cuerpo de la solicitud como una cadena JSON serializada para las solicitudes posteriores.

Luego, enviamos la solicitud y procesamos el flujo de respuesta de OpenAI. Tenga en cuenta que aquí configuramos el monitoreo de eventos para el flujo de respuesta para analizar los resultados de la respuesta y lograr una salida de transmisión. Específicamente, llamamos al método addReadStream de EventLoop para pasar el flujo de respuesta de OpenAI y los parámetros de la función de monitoreo del flujo de respuesta al bucle de eventos. En el ciclo de eventos, obtenemos los datos en el flujo de respuesta y los leemos línea por línea a través del ciclo y la función fgets. Luego usamos un ciclo while para juzgar si los datos leídos contienen dos caracteres de nueva línea.Si los datos contienen dos caracteres de nueva línea, significa que la sección actual de datos ha sido leída y se forma un resultado de datos completo. Entonces, llamamos al método removeReadStream de EventLoop para eliminar el oyente actual del flujo de respuesta del bucle de eventos. Finalmente, mostramos el resultado de los datos de respuesta actuales.

A través de la implementación del código anterior, podemos realizar fácilmente llamadas SSE a la interfaz API de OpenAI, realizar una salida de transmisión y mejorar de manera efectiva la eficiencia del procesamiento de datos.
 

Supongo que te gusta

Origin blog.csdn.net/weixin_58881595/article/details/130246714
Recomendado
Clasificación