GPT3聊天機器人Shiny APP

??GPT3模型已經(jīng)開放了通過API訪問生成文本的功能,這樣可以把GPT3類型的自然語言預(yù)訓(xùn)練大模型的能力集成進自己的應(yīng)用系統(tǒng)中,提供自然語言AI處理的能力,比如客服與咨詢等,如果在訓(xùn)練語料中加入專業(yè)領(lǐng)域的語料,比如大量的行業(yè)法律法規(guī)與案例或場景處理等,可以把行業(yè)客服與咨詢機器人的水平直接從智障一級提升到智能一級,應(yīng)用前景還是很廣的,因此同類技術(shù)的在研平臺可以參考。這個技術(shù)框架下,AI是智障還是智能,取決于它訓(xùn)練的語料,在這一點上,母語科技公司還是有非常大的優(yōu)勢的。
??GPT3模型官方目前提供了Python與Node.js兩種API SDK,開源社區(qū)提供了R、Java、C#等各種語言的API SDK,具體可以參閱OpenAI的官方文檔。Node.js用于在瀏覽器網(wǎng)頁中直接通過Javascript來調(diào)用,本篇用Python API,通過R語言的Shiny APP來封裝對它的調(diào)用。參考的是OpenAI Playground上的chat例子。
??需要注意測是GPT3與ChatGPT是兩個不同的大模型,雖然它們的技術(shù)框架與基礎(chǔ)相同,但訓(xùn)練的語料與優(yōu)化的方向不同,GPT3面向多領(lǐng)域在預(yù)測準(zhǔn)確性上進行優(yōu)化,ChatGPT面向聊天進行優(yōu)化,OpenAI官方說ChatGPT的API很快也會開放提供。

GPT3聊天機器人例子

??最近在開兩會,不能訪問OpenAI API的服務(wù)端口了,所以這個APP只是在筆記本上演示的開發(fā)版本。云端Linux服務(wù)器上雖然也部署了,不過暫時是用不了的。
GPT3聊天機器人Shiny APP聊天示例

??下面看看它具體的實現(xiàn)。
1、ChatGPT.py。Python API訪問OpenAI API的腳本,在Shiny APP中調(diào)用。

import openai
# 鄭重提示:純粹技術(shù)研究,請在法律法規(guī)范圍內(nèi)謹(jǐn)慎受控使用,勿用于違法用途,責(zé)任自負(fù)。
# Setup proxy for accessing OpenAI API server through VPN on Linux if it is needed.
# Need to down grade urllib3 to older version when access through VPN.
# pip install urllib3==1.25.11
import os
os.environ['http_proxy']="http://127.0.0.1:7890"
os.environ['https_proxy']="http://127.0.0.1:7890"

openai.api_key = 'Your OpenAI Access Key'

start_sequence = "\nAI: "
restart_sequence = "\nHuman: "

def CallAPI(prompt, tokens):
    response = openai.Completion.create(
      model="text-davinci-003",
      prompt=prompt,
      temperature=0.9,
      max_tokens=tokens,
      top_p=1,
      frequency_penalty=0,
      presence_penalty=0.6,
      stop=[" Human:", " AI:"]
    )
    return response["choices"][0]["text"]

??使用之前要先按安裝OpenAI API的Python接口軟件包。

pip install openai

??下面是Shiny APP的幾個文件。
2、global.R。加載上面的Python腳本以提供對OpenAI API的訪問。Linux服務(wù)器上要修改為腳本存放的相應(yīng)路徑。

library(reticulate)
library(stringr)

# Load OpenAI API
print(getwd())
path<- "C:/Users/Jean/Documents/Python Scripts/OpenAI/ChatGPT.py"
print(path)
source_python(path)

3、ui.R,定義了聊天機器人的UI界面。

fluidPage(
  sidebarLayout(
    # Sidebar 
    sidebarPanel(
      # Application title
      tags$h3("GPT-3 聊天機器人"),
      sliderInput("tokens",
                  "最大輸出單詞數(shù):",
                  min = 1000,  max = 5000, value = 500),
      checkboxInput("ifContext","是否包括上下文:", value = TRUE),
      actionButton("clearContext", "清除上下文", class = "btn-cleear"),
      # 1/6
      # width = 2
    ),
    # Main 
    mainPanel(
      textAreaInput("context","對話記錄",width="100%", rows =20, resize="vertical", value =""),  
      # 插入javascript,禁止自己修改 context textAreaInput
      tags$script(HTML("
        var context = document.getElementById('context');
        context.readOnly = true;
      ")),
      tags$h6(" "),
      textAreaInput("prompt","輸入:",width="100%", rows =2, resize="vertical", value =""),  
      actionButton("sendout", "提交", class = "btn-success"),
      # 5/6
      # width = 10
    )
  )
)

4、server.R,在Shiny Server端處理對OpenAI的調(diào)用,維持用戶對話的上下文,放入session用戶變量中。另外在問題和回答前加上對話雙方身份提示的前綴。

function(input, output, session) {
  
  tokens<- reactive({
    input$tokens
  })
  
  ifContext<- reactive({
    input$ifContext
  })
  
  prompt<- reactive({
    paste("Human: ",input$prompt, sep='')
  })
  
  observeEvent(input$clearContext,{
    session$userData$context<- ""
    updateTextAreaInput(session, "context", value = session$userData$context)
  })
  
  observeEvent(input$sendout,{
    if(ifContext() && ! is.null(session$userData$context)){
      session$userData$context<- paste(session$userData$context,prompt(),sep="\n\n")
    } else{
      session$userData$context<- prompt()
    }
    # Show notification while querying.
    id <- showNotification("正在詢問GPT-3...", duration = NULL, closeButton = FALSE)
    on.exit(removeNotification(id), add = TRUE)
    response<- CallAPI(session$userData$context, tokens())
    index<-str_locate(response,":")
    response<-str_sub(response,index[1]+1,str_length(response))
    response<-paste("AI:",response,sep='')
    session$userData$context<- paste(session$userData$context, response, sep="\n")
    updateTextAreaInput(session, "context", value = session$userData$context)
    updateTextAreaInput(session, "prompt", value = "")
  })
  
}

??That's all, 一共不到100行代碼,是不是很簡單呢?
??需要注意的是OpenAI API現(xiàn)在還沒有提供維持對話上下文的API,所以對話上下文的實現(xiàn)實際上是把整個對話的上下文拼接成字符串,整個作為輸入,后續(xù)的版本大概會提供維持上下文功能的API吧。
??這個簡單的例子也展示了R與Python如何像人的左手和右手一樣,互相配合,共同完成一個讓人印象深刻的任務(wù),他們真的是可以互相成就的。Shiny 瀏覽器界面的好處是,大屏小屏通用,程序?qū)懸淮尉涂梢粤耍唤屓嘶叵肫鹆嘶ヂ?lián)網(wǎng)剛開始普及的年代,大家在瀏覽器網(wǎng)絡(luò)聊天室里熱聊的情景,20年過去,Cyber空間已經(jīng)滄海桑田。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容