admin管理员组

文章数量:1130349

聊一聊如何开发 ChatGPT的聊天应用


个人一直想做一个个人用的ChatGPT聊天应用,Github上倒是一大堆开源项目,也能够快速部署使用。但是总归有一个痛点——技术栈不完全吻合,改起来费事儿。能够用的网站担心不安全,盗用openai_key什么的,再有的网站限制了每天的问题次数,需要充值,收费等等…原因,我还是下定决心自己做一个个人专属的ChatGPT应用网站。

废话不多说,先剖析一下作成这样一个网站要解决哪些技术难点?

事前探究

  • Openai key哪里找?

可以去淘宝上进行购买现成的Key,个人觉得还比较划算。

  • 国内无法使用Openai key怎么办?
  1. 翻墙
    这部分个人不太推荐,毕竟翻墙是违法的,而且大部分VPN应用都有站点想,而且不是特别稳定。
  2. 国外服务器搭建代理服务器,然后国内使用代理服务器访问
    这种方式我尝试了香港云服务器的Squid正向代理,但是几经周折都没成功,很遗憾只能放弃。
  3. 国外服务器 + 开发后台Openai中转服务
    前两种方式可能不太适合我吧,于是乎开始了中转openai服务的程序开发的探索。
  • 如何开发Openai中转服务?用什么进行开发?

使用python的fastapi库充当后台server,rquests库构筑oepani请求获取结果并不做任何处理返回给前端。至于为什么不用 openai库,第一个是由于官方维护老是出现新版本opeani库不兼容旧版的问题,第二也是因为自己构筑请求相关的参数,相对透明,可控性比较高。说白了就是openai调用失败了,你可能都不知道为什么,所以为什么不使用requests库自主去构建呢?

  • 如何转发官方的提供的steam模式的接口?
    两种方式:

1、使用官方提供的openai库

# 请求封装实体
class AskRequest(BaseModel):
    max_tokens: int = Field(default=2048)
    messages: list
    model: str = Field(default="gpt-3.5-turbo")
    stream: bool = Field(default=False)
    temperature: float = Field(default=0.7)
    top_p: float = Field(default=0.8)

# JSON格式封装
def chat(ask_req: AskRequest):
    try:
        # LangChainのstreamはコールバック周りが複雑な印象なので一旦openaiをそのまま使う
        response = openai.ChatCompletion.create(
            # model=query_data.model,
            model=ask_req.model,
            # SSEを使うための設定
            stream=False,
            messages=ask_req.messages,
            temperature=ask_req.temperature,
            top_p=ask_req.top_p,
            max_tokens=ask_req.max_tokens
        )
        return response
    except:
        return {
   
   
            "code": 500,
            "data": traceback.format_exc()
        }
# 流式封装
async def chat_stream(ask_req: AskRequest):
    try:
        # LangChainのstreamはコールバック周りが複雑な印象なので一旦openaiをそのまま使う
        response = openai.ChatCompletion.create(
            # model=query_data.model,
            model=ask_req.model,
            # SSEを使うための設定
            stream=True,
            messages=ask_req.messages,
            temperature=ask_req.temperature,
            top_p=ask_req.top_p,
            max_tokens=ask_req.max_tokens
        )
        for item in response:
            yield {
   
   "data": item}
    except:
        yield {
   
   "data": traceback.format_exc()}
    yield {
   
   "data": "[DONE]"}

# 请求转发接口
@app.post("/v1/chat/completions")
async def ask_stream(request: Request, ask_req: AskRequest):
    try:
        if ask_req.stream:
            

聊一聊如何开发 ChatGPT的聊天应用


个人一直想做一个个人用的ChatGPT聊天应用,Github上倒是一大堆开源项目,也能够快速部署使用。但是总归有一个痛点——技术栈不完全吻合,改起来费事儿。能够用的网站担心不安全,盗用openai_key什么的,再有的网站限制了每天的问题次数,需要充值,收费等等…原因,我还是下定决心自己做一个个人专属的ChatGPT应用网站。

废话不多说,先剖析一下作成这样一个网站要解决哪些技术难点?

事前探究

  • Openai key哪里找?

可以去淘宝上进行购买现成的Key,个人觉得还比较划算。

  • 国内无法使用Openai key怎么办?
  1. 翻墙
    这部分个人不太推荐,毕竟翻墙是违法的,而且大部分VPN应用都有站点想,而且不是特别稳定。
  2. 国外服务器搭建代理服务器,然后国内使用代理服务器访问
    这种方式我尝试了香港云服务器的Squid正向代理,但是几经周折都没成功,很遗憾只能放弃。
  3. 国外服务器 + 开发后台Openai中转服务
    前两种方式可能不太适合我吧,于是乎开始了中转openai服务的程序开发的探索。
  • 如何开发Openai中转服务?用什么进行开发?

使用python的fastapi库充当后台server,rquests库构筑oepani请求获取结果并不做任何处理返回给前端。至于为什么不用 openai库,第一个是由于官方维护老是出现新版本opeani库不兼容旧版的问题,第二也是因为自己构筑请求相关的参数,相对透明,可控性比较高。说白了就是openai调用失败了,你可能都不知道为什么,所以为什么不使用requests库自主去构建呢?

  • 如何转发官方的提供的steam模式的接口?
    两种方式:

1、使用官方提供的openai库

# 请求封装实体
class AskRequest(BaseModel):
    max_tokens: int = Field(default=2048)
    messages: list
    model: str = Field(default="gpt-3.5-turbo")
    stream: bool = Field(default=False)
    temperature: float = Field(default=0.7)
    top_p: float = Field(default=0.8)

# JSON格式封装
def chat(ask_req: AskRequest):
    try:
        # LangChainのstreamはコールバック周りが複雑な印象なので一旦openaiをそのまま使う
        response = openai.ChatCompletion.create(
            # model=query_data.model,
            model=ask_req.model,
            # SSEを使うための設定
            stream=False,
            messages=ask_req.messages,
            temperature=ask_req.temperature,
            top_p=ask_req.top_p,
            max_tokens=ask_req.max_tokens
        )
        return response
    except:
        return {
   
   
            "code": 500,
            "data": traceback.format_exc()
        }
# 流式封装
async def chat_stream(ask_req: AskRequest):
    try:
        # LangChainのstreamはコールバック周りが複雑な印象なので一旦openaiをそのまま使う
        response = openai.ChatCompletion.create(
            # model=query_data.model,
            model=ask_req.model,
            # SSEを使うための設定
            stream=True,
            messages=ask_req.messages,
            temperature=ask_req.temperature,
            top_p=ask_req.top_p,
            max_tokens=ask_req.max_tokens
        )
        for item in response:
            yield {
   
   "data": item}
    except:
        yield {
   
   "data": traceback.format_exc()}
    yield {
   
   "data": "[DONE]"}

# 请求转发接口
@app.post("/v1/chat/completions")
async def ask_stream(request: Request, ask_req: AskRequest):
    try:
        if ask_req.stream:
            

本文标签: 聊一聊ChatGpt