← 返回文章

搭建 chatgpt 过程

搭建 chatgpt 的过程中,有很多知识需要学习,很多技巧需要学习。

搭建 chatgpt 过程

搭建 chatgpt 的过程中,有很多知识需要学习,很多技巧需要学习。

流式响应

前两天,实现了一个 chatgpt 的 demo ,其中最令他们诟病的就是,响应速度慢,如果能像 chatgpt 网页那样,逐字打印就好了。

所以,改进第一点,页面上实现打字机效果的逐字打印。

后端

在 golang 后端上,有幸在 github 上找到了一个人封装了 openAI 的接口,提供了流式响应的方法。

package main

import (
	"context"
	"errors"
	"fmt"
	"io"
	openai "github.com/sashabaranov/go-openai"
)

func main() {
	c := openai.NewClient("your token")
	ctx := context.Background()

	req := openai.ChatCompletionRequest{
		Model:     openai.GPT3Dot5Turbo,
		MaxTokens: 20,
		Messages: []openai.ChatCompletionMessage{
			{
				Role:    openai.ChatMessageRoleUser,
				Content: "Lorem ipsum",
			},
		},
		Stream: true,
	}
	stream, err := c.CreateChatCompletionStream(ctx, req)
	if err != nil {
		fmt.Printf("ChatCompletionStream error: %v\n", err)
		return
	}
	defer stream.Close()

	fmt.Printf("Stream response: ")
	for {
		response, err := stream.Recv()
		if errors.Is(err, io.EOF) {
			fmt.Println("\nStream finished")
			return
		}

		if err != nil {
			fmt.Printf("\nStream error: %v\n", err)
			return
		}

		fmt.Printf(response.Choices[0].Delta.Content)
	}
}

很有意思,等有空了,要看看代码实现,它是如何实现这一效果的。

我用上了,但是有个问题,在国内,是无法连接到 openai 的,显然,报错也显示无法与 openAi 的地址进行连接。

我抬起头,看到墙,我悟了。需要加代理。 浏览器的代理,我会加。但 golang 编译出来的 二进制 咋加代理。

网上一顿搜,终于给我找到了,在 创建 http 的 client 时,是可以添加代理的,因此,我修改了 github.com/sashabaranov/go-openai 的代码。在它创建 http 的 client 的时候,嵌入了 proxy 的配置。


func DefaultConfig(authToken string) ClientConfig {

	u, _ := url.Parse("htttp://127.0.0.1:7890")
	t := &http.Transport{
		MaxIdleConns:    10,
		MaxConnsPerHost: 10,
		IdleConnTimeout: time.Duration(10) * time.Second,
		//Proxy: http.ProxyURL(url),
		Proxy: http.ProxyURL(u),
	}

	return ClientConfig{
		HTTPClient: &http.Client{Transport: t},
		BaseURL:    apiURLv1,
		OrgID:      "",
		authToken:  authToken,

		EmptyMessagesLimit: defaultEmptyMessagesLimit,
	}
}

其中,核心也还没仔细看,大致一看,就是创建了一个 transport ,在其中加入了 代理,transport 是做什么的来着?明天得去看看、

总之,这样,就能与 openai 通信了。再接下来,就是搞前端了,有点头疼。明天见