openAi ChatGPT调用性能优化的一些小妙招

Posted 九日王朝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了openAi ChatGPT调用性能优化的一些小妙招相关的知识,希望对你有一定的参考价值。

参考的demo:GitHub - ddiu8081/chatgpt-demo: A demo repo based on OpenAI API.

扭曲调教:

openai提供的chat接口(https://api.openai.com/v1/chat/completions)由于其模型很大(什么1750亿个参数啥的),单次http请求很难完成处理,一些常用的做法是采取流返回的方式,一个字一个字往外蹦,然后一点一点渲染,例如demo里的代码:

export const parseOpenAIStream = (rawResponse: Response) => 
  const encoder = new TextEncoder()
  const decoder = new TextDecoder()
  if (!rawResponse.ok) 
    return new Response(rawResponse.body, 
      status: rawResponse.status,
      statusText: rawResponse.statusText,
    )
  

  const stream = new ReadableStream(
    async start(controller) 
      const streamParser = (event: ParsedEvent | ReconnectInterval) => 
        if (event.type === 'event') 
          const data = event.data
          if (data === '[DONE]') 
            controller.close()
            return
          
          try 
            // response = 
            //   id: 'chatcmpl-6pULPSegWhFgi0XQ1DtgA3zTa1WR6',
            //   object: 'chat.completion.chunk',
            //   created: 1677729391,
            //   model: 'gpt-3.5-turbo-0301',
            //   choices: [
            //      delta:  content: '你' , index: 0, finish_reason: null 
            //   ],
            // 
            const json = JSON.parse(data)
            const text = json.choices[0].delta?.content || ''
            const queue = encoder.encode(text)
            controller.enqueue(queue)
           catch (e) 
            controller.error(e)
          
        
      

      const parser = createParser(streamParser)
      for await (const chunk of rawResponse.body as any)
        parser.feed(decoder.decode(chunk))
    ,
  )

  return new Response(stream)

类似于这样的处理方式。

但流传输不一定适用于所有的业务,若将stream改成false,那么接口响应多半会超时。

因此需要一些优化的策略:

一、降智

选用低能一些的模型,不过我尝试了gpt3的模型,一概不说人话

而/v1/completions的接口里只有 text-davinci-003还可以接受

 说明一下/v1/completions和v1/chat/completions的区别,/v1/chat/completions是传一个数组messages来完成上下文关联,而/v1/completions传的是一个字符串prompt参数,不过依然可以通过追加的方式,使其回答具有上下文关联性。

不过!! text-davinci-003​​​​​​​费用是turbo的10倍!!!!!!!

​​​​​​​这是决对不能接受的!!!

二、降低temperature参数

这个会有轻量的影响,如果你并不需要每次相同的问题都要回答不同的答案,那么可以降低此值,甚至可以降为0

三、优化返回长度 

这个会影响最大,亲测最有效,在问题前面追加回答设置,例如,回答不要超过100字,请简洁的回答下列问题等。会最大程度的降低返回时间,因为接口是按调用词数和返回词数计费的(ChatGPT(GPT3.5)官方API模型名称为“gpt-3.5-turbo”和“gpt-3.5-turbo-0301”。API调用价格比GPT text-davinci-003模型便宜10倍。调用费用为0.002美元/1000tokens,折合下来差不多0.1元4000~5000字。这个字数包括问题和返回结果字数。),所以chatgpt保持着能多bb尽量多bb的原则,少让他多bb点还可以省钱。

 

注意,参数里的max_tokens没必要设置,因为他只会无脑切割, 如果设置低了超过原本的输出答案,回答会不完整。

微信小程序_调用openAi搭建虚拟伙伴聊天

微信小程序_调用openAi搭建虚拟伙伴聊天

背景

从2022年的年底,网上都是chagpt的传说,个人理解这个chatgpt是模型优化训练,我们在用chatgpt的时候就在优化这个模型,这个是付费的,换言之,我们都是chagpt的韭菜,OpenAI 是一个研究组织,chagpt是他们的一个产品工具。
带着好奇心做了个小程序的聊天页面。

效果

像个机器人聊天

关于账号注册

由于国内电话不支持绑定openAi的邮箱,需要虚拟号码激活具体步骤网上都有教程

接口实现

8行python搞定

install openai,获取apiKey,调用即可向openai发送请求

def getOpenAiText(request):
    if request.method == 'GET':
        text = request.GET.get('text', default='')
        responseText = openai.Completion.create(
            model="text-davinci-003",
            prompt=text,
            max_tokens=100,
            temperature=0
        )
        return JsonResponse("data": responseText, "code": 200,"msg":'success')
    return JsonResponse("data": , "code": 0,"msg":'not allowed')

小程序实现

设计思路:灵感来源微信对话框模式一对一
只需要设计数据结构为
[
question:‘’,
answer:‘’,
isEdit:false
]
可以显示问答的状态
在添加一个currentIndex标识编辑的状态,遍历数字显示,加上时间绑定即可实现,
缓存采用storage。

页面结构

<view class="container-future">
  <view class="form-container-api">
    <view>
      <button style="width: 100%;" type="primary" formType="submit">openai调用</button>
    </view>
    <view class="chat-container">
      <view wx:for=" chatObjConfig.option " wx:for-index="index" wx:for-item="item" wx:key="index">
        <view class="form-request">
          <view wx:if="item.isEdit">问:$ <input bindinput="bindKeyInput" placeholder="输入关键词" data-column-index="index" disabled="isLoading" /></view> 
          <view wx:else class='questioned'>
          <view>
            问:$ item.question
          </view>
          </view>
        </view>
        <view class="form-response">
          
          <view class='questioned'>openai回答:$ item.answer</view>
        </view>
      </view>
    </view>
    <view class="form-submit">
      <button style="width: 100%;" type="primary" bindtap="search" loading="isLoading" disabled="isLoading">发送</button>
    </view>
  </view>
  <view class="loading" wx:if="isLoading">
    <view class="loader-child" />
    <view class="loader-child" />
    <view class="loader-child" />
  </view>
</view>

数据逻辑

// pages/future/future.js
const app = getApp();
const baseUrl = app.remoteConfig.baseUrl;
Component(

  /**
  * 继承父级样式
  */
  options: 
    addGlobalClass: true,
  ,
  /**
   *组件的初始数据
   */
  data: 
    searchOpenAiText:'',
    responseText:'',
    // questions,answer,index
    chatObjConfig:
      option:[
        question:'',
        answer:'',
        isEdit:true
      ],
      currentIndex:0
    
  ,
  lifetimes: 
    // 生命周期函数,可以为函数,或一个在 methods 段中定义的方法名
    attached: function () 
      if(wx.getStorageSync('openAiOptions'))
        this.setData(
          
            chatObjConfig:wx.getStorageSync('openAiOptions')
          
        )
      
    ,
    moved: function ()  ,
    detached: function () 
      wx.setStorageSync('openAiOptions', this.data.chatObjConfig)
    ,
  ,

  methods: 
    bindKeyInput(e) 
      const columnIndex=e.currentTarget.dataset
      console.log('this.data.chatObjConfig',this.data.chatObjConfig)
      const option=this.data.chatObjConfig.option
      option.some((item,index)=>
        if(columnIndex===index)
          item.question=e.detail.value
          item.isEdit=true
          return true
        
        return false
      )
      this.setData(
        searchOpenAiText:e.detail.value,
        chatObjConfig:
          option:option,
          currentIndex:columnIndex
        
      )
    ,
    search(e)
      console.log(this.data.searchOpenAiText)
      if(!this.data.searchOpenAiText)
        wx.showModal(
          cancelColor: 'cancelColor',
          title:'请输入!'
        )
      
      wx.showLoading(
        title: '加载中',
      )
      this.setData(
        isLoading: true
      )
      console.log(e)
      const path = '/common-api/searchOpenAiText/'
      const headers =  'Content-Type': 'application/json;charset=UTF-8' 
      const params=
        "text":this.data.searchOpenAiText
      
      const thisBack=this
      return new Promise((resolve, reject) => 
        wx.request(
          url: baseUrl + path,
          headers: headers,
          data:params,
          method: 'GET',
          success: (res) => 
            console.log(res,'res')
            const data=res.data.data
            const option=thisBack.data.chatObjConfig.option
            const currentIndex=thisBack.data.chatObjConfig.currentIndex
            const choices=data.choices
            console.log('choices',choices)
            option.some((item,index)=>
              if(currentIndex===index)
                item.answer=choices?choices.map(choicesItem=>return choicesItem.text).join('\\n'):'。。。未知'
                item.isEdit=false
                return true
              
              return false
            )
            const chatObjConfig=
              option:option,
              currentIndex:currentIndex+1
            
            option.push(
              question:'',
              answer:'',
              isEdit:true
            )
            thisBack.setData(
              
                isLoading: false,
                chatObjConfig:chatObjConfig
              
            )
            setTimeout(function () 
              wx.hideLoading()
            , 2000)
            resolve(res)
          ,
          fail: error => 
            thisBack.setData(
              isLoading: false
            )
            setTimeout(function () 
              wx.hideLoading()
            , 2000)
            reject(error)
          
        );
      )
    
  
)

结速

最后我的小程序:yma16
欢迎大家访问!

以上是关于openAi ChatGPT调用性能优化的一些小妙招的主要内容,如果未能解决你的问题,请参考以下文章

微信小程序_调用openAi搭建虚拟伙伴聊天

.net中最简单的http请求调用(比如调用chatgpt的openAI接口)

chatGPT:12.12 之后更新的 chatGPT 的本地部署和接口调用,解决 response 403 (无法连接openai服务器)问题

ChatGPT(GPT3.5) OpenAI官方API正式发布

ChatGPT没有API?OpenAI官方API带你起飞

经验分享-如何使用http调用chatGPT-3.5-turbo模型API