2023年5月9日 星期二

第一次使用 C# 與 ElasticSearch

第一次使用 C# 與 ElasticSearch

Elasticsearch 是一個開源的、分布式的、RESTful 風格的搜索和分析引擎。它基於 Apache Lucene 庫構建,通常用於實現全文搜索、大數據分析和實時數據處理等功能。以下是 Elasticsearch 可以做到的事情和它的用途:

  • 全文搜索:Elasticsearch 能夠對大量文檔進行快速、實時的全文搜索,並提供高度可配置的相關性排序和過濾功能。它可以用於網站或應用程序中的搜索框,以幫助用戶快速找到所需信息。
  • 數據分析:Elasticsearch 具有強大的數據分析能力,可以用於對結構化和非結構化數據進行實時聚合和分析。這對於生成報告、構建儀表板以及進行數據挖掘和可視化非常有用。
  • 日誌和事件數據處理:Elasticsearch 常與 Logstash 和 Kibana 一起使用(統稱為 ELK 堆棧),以收集、存儲、搜索和分析來自不同來源的日誌和事件數據。
  • 擴展性和高可用性:Elasticsearch 是分布式的,這意味著它可以水平擴展以支持更多數據和更高的吞吐量。它還具有高可用性和容錯功能,可以在節點故障時自動恢復。

Elasticsearch 的需求源於其能夠快速、靈活地處理大量數據,並提供實時搜索和分析功能。它適用於各種場景,例如站內搜索、日誌分析、數據挖掘和監控等。對於需要進行大規模搜索和分析的應用程序或組織來說,Elasticsearch 是一個很好的選擇。

對於 Elasticsearch 這樣優秀的工具,若能夠透過 .NET / C# 來進行呼叫,相信必定可以做到更多層面的加值應用,因此,首先需要學會如何透過 C# 來呼叫 Elasticsearch 提供的功能,將一筆文件寫入到 Elasticsearch Index 內。

建立可以使用 C# 程式碼將文件寫入到 Elasticsearch 索引內的測試專案

為了簡化測試用專案的複雜度,因此,在這裡將會建立一個 Console 主控台應用類型的專案。

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [主控台]
  • 在中間的專案範本清單中,找到並且點選 [主控台應用程式] 專案範本選項

    專案,用於建立可在 Windows、Linux 及 macOS 於 .NET 執行的命令列應用程式

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csElasticSearchQuichStart 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 7.0 (標準字詞支援)
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個主控台專案將會建立完成

安裝要用到的 NuGet 開發套件

因為開發此專案時會用到這些 NuGet 套件,請依照底下說明,將需要用到的 NuGet 套件安裝起來。

安裝 Elastic.Clients.Elasticsearch 套件

Elastic.Clients.Elasticsearch 是一個針對 .NET 平台的 Elasticsearch 客戶端庫,它允許您從 .NET 應用程序與 Elasticsearch 集群進行通信和互動。該庫為 Elasticsearch 提供了一個強類型的、易於使用的 API,可以用於執行各種操作,如索引管理、文檔檢索、搜索、數據分析等。

以下是 Elastic.Clients.Elasticsearch 庫的主要功能和目的:

  • 索引管理:使用該庫,您可以在 Elasticsearch 中創建、更新、刪除和配置索引。
  • 文檔操作:該庫提供了對文檔的 CRUD(創建、讀取、更新和刪除)操作,允許您將數據存儲到 Elasticsearch 中,並在需要時檢索、更新或刪除文檔。
  • 搜索功能:Elastic.Clients.Elasticsearch 庫支持 Elasticsearch 的強大搜索功能,如全文搜索、分面搜索、過濾和排序等。您可以使用強類型的查詢語法來構建複雜的搜索條件。
  • 數據分析:該庫允許您利用 Elasticsearch 的實時數據分析和聚合功能,用於生成報告、構建儀表板或進行數據挖掘。
  • 集群管理:Elastic.Clients.Elasticsearch 庫提供了用於管理 Elasticsearch 集群的 API,例如檢查集群狀態、節點統計信息和碩士選舉等。

總之,Elastic.Clients.Elasticsearch 庫為 .NET 開發者提供了一個強大且靈活的工具,用於與 Elasticsearch 集群進行通信和互動。該庫使得在 .NET 應用程序中集成 Elasticsearch 的搜索和分析功能變得更加簡單和高效。 請依照底下說明操作步驟,將這個套件安裝到專案內

  • 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
  • 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
  • 此時,將會看到 [NuGet: csElasticSearchQuichStart] 視窗
  • 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
  • 在左上方找到一個搜尋文字輸入盒,在此輸入 Elastic.Clients.Elasticsearch
  • 稍待一會,將會在下方看到這個套件被搜尋出來
  • 點選 [Elastic.Clients.Elasticsearch] 套件名稱
  • 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
  • 點選這個 [安裝] 按鈕,將這個套件安裝到專案內

建立要寫入索引內的文件使用的類別

  • 滑鼠右擊專案節點
  • 從彈出功能表中,點選 [加入] > [類別]
  • 此時出現了 [新增項目] 對話窗
  • 確認對話窗內的中間區域,已經選擇了 [類別] 這個項目
  • 在對話窗的下方 [名稱] 欄位內,輸入 Tweet.cs 作為這個新類別檔案名稱
  • 使用底下程式碼,替換掉剛剛產生的程式碼
namespace csElasticSearchQuichStart;

/// <summary>
/// Tweet 物件
/// </summary>
public class Tweet
{
    /// <summary>
    /// 使用者名稱
    /// </summary>
    public string User { get; set; }
    /// <summary>
    /// 發文日期
    /// </summary>
    public DateTime PostDate { get; set; }
    /// <summary>
    /// 發文內容
    /// </summary>
    public string Message { get; set; }
}

在這裡將會宣告一個 [Tweet] 類別,這個類別所產生的執行個體或物件,將會寫入到 Elasticsearch 索引內,在指定的索引內建立一筆 [Document] 文件紀錄,接下來看看如何進行這樣的操作。

開始進行轉檔程式設計

  • 在此專案節點下,找到並且打開 [Program.cs] 這個檔案
  • 使用底下 C# 程式碼替換掉 [Program.cs] 檔案內所有程式碼內容
using Elastic.Clients.Elasticsearch;

namespace csElasticSearchQuichStart;

internal class Program
{
    static async Task Main(string[] args)
    {
        // 建立 ElasticsearchClient 物件
        var client = new ElasticsearchClient(new Uri("http://192.168.82.7:9200"));

        // 建立一個 Tweet 物件
        var tweet = new Tweet
        {
            User = "Vulcan Lee",
            PostDate = DateTime.Now,
            Message = "Elasticsearch 是一個開源的、分布式的、RESTful 風格的搜索和分析引擎。"
        };

        // 將 Tweet 物件存入 Elasticsearch
        var response = await client.IndexAsync(tweet, "my-index-name");

        // 檢查存入是否成功
        if (response.IsValidResponse)
        {
            // 取得存入的 ID
            Console.WriteLine($"Index document with ID {response.Id} succeeded.");
        }
    }
}

在這個程式進入點方法內,首先使用 [ElasticsearchClient] 方法建立一個物件,由於這個類別的建構式可以接收多種參數,這裡選擇的是傳入一個 [Uri] 物件,而該 URI 將會指向自己所安裝的 Elasticsearch 服務主機,而 9200 Port 將會是預設的連線 Port 編號。

接著,建立一個 Tweet 物件,在這裡,將會把 [PostDate] 這個屬性值設定為 C# 內的 [DateTime.Now] 這個屬性值,因此,對於 [PostDate] 將會表示當前寫入的時間點;稍後,將可以透過者個屬性值,確認是否有成功寫入到 Elasticsearch 索引內。

現在,可以使用 Elasticsearch 類別庫提供的 client.IndexAsync(tweet, "my-index-name") 方法,將剛剛建立的物件,寫入到 Elasticsearch 的名為 [my-index-name] 索引內,在這裡將會形成一個文件在此索引內。

一旦這個方法呼叫完成後,將會回船型別為 [IndexResponse] 物件,透過該物件的 [IsValidResponse] 屬性值,可以得知此次執行是否有成功,若執行成功,將會把成功寫入的 Id 鍵值,也就是 [IndexResponse.Id] 顯示在螢幕上。

確認現在 Elasticsearch 狀態

  • 開啟瀏覽器,輸入網址 http://192.168.82.7:5601/

    這裡使用的服務埠將會是預設安裝所產生的

  • 此時,網頁將會呈現如下內容

  • 點選左上角的漢堡按鈕,開啟最左方的彈出功能表

  • 捲到彈出功能表,將會看到最後一個功能表選項為 Stack Management

  • 點選 Stack Management 選項

  • 此時將會進入到 [http://192.168.82.7:5601/app/management] 這個網頁

  • 現在左邊出現的 [Management] 功能表清單中,可以找到 [Kibana] 這個功能表

  • 在 [Kibana] 功能表中,在其下方將會看到 [Data Views] 這個功能表選項

  • 點選這個功能表選項

  • 確認從中間的 [Data Views] 內容中,沒有看到 名稱 Name 為 [my-index-name] 的 Data View

執行並確認有成功寫入到 ElasticSearch

  • 執行這個專案

  • 底下將會是執行後的螢幕截圖結果

  • 從執行結果可以看到,這裡建立了一個 Index,並且成功建立了一筆 document 文件紀錄,該文件 ID 為 46f_-YcB__eiJ4Vbf9yl

  • 現在回到 ElasticSearch 網頁上

  • 點選左上角漢堡按鈕,開啟彈出功能選項清單

  • 捲動該清單到最下方,將會看到 [Stack Management]選項

  • 點選這個 [Stack Management] 功能表選項

  • 此時,從網頁的最左方將會看到 [Management] 這個功能表清單

  • 找到 [Data] > [Index Management] 並且點選這個選項

  • 此時,在網頁的中間,將會看到 [Index Management] 畫面

  • 若在第一個欄位 (Name這個欄位) 有看到名為 [my-index-name] 的索引

  • 那就表示這次的新增 document 動作,因為系統沒有這個 Index,所以將會自動產生出來

  • 現在需要查看這個 Index 內有哪些 document 在裡面

  • 捲動左邊的功能表清單,直到看到 [Kibana] > [Data Views] 這個項目

  • 點選 [Data Views] 這個選項,將會看到如下圖畫面 

  • 點選右上方的 [Create data view] 按鈕

  • 現在有一個區域從網頁的右邊往左邊彈出來

  • 這個區域稱作 [Create data view]

  • 在欄位 [Name] 與 [Index pattern] 都輸入 my-index-name

  • 對於 [Timestamp field] 欄位,在其下拉選單中,選擇 [--- I don't want to use the time filter ---] 這個選項

  • 點選下方的 [Save data view to Kibana] 按鈕

  • 現在網頁畫面如下

  • 點選左上角漢堡按鈕,開啟彈出功能選項清單

  • 捲動該清單到最下方,將會看到 [Stack Management]選項

  • 點選左上角漢堡按鈕,開啟彈出功能選項清單

  • 從該清單到最上方,找到並且點選 [Analytics] > [Discover]

  • 當網頁顯示完成後,可以在左上方看到有個淡藍色下拉選單

  • 打開該下拉選單

  • 此時,應該可以找到 [my-index-name] 項目

  • 點選這個 [my-index-name] 項目

  • 沒有意外的話,可以從如底下螢幕截圖畫面中,看到剛剛新增的 document

 










2023年5月7日 星期日

將文件檔案轉換成為文字內容系列 - Office Word

將文件檔案轉換成為文字內容系列 - Office Word

在 上一篇文章 有討論到如何將 HTML 文件檔案轉換成為文字內容,在這份文章中,將會是這個轉換成為文字內容系列文章的第 3 個,在這裡將會探討如何將 Office 這套軟體中的 Word 類型的檔案,抽取出裡面的文字內容出來。

建立可以將 Office Word 檔案轉換出文字內容的測試專案

為了簡化測試用專案的複雜度,因此,在這裡將會建立一個 Console 主控台應用類型的專案。

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [主控台]
  • 在中間的專案範本清單中,找到並且點選 [主控台應用程式] 專案範本選項

    專案,用於建立可在 Windows、Linux 及 macOS 於 .NET 執行的命令列應用程式

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csWord2Text 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 7.0 (標準字詞支援)
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個主控台專案將會建立完成

安裝要用到的 NuGet 開發套件

因為開發此專案時會用到這些 NuGet 套件,請依照底下說明,將需要用到的 NuGet 套件安裝起來。

安裝 NPOI 套件

NPOI 是一個針對 C# 開發環境的開源文件處理庫,主要用於操作 Microsoft Office 文件格式,如 Excel(.xls 和 .xlsx)、Word(.doc 和 .docx)等。它提供了一個功能強大且靈活的 API,讓開發者能夠快速並輕鬆地完成對這些文件的讀取、創建和編輯操作。

NPOI 的主要功能和目的包括:

  • 讀取和寫入 Excel 文件:支持讀取和寫入 Excel 文件的內容,包括單元格、行、列、工作表等元素。開發者可以利用 NPOI 對 Excel 文件進行各種操作,如數據導入、導出、報表生成等。
  • 讀取和寫入 Word 文件:支持讀取和寫入 Word 文件的內容,包括文本、段落、列表、表格等元素。開發者可以利用 NPOI 進行 Word 文件的創建、修改和數據提取等操作。
  • 格式控制:提供了對 Office 文件中各種格式的控制,如字體、顏色、對齊、邊框等,讓開發者能夠更好地自定義文件的外觀和樣式。
  • 公式和圖表:支持對 Excel 文件中的公式和圖表的操作,如計算、更新和創建等。
  • 模板操作:可以基於現有的 Office 文件模板進行操作,方便開發者快速生成具有一致格式和樣式的文件。
  • 流操作:支持對流(Stream)進行讀取和寫入操作,使得開發者可以在不需要實際存儲文件的情況下進行 Office 文件的處理。

總之,NPOI 是一個功能強大的 Office 文件處理套件,適用於 C# 開發環境。它可以幫助開發者輕鬆地讀取、創建和編輯各種 Microsoft Office 文件,提高工作效率。

請依照底下說明操作步驟,將這個套件安裝到專案內

  • 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
  • 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
  • 此時,將會看到 [NuGet: csWord2Text] 視窗
  • 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
  • 在左上方找到一個搜尋文字輸入盒,在此輸入 NPOI
  • 稍待一會,將會在下方看到這個套件被搜尋出來
  • 點選 [NPOI] 套件名稱
  • 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
  • 點選這個 [安裝] 按鈕,將這個套件安裝到專案內

準備需要抽取文字內容的 PDF 檔案

  • 準備好一個 [.pdf] 文件檔案

  • 在這裡將會從網路上,隨機找到一個 [UserGuide_Android.docx] 檔案

  • 取得該檔案之後,將其透過檔案總管拖拉到 Visual Studio 2022 的專案內

  • 接著,點選 [UserGuide_Android.docx] 檔案

  • 查看 [屬性] 視窗的內容

    若沒有看到屬性視窗出現在 Visual Studio 2022 內,請從 Visual Studio 2022 功能表中,點選 [檢視] > [屬性視窗]

    (這個選項將會在功能表清單內的最下面)

  • 在屬性視窗內,找到 [複製到輸出目錄] 這個選項

  • 從下拉選單中找到並且設定為這個 [有更新時才複製] 選項

開始進行轉檔程式設計

  • 在此專案節點下,找到並且打開 [Program.cs] 這個檔案
  • 使用底下 C# 程式碼替換掉 [Program.cs] 檔案內所有程式碼內容
using NPOI.XWPF.Extractor;
using NPOI.XWPF.UserModel;

namespace csWord2Text
{
    internal class Program
    {
        static void Main(string[] args)
        {
            // 讀取 Word 檔案
            XWPFDocument document = new XWPFDocument(File.OpenRead(@"UserGuide_Android.docx"));

            // 讀取所有內容
            XWPFWordExtractor extractor = new XWPFWordExtractor(document);
            string text = extractor.Text;

            // 輸出所有內容
            Console.WriteLine(text);

            // 關閉 C# 檔案
            document.Close();
        }
    }
}

首先使用 [File.OpenRead] 方法來打開指定的 Word 檔案,該方法會回傳 Stream 物件,接著將這個 Stream 物件傳遞到 [XWPFDocument] 建構式內,如此便可以得到 [XWPFDocument] 物件。

接著,再來建立一個 [XWPFWordExtractor] 物件,透過這個物件,便可以抽取出在 Word 文件檔案內的所有文字出來。

最後,將所有的文字內容輸出到螢幕上

底下將會是執行後的螢幕截圖結果

底下是原始的 Word 檔案

 





2023年5月5日 星期五

甚麼是 GPT 分詞器 Tokenizer

甚麼是 GPT 分詞器 Tokenizer

GPT Tokenizer 是一個專門用於 Generative Pre-trained Transformer(GPT)模型的分詞器(Tokenizer)。它將文本輸入分解為一系列單詞、子詞或字符,稱為 tokens。這些 tokens 是 GPT 模型進行自然語言處理任務時的基本輸入單位。在 GPT 模型中,文本的表示和生成 (可以說 GPT 的輸入與輸出) 都是基於這些 tokens 進行的。

GPT Tokenizer 的具體實現基於 Byte Pair Encoding(BPE)算法。BPE 是一種無監督的文本壓縮算法,可以將文本中的頻繁出現的字符序列合併為單個 tokens。該算法根據字符在文本中出現的頻率將字符進行聚合,最終生成一個詞彙表(vocabulary),其中包括單詞、子詞和字符。

GPT Tokenizer 的主要用途如下:

  1. 文本預處理:在將文本輸入 GPT 模型之前,需要使用 GPT Tokenizer 對文本進行預處理,將其轉換為一系列 tokens。這些 tokens 是 GPT 模型接受的輸入格式。

  2. 文本生成:當 GPT 模型生成文本時,它實際上是生成一系列 tokens。GPT Tokenizer 可以將這些生成的 tokens 轉換回可讀的文本格式。

  3. 計算 token 使用量:在使用 GPT 模型進行文本生成時,我們需要控制生成的 token 數量,以避免過長的輸出或超出模型的最大序列長度。GPT Tokenizer 可以幫助我們計算輸入文本中的 token 數量,以便我們確定生成過程中的限制條件。

總之,GPT Tokenizer 是 GPT 模型進行文本表示、生成和相關計算的重要組件。它可以幫助我們將文本轉換為 GPT 模型所需的格式,並將生成的 tokens 轉換回可讀的文本。

例如,當輸入了這串文字

This library is licensed CC0, in the public domain.

經過 GPT 分詞器 Tokenizer 處理之後,將會分析出這串文字共有 51 個字元,並且將會轉換成為 12 Token;而原先的文字將會如下圖不同顏色區塊,切割成為不同的 Token。

Token IDs(或 Token Indices)是指將 token(單詞、子詞或字符)映射到一個唯一的整數標識符。每個 token 在模型的詞彙表中都有一個相應的 ID。Token IDs 是模型內部使用的一種表示形式,有助於模型更有效地處理和學習文本信息。

當我們使用分詞器(如 GPT Tokenizer)將文本轉換為 token 時,下一步是將這些 token 轉換為 token IDs。這樣,模型可以根據這些 ID 進行文本信息的處理和學習。在訓練過程中,這些 token IDs 會被轉換成 token Embedding,進一步捕捉詞彙的語義信息。

了解了 GPT 分詞器 Tokenizer 是什麼之後,當在進行 GPT Prompt / Completion 或者 Embedding API 進階應用呼叫的後,將會顯得相當有幫助的。

建立可以使用 GPT 分詞器 Tokenizer 的測試專案

為了簡化測試用專案的複雜度,因此,在這裡將會建立一個 Console 主控台應用類型的專案。

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [主控台]
  • 在中間的專案範本清單中,找到並且點選 [主控台應用程式] 專案範本選項

    專案,用於建立可在 Windows、Linux 及 macOS 於 .NET 執行的命令列應用程式

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csGptTokenizer 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 7.0 (標準字詞支援)
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個主控台專案將會建立完成

安裝要用到的 NuGet 開發套件

因為開發此專案時會用到這些 NuGet 套件,請依照底下說明,將需要用到的 NuGet 套件安裝起來。

安裝 AI.Dev.OpenAI.GPT 套件

AI.Dev.OpenAI.GPT 是一個 NuGet 套件,可以在 .NET 和 C# 專案中使用 。它提供了一個 GPT3Tokenizer C# 類別,可以幫助您計算提示和收到的回應中的令牌數 。該分詞器使用字節對編碼(BPE)算法,根據頻率和合併規則將單詞拆分為子詞 。

您可以通過在 nuget.org 上運行命令 dotnet add package AI.Dev.OpenAI.GPT --version 1.0.2 來安裝 AI.Dev.OpenAI.GPT NuGet 套件 。

請依照底下說明操作步驟,將這個套件安裝到專案內

  • 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
  • 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
  • 此時,將會看到 [NuGet: csGptTokenizer] 視窗
  • 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
  • 在左上方找到一個搜尋文字輸入盒,在此輸入 AI.Dev.OpenAI.GPT
  • 稍待一會,將會在下方看到這個套件被搜尋出來
  • 點選 [AI.Dev.OpenAI.GPT] 套件名稱
  • 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
  • 點選這個 [安裝] 按鈕,將這個套件安裝到專案內

開始進行使用 GPT 分詞器 Tokenizer 來進行程式設計

  • 在此專案節點下,找到並且打開 [Program.cs] 這個檔案
  • 使用底下 C# 程式碼替換掉 [Program.cs] 檔案內所有程式碼內容
using AI.Dev.OpenAI.GPT;

namespace csGptTokenizer
{
    internal class Program
    {
        static void Main(string[] args)
        {
            string text = "Microsoft MVP | 提供 .NET C# / Blazor / MAUI 教育訓練與顧問服務";
            List<int> tokens = GPT3Tokenizer.Encode(text);
            Console.WriteLine(text);
            Console.WriteLine($"中文字串長度:{text.Length}, Token數量:{tokens.Count}");
            text = "Microsoft MVP | Providing .NET C# / Blazor / MAUI Education, Training and Consulting Services";
            tokens = GPT3Tokenizer.Encode(text);
            Console.WriteLine(text);
            Console.WriteLine($"英文字串長度:{text.Length}, Token數量:{tokens.Count}");
            Console.WriteLine($"上述 Token 計算結果,可以從 https://platform.openai.com/tokenizer 來進行比對");
        }
    }
}

在這個測試程式碼中,將會分別把含有中文字的文字,與純粹全部都是英文字的文字,對於這兩種類型的文字,在透過 分詞器 處理過後,究竟會得到多少 Token 數量。

首先,會先準備一個含有 中英文 的文字,底下的文字將會儲存在 [text] 這個區域變數內。

Microsoft MVP | 提供 .NET C# / Blazor / MAUI 教育訓練與顧問服務

使用 [GPT3Tokenizer.Encode] 靜態方法,分析與取出這串文字的所有 Token 到 [tokens] 區域變數內,這是個 List<int> 型別物件。有了這些資訊,便可以得到這文字字串長度為 52 , 產生出 Token數量為 42

若是全為中文的文字

近年來物價飆漲,有眼尖的網友就發現連鎖速食店「摩斯漢堡」似乎偷偷調漲

將會得到這文字字串長度為 34 , 產生出 Token數量為 79

會有這樣的結果,這是因為一個中文字在進行分詞過程,將會拆解出 1~3 個 Token,反觀,一個英文字(會有多個字母所組成),通常會轉換成為一個 Token,但也有可能拆出多個 Token。

最後來看看全部都是英文的文字,經過分詞處理之後,所得甚麼樣的結果

Microsoft MVP | Providing .NET C# / Blazor / MAUI Education, Training and Consulting Services

將會得到這文字字串長度為 93 , 產生出 Token數量為 21

底下將會是執行後的螢幕截圖結果