新概念英語學習助手之全拆解教程

努力的小雨發表於2024-10-28

今天我們將實現一個學習英語的智慧助手。回想一下大家小時候的英語學習經歷,不知道你們都用過什麼課外英語教材。對我來說,小時候在英語補習班上最常接觸的就是《新概念英語》。

因此,我們決定直接利用《新概念英語》的教材,構建一個專屬於你的英語學習小助手。這個助手將迅速幫助你鞏固英語基礎,特別是為小學和初中的學生們提供支援,助力他們在中考中取得優異成績!

目標明確

好的,我們的助手目標非常明確,就是幫助學習英語的使用者,尤其是那些基礎較差或希望在短期內掌握英語基礎的學習者。為此,我們將專注於《新概念英語》的第一冊,因為它是學習英語的堅實基礎。這一冊內容涵蓋了基本的語音、語調、語法、詞法、句法及句型結構等知識,是打好英語基本功、邁入英語世界的關鍵。

需要注意的是,第一冊的課程設計以奇數課為核心(例如1-001),而相應的偶數課(如1-002)則是對前一課內容的補充。因此,我們將主要圍繞奇數課進行學習,以確保學習的系統性和連貫性。這將為學習者提供一個穩固的基礎,助力他們在英語學習的旅程中更進一步。

開始搭建

直接進行提問時,模型可能會因為未經過特定資料的訓練而無法給出準確的回答,如下圖所示。因此,為了解決這個問題,我們需要將知識庫或資料庫與模型進行掛載,以便為使用者提供更為精準和全面的答案。

在後續的講解中,我們將詳細介紹如何有效整合這些資源,以提升智慧助手的回答能力和使用者體驗。

image

角色指令

為了避免資訊的冗雜,我決定不分享中間的聯調過程,而是直接向大家提供一個最終版本,以便於大家進行參考。希望這樣能夠更高效地傳達核心內容。

# Role : 
你是一位新概念第一冊英語學習教師,熟知第一冊英語的知識點。你將使用中文問答測試使用者的英語問答能力並提供詳細的反饋。

## Background : 
新概念英語第一冊是為英語學習者提供的基礎入門課程。該課程特別適合英語基礎薄弱、希望在短期內建立扎實英語基礎的學習者。

## Goals :
1. 呼叫[data_sheet_agent]工具獲取課程的英語知識點。
2. 透過四個問題幫助學習者掌握基本的英語知識。
3. 在四個問題提問結束後,生成個性化的複習資料和學習建議。

## Constrains :
1. 禁止提問偶數課程如第二課,必須提問奇數課程,如第一課,直接回複使用者即可。
2. 必須至少安排4個練習問題,以確保得出更準確的學習效果評估。
3. 禁止提問超過當前課程的英語單詞和短語範圍。禁止提示使用者答案
4. 禁止一次性提出四個問題,必須逐一提供四個問題
5. 提問必須以提問中英文結合。禁止提問翻譯問題。

## Skills :
1. 精通英語語法和詞彙知識。
2. 至少能夠設計安排4個練習問題語言練習題。
3. 具備強大的邏輯思維能力。
4. 瞭解英語學習者的心理與需求。
5. 能夠運用多樣化的教學方法增強學習效果。

## Workflows:
0. 根據使用者選擇的課程,使用memory_variable_writer工具來更新course記憶變數的值,以便後續的問題和反饋能夠針對這一課進行。
1. 呼叫[data_sheet_agent]工具引數為【新概念英語 - 第1冊 - 第XXX課】查詢選擇課程的英語內容,確定關鍵知識點。XXX表示三位數字:001/005等。
2.介紹當前課程的學習目標及關鍵知識點。介紹示例:
《新概念英語》第一冊第一課是 “Excuse me!”。這節課的學習目標是掌握一些基本的日常用語,關鍵知識點包括 “excuse me”“yes”“is this” 等表達的用法。
3.嚴格按照課程原文句子、短語、單詞內容確定本次要提問的內容並開始第一輪問題,旨在檢驗學生對課程內容的基本理解。
4. 每次只提問一個問題並記錄當前是第幾道題目,
5. 使用者必須透過寫英語句子作答才可以進入下一個問題,必須逐一提供四個問題,禁止超過四道提問題目。
6. 必須在4個練習問題提問後使用GaiJinYiJianHeXueXiJianYi工具為使用者生成榮譽證書。

在這裡,我想詳細闡述一下我們的除錯思路。這個指令的最終目標是讓大模型在首次從資料庫中檢索資訊後,基於第一次的資料檢索,依次進行四輪問答。在這四輪問答結束後,模型還會為大家生成一份總結和建議,以便更好地梳理和應用所學內容。

此外,為了激勵學生們的積極性,我們特別設計了一張榮譽證書,以表彰他們的努力和成就。同時,我們也提供了一些相關的影片連結,供大家進一步學習和參考。希望這一系列的設計能對大家有所幫助!

變數

首先,讓我們從變數的概念入手,逐步深入理解其重要性。之所以在這裡引入變數,是因為在首次提問時必須設定好當前課程章節。如果這一環節沒有處理好,那麼在後續生成證書時,即使提示詞中明確指出了需要傳遞哪些引數,也難以發揮作用。

因此,這個變數的主要目的是為了將相關資訊記錄下來,以便後續使用。在工作流的後續步驟中,我們可以呼叫這個變數,從而確保生成的證書內容準確無誤。

image

預設值

當然,我為這個變數設定了我設定了一個預設值,主要用於工作流中的判斷。這一機制可以有效防止使用者在聊天視窗隨意請求大模型呼叫工作流生成證書,從而避免功能的誤用。

儘管我最初考慮在提示詞中設定這些限制,但大模型並不總是遵循這些指令,因此依賴工作流的設計更為可靠。

單次會話

而且,這個機制是針對單次會話設計的,因為每次使用者可能會對不同的課程提出疑問。透過這種方式,我們可以有效避免生成錯誤的證書。因此,我沒有讓變數一直生效,而是根據具體的業務需求進行調整。

掛載資料庫

接下來,我們需要開始搜尋相關的資料,以便將其掛接下來,我們需要開始搜尋相關的資料,以便將其掛載。

網頁外掛

首先,我想說明的是,這裡我沒有使用網頁外掛或在工作流中設定網頁節點進行直接訪問網址,原因有幾點。

首先,網站的穩定性往往不可預測,直接訪問可能導致助手的功能失效,從而影響使用者體驗。

其次,我仔細檢視了對方網站,並發現他們並沒有明確的爬蟲協議,貿然進行資料抓取可能會對網站造成負擔,甚至導致崩潰。

為了保證系統的穩定性和對方網站的正常執行,我選擇了更為穩妥的方式來處理資料。

資料清洗

接下來,我們將開始資料清洗的過程。網頁上的資料往往包含大量的雜質和冗餘資訊,這些不必要的元素可能會對模型的回答質量產生負面影響。

我採用了一種相對簡單且成本低廉的方法,透過藉助第三方的Kimi網頁工具來實現我的需求。我只需編寫適當的提示語,便能獲得所需的資料。這一過程大約耗費了我兩小時的時間。當然,如果你有資金支援,可以考慮直接透過程式碼進行對接。這樣,利用程式碼中的迴圈結構,可以更高效地將資料進行拼接,節省時間和精力。

image

建立資料庫

在這裡,我選擇使用資料庫而非知識庫,可能會引發一些疑問。在大多數人的認知中,我們通常認為資料應該儲存在知識庫中,這是因為知識庫常常被視為知識管理和資訊檢索的理想場所。然而,實際上,使用資料庫的理由有幾點值得深入探討。

首先,命中率的問題並不容忽視。知識庫在查詢時可能會受到一定的限制,這可能導致資訊檢索的命中率相對較低。換句話說,我們可能會面臨獲取資訊的困難。

其次,即便命中了所需的資訊,知識庫的查詢過程往往會導致額外的token消耗。我們看下效果,如圖所示:

image

我們之所以需要使用資料庫進行精準匹配,是因為我們的提問指向某一特定課程,都是非常具體且針對性的。

至於為什麼不使用記憶表,原因在於記憶表主要是針對對話過程中產生的資料,而這些資料的性質和結構與我們的需求並不完全匹配。

讓我們進一步分析一下資料庫的表現。首先,我們需要在本地建立資料庫,並確保已經編寫好相應的CSV檔案。在進行匯入之前,建議先開啟這個CSV檔案,仔細檢查其格式和內容是否正確。這一步驟至關重要,因為如果檔案格式不符合要求或內容出現問題,匯入後可能會導致資料庫中沒有任何資料顯示,如圖所示:

image

載入完成後,我們將立即進行掛載操作。

image

接下來,我們將在對話中進行效果測試,以驗證精準匹配的成功實現。這一過程不僅有效節省了token的消耗,還顯著提高了回答的準確性。

image

在除錯過程中,我注意到某些內容並不是必需的,例如原文翻譯。為了進一步提高資料的質量和有效性,我進行了第二次資料清洗。這一過程讓我能夠篩選出與專案目標更加相關的資訊,從而確保最終資料集的精確性和實用性。

經過這一輪的清洗,最終得到的資料如下:

image

經過一系列測試後,我發現系統的表現已經接近我所期望的效果,尤其是在正常問題問答方面,已經相當出色。此外,當我遇到不確定的情況時,系統也能及時提供相應的提示,幫助我更好地構建回答。

image

工作流元件

在這個階段,我們對工作流的目的有了明確的認識,因為待完成的任務相對繁雜,單靠提示詞和思考無法有效地實現所有目標。因此,建立一個功能齊全的工作流顯得尤為必要。接下來,讓我們仔細分析一下工作流需要具備哪些核心功能:

  1. 證書生成:該功能旨在鼓勵學生養成良好的學習習慣,透過生成證書來認可他們的努力與成就,從而激勵他們繼續前進。
  2. 效果總結與建議:工作流需要能夠總結當前使用者在測試問答中的表現,並提供合理的反饋和改進建議。這一功能將幫助學生識別自身的優缺點,從而更有針對性地進行學習。
  3. 影片連結推薦:為配合當前學習章節,工作流還應提供相關的影片連結,供學生自主選擇觀看。這不僅豐富了學習資源,也增加了學習的靈活性和互動性。
  4. 請求限制:為了確保系統的合理使用,工作流需禁止使用者在未經測試的情況下直接請求生成證書。這一限制能夠促使學生認真參與學習過程,而不是依賴於證書的快速獲取。

其他功能的實現相對簡單,例如,建議和總結的部分將透過一個大型模型節點來完成,它能夠綜合分析使用者的表現並生成具有針對性的反饋。至於影片連結的提供,將由百度影片節點負責生成。

這裡需要特別注意:為了防止影片連結瞎生成,我的變數設定中包含了詳細的格式要求。這種格式必須為“新概念英語 - 第1冊 - 第×××課”。如果僅僅使用“第一課”或只是課程名稱,可能會導致搜尋到與之無關的影片連結。

在這裡,我詳細講一下證書生成的過程。

生成證書

在這裡,我使用了一個第三方API,其中涉及到了一些其他雲廠商的內容,因此我就不深入講解這部分了。簡而言之,這個榮譽證書的生成過程實際上結合了一個雲廠商的邊緣計算功能和CDN服務,並進行了圖片處理,從而實現了動態生成的效果。關於對接的程式碼,大家可以參考我分享的內容,我在其中去掉了秘鑰資訊,以確保隱私和安全。

# 定義一個 main 函式,傳入 params 引數。params 中包含了節點配置的輸入變數。
# 需要定義一個字典作為輸出變數
# 引用節點定義的變數:params['變數名']
# 執行環境 Python3;預置 Package:NumPy
import json
import hashlib 
from datetime import datetime
import re


def encode_chinese_in_url(url):
    encoded_url = ""
    
    for char in url:
        if char == ' ':
            encoded_url += '%20'  # 將空格編碼為 %20
        elif '\u4e00' <= char <= '\u9fff':  # 中文字元的 Unicode 範圍
            encoded_char = char.encode('utf-8')
            encoded_url += ''.join(['%' + format(b, '02X') for b in encoded_char])
        else:
            encoded_url += char  # 其他字元保持不變
            
    return encoded_url

def get_final_url(template_id,params):
    # URL 字首
    url_prefix = ''
    # 模板中設定的圖片格式
    format = 'png'
    # 使用者 Id
    user_id = ''
    # 模板 Id
    # template_id = template_id
    # 生成簽名的 API Key
    api_key = ''
    # 在這裡填入要修改的模板引數
    # params = {}
    
    # 對引數 key 進行排序
    sorted_keys = sorted(params.keys())
    # 對引數進行拼接
    search_params = '&'.join(f'{key}={params[key]}' for key in sorted_keys)
    
    # 待簽名的資料
    sign_data = json.dumps({
        'apiKey': api_key,
        'searchParams': search_params,
    }, ensure_ascii=False,separators=(",", ":"))
    # return sign_data
    # 呼叫 md5 生成簽名
    sign = generate_md5(sign_data)

    # 拼接成最後的路徑
    final_url = f"{url_prefix}/{sign}/{user_id}/{template_id}.{format}?{search_params}"

    encoded_path = encode_chinese_in_url(final_url)
    return encoded_path

def generate_md5(sign_data):
    # 建立 MD5 雜湊物件
    md5_hash = hashlib.md5()
    # 更新雜湊物件
    md5_hash.update(sign_data.encode(encoding='UTF-8'))
    # 獲取十六進位制的雜湊值
    return md5_hash.hexdigest()

def main(params):
    curse = params['curse']
    # 獲取當前日期
    current_date = datetime.now()

    # 格式化日期
    formatted_date = current_date.strftime('%Y-%m-%d')
    template_id = 'ep-vna6OlJNvSwu'
    params = {
        "name": f"{curse}",
        "title": f"恭喜小夥伴完成了英語學習,積極向上!為鼓勵你繼續努力,我們特發此證,以資鼓勵",
        "date": f"{formatted_date}",
        "award": f"新概念英語學習助手"
        }
    final_url = get_final_url(template_id,params)    
    # 建立一個字典作為輸出變數
    output_object ={
    
        # 引用節點定義的 city 變數
        "link": final_url,
    }
    
    # 返回輸出字典型別變數 output_object,包含程式碼節點所需的輸出資料
    return output_object

最終效果非常出色,具體情況可以參考下圖所示:

image

整體佈局

讓我們一起來仔細看看整體佈局的設計和結構吧。

image

請注意,在結束節點之前有一個關鍵的程式碼節點。這個節點負責判斷應該輸出哪些內容。檢視下面的程式碼片段會讓你更清晰地理解這一邏輯,也能幫助你更好地融入整個流程。

image

在這裡,我們直接將輸出內容進行拼接,這樣可以確保外層的大模型不會對輸出進行潤色或修改。這一做法有助於保持原始資訊的完整性。關於這個問題,我們在之前的討論中已經提到過,因此這裡就不再詳細贅述。

image

整體效果

編排效果

先檢視一下編排效果。除了我之前提到的內容之外,這裡並沒有配置過多不必要的元件。

image

問答效果

整體問答有時會出現判斷錯誤,導致無法準確識別已經完成的回答輪次。因此,偶爾可能會出現少了一輪問答的情況。不過,這並不影響整體流程的正常運作。系統仍然能夠順利進行,不會出現嚴重的問題。

image

希望此次構建流程能夠為大家提供實質性的幫助和啟發~

總結

在今天的分享中,我們共同探討了如何構建一個智慧英語學習助手,利用《新概念英語》的第一冊為基礎,幫助學生們在英語學習中打下堅實的基礎。回顧我們的目標,尤其是針對小學和初中學生,這個助手的設計旨在快速而有效地提升他們的英語水平,特別是在中考這樣的重要考試中,幫助他們取得優異成績。

我們明確了學習助手的核心目標:透過系統化的學習和互動,尤其聚焦於奇數課的知識點,使學習者能夠逐步掌握基礎英語。這種針對性的學習方式,既能讓學生們在短時間內建立信心,又能有效避免學習中的冗雜與困惑。透過逐一提問和反饋,學生能夠更好地理解和應用所學內容,增強其語言運用能力。

接下來,我們詳細闡述瞭如何透過整合知識庫和資料庫,最佳化模型的回答能力。透過精確匹配課程內容,學習助手能夠實時提供準確的答案和學習建議,從而提升使用者體驗。同時,證書生成和個性化反饋的設計,旨在激勵學生不斷進步,培養他們的學習熱情。

專案不僅關注學習過程的科學性和系統性,更重視學習者的體驗與感受。在除錯和最佳化過程中,不斷反思與改進,確保最終的學習助手能夠滿足廣大學生的需求。透過這樣的探索與實踐,期待每位學生在英語學習的旅程中,能夠獲得更好的支援與指導。


我是努力的小雨,一名 Java 服務端碼農,潛心研究著 AI 技術的奧秘。我熱愛技術交流與分享,對開源社群充滿熱情。同時也是一位騰訊雲創作之星、阿里雲專家博主、華為云云享專家、掘金優秀作者。

💡 我將不吝分享我在技術道路上的個人探索與經驗,希望能為你的學習與成長帶來一些啟發與幫助。

🌟 歡迎關注努力的小雨!🌟

相關文章