chat gpt的使用体验最近使用了一下chat gpt 3.5,发现它确实比较智能,和自己之前用过的很多AI等的对话能力差距很大。尤其是在查资料方面,速度非常快。比如我想查一个linux命令,只需要用对话的形式去命令它就可以了,目前速度还在自己能接受的范围,不需要开会员:
chat gpt的优势使用下来,chat gpt主要有这几个优势:
比市面上大多数AI更智能可以「联系上下文」来对话,每次对话不是独立的反应很快,几秒钟出结果特别是第二点,非常符合人类的对话习惯,与其他AI有比较明显的差距。测试下来,这个对话上下文一般只能保持前面几条,但正常使用是完全足够的。
chat gpt的劣势chat gpt也并不完美,他也有一些劣势。
答案不一定正确,尤其是比较冷门的内容国内用户访问不了,或者访问比较困难第1点我觉得比较致命,这个其实是chat-gpt的底层算法决定的,虽然还在不断地训练,但对于一些比较冷门的问题,训练数据和训练场景本来就很少,就可能出错。你可以理解为「你在和一个满嘴跑火车的人工智能对话」。比较严谨的问题还是不要直接采纳它的答案,比如我问它自己的open api如何传参才能保持上下文对话的能力,它就没答对,或者回答的是过期的答案。
尽管如此,它还是在一定程度上能提升自己搜索信息的效率,关键还很好玩,可惜目前使用chat-gpt的门槛还比较高,「需要科学上网,还需要用国外的手机号注册账号」。
所以我想了一个国内可以直接使用chat-gpt的方案,这样「自己的家人朋友可以低门槛使用chat-gpt,也可以让自己的国内app接入世界上最顶级的AI引擎」。
官方web端chat gpt的问题chat-gpt官方提供了一个web端的聊天窗口:https://chat.openai.com/chat。这个网页需要科学上网+账号登录才能打开,所以本身有一定的使用门槛。
我自己使用官方web端,碰到的另一个问题是经常会断开连接,需要刷新网页才能继续使用,不知道是不是我浏览器设置的原因。且这个断开的频率非常高,基本上几分钟不用就断开了。我问chat gpt怎么解决,它也没给我一个好的解决方案,大概就是浏览器清缓存或者换浏览器之类的。
如何在国内使用chat gpt下面介绍一下如何搭建一个在国内就可以使用chat gpt的方案,不用科学上网和账号。
这个方案「还是需要科学上网和账号」的,但是可以分享给其他人使用,相当于降低了其他人使用的门槛,也可以集成在自己的应用程序里,让自己的应用具有chat gpt AI对话的能力。
大概的方案是这样:
1 注册一个账号首先还是需要自己去注册一个账号,自己不怕折腾的话,大概「0.5美金」就可以注册一个账号,网上有很多注册教程,这里就不细讲了,但是「需要科学上网」。如果怕折腾,直接淘宝、抖音买一个,大概20~30 RMB的样子。
2 生成一个api-key有了账号后,登录open ai 的个人中心,可以看到一个生成api-key的地方。
拿到这个API key后,就可以根据open ai的官方文档去发送对话请求了,文档是http形式的,所以用postman就能试。官方提供了nodejs和python的sdk,社区也有go、Java等sdk。
3 购买一个海外服务器如果自己没有在国内网络直接使用chat-gpt的需求,在上一步就可以结束了,剩下的就是自己去官网玩或者集成进自己的应用。
但如果有「在国内网络使用chat-gpt的需求」,需要使用一个国内可访问的海外服务器作为跳板。这个服务器可以放在香港、日本、韩国、新加坡等,这样延迟会低一些。
aws可以用信用卡(具有外币功能的)免费申请一年的海外服务器,学生身份也可以免费使用一年,大家可以尝试使用。
->PS: 信用卡或者学生身份都没有的,可以去淘宝看看,说不定有惊喜。
<-4 搭建一个中转服务接下来就是搭建一个http中转服务,放在海外服务器上了。简单的做法是直接用一个nginx代理,但我这里用golang写了一个中转服务,主要出于以下考虑:
想要网络传输的内容少一点,这样更快一点,上下文信息存储在中转服务上没弄https,又不想自己的open ai key暴露,所以key只放在了中转服务器上国内客户端想集成在各种应用上,API参数尽可能简单点,在中转服务器做了一层包装我这里使用了open ai的go社区sdk,代码大概是这样,比较简单,就一个文件:
package main
import (
"context"
"encoding/json"
"fmt"
"io"
"net/http"
"github.com/sashabaranov/go-openai"
)
var client = openai.NewClient("xxxxx")
var messages = make([]openai.ChatCompletionMessage, 0)
const HttpKey = "xxxxx"
type RobotReq struct {
Key string `json:"key"`
Input string `json:"input"`
}
type RobotRes struct {
Output string `json:"output"`
}
func main() {
// 一个http接口
http.HandleFunc("/chat", func(w http.ResponseWriter, r *http.Request) {
if r.Method != "POST" {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
// 读取请求的body数据
body, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "Unable to read request body", http.StatusBadRequest)
return
}
req := &RobotReq{}
err = json.Unmarshal(body, req)
if err != nil {
fmt.Println("json序列化失败")
return
}
// 校验一下密码
key := req.Key
if key == "" {
fmt.Println("key is empty")
w.WriteHeader(http.StatusBadRequest)
return
}
if key != HttpKey {
fmt.Println("key is wrong")
w.WriteHeader(http.StatusBadRequest)
return
}
input := req.Input
if input == "" {
fmt.Println("input is empty")
w.WriteHeader(http.StatusBadRequest)
return
}
messages = append(messages, openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleUser,
Content: input,
})
resp, err := client.CreateChatCompletion(
context.Background(),
openai.ChatCompletionRequest{
Model: openai.GPT3Dot5Turbo,
Messages: messages,
},
)
if err != nil {
_ = fmt.Errorf("chat gpt client error")
messages = make([]openai.ChatCompletionMessage, 0)
return
}
messages = append(messages, openai.ChatCompletionMessage{
Role: openai.ChatMessageRoleAssistant,
Content: resp.Choices[0].Message.Content,
})
// 如果messages的长度大于20,就删除前两个元素
if len(messages) > 20 {
messages = messages[2:]
}
_, err = w.Write([]byte(resp.Choices[0].Message.Content))
if err != nil {
_ = fmt.Errorf("write error")
return
}
})
err := http.ListenAndServe(":8080", nil)
if err != nil {
_ = fmt.Errorf("http listen error")
return
}
}
把中转服务部署好后,理论上应该也可以使用http来访问:
5 搭建国内可访问的客户端接下来就是搭建一个国内可访问的客户端,因为我家人朋友不会使用postman,所以需要有一个更友好的入口。本来打算集成钉钉、飞书机器人的,但是时间上比较紧,没来得及研究,所以先用低码平台搭建了一个网
页版本的,后面有时间集成到自己的微信公众号吧,反正前面的链路都搭建好了,只搭客户端,还是比较快的。
网页版的效果大概是这样,也具有上下文对话的能力:
这里我用的是appsmith来搭建的。有需要的朋友可以私聊我导出搭建数据,自己搭一个也很快。
注意事项如何实现上下文?open ai的open api有过几次更新,如何在请求中实现上下文,比较麻烦,我也是查了比较久才弄对。
理论上来讲,需要有一个地方来存储上下文。最开始open ai是存在他们自己的服务器上的,通过session_id来维护这个上下文。
后来可能是觉得这样做稳定性和性能太差,也比较吃他们自己的资源,所以改成了客户端自己存,然后每次调用通过参数把历史上下文传过去的方式。这种方式网络开销比较大,但是对open ai自己来说,服务器的存储压力和复杂性可能会降低很多。
最新实现聊天上下文的能力,应该是把历史对话都放进请求的messages字段里。需要注意整个请求的4kb大小的限制。所以我自己的golang代码中,只会保留最近20条对话,包括自己的话和机器人返回的话。
如何实现多线程聊天?chat gpt官方web端可以实现多线程聊天。其实核心也就
是每个上下文分开存储。我这里没来得及实现这个功能,但是大概的思路还是比较简单的,后面有时间再实现一下。具体的思路是:用一个map来存储对话线程和聊天上下文的关系:
// 这里的key可以是session_id或者user_name之类的
var chatMap = make(map[string][]openai.ChatCompletionMessage
AI场景畅想chat gpt的热度一直不减(印象中圈内大概火了一个月了,甚至已经出圈了)。后面几年AIGC可能有很多不错的机会。
在翻看open ai的open api官方文档的时候,发现他们家不止是有chat gpt这一款产品,还有语音转文字、生成图片等等能力,后面有机会都玩玩看。
我理想中的AI世界是这样的:我有一个智能设备(可能是手表、眼睛、或者耳机什么的),然后可以通过语音、图像识别快速像AI提问,然后它可以快速返回这个问题的答案,并用语音、视频的方式说出来。
未来,人类很有可能大规模使用AI来辅助自己工作和决策。
目前看来,这样的世界并不遥远。甚至现在的技术就已经可以做到了,已经有人把天猫精灵和小爱同学集成进chat-gpt了。随着网络的不断升级、AI模型的不断升级,这个场景很有可能会在未来几年内实现。