实现ChatGPT的逐字输出

1,023 阅读1分钟

前言

通过API进行交互,使用JavaScript等编程语言发起HTTP请求来实现逐字输出。 一次性请求等待整个响应体完全返回,然后再进行逐字输出。这可能会导致较长的等待时间,特别是在生成大量文本时。

为了实现更快的逐字输出,可以使用fetch流式获取响应数据,采用异步方式,逐块获取响应数据并逐字输出。这可以通过读取响应的数据流来实现。

代码实现

以下是一个基本的示例,展示了如何使用JavaScript中的fetch函数与GPT-3 API进行交互,实现逐字输出到文本框。

<!DOCTYPE html>
<html>
<head>
    <title>异步逐字输出示例</title>
</head>
<body>
    <div id="output"></div>

    <script>
        const apiKey = 'YOUR_OPENAI_API_KEY'; // 替换为您的OpenAI API密钥
        const prompt = "Once upon a time"; // 您的生成提示

        async function fetchGeneratedText(prompt) {
            const response = await fetch('https://api.openai.com/v1/engines/davinci-codex/completions', {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                    'Authorization': `Bearer ${apiKey}`
                },
                body: JSON.stringify({
                    prompt: prompt,
                    max_tokens: 1
                })
            });

            const reader = response.body.getReader();
            let generatedText = '';

            while (true) {
                const { done, value } = await reader.read();

                if (done) {
                    break;
                }

                generatedText += new TextDecoder().decode(value);
                const outputDiv = document.getElementById('output');
                outputDiv.textContent = generatedText;
            }
        }

        // 开始异步逐字输出
        fetchGeneratedText(prompt);
    </script>
</body>
</html>

小结

在这个示例中,fetchGeneratedText函数通过读取响应数据流的方式来实现逐块获取生成的文本。每次读取一块数据后,将数据解码并将逐块生成的文本逐字显示在界面上。这样可以避免等待整个响应体返回,从而实现更快的逐字输出。 response.body.getReader()获取一个流读取器,通过read()函数完成调用,使用new TextDecoder()创建文本解码器,进行解码文本。示例代码是通过ChatGPT生成的。

来源声明:用于记录学习心得整理总结,内容非原创。