ChatGPT 桌面版 gpt-3.5-turbo 模型中的参数问题

By hi_aardio at 2023-03-02 • 0人收藏 • 1024人看过

Jacen He 有个关于“编写 ChatGPT 桌面版,改进支持上下文对话”的公众号代码分享,如下:

import win.ui;
/*DSG{{*/
var winform = win.form(text="ChatGPT 桌面智能助理";right=661;bottom=721)
/*}}*/

import web.view;
var wb = web.view(winform);

import web.rest.jsonClient;
var http = web.rest.jsonClient(); 

//参数请改成您的 API key(或者获取 API key 的网址也可以)。
http.setAuthToken("API key");
var ai = http.api("https://api.openai.com/v1/");
    
var conversation = {};
var chatGptName = "桌面智能助理";
var chatGptInfo = "是一个快乐的程序员,精通多种编程语言";

wb.external = {
    ask = function(q){
        table.push(conversation,"用户:"+q);
        
        var prompt;
        do{
            prompt =  "提示:你叫"
            + chatGptName + ","
            + chatGptInfo + "。<|endoftext|>"  
            + "当前时间:" + tostring(time()) + "。<|endoftext|>"  
            + string.join(conversation,"<|endoftext|>") 
            + "<|endoftext|>"
            + chatGptName + ":";
            
            if(#prompt < 2000) break; 
            
            table.shift(conversation);
        }while(true);   
        
        var ret,err = ai.completions({
            "prompt": prompt,//发送提示
            "model": "text-davinci-003",//GPT 3.5 模型
            "temperature": 0.8,//热度,0~1 之间。
            "max_tokens": 2048,//最大允许的字符数量 
            "stop": {"<|endoftext|>"}  
        })
        
        if(ret){
            var a = ret.choices[1].text; 
            table.push(conversation,chatGptName+":"+a);
            return a;
        }
        else {
            if(err[1]=='{'#){
                var errObject = web.json.tryParse(err)[["error"]];
                if(errObject[["code"]]="invalid_api_key"){
                    return "您的 API key 已经失效了!"; 
                } 
                
                if(errObject[["message"]]) return errObject[["message"]];
            }
            
            return err;
        }
    };  
} 

wb.html = /**
<!DOCTYPE html><html>
<head>
    <meta charset="utf-8" />
    <title>ChatGPT 桌面智能助理</title> 
    <script src="https://lib.baomitu.com/react/18.2.0/umd/react.production.min.js"></script>
    <script src="https://lib.baomitu.com/react-dom/18.2.0/umd/react-dom.production.min.js"></script> 
    <script src="https://lib.baomitu.com/chatui-core/2.4.2/index.min.js"></script> 
    <link rel="stylesheet" href="https://lib.baomitu.com/chatui-core/2.4.2/index.min.css"> 
    <script src="https://lib.baomitu.com/babel-standalone/7.20.14/babel.min.js"></script> 
    <style type="text/css">html,body,#app{height:100%}</style>
</head>
<body>  

<script type="text/babel"> 
    const { useState,useEffect,useCallback,useRef } =  React;  
    const { default: Chat, Bubble, useMessages } = ChatUI;  
    
    const App = () => {
        const { messages, appendMsg, setTyping } = useMessages([{
            type: 'text',
            content: { text: '主人好,我是桌面智能助理,您的贴心小助手~' },
            user: { avatar: 'https://gw.alicdn.com/tfs/TB1DYHLwMHqK1RjSZFEXXcGMXXa-56-62.svg' },
        }]);
    
        function handleSend(type, val) {
            if (type === 'text' && val.trim()) {
                appendMsg({
                    type: 'text',
                    content: { text: val },
                    position: 'right',
                });
        
                setTyping(true);
                
                aardio.ask(val).then( text=>{
                    appendMsg({
                        type: 'text',
                        content: { text: text },
                    }); 
                }) 
            }
        }
    
        function renderMessageContent(msg) {
            const { content } = msg;
            return <Bubble content={content.text} />;
        }
    
        return (
            <Chat
                navbar={{ title: '' }}
                messages={messages}
                renderMessageContent={renderMessageContent}
                onSend={handleSend}
            />
        );
    };
    
    const root = ReactDOM.createRoot(document.getElementById('app'));
    root.render(<App />);
    
</script>
<div id="app"></div>
**/

winform.show();
win.loopMessage();

这里用的模型是

text-davinci-003

而最新open ai出的更便宜好用的3.5模型是gpt-3.5-turbo and gpt-3.5-turbo-0301

新模型对应的介绍如下:

API Reference - OpenAI API

与原来模型相比,主要是post时参数上有所变化。(原来都是json方式,一对一,这次的新模型多了【】,需要提供多个参数值)

新模型参数:

{
  "model": "gpt-3.5-turbo",
  "messages": [{"role": "user", "content": "Hello!"}]
}

这里涉及到messages后面参数 


[{"role": "user", "content": "Hello!"}]

想请教各位,在aardio中,如何来写这一部分内容?

谢谢

8 个回复 | 最后更新于 2023-07-20
2023-03-02   #1

新模型 API介绍 

https://platform.openai.com/docs/api-reference/chat/create

老模型API介绍

https://platform.openai.com/docs/api-reference/models/list
2023-03-02   #2

回复#1 @hi_aardio :

最终post出去的都是json格式的string,[...]在aardio里其实对应的就是数组{...}

2023-03-02   #3

回复#2 @jerryxjr1220 :

在修改完对应post的url后,

message这部分,我尝试直接加入示例,对话一直处于无反馈状态,也没有报什么错

"messages":{{"role": "user", "content": "hello"}},

当message以字符串内容加入时会报不是array的错

2023-03-02   #4

我从console里获取到了返回的内容,因为返回内容的json也有变化,所以窗口界面才没有显示返回内容

2023-03-02   #5

主要改2个地方

prompt =  {{"role": "user", "content":"提示:你叫"
            + chatGptName + ","
            + chatGptInfo + "。<|endoftext|>"  
            + "当前时间:" + tostring(time()) + "。<|endoftext|>"  
            + string.join(conversation,"<|endoftext|>") 
            + "<|endoftext|>"
            + chatGptName + ":"}};

还有就是返回的内容

var a = ret.choices[1].message.content;

这样就可以正常使用了

2023-03-02   #6

回复#5 @hi_aardio :

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
mainForm = win.form(text="chatsonic";right=1152;bottom=594;bgcolor=16777215;border="none")
mainForm.add(
plsAsk={cls="plus";left=34;top=508;right=1046;bottom=578;align="left";bgcolor=16777215;border={color=-16777216;width=1};color=16711680;db=1;dl=1;dr=1;editable=1;font=LOGFONT(h=-16;name='微软雅黑');link=1;multiline=1;wrap=1;z=2};
plsLang={cls="plus";text="中文";left=861;top=9;right=1041;bottom=35;color=16711680;dr=1;dt=1;font=LOGFONT(h=-20;name='FontAwesome');iconStyle={align="left";font=LOGFONT(h=-20;name='FontAwesome');padding={left=40}};iconText='\uF096  ';z=5};
plsLog={cls="plus";left=34;top=41;right=1121;bottom=496;align="left";bgcolor=16777215;border={color=-16777216;width=1};color=8388608;db=1;dl=1;dr=1;dt=1;editable=1;font=LOGFONT(h=-16;name='微软雅黑');link=1;multiline=1;wrap=1;z=1};
plsSend={cls="plus";text="Send";left=1059;top=508;right=1121;bottom=578;bgcolor=15793151;color=8388608;db=1;dr=1;font=LOGFONT(h=-16;name='微软雅黑';weight=700);notify=1;z=3};
plus={cls="plus";text="ChatSonic智能助手";left=32;top=10;right=275;bottom=38;align="right";color=8388608;dl=1;dt=1;font=LOGFONT(h=-20;name='FontAwesome';weight=700);iconColor=32768;iconStyle={align="left";font=LOGFONT(h=-29;name='FontAwesome');padding={left=10}};iconText='\uF1D7';z=4}
)
/*}}*/

import inet.http;
import web.json;
import time;

import win.ui.simpleWindow;
win.ui.simpleWindow(mainForm);

var;
var head = {
    "accept": "application/json",
    "content-type": "application/json",
    "X-API-KEY": "替换你自己的token key"
}
var url = "https://api.writesonic.com/v2/business/content/chatsonic?engine=premium&language="

var history = {{"is_sent": true, "message": ""}, }

mainForm.plsLang.skin({
color = {
hover = 0xF0FF0000; 
};
checked = {
     iconText = '\uF046';
    } 
})

mainForm.plsSend.skin(
background = { 
hover = 0xFFFF771C; 
}
)
mainForm.plsSend.oncommand = function(id,event){
mainForm.plsSend.disabled = true;
if mainForm.plsLang.checked {
lang = "zh";
} else {
lang = "en";
}
var payload = {
     "enable_google_results": true,
     "enable_memory": true,
     "input_text": mainForm.plsAsk.text,
     "history_data": history,
}
var http = inet.http();
http.addHeaders = head;
var respstr = http.post(url+lang, web.json.stringify(payload, true));
if respstr {
var resp = web.json.parse(respstr, true);
tm = time.now()
tm.format="%Y年%m月%d日 %H时%M分%S秒";
string.save("/res/dialog.txt", tostring(tm)+'\r\n', true);
string.save("/res/dialog.txt", "You >>> "+mainForm.plsAsk.text+'\r\n', true);
string.save("/res/dialog.txt", "GPT >>> "+resp.message+'\r\n', true);
table.push(history, 
{
"is_sent": true, 
"message": mainForm.plsAsk.text
},
{
"is_sent": false, 
"message": resp.message
},
)
mainForm.plsLog.editBox.print("You >>> "+mainForm.plsAsk.text);
mainForm.plsLog.editBox.print("GPT >>> "+resp.message);
mainForm.plsAsk.text = null;

}
mainForm.plsSend.disabled = false;
}

mainForm.plsLang.checked = true;

mainForm.show();
return win.loopMessage();


虽然我不是调用的openai的api,不过原理是一样的。

2023-03-03   #7

回复#6 @jerryxjr1220 :

早。。

多谢

不过早上看官方的api 被X了

2023-07-20   #8

Jacen He 有个关于“编写 ChatGPT 桌面版“针对现在新版的gpt4和比较流行的自定义http url,分发key的方式有更新

import win.ui;
import console.int;
import web.rest.jsonClient;
/*DSG{{*/
mainForm = win.form(text="Demo";right=757;bottom=467)
mainForm.add(
answer={cls="edit";left=132;top=145;right=670;bottom=325;edge=1;hscroll=1;multiline=1;vscroll=1;z=4};
button={cls="button";text="发送";left=58;top=376;right=223;bottom=417;z=1};
question={cls="edit";left=140;top=30;right=683;bottom=73;edge=1;multiline=1;z=2};
static={cls="static";text="问题";left=36;top=33;right=105;bottom=63;font=LOGFONT(h=-20);transparent=1;z=3};
static2={cls="static";text="答案";left=39;top=152;right=98;bottom=190;font=LOGFONT(h=-20);transparent=1;z=5}
)
/*}}*/

import console;
console.open();
//适合用gpt 3.5,4,自定义http和分发的key
mainForm.button.oncommand = function(id, event) {
    
    //创建 API 客户端
    var http = web.rest.jsonClient();
    
    //设置 Key 或者获取 Key 的网址/或自定义分发的key
    http.setAuthToken("国内套壳提供的key");
    
    //引入 OpenAI 接口/或自定义接口
    var ai = http.api("https://套壳地址/v1/chat/");
    
    //调用 API 
    var ret = ai.completions({
    "messages": {
      
        {
            "role": "user",
            "content": mainForm.question.text
        }
    },
    "stream": false, 
    "model": "gpt-4",
    "temperature": 0.5,
    "presence_penalty": 0,
    "frequency_penalty": 0,
    "top_p": 1
})
    
    //显示回复
    console.dumpTable(ret)
    mainForm.answer.clear();
    mainForm.answer.print(ret.choices[1].message.content);
}

mainForm.show();
return win.loopMessage();


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...