ChatGPT工作提效系列
- ChatGPT工作提效之初探路徑獨(dú)孤九劍遇強(qiáng)則強(qiáng)
- ChatGPT工作提效之在程序開發(fā)中的巧勁和指令(創(chuàng)建MySQL語句、PHP語句、Javascript用法、python的交互)
- ChatGPT工作提效之生成開發(fā)需求和報(bào)價(jià)單并轉(zhuǎn)為Excel格式
ChatGPT是一種實(shí)時(shí)對話生成模型,能夠幫助用戶快速地回答問題、提供信息,并且能夠流暢地進(jìn)行對話,準(zhǔn)確理解用戶的意圖,并作出相應(yīng)的回應(yīng)。
ChatGPT模型的優(yōu)點(diǎn)在于其生成文本的自然度和連貫度都非常好,不會(huì)出現(xiàn)明顯的邏輯錯(cuò)誤和語法錯(cuò)誤。此外,ChatGPT的訓(xùn)練數(shù)據(jù)集豐富多樣,能夠應(yīng)對大部分的問題場景。由于使用預(yù)訓(xùn)練模型,可以快速定制成各種應(yīng)用場景的問答模型,能夠大幅提升開發(fā)效率。不過,ChatGPT也存在一些缺點(diǎn)。由于其是基于預(yù)訓(xùn)練模型的生成模型,無法像傳統(tǒng)的規(guī)則引擎一樣對自己的回答邏輯處理進(jìn)行調(diào)整,因此產(chǎn)生了一些無意義的回答或者矛盾的回答。
近期,在小鵝通的項(xiàng)目實(shí)戰(zhàn)開發(fā)過程中,增加了“面向ChatGPT開發(fā)”的使用頻率?,F(xiàn)就有關(guān)過程記錄如下:
一、項(xiàng)目需求
調(diào)用小鵝通API接口獲取指定資源學(xué)習(xí)記錄信息,xe.user.leaning_record_by_resource.get/1.0.0。
請求方式及url
- 請求方式:POST
- 請求頭:Content-Type:application/json
- 接口地址:https://api.xiaoe-tech.com/xe.user.leaning_record_by_resource.get/1.0.0
- 頻率限制:10秒3000次
- 備注:數(shù)據(jù)是準(zhǔn)實(shí)時(shí)的,4~5分鐘延遲
- user_id數(shù)組,請求數(shù)量上限,請求參數(shù)如圖:
目前需要在小鵝通上述API條件的限制做,批量獲取用戶指定資源的學(xué)習(xí)記錄。在php中是完善的延遲進(jìn)程的算法的,很容易API超限或請求頻繁導(dǎo)致token失效。
如何實(shí)現(xiàn)隊(duì)列更新呢?
1.chatGPT:使用php分批分時(shí)輸出的代碼
php寫一下一個(gè)100長度的數(shù)組,分批分時(shí)輸出的代碼
<?php
// 創(chuàng)建一個(gè)100長度的數(shù)組
$array = range(1, 100);
// 每批輸出的長度
$batch_size = 10;
// 循環(huán)輸出數(shù)組內(nèi)容
for ($i = 0; $i < count($array); $i += $batch_size) {
echo "批次 " . ($i / $batch_size + 1) . "\n";
echo implode(", ", array_slice($array, $i, $batch_size)) . "\n";
sleep(1); // 暫停1秒,以模擬分時(shí)輸出
}
?>
sleep(1)
2.chatGPT使用javascript分批分時(shí)輸出的代碼
在javascript中實(shí)現(xiàn)一個(gè)100長度的數(shù)組,分批分時(shí)輸出的代碼怎么寫
var arr = Array(100).fill(null).map((_, i) => i + 1); // 創(chuàng)建長度為100的數(shù)組
function outputArrayInBatch(arr, batchNum, interval) {
var startIndex = batchNum * interval; // 當(dāng)前批次的起始索引
var endIndex = (batchNum + 1) * interval; // 當(dāng)前批次的結(jié)束索引
if (startIndex > arr.length - 1) {
return; // 當(dāng)所有元素都輸出完畢后,退出遞歸
}
if (endIndex > arr.length) {
endIndex = arr.length; // 當(dāng)結(jié)束索引超過數(shù)組長度時(shí),將結(jié)束索引設(shè)置為數(shù)組的最后一個(gè)元素的索引
}
var batchArr = arr.slice(startIndex, endIndex); // 當(dāng)前批次需要輸出的元素?cái)?shù)組
//對批次數(shù)組進(jìn)行遍歷操作;
console.log(batchArr); // 輸出當(dāng)前批次的元素
setTimeout(function () {
outputArrayInBatch(arr, batchNum + 1, interval); // 遞歸調(diào)用下一批次的輸出
}, 2000); // 每隔1秒輸出一批次
}
// 執(zhí)行輸出
outputArrayInBatch(arr, 0, 10); // 一次輸出10個(gè)元素,共分10批輸出
代碼中首先創(chuàng)建了長度為100的數(shù)組。outputArrayInBatch()函數(shù)接收三個(gè)參數(shù):待輸出的數(shù)組、當(dāng)前批次數(shù)、每批次需要輸出的元素個(gè)數(shù)。在函數(shù)中,首先根據(jù)批次數(shù)和輸出元素個(gè)數(shù)計(jì)算當(dāng)前需要輸出的元素?cái)?shù)組;然后輸出當(dāng)前批次的元素,并通過setTimeout()函數(shù)遞歸調(diào)用函數(shù),輸出下一批次的元素。
這里輸出的是每隔1秒輸出一批次的元素,可以根據(jù)具體需求調(diào)整輸出時(shí)間間隔。
二、批量修復(fù)API接口
1.修復(fù)單位不存在API
public function upDepart()
{
global $db, $res;
dbc();
@$user_phone = get_param('user_phone');
if ($user_phone == "") {
die("參數(shù)錯(cuò)誤");
}
//讀取單位認(rèn)證
$row = $db->fetch('depart_audit', '*', array('user_phone' => $user_phone), ' audit_id DESC');
//獲取單位ID
$row_depart = $db->fetch('depart', 'depart_id', array('depart_name' => $row['depart_name']), ' depart_id DESC');
if ($row_depart['depart_id'] == "") {
die("單位不存在或未驗(yàn)證");
}
//更新單位庫
$user_roles = 1;//單位管理員權(quán)限;
$user_menu = 0;//可操作
$user_auth = 1;//已審
$db->insert('admin', array('user_phone' => $user_phone, 'user_name' => $row['user_name'], 'user_pwd' => $row['user_pwd'], 'user_mail' => $row['user_mail'], 'depart_id' => $row_depart['depart_id'], 'user_depart' => $row['depart_name'],
'user_branch' => $row['user_branch'], 'user_titles' => $row['user_titles'], 'user_province' => $row['province'], 'user_city' => $row['city'], 'user_area' => $row['area'],
'user_roles' => $user_roles, 'user_menu' => $user_menu, 'user_auth' => $user_auth));
$res["data"] = $user_phone . "-更新成功";
die(json_encode_lockdata($res));
}
2.修復(fù)單位depart_id不存在
public function upDeID()
{
global $db, $res;
dbc();
//讀取管理員信息
$sql = "select depart_id,user_depart FROM " . $db->table('admin') . " WHERE depart_id IS NULL";
$sql .= " ORDER BY user_id DESC";
$row = $db->queryall($sql);
for ($i = 0; $i < count($row); $i++) {
// echo $row[$i]['user_depart'] . '<br>';
//獲取單位ID
$row_depart = $db->fetch('depart', 'depart_id,depart_name', array('depart_name' => $row[$i]['user_depart']), ' depart_id DESC');
if ($row_depart) {
$db->update('admin', array('depart_id' => $row_depart['depart_id']), array('user_depart' => $row[$i]['user_depart']));
}
}
$res["data"] = "更新成功";
die(json_encode_lockdata($res));
}
3.批量更新登錄權(quán)限
public function upAuth()
{
global $db, $res;
dbc();
$db->update('user', array('user_auth' => 1), array('user_auth' => 0));
$res["data"] = "更新成功";
die(json_encode_lockdata($res));
}
三、開發(fā)中遇見的問題
1.查詢字段為空的sql語句
mysql篩選某字段未空的查詢語句怎么寫
在MySQL中,篩選某字段未空的查詢語句可以使用 IS NOT NULL
來表示。例如,假設(shè)有一個(gè)表名為 my_table
,其中包含 field1
字段,要查找 field1
字段不為空的數(shù)據(jù),可以使用以下 SQL 查詢語句:
SELECT * FROM my_table WHERE field1 IS NOT NULL;
其中 SELECT *
表示選擇所有列,FROM my_table
表示從 my_table
表中查詢數(shù)據(jù),WHERE field1 IS NOT NULL
表示篩選 field1
字段不為空的數(shù)據(jù)。
如果要篩選出某個(gè)字段值為空的數(shù)據(jù),可以使用 IS NULL
來表示,例如:
SELECT * FROM my_table WHERE field1 IS NULL;
這條 SQL 查詢語句將會(huì)返回 field1
字段為空的記錄所有數(shù)據(jù),其他字段可能為空或者有值。
而在實(shí)際的開發(fā)過程中,在寫查詢字段為空的sql語句中時(shí),用了is null查表中user_eid為空的記錄,結(jié)果是沒有結(jié)果。其原因在于,只有是顯示(null)的字段才是真正的空值,如果之前為該字段賦值之后刪除值框里什么都沒有應(yīng)該是下面的寫法:user_eid = ''
public function getEid()
{
checkAdminAuth($_COOKIE['admin_roles'], '0', 1);//超管權(quán)限
global $db, $res;
dbc();
//讀取管理員信息
$sql = "select user_eid,user_name,user_phone FROM " . $db->table('user') . " WHERE user_eid = ''";
$sql .= " ORDER BY user_id DESC";// LIMIT 100
$row = $db->queryall($sql);
$res["data"] = $row;
die(json_encode_lockdata($res));
}
2.設(shè)置登錄cookie永不過期
php如何設(shè)置登錄cookie永不過期
要設(shè)置PHP登錄cookie永不過期,可以指定一個(gè)很大的過期時(shí)間,如設(shè)置為2038年1月19日,這是PHP可以處理的最大日期。
可以使用setcookie()函數(shù)設(shè)置cookie,具體示例如下:
$cookie_name = "user";
$cookie_value = "John Doe";
$expiry_date = strtotime('2038-01-19');
setcookie($cookie_name, $cookie_value, $expiry_date, "/");
在上面的示例中,$expiry_date變量設(shè)置為2038年1月19日的時(shí)間戳,該時(shí)間戳將在setcookie()函數(shù)中設(shè)置為cookie的過期時(shí)間。在本例中,cookie的路徑設(shè)置為“/”,這表示cookie與服務(wù)器上所有頁面都關(guān)聯(lián),而不是僅與當(dāng)前頁面關(guān)聯(lián)。
這樣設(shè)置后,用戶的登錄cookie將被永久保存,直到瀏覽器將其刪除或達(dá)到在服務(wù)器上規(guī)定的最長持續(xù)時(shí)間為止。
3.實(shí)現(xiàn)短信驗(yàn)證碼的代碼是什么
除了Redis外,還有很多其他的方式實(shí)現(xiàn)短信驗(yàn)證碼的流控。下面是一個(gè)基于文件系統(tǒng)的示例代碼:
<?php
// 定義短信驗(yàn)證碼保存目錄
define('SMS_DIR', '/path/to/sms/dir/');
// 獲取客戶端IP地址
$ip = $_SERVER['REMOTE_ADDR'];
// 獲取手機(jī)號碼
$phone = 'your_phone_number';
// 定義文件名規(guī)則
$filename = md5($ip . $phone) . '.json';
// 檢查文件是否存在
if (file_exists(SMS_DIR . $filename)) {
// 如果文件存在,則讀取文件內(nèi)容
$content = file_get_contents(SMS_DIR . $filename);
// 解析JSON內(nèi)容
$data = json_decode($content, true);
// 如果超過發(fā)送次數(shù)限制,則提示用戶并退出
if ($data['count'] >= 5 && time() - $data['timestamp'] < 300) {
echo "發(fā)送頻率過快,請稍后再試。";
exit;
} else {
// 如果可以發(fā)送,則將發(fā)送次數(shù)加1,并更新時(shí)間戳
$data['count']++;
$data['timestamp'] = time();
}
} else {
// 如果文件不存在,則創(chuàng)建新文件并寫入初始內(nèi)容
$data = [
'count' => 1,
'timestamp' => time()
];
$content = json_encode($data);
file_put_contents(SMS_DIR . $filename, $content);
}
// 發(fā)送短信驗(yàn)證碼
?>
在上述代碼中,將短信驗(yàn)證碼的發(fā)送次數(shù)保存在一個(gè)JSON文件中,與客戶端IP地址和手機(jī)號碼相關(guān)聯(lián)。代碼中使用md5值來生成文件名,文件內(nèi)容為JSON格式的字符串,包含發(fā)送次數(shù)和最后發(fā)送時(shí)間戳兩個(gè)字段。
在發(fā)送短信驗(yàn)證碼時(shí),先根據(jù)請求參數(shù)生成文件名,然后檢查是否存在對應(yīng)的文件。如果文件存在,則讀取文件內(nèi)容,檢查發(fā)送次數(shù)和時(shí)間戳是否超過限制。如果可以發(fā)送,則將發(fā)送次數(shù)加1,并將更新后的內(nèi)容寫回文件;如果發(fā)送次數(shù)已經(jīng)達(dá)到限制,則提示用戶稍后再試。如果文件不存在,則創(chuàng)建新文件,并寫入初始的發(fā)送次數(shù)和時(shí)間戳。
基于文件系統(tǒng)的方式性能略低于Redis或其他內(nèi)存型數(shù)據(jù)庫,同時(shí)也更容易受到并發(fā)訪問的影響。因此,建議在高并發(fā)場景下使用更為高效的Redis等緩存服務(wù)器。文章來源:http://www.zghlxwxcb.cn/news/detail-462815.html
@漏刻有時(shí)文章來源地址http://www.zghlxwxcb.cn/news/detail-462815.html
到了這里,關(guān)于ChatGPT工作提效之小鵝通二次開發(fā)批量API對接解決方案(學(xué)習(xí)記錄同步、用戶注冊同步、權(quán)益訂購?fù)?、開發(fā)文檔)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!