顯示具有 OpenAI 標籤的文章。 顯示所有文章
顯示具有 OpenAI 標籤的文章。 顯示所有文章

2023年4月24日 星期一

體驗使用 Azure OpenAI client library for .NET 套件之設計聊天GPT - 開發教學

體驗使用 Azure OpenAI client library for .NET 套件之設計聊天GPT - 開發教學

上一篇文章 體驗使用 Azure OpenAI client library for .NET 套件之驗經驗分享 - 開發教學 中,對於 微軟官方的 Azure.AI.OpenAI 套件,使用 Prompt / Completion 模式來進行一個 GPT API 呼叫,說明整個設計過程與會用到相關程式碼用法。

至於當初一開始設計呼叫 Azure OpenAI API 的時候,從網路上找到這個 [Betalgo.OpenAI.GPT3] 套件,來呼叫 Azure OpenAI GPT 相關 API 似乎都沒有遇到甚麼問題,最重要的是,可以同時支援 OpenAI GPT API 與 微軟這裡的 OpenAI GPT API,這樣的功能真的是太完美了,因為可以同時切換在不同系統下來使用 GPT 所提供的功能。

這麼好用與開發上相當容易的套件,為什麼要更換成為 微軟官方的 Azure.AI.OpenAI 套件呢?其中一個最主要的原因,那就是之前使用的套件,無法使用 Azure OpenAI 內提供的 GPT4 功能,所以,只好放棄使用這個套件。

然而,最重要的原因就是,市面上滿滿 OpenAI GPT 的開發文章,幾乎一面倒地使用 Python 這個語言來做為演練主角,這讓身為 .NET 資深開發者很沒面子,也很無奈呀,難道 .NET / C# 真的與 OpenAI 這波浪潮無緣嗎?我不斷地搜尋,發現到,微軟真的有認真投入在 OpenAI 與 C# 開發工具支援上(說實在的,自己的小孩,自己不疼,還有誰會疼),真的做到讓人刮目相看的地步,原本以為要再等很久的時間,才能夠看到有哪位大神可以釋放出可以使用 C# 開發 OpenAI GPT 應用的套件,沒想到微軟這麼快就推出了,而且驚訝的是相當親切、容易、完成,這與我之前所認識的微軟作風與做事態度,180度的顛覆我的認知。

話不多說,堅持是一定要的,這裡還是要持續使用 C# 來做到任何事情,經過第一次上手 [Azure.AI.OpenAI] 套件後,發現到這個套件也不會難用,很快速就可以上手,也許是之前有使用與呼叫過 GPT API,所以幾乎無痛就這麼開發下去了。

在第一次看到這個套件說明文件的時候,我就眼睛一亮有看到 [Chat Messages] 這個主題,心裡想說這到底是可以做出類似 ChatGPT 這樣應用的 API,還是甚麼其他鬼東西,由於尚有許多工作、文章、簡報需要去處理,心中的那個疑惑也就暫時放下了;就在今天,還是來解除這個疑問吧?

在這篇文章將會使用 [Azure.AI.OpenAI] 提供的 [Chat Messages] API,設計出一個智慧大主廚功能,使用者只需要輸入手頭上的食材,智能大主廚就會幫你設計出菜單,並且告訴你怎們做出這套菜,最後為這道菜做出完美說明。

取得 Azure OpenAI Key 並且儲存為系統環境變數

同樣的,這裡還是使用 Azure 上提供的 OpenAI 服務來進行 API 呼叫

  • 打開 Azure 網頁,並且登入該服務

  • 切換到你自己建立 [Azure OpenAI] 服務

  • 在 Overview 儀表板頁面中,將會看到 [Manage keys] 欄位

  • 點選該欄位名稱右邊的 [Click here to manage keys] 文字

  • 現在將會看到 [Keys and Endpoint] 這個頁面

  • 你可以點選 [Show Keys] 來看到 API Key 的內容,又或者點選最右方的複製按鈕,將 API Key 複製到剪貼簿內

  • 開啟命令提示字元視窗

  • 使用底下命令將建立 OpenAI Key 永久性的環境變數

setx OpenAIKey "剪貼簿內的 OpenAI Key 值" /M

建立使用 Azure OpenAI client library for .NET 測試用的專案

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

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

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

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

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

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

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

安裝要用到的 NuGet 開發套件

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

安裝 Azure.AI.OpenAI 套件

  • 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
  • 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
  • 此時,將會看到 [NuGet: AzureOpenAIClientLibraryChatMessages] 視窗
  • 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
  • 在左上方找到一個搜尋文字輸入盒,在此輸入 Azure.AI.OpenAI
  • 對於這個套件,現在尚在 Preview 階段,因此,請勾選 [包括搶鮮版] 這個檢查盒控制項
  • 稍待一會,將會在下方看到這個套件被搜尋出來
  • 點選 [Azure.AI.OpenAI] 套件名稱
  • 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
  • 點選這個 [安裝] 按鈕,將這個套件安裝到專案內

安裝 Azure.Identity 套件

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

修正主程序 Program.cs 的程式碼

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

namespace AzureOpenAIClientLibraryChatMessages
{
    internal class Program
    {
        static async Task Main(string[] args)
        {
            #region 使用 Azure.AI.OpenAI 套件來 OpenAIClient 物件
            var apiKey = Environment.GetEnvironmentVariable("OpenAIKey");
            string endpoint = "https://vulcan-openai.openai.azure.com/";
            var client = new OpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey));
            #endregion

            #region 準備使用 OpenAI GPT 的 聊天記憶功能,並且呼叫 GPT API 來生成內容
            while (true)
            {
                Console.WriteLine("請輸入手頭上可用的食材名稱");
                string input = Console.ReadLine();
                Console.WriteLine("請稍後,主廚正在思考中...");
                var chatCompletionsOptions = new ChatCompletionsOptions()
                {
                    Messages =
                    {
                        new ChatMessage(ChatRole.System, "你是一個全方位主廚,擅長世界各地美食製作與烹飪," +
                        "將會根據輸入食材,建議要做出的菜名與建議作法(並不一定只能夠使用指定食材來設計這道菜),最後給予這道菜一個完美說明與介紹;" +
                        "若輸入內容沒有食材,請回應:這難倒我了,我不是食神"),
                        new ChatMessage(ChatRole.User, "食材:雞胸肉、檸檬、迷迭香"),
                        new ChatMessage(ChatRole.Assistant, "建議:檸檬迷迭香烤雞胸"),
                        new ChatMessage(ChatRole.User, "食材:番茄、義大利麵、大蒜"),
                        new ChatMessage(ChatRole.Assistant, "建議:番茄大蒜義大利麵"),
                        new ChatMessage(ChatRole.User, $"食材:{input}"),
                    },
                    Temperature = (float)0.7,
                    MaxTokens = 800,
                    NucleusSamplingFactor = (float)0.95,
                    FrequencyPenalty = 0,
                    PresencePenalty = 0
                };

                string deploymentName = "gpt-4";
                Response<ChatCompletions> response = await client.GetChatCompletionsAsync(
                    deploymentOrModelName: deploymentName,
                    chatCompletionsOptions);
                var result = response.Value;

                foreach (var message in result.Choices)
                {
                    Console.WriteLine(message.Message.Content);
                }
                await Console.Out.WriteLineAsync();
                await Console.Out.WriteLineAsync();
                #endregion
            }

            Console.WriteLine("Press any key for continuing...");
            Console.ReadKey();
        }
    }
}

在這個進入點程式碼內,首先會進行使用 Azure.AI.OpenAI 套件來 OpenAIClient 物件,這裡先呼叫 Environment.GetEnvironmentVariable("OpenAIKey") 敘述,取得剛剛設定在系統環境變數中的 OpenAI Key 值,並且將 Key 儲存到 [apiKey] 這個物件內。會想要這麼設計的理由是很單純的,就是不想把 OpenAI Key 內容寫在程式碼內,並且 Commit 到版控系統內,如果是這樣的話,那麼,大家都會知道你的 OpenAI Key 內容,當然,也就可以透過這個 Key 來存取你的 Azure OpenAI Service,最後將是你需要負擔這些呼叫 API 的費用。

緊接著使用 OpenAIClient 類別來建立一個物件,這個類別建構函式將會需要 Azure OpenAI Service 的服務端點與 Azure OpenAI Key 這兩個資訊,使用 new OpenAIClient(new Uri(endpoint), new AzureKeyCredential(apiKey)) 這樣方式,建立起這個物件。

緊接著就是要來學習如何使用 Chat Completion 功能,建立一個 [ChatCompletionsOptions] 類別會用到的物件;一旦這個物件建立完成後,需要設定 [Messages] 這個屬性內容,其型別為 [IList],也就是說,這裡會有一連串的角色與需要描述的提示 Prompt 內容,所以,每產生一個 [ChatMessage] 物件,根據這個類別建構函式描述

/// <summary>
/// Initializes a new instance of ChatMessage.
/// </summary>
/// <param name="role">The role to associate with the message.</param>
/// <param name="content">The content to associate with the message.</param>
public ChatMessage(ChatRole role, string content)
{
    Role = role;
    Content = content;
}

需要傳遞一個 [ChatRole] 型別物件,與一個提示字串文字內容

對於 [ChatRole] 型別是一個 [struct] 型別,裡面會有三個主要的角色,分別是 [ChatRole.System]、[ChatRole.Assistant]、[ChatRole.User],這可以透過該型別的提供的三個靜態欄位來取得

  • [ChatRole.System] : 對系統指示的、用戶提示的輸入提供響應的角色
  • [ChatRole.Assistant] : 指示或設置助手行為的角色
  • [ChatRole.User] : 為聊天完成提供輸入的角色

因此,透過不同角色與其相對應的 Prompt 內容,將會讓 GTP 可以具有少數樣本的學習與產出能力,能夠產生真正需要的內容。

底下將會是這個範例所設計出來的少數樣本程式碼

Messages =
{
    new ChatMessage(ChatRole.System, "你是一個全方位主廚,擅長世界各地美食製作與烹飪," +
    "將會根據輸入食材,建議要做出的菜名與建議作法(並不一定只能夠使用指定食材來設計這道菜),最後給予這道菜一個完美說明與介紹;" +
    "若輸入內容沒有食材,請回應:這難倒我了,我不是食神"),
    new ChatMessage(ChatRole.User, "食材:雞胸肉、檸檬、迷迭香"),
    new ChatMessage(ChatRole.Assistant, "建議:檸檬迷迭香烤雞胸"),
    new ChatMessage(ChatRole.User, "食材:番茄、義大利麵、大蒜"),
    new ChatMessage(ChatRole.Assistant, "建議:番茄大蒜義大利麵"),
    new ChatMessage(ChatRole.User, $"食材:{input}"),
}

每一次使用者輸入的食材內容(這些內容將會儲存在 input 這個字串物件內),都會把上述的聊天情境文字,加入此次輸入的內容,一併送至 GPT API 內,而將會產生出預期的內容。

對於這個 ChatCompletionsOptions 物件,還在這個程式碼中使用到

Temperature = (float)0.7,
MaxTokens = 800,
NucleusSamplingFactor = (float)0.95,
FrequencyPenalty = 0,
PresencePenalty = 0

這些參數將會用於設定 GPT 可以控制生成回答或文本的風格和長度,而主要目的是讓您能夠根據您的需求和偏好,客製化生成的文本。當然,上述的參數值是可以依據本身需求來自行調整,或者執行各種問題後,再來變更這些參數內容,觀察哪個參數或者內容是合適的。

  • Temperature(溫度): 此參數控制生成文本的創意程度。較高的溫度值(如1.0)將導致生成的文本更具創意和多樣性,但可能較難理解或較為離題。較低的溫度值(如0.2)則會讓生成的文本更為保守、連貫和專注,但可能較為重複和保守。
  • MaxTokens(最大生成字數): 此參數限制生成文本的最大字數。這可以幫助您控制生成的文本的長度,避免產生過長或冗長的回答。
  • NucleusSamplingFactor(核抽樣因子): 此參數控制生成文本時使用的核抽樣策略。核抽樣是一種在生成過程中採樣候選字的方法,它選擇了一個概率閾值,僅考慮概率高於此閾值的候選字。NucleusSamplingFactor越高,生成的文本越具創意和多樣性,但可能較難理解或較為離題。
  • FrequencyPenalty(頻率懲罰): 這個參數用於控制生成文本中出現的單詞的罕見程度。較高的FrequencyPenalty值將抑制常見單詞的出現,從而使生成的文本更具特色和創意。然而,過高的值可能會導致文本難以理解。
  • PresencePenalty(出現懲罰): 此參數用於控制生成文本中重複詞語的程度。較高的PresencePenalty值會減少生成文本中重複單詞的機率,使文本更為多樣化。然而,過高的值可能會導致生成的文本不夠連貫。

完成之後,就可以透過 [GetChatCompletionsAsync] API,將需要使用的模型和 [ChatCompletionsOptions] 物件值傳送給 GPT,完成呼叫之後,將會得到 [Response] 型別的物件,現在便可以將 GPT 生成的內容輸出到螢幕上。

底下是執行這個專案的結果

請輸入手頭上可用的食材名稱
紅茶, 蝦子, 節瓜
請稍後,主廚正在思考中...
建議:紅茶燉蝦與節瓜

菜名:紅茶風味燉蝦搭配節瓜

作法:

1. 先將紅茶泡好,選擇一款濃郁的紅茶,如阿薩姆紅茶,並將紅茶濾出待用。

2. 準備新鮮的蝦子,去殼去腸,洗淨後瀝乾。

3. 節瓜削皮,切成小塊。

4. 大蒜切末,備用。

5. 熱鍋,倒入適量的橄欖油,先炒香大蒜末,再加入蝦子翻炒至變色,盛出備用。

6. 用剩餘的油和蒜末,將節瓜塊放入鍋中翻炒,炒至表面微焦後,倒入步驟1的紅茶,煮至節瓜軟熟。

7. 將炒好的蝦子放回鍋中,與節瓜一起煮沸,稍加調味(可用鹽、胡椒等,根據個人口味調整)。

8. 煮好之後,盛出並撒上適量的蔥花或香菜。

完成這道美味的紅茶風味燉蝦搭配節瓜,紅茶的香氣為蝦子帶來了一抹特別的風味,而節瓜則提供了清爽的口感,是一道很特別的中西合璧佳餚。

現在來輸入一個與食材無關的內容,看看會如何回應

不過,若輸入 打火機, 牛肉 文字,來看看 GPT 會如何生成,當然,可以透過不同的控制生成內容參數,讓生成的內容更具有參考價值

 






2023年4月17日 星期一

Azure OpenAI Server 相關技術名詞彙整

Azure OpenAI Server 相關技術名詞彙整

(2023/04/07 出版)

一句話總結 OpenAI 提供的服務

提供三種應用模式,透過 Prompt-Completion 模式 ,使用自然語言來輸入,而後依據不同模型目的,產生出該模型所期望的相關的內容(文字、程式碼、圖片),這裡將會使用到相關的模組來提供這些服務,這包含了 GPT / Codex / DALL-E

GPT-3

取得 Prompt 內容,並且生成 Completion 文字內容

Codex

取得 Prompt 內容,並且生成 Completion 相關程式碼

DALL-E

取得 Prompt 內容,並且生成 Completion 圖片

# 甚麼是 生成式 AI

Generative AI: a broad description of AI that gnerates data, such as text, images, audio, video, code

"Generative AI" 是指一類 AI 技術,它能夠生成新的數據,例如文本、圖像、音頻、視頻或代碼。這些數據不是從現有數據中選擇或排列出來的,而是由 AI 系統自己創造出來的。這種技術通常基於 [機器學習] 或 [深度學習] 模型,它們使用現有的數據訓練出一個模型,然後使用該模型來生成新的數據。

此外,"Generative AI" 也包括將現有數據轉換為不同形式的技術,例如圖像風格轉換或文本翻譯。這些技術將現有的數據轉換為不同的形式,但不會生成全新的數據。

需要注意的是,由於這種技術能夠生成具有潛在偏見或有害內容的數據,因此需要謹慎使用。有些國家也對其使用進行了限制,以保障公共利益和個人隱私。

甚麼是 GPT

GPT

GPT是 Generative Pre-trained Transformer 「生成式預訓練變換器模型」的簡稱,翻成白話文,就是預先訓練好,可以用來產生資料的一種 Transformer 模型 (這是基於谷歌開發的 Transformer 語言模型,Transformer模型於2017年由Google大腦的一個團隊推出,現已逐步取代長短期記憶(LSTM)等RNN模型成為了NLP問題的首選模型。)

所謂 Transformer 模型,並不是指模型本身會變化,而是指模型會對資料進行轉換,來產生所謂「關注度」,進而用關注度來產生預測的結果。

GPT 擅長於那些方面工作

  • Content Generation
  • Summarization
  • Classification
  • Categorization
  • Sentiment Analysis
  • Data Extraction
  • Translation

Azure OpenAI 中目前可用的模型系列

  • GPT-4

    一組模型可改善 GPT-3.5,並可瞭解並產生自然語言和程式碼。

  • GPT-3

    一系列可以了解並產生自然語言的模型。 這些模型有 [Davinci]、[Curie]、[Babbage]、[Ada]

  • Codex

    一系列可以了解並產生程式碼的模型,包括將自然語言轉譯成程式碼。

  • 內嵌

    一系列可以了解並使用內嵌的模型。

    內嵌是一種特殊的資料表示格式,可供機器學習模型和演算法輕鬆使用。 內嵌是文字片段語意的資訊密集表示法。

    目前我們為不同功能提供三種系列的內嵌模型: [相似度] 、 [文字搜尋] 和 [程式碼搜尋]。

GPT-3 四種模型

GPT-3 模型可以了解並產生自然語言。 此服務提供四種模型功能,各具有不同層級的能力與速度,適用於不同的工作。 Davinci 是功能最佳的模型,而 Ada 則是速度最快的模型。

Davinci

Davinci 是功能最佳的模型,其可以執行其他模型可執行的任何工作,而且使用較少的指示。 對於需要深度了解內容的應用程式,例如針對特定對象的摘要和創意內容產生,Davinci 會產生最佳結果。 Davinci 提供的增加功能需要更多計算資源,因此 Davinci 的成本更高,而且無法與其他模型一樣快。

Davinci 擅長的另一個領域是了解文字的意圖。 Davinci 擅長解決多種邏輯問題和說明人物的動機。 Davinci 已經能夠解決一些涉及因果關係的最具挑戰性 AI 問題。

適用於:複雜意圖、因果關係、對象摘要 (Complex intent, cause and effect, summarization for audience)

Curie

Curie 不僅功能強大,也很快速。 雖然 Davinci 在分析複雜文字方面更強,但 Curie 對於許多細微的工作相當有能力,例如情感分類和摘要。 Curie 也精於回答問題和執行問與答,以及作為一般服務聊天機器人。

適用於:語言翻譯、複雜分類、文字情感、摘要 (Lauguage translation, complex classification, text sentiment summarization)

Babbage

Babbage 可以執行簡單的工作,例如簡單的分類。 當涉及到語意搜尋排名文件與搜尋查詢的匹配程度時,其也相當有能力。

適用於:中等分類、語意搜尋分類 (Moderate classification, semantic search classification)

Ada

Ada 通常是速度最快的模型,而且可以執行如下工作:剖析文字、位址更正,以及不需要太多細微差別的特定類型分類工作。 Ada 的效能通常可以藉由提供更多內容來改善。

適用於:剖析文字、簡單分類、位址更正、關鍵字 (Parsing text, simple classification, address correction, keyword)

什麼是模型

在機器學習中,模型是一個數學公式或算法,它可以從數據中學習並生成預測或結果。

Azure OpenAI服務是什麼

Azure OpenAI 服務是一種進階語言 AI,為客戶提供具有 Azure 安全性和企業承諾的 OpenAI GPT-4、GPT-3、Codex 和 DALL-E 模型。

Azure OpenAI 服務提供 OpenAI 強大語言模型的 REST API 存取權,包括 GPT-3、Codex 和 Embeddings 模型系列。

Azure OpenAI 服務處理哪些數據?

  • 提示和完成

    提示由用戶提交,完成由服務通過完成(/completions、/chat/completions)和嵌入操作輸出。

  • 培訓和驗證數據

    您可以提供自己的訓練數據,其中包含提示完成對,以便微調 OpenAI 模型。

  • 來自訓練過程的結果數據

    在訓練一個微調模型後,該服務將輸出作業的元數據,其中包括每一步處理的令牌和驗證分

用於微調 OpenAI 模型的訓練數據

通過 Azure OpenAI Studio 提交給 Fine-tunes API 的訓練數據(提示完成對)使用自動化工具進行預處理以進行質量檢查,客戶提供的訓練數據僅用於微調客戶的模型,微軟不會使用它來訓練或改進任何微軟模型。

文本提示生成補全和嵌入結果

在客戶的 Azure OpenAI 資源中配置模型部署(由客戶的微調模型或基本模型端點組成)後,客戶可以通過 REST API、客戶端庫使用我們的完成或嵌入操作向模型提交文本提示,或 Azure OpenAI Studio;該模型生成通過 API 返回的文本輸出(完成)。在這些操作期間,模型中不會存儲任何提示或完成,並且不會使用提示和完成來訓練、重新訓練或改進模型。

您是否使用我的公司資料來定型任何模型?

Azure OpenAI 不會使用客戶資料來重新定型模型。 如需詳細資訊,請參閱 Azure OpenAI 資料、隱私權和安全性指南

Azure OpenAI 處理的客戶數據是否發送到 OpenAI?

不會。Microsoft 在我們的 Azure 基礎架構中託管 OpenAI 模型,並且發送到 Azure OpenAI 的所有客戶數據都保留在 Azure OpenAI 服務中。

客戶數據是否用於訓練 OpenAI 模型?

不會。我們不會使用客戶數據來訓練、再訓練或改進 Azure OpenAI 服務中的模型。

防止濫用和有害內容的產生

Azure OpenAI 服務包括一個內容管理系統,它與模型一起工作以過濾潛在的有害內容。該系統的工作原理是通過一組旨在檢測誤用的分類模型來運行輸入提示和生成的完成。如果系統識別出有害內容,如果提示被認為不合適,客戶會在 API 調用中收到錯誤,或者響應中的 finish_reason 將是 content_filter 以表示某些生成已被過濾。

除了同步內容過濾之外,Azure OpenAI 服務還將服務的提示和完成情況存儲最多三十 (30) 天,以監控暗示以可能違反適用產品條款的方式使用服務的內容和/或行為。獲得授權的 Microsoft 員工可以查看觸發我們的自動化系統的提示和完成數據,以調查和驗證潛在的濫用行為。

甚麼是 Prompt Engineering

Prompt Engineering: Crafting ideal inputs in order to get the most out of large language models ( LLM )

您提到的論述是關於 "Prompt Engineering" ,即利用恰當的輸入來最大限度地發揮大型語言模型(LLM)的潛力。這個說法是正確的。Prompt Engineering 是一種策略,通過優化用戶提供給語言模型的輸入,以獲得更好、更相關的輸出。簡而言之,Prompt Engineering 是一種技巧,用於設計和調整輸入,以使模型產生最理想的回應。

對於 Prompt Engineering,有幾點需要補充:

  • 清晰和具體

    為了獲得最佳結果,輸入應該越清晰、越具體越好。這有助於避免模型產生含糊不清或無關的回答。

  • 問題類型

    了解您要解決的問題類型,這將幫助您選擇最合適的方式來引導模型。例如,您可以選擇多次迭代、對話形式或者將問題分解成更小的部分。

  • 控制篇幅

    可以通過設定字數限制或其他篇幅要求,來控制模型生成的回答篇幅。這有助於確保回答的簡潔和實用性。

  • 設定角色和背景

    為模型提供角色和背景資訊,可以幫助它產生更符合場景的回答。例如,您可以要求模型扮演某個專家,或者遵循特定的寫作風格。

  • 迭代和嘗試

    Prompt Engineering 可能需要多次嘗試和調整,以找到最合適的輸入。通過不斷嘗試,您將更了解如何引導模型產生理想的回答。

總之,Prompt Engineering 是一個有效的方法,通過優化輸入以從大型語言模型中獲得更好的結果。了解如何設計和調整輸入將有助於您充分利用這些強大的模型。

Token

Token: A unit easily understood by a language model

您提到的論述是關於 "token" ,它是語言模型容易理解的基本單位。這個說法是正確的。在自然語言處理(NLP)領域,token 是將文本分解成更小、可管理的單位的過程。根據不同的語言和模型,token 可能是單詞、字符、子詞或者詞素等。

對於 token,有幾點需要補充:

  • 分詞(Tokenization)

    將原始文本分解為 token 的過程稱為分詞。分詞算法可以基於單詞、字符或其他語言單位來運作。分詞是 NLP 中的一個基本步驟,因為它將文本轉換為模型可以處理的格式。

  • 語言模型的訓練

    在訓練語言模型時,token 被用作輸入和輸出。模型會學習 token 之間的關係,以便在給定上下文的情況下,生成或預測下一個最可能出現的 token。

  • 語言和編碼

    不同語言的 token 編碼方式可能有所不同。例如,英文通常使用基於單詞的 token,而像中文這樣的語言則可能使用基於字符的 token。部分語言模型,如 GPT-3 和 BERT,使用了一種稱為 "Byte Pair Encoding" (BPE)或 "WordPiece" 的子詞分詞方法,以更好地處理不同語言和詞彙的多樣性。

  • Token 的數量限制

    大多數語言模型都有一個固定的最大 token 數量限制,這意味著在單次輸入或輸出中,它們只能處理有限數量的 token。超過此限制可能會導致性能下降或無法正常運作。

總之,token 是語言模型容易理解的基本單位,對於 NLP 任務至關重要。理解 token 的概念以及如何適當地將文本分解為 token 對於有效地使用語言模型非常重要。

甚麼是 GPT Embedding

GPT Embedding 是指 GPT (Generative Pre-trained Transformer) 模型中使用的字詞嵌入 (word embedding) 技術。字詞嵌入是一種將自然語言中的單詞映射到低維向量空間中的技術。

GPT模型使用基於 Transformer 結構的深度神經網絡來進行語言建模,其中的字詞嵌入層用來將輸入的單詞轉換為向量表示,以便進一步進行神經網絡的計算。

GPT Embedding 是通過一個基於 Transformer 結構的編碼器,將每個單詞轉換為一個固定維度的向量表示。這個向量表示的特點是:不同單詞之間的距離反映了它們在語言上的相似度。在 GPT 模型中,字詞嵌入層是通過大量無監督的語料庫進行預訓練,以學習單詞之間的語言結構和關係。在實際應用中,這些預訓練的字詞嵌入可以幫助 GPT 模型更好地理解和生成自然語言文本。

GPT 中的無監督學習與有監督學習有甚麼差別

監督式學習和非監督式學習的主要區別在於是否使用標記數據集。監督式學習使用標記數據,這意味著人類監督參與管理訓練數據。非監督式學習使用未標記數據,這意味著管理訓練數據時人類監督最少。

為什麼進行 Fine Tuning,不要做這樣事情 : Not bulk teaching of new knowledge

微調是一種遷移學習形式,它使用預先訓練的模型和現有數據來進一步訓練和提高模型的性能。 當可用於訓練的數據有限以及模型需要專門用於特定任務或數據集時,這是一種有用的技術。 它不適合新知識的批量教學,因為預訓練模型已經針對特定任務進行了優化。

進行 Fine Tuning 的目的是在一個已經訓練好的模型基礎上,進一步調整模型以適應新的任務或是特定的應用。在進行 Fine Tuning 時,通常會使用一個較小的數據集來重新訓練模型,而這個數據集通常包含了新的任務或是特定應用所需的特徵和知識。

相對於 "bulk teaching of new knowledge",進行 Fine Tuning 的優勢在於它可以更好地保留模型原有的知識和能力。這是因為 Fine Tuning 的過程是在一個已經訓練好的模型基礎上進行微調,所以它可以利用原有的知識和能力來更好地適應新的任務或應用。

另一方面,"bulk teaching of new knowledge" 則是直接使用大量的新數據來重新訓練整個模型,這樣會導致原有的知識和能力被淹沒或是覆蓋掉,使得模型的整體表現可能會變差。因此,如果需要調整模型以適應新的任務或應用,建議使用 Fine Tuning 的方式進行微調,而不是直接進行 "bulk teaching of new knowledge"。

預先訓練 GPT 與 微調 GPT 有何差異

預先訓練 (pretraining) 和微調 (fine-tuning) 是兩個不同的概念。

預先訓練是指在大規模語料庫上訓練 GPT 模型,以學習通用的語言特徵和知識,如語法、語義、上下文等。預先訓練的目標是將 GPT 模型作為通用語言模型,可以用於各種自然語言處理任務,例如文本分類、語言生成、機器翻譯等。預訓練過程通常需要大量的計算資源和時間,並且使用了無標籤的大規模語料庫來訓練模型。

微調是指在預先訓練的 GPT 模型的基礎上,使用帶標籤的少量任務特定數據,對模型進行再訓練,以適應特定任務。微調的目標是提高 GPT 模型在特定任務上的性能和效果。微調通常需要較少的計算資源和時間,因為它只需要對預訓練的模型進行小規模的調整,使其更適合於特定任務。

總之,預先訓練是為了學習通用的語言知識和特徵,而微調是為了調整預先訓練的模型以適應特定任務。這兩個過程的目標和方法是不同的。

對於大量的 FAQ 技術文件、使用手冊、合約文件、維護紀錄、叫修紀錄等等檔案或資訊,該使用 GPT 的甚麼技術呢?

對於大量的 FAQ 技術文件、使用手冊、合約文件、維護紀錄、叫修紀錄等等檔案或資訊,可以使用 GPT 的預訓練和微調技術來建立一個自然語言處理模型,用於回答與技術相關的問題。您可以將這些文件中的文本作為訓練數據,然後通過對模型進行微調來針對您特定的應用場景進行優化。

您還可以使用內嵌技術將模型集成到您的應用程序中,以便於用戶與您的應用程序進行交互並獲取問題解答。此外,如果您的數據集很大,您還可以考慮使用 GPT-3 的 bulk teaching 技術來將新的知識直接注入模型中。