GPT3聊天机器人Shiny APP

  GPT3模型已经开放了通过API访问生成文本的功能,这样可以把GPT3类型的自然语言预训练大模型的能力集成进自己的应用系统中,提供自然语言AI处理的能力,比如客服与咨询等,如果在训练语料中加入专业领域的语料,比如大量的行业法律法规与案例或场景处理等,可以把行业客服与咨询机器人的水平直接从智障一级提升到智能一级,应用前景还是很广的,因此同类技术的在研平台可以参考。这个技术框架下,AI是智障还是智能,取决于它训练的语料,在这一点上,母语科技公司还是有非常大的优势的。
  GPT3模型官方目前提供了Python与Node.js两种API SDK,开源社区提供了R、Java、C#等各种语言的API SDK,具体可以参阅OpenAI的官方文档。Node.js用于在浏览器网页中直接通过Javascript来调用,本篇用Python API,通过R语言的Shiny APP来封装对它的调用。参考的是OpenAI Playground上的chat例子
  需要注意测是GPT3与ChatGPT是两个不同的大模型,虽然它们的技术框架与基础相同,但训练的语料与优化的方向不同,GPT3面向多领域在预测准确性上进行优化,ChatGPT面向聊天进行优化,OpenAI官方说ChatGPT的API很快也会开放提供。

GPT3聊天机器人例子

  最近在开两会,不能访问OpenAI API的服务端口了,所以这个APP只是在笔记本上演示的开发版本。云端Linux服务器上虽然也部署了,不过暂时是用不了的。
GPT3聊天机器人Shiny APP聊天示例

  下面看看它具体的实现。
1、ChatGPT.py。Python API访问OpenAI API的脚本,在Shiny APP中调用。

import openai
# 郑重提示:纯粹技术研究,请在法律法规范围内谨慎受控使用,勿用于违法用途,责任自负。
# 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服务器上要修改为脚本存放的相应路径。

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",
                  "最大输出单词数:",
                  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的调用,维持用户对话的上下文,放入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现在还没有提供维持对话上下文的API,所以对话上下文的实现实际上是把整个对话的上下文拼接成字符串,整个作为输入,后续的版本大概会提供维持上下文功能的API吧。
  这个简单的例子也展示了R与Python如何像人的左手和右手一样,互相配合,共同完成一个让人印象深刻的任务,他们真的是可以互相成就的。Shiny 浏览器界面的好处是,大屏小屏通用,程序写一次就可以了,不禁让人回想起了互联网刚开始普及的年代,大家在浏览器网络聊天室里热聊的情景,20年过去,Cyber空间已经沧海桑田。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,755评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,305评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,138评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,791评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,794评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,631评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,362评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,264评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,724评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,900评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,040评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,742评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,364评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,944评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,060评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,247评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,979评论 2 355

推荐阅读更多精彩内容