一、需求背景
學(xué)英語,最大的痛苦莫過于背單詞!
不知道你平時都是用什么方式在背單詞呢?硬啃單詞書?字典?還是說各類的背單詞APP來回跳轉(zhuǎn)?
不可否認(rèn)的是,單詞一兩遍完全記不住,沒有個三四五六七八遍,都很難在考場的卷子上認(rèn)出他!
所以,這次我們來做一個通關(guān)英語四六級的背單詞神器,讓他能夠基于艾賓浩斯遺忘規(guī)律來輔助我們高效背單詞。
這個項目也是AIGC
的一個方向性的探索,我們基于LLM的能力,進(jìn)一部封裝。相比于專欄中的前幾個項目是直接基于OpenAI接口的直接生成,這次我們需要對模型進(jìn)行數(shù)據(jù)的填喂。同時制定好相應(yīng)的語料生成規(guī)則,讓他能夠根據(jù)我們的語料信息生成到我們的答案內(nèi)容。
所以在本項目中,我們使用到的技術(shù)包括:語料Embedding技術(shù)
,Prompt微調(diào)技術(shù)、``Fine Tune技術(shù)
,正是通過這三種技術(shù)能力的加持,由此顛覆以往的機(jī)械式背單詞!打造一款更加完美的背單詞程序!
二、項目原理及架構(gòu)
2.1 實現(xiàn)原理
(1)語料的準(zhǔn)備
想要有好的單詞記憶效果,我們的單詞語料必須準(zhǔn)備得足夠完整!這里我們選用了GitHUB中開源詞典數(shù)據(jù)項目。其中包含了四六級、考研、雅思托福等。這里我們主要針對英語四六級準(zhǔn)備,所以這里使用四六級的詞匯書就足夠了!將其下載,然后導(dǎo)入到數(shù)據(jù)庫中。
(2)制定LLM模型背單詞規(guī)則
背過單詞的都知道,人的記憶功能都是符合記憶曲線的,同樣地我們冶可以將這種記憶規(guī)則遷移到我們程序中!其中最重要的就是構(gòu)建好相應(yīng)的Prompt來滿足單詞記憶的規(guī)則效果!
- 先對LLM進(jìn)行記憶規(guī)則的自定義!
- 再對LLM輸入背單詞進(jìn)行詞義混淆內(nèi)容的設(shè)定!
(3)記憶已經(jīng)學(xué)會的單詞
為了讓程序記住我們已經(jīng)背誦過了的單詞,就要讓LLM
具備記憶功能。在傳統(tǒng)的web應(yīng)用開發(fā)過程中,說到數(shù)據(jù)存儲,第一時間我們考慮得更多得除了關(guān)系型數(shù)據(jù)庫以及中間件緩存數(shù)據(jù)庫!這是由于業(yè)務(wù)得特性所決定得!我們在web應(yīng)用中,數(shù)據(jù)是規(guī)整的!是結(jié)構(gòu)化的。所以用傳統(tǒng)的關(guān)系型數(shù)據(jù)庫完全可以滿足系統(tǒng)的檢索需求!
但是,這次我們面對的是大語言模型,而且我們的數(shù)據(jù)是完全基于文本語料的,可以說不是完全地結(jié)構(gòu)化以及關(guān)系型的數(shù)據(jù)!這個時候我們結(jié)合時下大火的向量數(shù)據(jù)庫Milvus
來進(jìn)行數(shù)據(jù)的存儲和檢索!也就是傳說中的Embedding技術(shù)
【該技術(shù)的核心原理:將文本內(nèi)容通過數(shù)學(xué)運算,將其轉(zhuǎn)化為向量。然后基于向量間的相似度運算來進(jìn)行內(nèi)容的匹配!從而檢索出當(dāng)前內(nèi)容的最高相似度數(shù)據(jù)
】
Milvus 是一款開源的特征向量相似度搜索引擎,具有使用方便、實用可靠、易于擴(kuò)展、穩(wěn)定高效和搜索迅速等特點,在全球范圍內(nèi)被上百家組織和機(jī)構(gòu)所采用。Milvus 已經(jīng)被廣泛應(yīng)用于多個領(lǐng)域,其中包括圖像處理、機(jī)器視覺、自然語言處理、語音識別、推薦系統(tǒng)以及新藥發(fā)現(xiàn)等。
Milvus
學(xué)習(xí)教程大全:
- Milvus簡單明了教程一
- Milvus簡單明了教程二
2.2 技術(shù)架構(gòu)
2.3 技術(shù)棧
模塊 | 語言及框架 | 涉及的技術(shù)要點 |
---|---|---|
小程序前端 | 基于VUE 2.0語法 +Uni-app跨平臺開發(fā)框架
|
Http接口通信、Flex布局方式、uView樣式庫的使用、JSON數(shù)據(jù)解析、定時器的使用 |
小程序接口服務(wù)端 |
Python + Flask WEB框架
|
rest接口的開發(fā)、 ChatGPT API接口的數(shù)據(jù)對接 、 前后端websocket實時通信 |
2.4 數(shù)據(jù)交互原理
三、項目功能的實現(xiàn)
3.1 ChatGPT API的接入
要接入ChatGPT API,需要按照以下步驟進(jìn)行操作:
- 注冊一個賬號并登錄到OpenAI的官網(wǎng):https://openai.com/
- 在Dashboard頁面上,創(chuàng)建一個API密鑰。在“API Keys”選項卡下,點擊“Generate New Key”按鈕。將生成的密鑰保存好,以備后續(xù)使用。
- 選擇所需的API服務(wù),例如“Completion” API,以使用OpenAI的文本生成功能。
使用Python
調(diào)用ChatGPT API
實現(xiàn)代碼如下:
- 方法一:使用
request
庫
import requests
import json
# 構(gòu)建API請求
url = "https://api.openai.com/v1/engines/davinci-codex/completions"
headers = {"Content-Type": "application/json",
"Authorization": "Bearer YOUR_API_KEY"}
data = {
"prompt": "Hello, my name is",
"max_tokens": 5
}
# 發(fā)送API請求
response = requests.post(url, headers=headers, data=json.dumps(data))
# 解析API響應(yīng)
response_data = json.loads(response.text)
generated_text = response_data["choices"][0]["text"]
print(generated_text)
- 方式二:使用
openAI庫
from flask import Flask, request
import openai
app = Flask(__name__)
openai.api_key = "YOUR_API_KEY_HERE"
@app.route("/")
def home():
return "Hello, World!"
@app.route("/chat", methods=["POST"])
def chat():
data = request.json
response = openai.Completion.create(
engine="davinci",
prompt=data["message"],
max_tokens=60
)
return response.choices[0].text
if __name__ == "__main__":
app.run()
3.2 小程序端設(shè)計與實現(xiàn)
首頁 | 學(xué)習(xí)頁 |
---|---|
![]() |
![]() |
學(xué)習(xí)統(tǒng)計頁 | |
– | – |
![]() |
|
3.3 Milvus數(shù)據(jù)庫的接入
- JAVA SDK工具類接入
- FLAT:FLAT適用于希望在小規(guī)模、百萬級數(shù)據(jù)集上獲得完全準(zhǔn)確和精確搜索結(jié)果的場景。
- IVF_FLAT:IVF_FLAT是一種基于量化的索引,適用于追求查詢準(zhǔn)確度和速度之間的理想平衡的場景。
- IVF_SQ8:IVF_SQ8是一種基于量化的索引,適用于那些資源非常有限且需要顯著減少磁盤、CPU和GPU內(nèi)存消耗的場景。
- IVF_PQ:IVF_PQ是一種基于量化的索引,適用于那些即使付出準(zhǔn)確度代價也要追求高查詢速度的場景。
- HNSW:HNSW是一種基于圖的索引,適用于對搜索效率有高要求的場景。
- ANNOY:ANNOY是一種基于樹的索引,適用于追求高召回率的場景。
- RAFT: 基于GPU的一種索引
文章來源:http://www.zghlxwxcb.cn/news/detail-641750.html
3.4 小程序單詞學(xué)習(xí)功能實現(xiàn)
<!--pages/learning/learning.wxml-->
<view class="bgWrapper bg-linear-{{colorType}}"></view>
<view class="topline" wx:if="{{!learnDone}}">
<view class="progress">{{learnedNum}} / {{learnNum}}</view>
</view>
<view class="wordWrapper" bindtap="playVoice" wx:if="{{!learnDone}}">
<view class="word word-color-{{colorType}}" wx:if="{{ wordMode == 0 }}">{{wordDetail.word}}</view>
<view class="repeatTime" wx:if="{{ wordMode == 0 }}">
<view class="times first {{ thisWordRepeatTime>=1? 'bg-color-light-'+colorType : 'bg' }}"
wx:if="{{ repeatTimes>1 }}"></view>
<view class="times {{ thisWordRepeatTime>=2? 'bg-color-light-'+colorType : 'bg' }}"
wx:if="{{ repeatTimes>=2 }}"></view>
<view class="times {{ thisWordRepeatTime>=3? 'bg-color-light-'+colorType : 'bg' }}"
wx:if="{{ repeatTimes>=3 }}"></view>
<view class="times {{ thisWordRepeatTime==4? 'bg-color-light-'+colorType : 'bg' }}"
wx:if="{{ repeatTimes==4 }}"></view>
</view>
<view class="pron" wx:if="{{ wordMode == 0 && wordDetail.phonetic.length > 0 }}">/ {{wordDetail.phonetic}} / <text
class="voice iconfont icon-sound"></text></view>
<view class="timing" wx:if="{{ wordMode == 1 }}" catchtap="{{ isBtnActive? 'showWord':'' }}">
<mpProgress class="progress" config="{{wordTimingConfig}}" reset="{{wordTimingReset}}"
isStop="{{wordTimingStop}}" percentage="{{100}}" bindtimingOut="timingOut" data-type="word"></mpProgress>
<!-- <button class="resetbtn" type="primary" bindtap="resetCanvasFunc">reset</button> -->
</view>
<view class="timing" wx:if="{{ wordMode == 2 }}">
<view class="model"></view>
<view class="model phonetic"></view>
</view>
</view>
<view class="content" wx:if="{{!learnDone}}">
<view class="chooseCorrect" wx:if="{{ contentMode == 0 }}">
<view class="choice {{choiceBgList[index]}}" wx:for="{{choiceOrder}}" wx:key="index" hover-class="wasTaped"
data-index="{{index}}" bindtap="{{ isBtnActive? 'checkChoice':'' }}">
<view class="pos">{{wrongTransWordList[item].translation.pos}}</view>
<view class="meaning"> {{wrongTransWordList[item].translation.meaning}}</view>
</view>
</view>
<view class="translationWrapper" wx:if="{{ contentMode == 1 }}">
<view class="transRow" wx:for="{{wordDetail.shortTrans}}" wx:key="index">
<view class="pos" wx:if="{{ item.pos != '' }}">{{item.pos}}</view>
<view class="meaning {{ item.more? 'moreBtn':'' }}" bindtap="{{ item.more? 'toDetail':'' }}"
hover-class="{{ item.more? 'tapedText':'' }}">{{item.meaning}}
</view>
</view>
</view>
<view class="timing" wx:if="{{ contentMode == 2 }}" bindtap="{{ isBtnActive? 'showTrans':'' }}">
<mpProgress class="progress" config="{{contentTimingConfig}}" reset="{{contentTimingReset}}"
isStop="{{contentTimingStop}}" percentage="{{100}}" bindtimingOut="timingOut" data-type="content">
</mpProgress>
<!-- <button class="resetbtn" type="primary" bindtap="resetCanvasFunc">reset</button> -->
</view>
<view class="timing" wx:if="{{ contentMode == 3 }}" bindtap="{{ isBtnActive? 'showTrans':'' }}">
<view class="model"></view>
<view class="model"></view>
<view class="model"></view>
</view>
</view>
<view class="control" wx:if="{{!learnDone}}">
<view class="btn answerBtn" wx:if="{{ controlMode == 0 }}" hover-class="wasTaped"
bindtap="{{ isBtnActive? 'showAnswer':'' }}">
<view class="text">答案</view>
<view class="decorate"></view>
</view>
<view class="knowWrapper" wx:if="{{ controlMode == 1 }}">
<view class="btn knowBtn left" hover-class="wasTaped" bindtap="{{ isBtnActive? 'setAsKnown':'' }}">
<view class="text word-color-{{colorType}}">認(rèn)識</view>
<view class="decorate bg-color-light-{{colorType}}"></view>
</view>
<view class="btn knowBtn" hover-class="wasTaped" bindtap="{{ isBtnActive? 'setAsUnknown':'' }}">
<view class="text notknowtext">不認(rèn)識</view>
<view class="decorate dforNotKnow"></view>
</view>
</view>
<view class="knowWrapper" wx:if="{{ controlMode == 2 }}">
<view class="btn knowBtn left" hover-class="wasTaped" bindtap="{{ isBtnActive? 'toNextWord':'' }}">
<view class="text word-color-{{colorType}}">下一個</view>
<view class="decorate bg-color-light-{{colorType}}"></view>
</view>
<view class="btn knowBtn" hover-class="wasTaped" bindtap="{{ isBtnActive? 'changeToUnknown':'' }}">
<view class="text notknowtext">記錯了</view>
<view class="decorate dforNotKnow"></view>
</view>
</view>
<view class="btn nextBtn" wx:if="{{ controlMode == 3 }}" hover-class="wasTaped"
bindtap="{{ isBtnActive? 'toNextWord':'' }}">
<view class="text word-color-{{colorType}}">下一個</view>
<view class="decorate bg-color-light-{{colorType}}"></view>
</view>
<view class="bottomMenu">
<!-- <view class="left">單詞詳情</view>
<view class="left">跳過此輪</view>
<view class="left">設(shè)為已掌握</view>
<view class="left last">加入生詞本</view> -->
<view class="bottomBtn iconfont icon-getDetail" hover-class="wasTaped-bottom" bindtap="toDetail"></view>
<view class="bottomBtn iconfont icon-skip" hover-class="wasTaped-bottom" data-type="skip"
bindtap="{{ isBtnActive? 'skip':'' }}"></view>
<view class="bottomBtn iconfont icon-learned" hover-class="wasTaped-bottom" data-type="master"
bindtap="{{ isBtnActive? 'skip':'' }}"></view>
<view class="bottomBtn iconfont icon-addToNB-{{isInNotebook?'yes':'no'}}"
hover-class="wasTaped-bottom{{isInNotebook?'1':''}}" bindtap="toggleAddToNB"></view>
</view>
</view>
<view class="doneWrapper" wx:if="{{learnDone}}">
<view class="text word-color-{{colorType}}">本組單詞學(xué)習(xí)已完成</view>
<view class="btn back" hover-class="wasTaped" bindtap="goBack">完成學(xué)習(xí)</view>
<view class="btn continue bg-color-light-{{colorType}}" hover-class="wasTaped" bindtap="reInit">繼續(xù)學(xué)習(xí)</view>
</view>
<!-- <view class="test">
<button class="showInfo" data-name="wordLearningRecord" bindtap="showInfo">l-Record</button>
<button class="showInfo" data-name="control" bindtap="showInfo">control</button>
<button class="showInfo" data-name="settings" bindtap="showInfo">settings</button>
</view> -->
四、推薦閱讀
??入門和進(jìn)階小程序開發(fā),不可錯誤的精彩內(nèi)容?? :文章來源地址http://www.zghlxwxcb.cn/news/detail-641750.html
- 《小程序開發(fā)必備功能的吐血整理【個人中心界面樣式大全】》
- 《微信小程序 | 借ChatGPT之手重構(gòu)社交聊天小程序》
- 《微信小程序 | 人臉識別的最終解決方案》
- 《微信小程序 |基于百度AI從零實現(xiàn)人臉識別小程序》
- 《吐血整理的幾十款小程序登陸界面【附完整代碼】》
到了這里,關(guān)于微信小程序| 打造ChatGPT英語四六級背單詞小程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!