草庐IT

为在线客服系统接入chatGPT(四):chatGPT接口vue网页版,可以联系上下文语境,可以实现自己的chatGPT,附代码

唯一在线客服系统-开发技术笔记 2023-03-28 原文

如果想实现chatGPT的网页版,调用接口就可以了,但是如果需要联系上下文语境,就需要在传递的数据的时候进行下拼接

传参的时候对所有的对话数据进行拼接,拼成下面这样

{"prompt":"(You:在吗\n)这里在哦,有什么可以帮助你的吗?(You:你这个系统多少钱\n)抱歉,您想知道什么?这里是客服中心,不提供价格咨询服务哦。(You:在哪咨询价格\n)可以您联系我们的销售团队,他们会给您提供更多的产品价格咨询服务。(You:联系方式发一下\n)您可以通过电话或网络咨询,我们的客服热线是000-888-888,网站是Http://www.example.com 。(You:错的\n)很抱歉由于我们尽力提供精确和准确的信息,但如果有错误出现了,非常抱歉。请您及时联系我们,我们会尽快纠正这个错误,感谢您的反馈。(You:你是机器人吗\n)(You:你是机器人吗\n)","max_tokens":2048,"model":"text-davinci-003"}

 

(You:数据) 这是我们输入的内容,后面接上返回的内容,效果如图所示

 

 

 

 

具体详细代码:

<template>
    <div class="chatAppBody">
        <div class="chatTitle">chatGPT</div>
        <div class="chatBox">
            <div v-for="row in msgList">
                <div v-if="row.isme!=true">
                    <div class="chatNotice">{{row.time}}</div>
                    <div class="chatRow">
                        <el-avatar class="chatAvatar" :size="30" :src="row.avator"></el-avatar>
                        <div class="chatMsgContent">
                            <div class="chatUsername">{{row.name}}</div>
                            <div class="chatContent" v-html="row.content"></div>
                        </div>
                    </div>
                </div>
                <div v-if="row.isme==true">
                    <div class="chatNotice" v-if="row.show_time==true">{{row.time}}</div>
                    <div class="chatRow chatRowMe">
                        <div class="chatContent" v-html="row.content"></div>
                    </div>
                </div>
            </div>
        </div>
        <div class="chatBottom">
            <div class="chatAreaBox">
                <div class="chatArea">
                    <textarea class="chatAreaInput" v-model="originMessage"  @keyup.ctrl.enter.exact="chatToUser($event)" @keyup.enter.exact="chatToUser($event,'enter')" ></textarea>
                    <div @click="chatToUser($event)" class="chatSendBtn iconfont icon-fasong"></div>
                </div>
            </div>

            <div class="chatCopyright">
                <i class="el-icon-chat-dot-round"></i> Powered by 唯一客服
            </div>
        </div>
        
        <audio id="chatMessageAudio" style="display: none;" :src="require('@/assets/alert2.ogg')"></audio>
    </div>
</template>

<script>
    import tools from '../tools/functions.js'
    import storage from '../tools/localStorage.js'
    import xss from 'xss'
    export default {
      name: 'ChatApp',
        data() {
          return {
              window:window,
              secret:"自己的密钥",
              message:"",
              originMessage:"",
              msgList:[],
              sendDisable:false,
          }
        },
        methods: {
           //发送给客户
            chatToUser:function(e) {
                let _this=this;
                if(this.sendDisable) return;
                //用户点击了ctrl+enter触发
                if(e && e.ctrlKey && e.keyCode==13) { 
                    this.originMessage += '\n';
                    return;
                }
                if(this.originMessage=="") return;
                _this.message+=`(You:${this.originMessage})`;
                let sendMessage = {
                    "prompt":_this.message,
                    "max_tokens":2048,
                    "model":"text-davinci-003",
                };
                let showMessage={
                    isme:true,
                    content:this.originMessage,
                    show_time:false,
                }
                this.msgList.push(showMessage);
                this.scrollBottom();
                let headers={
                    headers:{ 
                        'Authorization': `Bearer ${this.secret}`,
                        },
                }
                this.sendDisable=true;
                this.$axios.post('https://api.openai.com/v1/completions',sendMessage,headers).then(function (response) {
                    _this.sendDisable=false;
                    if(!response.data.choices){
                        _this.$message({
                          message: response.data.error.message,
                          type: 'error'
                        });
                        return ;
                    }
                    _this.originMessage="";
                    let retMessage=response.data.choices[0].text;
                    retMessage=tools.trim(retMessage,"\n");
                    _this.message+=retMessage;
                    let showMessage={
                        isme:false,
                        avator:"https://goflychat.oss-cn-hangzhou.aliyuncs.com/static/upload/avator/2022June/32a988a3c2f8700119fa1f5da1b6a4bd.png",
                        content:retMessage.replaceAll("\n","<br>"),
                        time:tools.shortTime(tools.getNowDate())
                    }
                    _this.msgList.push(showMessage);
                    _this.alertSound();
                    _this.scrollBottom();
                }).catch(function (error) {
                    _this.sendDisable=false;
                    _this.$message({
                      message: error.response.data.error.message,
                      type: 'error'
                    });
                    return ;
                });
            },
            //滚动到底部
            scrollBottom:function(){
                var _this=this;
                this.$nextTick(function(){
                    var container = _this.$el.querySelector(".chatBox");
                    container.scrollTop = 999999999;
                });
            },
            //提醒声音
            alertSound(){
                tools.alertSound("chatMessageAudio","");
            }
        },
        mounted: function () {
        }
    }
</script>

<style lang="scss">
    .chatAppBody{
        display: flex;
        flex-direction: column;
        height: 100vh;
        background-color: #f1f5f8;
    }
    .chatTitle{
        background: #fff;
        padding: 5px 0px;
        text-align: center;
        font-size: 14px;
    }
    .chatBox{
        flex: 1;
        padding: 0px 5px;
        padding-bottom: 15px;
        overflow: auto;
    }
    .chatBottom{
        display: flex;
        flex-direction: column;
    }
    .chatRow{
        display: flex;
        align-items: flex-end;
        margin: 5px 0px;
    }
    .chatAvatar{
        margin-right: 5px;
        flex-shrink: 0;
    }
    .chatUsername {
        font-size: 12px;
        white-space: nowrap;
        color: #999;
        margin-bottom: 2px;
    }
    .chatContent{
        border-radius: 10px 10px 10px 0px;
        padding: 10px;
        background-color: rgb(255,255,255);
        box-shadow: 0 5px 30px rgb(50 50 93 / 8%), 0 1px 3px rgb(0 0 0 / 5%);
        font-size: 14px;
        word-break: break-all;
        line-height: 21px;
        display: inline-block;
    }
    
    .chatRowMe{
        justify-content: flex-end;
    }
    .chatRowMe .chatContent{
        border-radius: 10px 10px 0px 10px;
    }
    .chatNotice{
        text-align: center;
        color: #bbb;
        margin: 8px 0;
        font-size: 12px;
    }
    .chatAreaBox{
        margin: 0px 10px;
        margin-bottom: 10px;
        box-shadow: 0 5px 30px rgb(50 50 93 / 8%), 0 1px 3px rgb(0 0 0 / 5%);
        border-radius: 10px;
    }
    .chatArea{
        display: flex;
        padding: 3px 5px;
        align-items: center;
        background: #fff;
        border-radius: 10px;
    }
    .chatArea .iconfont{
        color: #383838;
        font-size: 18px;
        margin: 0px 6px;
        cursor: pointer;
    }
    .chatArea .iconfont:hover{
        color: #409eff;
    }
    .chatAreaInput{
        border-radius: 10px;
        border: 0;
        flex: 1;
        outline: none;
        resize: none;
        box-sizing: border-box;
        color: #505050;
        min-height: 50px;
        font-size: 16px;
    }
    .chatCopyright{
        color: #999a9b;
        font-size: 12px;
        text-align: center;
        margin-bottom: 10px;
        filter: grayscale(1);
        opacity: .9;
        font-family: Inter,-apple-system,system-ui,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Tahoma,Arial,sans-serif;
    }
    
    .chatContent a{
        color: #07a9fe;
        text-decoration: none;
    }
    
    .alink{
        display: inline-block;
        word-break: break-all;
        color: #07a9fe;
        font-size: 12px;
        cursor: pointer;
    }
    
    </style>

 

有关为在线客服系统接入chatGPT(四):chatGPT接口vue网页版,可以联系上下文语境,可以实现自己的chatGPT,附代码的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  4. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  5. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  6. ruby - 是否可以覆盖 gemfile 进行本地开发? - 2

    我们的git存储库中目前有一个Gemfile。但是,有一个gem我只在我的环境中本地使用(我的团队不使用它)。为了使用它,我必须将它添加到我们的Gemfile中,但每次我checkout到我们的master/dev主分支时,由于与跟踪的gemfile冲突,我必须删除它。我想要的是类似Gemfile.local的东西,它将继承从Gemfile导入的gems,但也允许在那里导入新的gems以供使用只有我的机器。此文件将在.gitignore中被忽略。这可能吗? 最佳答案 设置BUNDLE_GEMFILE环境变量:BUNDLE_GEMFI

  7. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  8. ruby - 一个 YAML 对象可以引用另一个吗? - 2

    我想让一个yaml对象引用另一个,如下所示:intro:"Hello,dearuser."registration:$introThanksforregistering!new_message:$introYouhaveanewmessage!上面的语法只是它如何工作的一个例子(这也是它在thiscpanmodule中的工作方式。)我正在使用标准的ruby​​yaml解析器。这可能吗? 最佳答案 一些yaml对象确实引用了其他对象:irb>require'yaml'#=>trueirb>str="hello"#=>"hello"ir

  9. ruby - 可以通过多少种方法将方法添加到 ruby​​ 对象? - 2

    当谈到运行时自省(introspection)和动态代码生成时,我认为ruby​​没有任何竞争对手,可能除了一些lisp方言。前几天,我正在做一些代码练习来探索ruby​​的动态功能,我开始想知道如何向现有对象添加方法。以下是我能想到的3种方法:obj=Object.new#addamethoddirectlydefobj.new_method...end#addamethodindirectlywiththesingletonclassclass这只是冰山一角,因为我还没有探索instance_eval、module_eval和define_method的各种组合。是否有在线/离线资

  10. 亚特兰蒂斯的回声(中文版): chatGPT 的杰作 - 2

    英文版英文链接关注公众号在“亚特兰蒂斯的回声”中踏上一段难忘的冒险之旅,深入未知的海洋深处。足智多谋的考古学家AriaSeaborne偶然发现了一件古代神器,揭示了一张通往失落之城亚特兰蒂斯的隐藏地图。在她神秘的导师内森·兰登教授的指导和勇敢的冒险家亚历克斯·默瑟的帮助下,阿丽亚开始了一段危险的旅程,以揭开这座传说中城市的真相。他们的冒险之旅带领他们穿越险恶的大海、神秘的岛屿和充满陷阱和谜语的致命迷宫。随着Aria潜在的魔法能力的觉醒,她被睿智勇敢的QueenNeria的幻象所指引,她让她为即将到来的挑战做好准备。三人组揭开亚特兰蒂斯令人惊叹的隐藏文明,并了解到邪恶的巫师马拉卡勋爵试图利用其古

随机推荐