tag:blogger.com,1999:blog-42910696793430259642024-03-18T11:03:27.715+08:00.NET WalkerKeep Walking With .NETDavidhttp://www.blogger.com/profile/14918558855624275059noreply@blogger.comBlogger718125tag:blogger.com,1999:blog-4291069679343025964.post-36613861964815196962024-03-08T01:13:00.001+08:002024-03-17T21:58:22.734+08:00Semantic Kernel Plugin 的錯誤處理<p>先前我們<a href="https://studyhost.blogspot.com/2024/03/line-bot-semantic-kernel.html">提到了</a>透過Semantic Kernel,可以讓AI/LLM在與用戶對談的過程中,自動在需要的時候去呼叫 PlugIn 物件的方法(Method),特別的事情是,這個呼叫並非是我們寫程式去做的,而是 AI 自己做的,我們並沒有寫這部分程式碼的邏輯,我們寫的只是提示(prompt)而已。</p>
<p>那問題來了,如果不是我們寫程式去呼叫這個方法,而是AI自己去呼叫的,那假設,這個被呼叫的方法裡面發生了 Exception ,那會發生什麼事情!?</p>
<p>我們看底下這段程式碼:</p>
<pre><code>public class LeaveRequestPlugin
{
[KernelFunction]
[Description("取得請假天數")]
public int GetLeaveRecordAmount([Description("要查詢請假天數的員工名稱")] string employeeName)
{
isRock.LineBot.Bot bot = new LineBot.Bot(ChannelAccessToken);
bot.PushMessage(AdminUserId, $"[action : 查詢 {employeeName} 假單]");
if (employeeName.ToLower() == "david")
return 3;
else if (employeeName.ToLower() == "mary")
throw new System.ArgumentOutOfRangeException("無法取得假單資料");
else
return 5;
}
(...略...)
}
</code></pre>
<p>請注意上面這段查詢員工請假天數的程式碼,你會發現,我們刻意在程式碼裡面,加入了底下這段 code:</p>
<pre><code>(...略...)
else if (employeeName.ToLower() == "mary")
throw new System.ArgumentOutOfRangeException("無法取得假單資料");
(...略...)
</code></pre>
<p>當用戶查詢 Mary 的請假記錄時候,我們故意讓系統發生 ArgumentOutOfRangeException ,我們來看執行的結果:<br>
<img src="https://arock.blob.core.windows.net/blogdata202403/07-194231-6622f85b-9fea-438d-9222-f60f67b831ae.png" alt="enter image description here"></p>
<p>你會發現,有趣的是,當Exception發生的時候,系統並沒有直接崩潰,LINE Bot也沒有已讀不回,反倒是AI自動給了用戶一個可愛的錯誤訊息:</p>
<blockquote>
<p>哎呀,看起來我們遇到了一點問題,無法取得 Mary 的假單資料。可能是系統出了點錯誤,或者是目前沒有 Mary 的假期記錄。需要我幫您查詢其他事情嗎?</p>
</blockquote>
<p>這個錯誤訊息是從哪裡來的? 是真實的嗎? 還是其實是 AI 自己的幻覺? 我們來看程式碼:</p>
<pre><code> throw new System.ArgumentOutOfRangeException("無法取得假單資料");
</code></pre>
<p>從程式碼我們知道,是真的有 “無法取得假單資料” 這樣的Error Message被拋出,只是 AI/LLM 接手了這個錯誤訊息,並且自己做了包裝,然後告知用戶。</p>
<p>那如果,我們繼續打破砂鍋問到底呢? AI會給什麼回覆? 請看:<br>
<img src="https://arock.blob.core.windows.net/blogdata202403/07-200947-47c56f66-1132-459a-92ee-0a7a85fb7398.png" alt="enter image description here"><br>
如上圖所示,AI乖乖地依照用戶的要求,把錯誤訊息呈現出來。甚至還會解釋這個錯誤發生的可能原因!!!</p>
<p>這AI(嚴格來說是SK框架)也算是夠貼心的,可以把本來會造成系統崩潰的狀況,自動包裝成用戶可以接受並理解的訊息。這讓對談機器人在面對例外狀況的時候,也能夠以自然語言的方式來輸出與呈現,避免造成無預期的崩潰。</p>
<p>雖然,跟過去我們所理解的一樣,如果不在Prompt當中做一些防範措施,AI可能會洩漏過多我們不想讓用戶知道的資訊。</p>
<p>但不論如何,從過去的例子中我們已經發現,AI/LLM可以透過自然語言對談,自動決定要呼叫 PlugIn 類別的哪個方法,現在, AI 還自動幫我們作 try…catch 錯誤處理並直接做出適當的回應,這些現象都讓我們知道,AI對於自然語意的理解,已經達到了可以在真實世界裡正式使用的程度了。</p>
<h4 id="後話:">後話:</h4>
<p>一直有人在爭論著, AI 是否將會取代開發人員,但我逐漸開始覺得,AI會不會寫程式很可能根本是一個假議題,因為AI根本不需要會寫程式,廣義來說,AI本身就是程式,因此它根本不需要再去"寫"程式(產生程式碼是人類的需要,不是AI的需要),它只需要依照需求做出正確的判斷即可。</p>
<p>人類之所以需要寫程式,是因為程式碼是一個橋樑(人類跟電腦之間的橋樑),我們想要讓電腦依照我們寫的程式碼來運作。但如今,倘若電腦(AI)本身已經可以作判斷、作動作了,那又何必需要再寫什麼程式? 就好比,你完全不需要寫程式告訴你的助理說,他該做些什麼,然後他再依照你寫的程式去做,你根本只需要"直接"告訴你的助理,他該做些什麼就好了呀。</p>
<p>換言之,過去我們必須<strong>透過寫程式才能操控電腦</strong>的時代,可能就快要過去了,或許未來,我們真的只需要告訴電腦我們想叫它做的事情,它就自己會設法完成了,那屆時,程式碼還有存在的必要嗎?</p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-86309164230857032822024-03-06T23:01:00.001+08:002024-03-17T21:58:26.416+08:00在 LINE Bot 開發中使用Semantic Kernel建立自然語言請假系統<p>身為 LAE(LINE API Expert) 與 LINE 的支持者,既然知道透過Semantic Kernel可以快速的開發對談機器人,那當然要嘗試用在 LINE Bot的開發上。</p>
<p>先前我們<a href="https://studyhost.blogspot.com/2024/03/sk.html">介紹過</a>如何使用 Semantic Kernel 來開發一個支援記憶與對話前後文、可以用自然語言進行請假的對談機器人,但當時的架構是在 console 環境,負責記憶處理的 ChatHistory 是可以被長時間保存的實體物件,但換成了LINE Bot開發的WebAPI架構,一切就變的有所不同了。</p>
<p>首先,由於ChatHistory物件會隨著WebAPI行程消失而遺失,且我們的LINE Bot還得面對多個用戶,因此也無法簡單的用一個 ChatHistory 物件就保存所有用戶的對話紀錄。所以我們要做一些調整,為每一位用戶建立一個自己的ChatHistory物件。</p>
<p>因此,我們在 WebAPI 中撰寫了底下這樣的程式碼:</p>
<pre><code>static Dictionary<string, ChatHistory> ChatHistoryByUser = new Dictionary<string, ChatHistory>();
private ChatHistory getHistoryFromStaticRepo(string UserId)
{
if (ChatHistoryByUser.ContainsKey(UserId))
return ChatHistoryByUser[UserId];
else
return new ChatHistory();
}
private void saveHistory(string UserId, ChatHistory chatHistory)
{
if (ChatHistoryByUser.ContainsKey(UserId))
ChatHistoryByUser[UserId] = chatHistory;
else
ChatHistoryByUser.Add(UserId, chatHistory);
}
</code></pre>
<p>這段程式碼以靜態方式儲存ChatHistory物件的Dictionary,搭配 getHistoryFromStaticRepo(string UserId) 和 saveHistory(string UserId, ChatHistory chatHistory) 這兩個方法,可以簡單地為每一個用戶保存對話狀態。</p>
<h5 id="但請讀者留意,由於我們只是想用最簡單的方式來說明可行的做法,因此上面用靜態型別來暫時儲存對談紀錄,比較理想的實作還是採用資料庫或類似的儲存體,而非用靜態型別的記憶體變數來保存。">但請讀者留意,由於我們只是想用最簡單的方式來說明可行的做法,因此上面用靜態型別來暫時儲存對談紀錄,比較理想的實作還是採用資料庫或類似的儲存體,而非用靜態型別的記憶體變數來保存。</h5>
<p>有了這兩個方法之後,我們在WebAPI主程式裡面,就可以大方地針對每一個用戶,在對談前取回聊天訊息:</p>
<pre><code>// 在對談前取回聊天訊息
var history = getHistoryFromStaticRepo(LineEvent.source.userId);
if (history == null || history.Count() <= 0)
history = new ChatHistory(
@"你是企業的請假助理,可以協助員工進行請假,或是查詢請假天數等功能。
若員工需要請假,你需要蒐集請假起始日期、天數、請假事由、代理人、請假者姓名等資訊。最後呼叫 LeaveRequest Method。
若員工需要查詢請假天數,你需要蒐集請假者姓名,最後呼叫 GetLeaveRecordAmount Method。
--------------
* 所有對談請用正體中文回答
* 請以口語化的方式來回答,要適合對談機器人的角色
");
</code></pre>
<p>並且在對談後儲存聊天訊息:</p>
<pre><code>if (LineEvent.type.ToLower() == "message" && LineEvent.message.type == "text")
{
// Add user input
history.AddUserMessage(LineEvent.message.text);
// Enable auto function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// Get the response from the AI
var result = chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel).Result;
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
// 在對談後儲存聊天訊息
saveHistory(LineEvent.source.userId, history);
responseMsg = result.Content;
}
</code></pre>
<p>其他程式碼的寫法,幾乎和先前 console 版本的 Semantic Kernel 完全相同。唯一的差別是我們在 LeaveRequestPlugin 類別的方法中稍微做了點修改,讓具體發生 action 的時候,傳送訊息給 admin(注意底下的 bot.PushMessage(…):</p>
<pre><code>[KernelFunction]
[Description("進行請假")]
public bool LeaveRequest([Description("請假起始日期")] DateTime 請假起始日期, [Description("請假天數")] string 天數, [Description("請假事由")] string 請假事由, [Description("代理人")] string 代理人,
[Description("請假者姓名")] string 請假者姓名)
{
isRock.LineBot.Bot bot = new LineBot.Bot(ChannelAccessToken);
bot.PushMessage(AdminUserId, $"action [建立假單: {請假者姓名} 請假 {天數}天 從 {請假起始日期} 開始,事由為 {請假事由},代理人 {代理人}]");
return true;
}
</code></pre>
<p>如此這般,具有前後文記憶、可以透過自然語言請假的LINE Bot對談機器人就這樣完成了。</p>
<p>執行結果如下:<br>
<img src="https://arock.blob.core.windows.net/blogdata202403/06-193943-7bd4e97c-62e4-49fa-824a-c1f801f5ac2b.png" alt="enter image description here"></p>
<p>你會發現,在LINE裡面依舊可以很輕鬆地透過 Semantic Kernel 建立一個具有記憶且可以透過自然語言請假的對談機器人。由於這讓LINE Bot可以輕易的支援對談前後文和歷史訊息的記憶,並且可以透過LLM來剖析自然語言,理解語意,甚至自動執行相關的action(LeaveRequestPlugin類別中的method),大大的簡化了Chat Bot的開發。</p>
<p>過去,我要大費周章才寫得出一個具有記憶和理解前後文,且可以有效的識別用戶以自然語言輸入的 LINE Bot。如今,透過 LLM 和 Semantic Kernel 可以在一兩百行程式碼內就可以實現,而且效果遠比過去的 Chat Bot 好上一個檔次。</p>
<p>這個例子,大致可以看到 Semantic Kernel + LLM 可以為 LINE Bot 帶來的突破!!! 我認為, Chat Bot 開發,現在才正式開始。</p>
<hr>
<p>參考 課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a><br>
參考 Repo:<br>
<a href="https://github.com/isdaviddong/ex_linebot_with_sk">GitHub - isdaviddong/ex_linebot_with_sk</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-11459674837369673722024-03-06T20:22:00.001+08:002024-03-17T21:58:29.911+08:00使用Semantic Kernel 建立自然語言請假系統<p>既然我們已經知道,可以透過 Semantic Kernel 輕易地建立聊天機器人/智能助理,我們之前(參考<a href="https://studyhost.blogspot.com/2024/02/semantic-kernel.html">這篇</a>)也看到了如何用自然語言驅動 AI ,來自動呼叫 IoT 控制開關燈類別中的方法,體驗過了它的威力,接著,我們就來實作一下,如何透過 Semantic Kernel 來建立一個可以透過自然語言請假的對談機器人。</p>
<p>我得說,我過去幾年做過無數次這個範例,試圖用自然語言以對談方式來完成請假。從最初LINE Bot 出現的時候,以手工苦刻的方式,來建立請假機器人,到使用 Azure AI 上的 Language Understanding 解決方案,讓機器人能夠『稍微』看懂用戶以自然語言的方式輸入的請假資訊,但整個過程從來沒有愉快過。</p>
<p>過去,電腦對自然語言的理解實在太差了,直到GPT的出現,直到有了LLM,一切才開始不同。現在,我們可以輕易地透過 Semantic Kernel 使用大語言模型,來建立一個類似底下這樣,表現非常好的自然語言請假系統:<br>
<img src="https://arock.blob.core.windows.net/blogdata202403/02-143539-e54c20bc-49a8-4410-af15-eb22ee54ff7b.png" alt="enter image description here"></p>
<p>你會發現,我們實作了一個可以幫助用戶請假的對談機器人。他會蒐集用戶的請假資訊,然後在資訊滿足之後,呼叫API來完成請假動作。</p>
<p>上面這段對談紀錄當中,黃色的部分就是AI自動進行的 Action,也就是具體的『請假』或是『查詢』動作,其他的則是自然語言的交談對話。</p>
<p>我們之前說過,透過 Semantic Kernel ,我們可以快速地完成上面這個功能的開發。為了完成這個需求,我們建立了底下這個 LeaveRequestPlugin 類別。這個類別裡面有三個方法,你可以從Description描述看到這些方法的功能(當然,範例裡面的Action暫且用示意的方式來呈現,不真的寫入資料庫):</p>
<pre><code>// 請假功能 Plugin
public class LeaveRequestPlugin
{
[KernelFunction]
[Description("取得請假天數")]
public int GetLeaveRecordAmount([Description("要查詢請假天數的員工名稱")] string employeeName)
{
//修改顯示顏色
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"\n [action]查詢 {employeeName} 請假天數。\n");
//還原顯示顏色
Console.ResetColor();
if (employeeName.ToLower() == "david")
return 5;
else if (employeeName.ToLower() == "eric")
return 8;
else
return 3;
}
[KernelFunction]
[Description("進行請假")]
public bool LeaveRequest([Description("請假起始日期")] DateTime 請假起始日期, [Description("請假天數")] string 天數, [Description("請假事由")] string 請假事由, [Description("代理人")] string 代理人,
[Description("請假者姓名")] string 請假者姓名)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"\n [action]建立假單: {請假者姓名} 請假 {天數}天,從 {請假起始日期} 開始,事由為 {請假事由},代理人 {代理人}\n");
//還原顯示顏色
Console.ResetColor();
return true;
}
[KernelFunction]
[Description("取得今天日期")]
public DateTime GetCurrentDate()
{
return DateTime.UtcNow.AddHours(8);
}
}
</code></pre>
<p>主程式的部分,則大同小異,我們採用 OpenAI 的 gpt-4-turbo-preview Model,作為這個服務的 AI Provider,我們給的 system prompt是底下程式碼中撰寫的這樣:</p>
<pre><code> var OpenAIModel = "gpt-4-turbo-preview";
var OpenAIKey = "👉ApiKey👈";
// Create a new kernel builder
var builder = Kernel.CreateBuilder()
.AddOpenAIChatCompletion(OpenAIModel, OpenAIKey);
builder.Plugins.AddFromType<LeaveRequestPlugin>();
Kernel kernel = builder.Build();
// Create chat history 物件,並且加入
var history = new ChatHistory(
@"你是企業的請假助理,可以協助員工進行請假,或是查詢請假天數等功能。
若員工需要請假,你需要蒐集請假起始日期、天數、請假事由、代理人、請假者姓名等資訊。最後呼叫 LeaveRequest Method。
若員工需要查詢請假天數,你需要蒐集請假者姓名,最後呼叫 GetLeaveRecordAmount Method。
--------------
* 所有對談請用正體中文回答
* 請以口語化的方式來回答,要適合對談機器人的角色
");
</code></pre>
<p>當我們在主程式中給了這樣的 prompt ,並且將 LeaveRequestPlugin 掛上之後,主程式只有底下這樣的典型的 Semantic Kernel 對談 Loop:</p>
<pre><code> // Get chat completion service
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 開始對談
Console.Write("用戶 > ");
string? userInput;
while (!string.IsNullOrEmpty(userInput = Console.ReadLine()))
{
// Add user input
history.AddUserMessage(userInput);
// Enable auto function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// Print the results
Console.WriteLine("AI助理 > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
// Get user input again
Console.Write("\n用戶 > ");
}
}
}
</code></pre>
<p>就這樣程式寫完了。</p>
<p>開始運行之後,剩下的就是 AI 自己決定在需要查詢用戶請假天數時,去呼叫了 GetLeaveRecordAmount(string employeeName) 這個方法,然後把員工名稱當作參數傳入。有趣的是,當AI知道需要用戶名稱這個參數時,會主動問用戶的名稱。此外,當用戶提到從 “明天” 開始請假時(參考下圖),AI也會主動呼叫 GetCurrentDate() 這個位於 LeaveRequestPlugin 類別中的方法,來取得今天的時間日期,並推斷出明天的日期,因此就無需再去問用戶明天是幾月幾號:<br>
<img src="https://arock.blob.core.windows.net/blogdata202403/02-143539-e54c20bc-49a8-4410-af15-eb22ee54ff7b.png" alt="enter image description here"></p>
<p>我還嘗試把 description和變數名稱都特別改成中文,看看運行起來的狀況如何? 顯然,對於LLM來說,這根本不是問題。</p>
<p>這一切邏輯和行為,都是透過 GPT 和 Semantic Kernel 攜手自動完成,開發人員寫的只是提示(Prompt)以及適當的提供API或類別中的方法。</p>
<p>透過 Semantic Kernel ,這是有史以來讓我首次覺得,撰寫一個要能夠以自然語言進行請假的系統是如此的簡單、快速、有趣,這讓所謂的 AI 助理(Assistant) 和 Copilots 的開發,瞬間變得非常的容易。</p>
<p>下一個世代的應用程式軟體開發方式,已在眼前。</p>
<hr>
<p>參考 課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-11228832596411578032024-02-29T00:51:00.001+08:002024-03-17T21:58:33.631+08:00精彩(且驚人)的Semantic Kernel入門範例<p>之前開直播的時候,和線上朋友聊到,因為AI的出現,未來的應用程式,勢必會和現在有所不同。</p>
<p>先不要跳到<strong>黃仁勳</strong>說的,未來『每個開發人員都可以直接用自然語言做程式設計』(這樣也太駭人聽聞了一點),先看看眼下我們可以做到什麼程度。</p>
<p>你會發現透過 Semantic Kernel,這個所謂的 AI 開發框架,已經可以做到,<strong>讓 AI 自己決定何時(以及如何)呼叫一個類別(Class)中的方法(Method)</strong>。而我們只需要讓用戶輸入對話與機器人對談,就可以控制程式運行的流程與邏輯。也就是說,現在不需要滑鼠點選,不用選單操作,只要與機器人透過自然語言對談(底下的範例是打字,但當然可以是語音),就可以操控系統。</p>
<p>我前陣子一直說的,AI 會讓 GUI 有著天翻地覆的改變,意即如此。</p>
<p>看底下這個類別的程式碼:</p>
<pre><code>//控制開關燈的類別
public class LightPlugin
{
//當前燈的狀態
public bool IsOn { get; set; } = false;
[KernelFunction]
[Description("取得燈的狀態")]
public string GetState()
{
return IsOn ? "on" : "off";
}
[KernelFunction]
[Description("改變燈的狀態")]
public string ChangeState(bool newState)
{
this.IsOn = newState;
var state = GetState();
// Print the state to the console
Console.WriteLine($"[Light is now {state}]");
return state;
}
}
</code></pre>
<p>上面這個很簡單的 LightPlugin 類別,具有兩個方法:GetState 和 ChangeState。這兩個方法都被標記為 [KernelFunction],這意味著它們可以直接被 AI 呼叫。</p>
<p>LightPlugin 類別中有一個全域屬性IsOn ,指的是當前的燈是<strong>開著</strong>還是<strong>關的</strong>。</p>
<p>從這邊你會看到, LightPlugin 這個類別包含的一個狀態(屬性),和兩個行為(方法),你可以將其比擬成一個IoT智慧型家電的控制物件,透過改變這個物件就可以控制家電。請在心裡想像一下,如果你過去,要寫程式讓用戶來操作這個物件,進而控制電燈的開或關,你會怎麼做?</p>
<p>做一個控制面板(GUI)? 還是做一個選單操作介面(Menu)? 來控制這個燈光的開啟和關閉。</p>
<p>那如果,這個控制機制要改成語音控制呢? 例如我希望用戶能夠用說的,電腦就能夠回報目前燈光的狀況,或是幫你直接開關燈,你是不是必須多撰寫很多程式碼,才能完成?</p>
<p>好,我們接著來看底下的程式碼,看看Semantic Kernel是如何完成這需求的:</p>
<pre><code>private static async global::System.Threading.Tasks.Task Main(string[] args)
{
//Azure OpenAI 服務資訊
var DeployName = "👉模型佈署名稱👈";
var Endpoint = "https://👉API端點👈.openai.azure.com/";
var ApiKey = "👉ApiKey👈";
// 建立 kernel builder, 掛上 Azure OpenAI
var builder = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(DeployName, Endpoint, ApiKey);
builder.Plugins.AddFromType<LightPlugin>(); // 將 LightPlugin 加入 Kernel
Kernel kernel = builder.Build();
// 建立 chat history 物件,並且加入系統提示訊息(System Prompt)
var history = new ChatHistory();
history.AddSystemMessage("你是一個親切的智能家庭助理,可以協助用戶回答問題,交談時請使用中文。");
// Get chat completion service
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 開始對談
Console.Write("User > ");
string? userInput;
while (!string.IsNullOrEmpty(userInput = Console.ReadLine()))
{
// Add user input
history.AddUserMessage(userInput);
// Enable auto function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// 從 AI 取得對談結果
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// 顯示結果
Console.WriteLine("Assistant > " + result);
// 將對話加入歷史訊息
history.AddMessage(result.Role, result.Content ?? string.Empty);
// Get user input again
Console.Write("User > ");
}
}
</code></pre>
<p>先看上面這段程式碼,搭配 剛才的LightPlugin之後,執行結果如下:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/25-205554-b355b92e-54b3-4491-939c-b5eddeef96bd.png" alt="圖片"></p>
<p>想像一下,這是一個智能助理管家(畢竟上面的 prompt 我們是這麼說的),當你回家了,這個AI會跟你說話:</p>
<blockquote>
<p>歡迎回家!需要我為您開啟燈光或是播放輕快的音樂來放鬆一下嗎?</p>
</blockquote>
<p>接著你說:</p>
<blockquote>
<p>現在好黑,燈是開著嗎?</p>
</blockquote>
<p>AI 想知道燈的狀況,因此它自己去呼叫了 LightPlugin 的 GetState() 方法,告訴你目前燈是關的,並且問你要不要開燈?</p>
<blockquote>
<p>對不起,目前的燈光是關閉的,要我立即為您打開燈光嗎?</p>
</blockquote>
<p>你說…</p>
<blockquote>
<p>幫我開燈</p>
</blockquote>
<p>這個敘述會促使 AI 去執行 LightPlugin 類別的ChangeState()方法,自動傳入參數 True,這時,燈開了,然後出現底下訊息</p>
<blockquote>
<p>[Light is now on]<br>
好的,燈已經打開了。如果還有其他需要的話,隨時告訴我喔。</p>
</blockquote>
<p>後面的動作就不用我多解釋了,你用口語化的指令,告訴AI說,你要關燈,它就幫你關燈。你人在國外出差,要問家裡的燈是開是關,它就幫你查詢狀態,並且回報:</p>
<blockquote>
<p>是的,您的家中燈光目前是關閉的。如果您需要改變狀態或有其他需要,隨時讓我知道。</p>
</blockquote>
<p>這個系統的操作,不是用滑鼠、不是用選單、不是用手機 app,單純就是用口語化的指令,來控制一切。整個流程,由 AI 自己決定何時(when)/如何(How)呼叫 LightPlugin 的什麼(What) Method(方法),全部用 語意(Semantic) 為核心,所以這個框架被稱為 Semantic Kernel 我想是再適當不過的了。</p>
<p>你再看一下操作的影片,有沒有很讓人震驚?</p>
<iframe width="1730" height="697" src="https://www.youtube.com/embed/UN2i6FYlOiE" title="ex_sk_101_Semantic_Kernel_beginning" allowfullscreen=""></iframe>
<p>誰控制這一切的? 誰回應了用戶的對談? 並且決定何時呼叫 API(或method),當然是 GPT 模型,看底下這段:</p>
<pre><code> //Azure OpenAI
var DeployName = "👉模型佈署名稱👈";
var Endpoint = "https://👉API端點👈.openai.azure.com/";
var ApiKey = "👉ApiKey👈";
// Create a new kernel builder
var builder = Kernel.CreateBuilder()
.AddAzureOpenAIChatCompletion(DeployName, Endpoint, ApiKey);
builder.Plugins.AddFromType<LightPlugin>(); // Add the LightPlugin to the kernel
Kernel kernel = builder.Build();
</code></pre>
<p>kernel builder 建立了以 AzureOpenAIChatCompletion 方法為核心的 AI Kernel,並且添加了 LightPlugin 這個類別作為 Plugin。</p>
<p>接著,我們配置了 System Message (role為system的prompt):</p>
<pre><code> // 建立 chat history 物件,並且加入系統提示訊息
var history = new ChatHistory();
history.AddSystemMessage("你是一個親切的智能家庭助理,可以協助用戶回答問題,交談時請使用中文。");
</code></pre>
<p>最後建立了 chatCompletionService 物件,並且開啟了對話迴圈,然後程式就動起來了:</p>
<pre><code> // Get chat completion service
var chatCompletionService = kernel.GetRequiredService<IChatCompletionService>();
// 開始對談
Console.Write("User > ");
string userInput;
while ((userInput = Console.ReadLine()) != null)
{
// Add user input
history.AddUserMessage(userInput);
// Enable auto function calling
OpenAIPromptExecutionSettings openAIPromptExecutionSettings = new()
{
ToolCallBehavior = ToolCallBehavior.AutoInvokeKernelFunctions
};
// Get the response from the AI
var result = await chatCompletionService.GetChatMessageContentAsync(
history,
executionSettings: openAIPromptExecutionSettings,
kernel: kernel);
// Print the results
Console.WriteLine("Assistant > " + result);
// Add the message from the agent to the chat history
history.AddMessage(result.Role, result.Content ?? string.Empty);
// Get user input again
Console.Write("User > ");
}
</code></pre>
<p>迴圈中,我們只是透過 AddUserMessage() 方法把用戶輸入的訊息傳遞給 AI,並且透過 GetChatMessageContentAsync() 方法取得回傳結果,這樣的對話之間,AI 就自己決定了要進行的行為,要呼叫的 API(Method),這還不驚人嗎?</p>
<p><em><strong>以後的程式的核心,可能不是我寫的邏輯,而是 AI 決定的邏輯</strong></em>,我們只是提供了在什麼狀況下要呼叫什麼方法的指引(注意 LightPlugin類別的那兩個方法身上掛的 KernelFunction Attribute 與 Description Attribute ),然後,事就這麼成了。</p>
<p>在上面的範例中,應用程式的『核心』,已經不是我寫的邏輯,應用程式的核心,是AI。我只是提供AI所需要的功能(Plugin),然後用戶就可以透過與AI對談,完成所有的 Actions(行為)。</p>
<p>沒有複雜的UI操作介面,沒有複雜的邏輯指令,全都是自然語言溝通,全部是AI。</p>
<p>我第一次看到的時候是很震驚的,想像一下,如果上面的 LightPlugin類別是一個個的API,那未來的程式開發方式是不是會大大的改變?</p>
<p>我們會不會迎向一個透過自然語言就可以操作的系統? 甚至一個透過語音就可以控制的作業系統? 果真實現,那鋼鐵人裡面的人工智能助理Jarvis,還會遠嗎?</p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">ChatGPT(Azure OpenAI) 對談機器人開發實戰 (studyhost.tw)</a><br>
參考資料:<br>
<a href="https://learn.microsoft.com/zh-tw/semantic-kernel/overview/">https://learn.microsoft.com/zh-tw/semantic-kernel/overview/</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-31041701845827349322024-02-26T00:27:00.001+08:002024-02-26T00:27:23.625+08:00使用CLI指令快速開啟Windows Terminal<p>不知道你會不會和我一樣有種感覺,Terminal 用久了,喜歡打字勝過用滑鼠點GUI。</p>
<p>這導致,我在VS 2022中寫 code 的時候,有時候要安裝套件,我喜歡用 windows terminal 多過用 NuGet 管理員,包含執行類似 dotnet run 指令,我都比較喜歡在 CLI 環境下執行(也許是用慣了VS Code的關係)。</p>
<p>當然,在 VS 2022中,不是沒有 Terminal,其實它有一個 『開發人員 PowerShell』,一般你按 Ctrl + ~ 就會出現:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/25-201009-35fc5de5-fa00-4427-9302-4aff3c0a7c37.png" alt="enter image description here"></p>
<p>但我很不喜歡用它,主要是因為『醜』。<br>
沒法很簡單的調整文字大小,也沒什麼色彩,而且有時候還會有奇怪的換行或顯示問題。</p>
<p>我忍耐它好一陣子了,我一直想,是不是有什麼方法,可以從這個<br>
『開發人員 PowerShell』直接開啟 windows terminal?</p>
<p>總該有個指令可以簡單的完成這件事情對吧?</p>
<p>類似像是在一般的終端機下 『start . 』指令,我就可以啟動檔案總管,並且開啟當前資料夾。下『code .』指令,就可以用 VS Code 開啟當前資料夾。</p>
<p>那 windows terminal 呢? 有沒有簡單的指令可以呼叫它?<br>
稍微一找,發現還真簡單,指令是:</p>
<pre><code>wt -d .
</code></pre>
<p>就這樣,搞定:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/25-202136-d0a187fc-add3-4239-8013-17cf79b97415.png" alt="圖片"></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-24664484578588937372024-02-14T12:04:00.001+08:002024-03-17T21:58:42.419+08:00Azure OpenAI 的申請與使用<p>OpenAI 介紹久了,覺得還是需要寫一篇來介紹Azure OpenAI的申請和使用。</p>
<p>和 OpenAI APIs一樣,微軟身為 OpenAI 最大的投資廠商,理當有一組 Azure 上的 OpenAI API 服務。然而其實,兩組API之間,幾乎完全一樣,不管是用法和價格。</p>
<p>那兩者之間的差異如何定位呢?</p>
<h3 id="openai-與-azure-openai-之間的差異">OpenAI 與 Azure OpenAI 之間的差異</h3>
<p>目前Azure OpenAI API服務的定位是針對企業用戶,而OpenAI API則有開放給一般個人用戶申請。這使得Azure OpenAI API的嚴謹度與安全性相對比較高。例如,Azure OpenAI API在呼叫時有獨立的Endpoint,針對使用的模型也有獨立的部署,除了不會跟別人共用API呼叫端點因此可以讓安全性和穩定性提升之外,微軟也承諾你上傳的數據不會被用在訓練模型的用途(這也是大家很在意的議題)。</p>
<p>此外,Azure OpenAI API的帳單是跟著Azure訂閱,同時在全球各地有不同的資料中心,這讓開發人員可以選擇距離自己(或自己的客戶)比較近的資料中心進行模型部署,以便於取得最好的運作效能。</p>
<p>由於微軟是透過在地的合作夥伴進行Azure銷售,因此在Azure OpenAI API的使用成本方面,可能因為採購的優惠折扣而有比較低的總體金額,相較之下OpenAI API就是死板板的固定金額,碰到問題的時候大概也只能上討論區尋求解答,比較沒有在地的服務。</p>
<p>OpenAI API有多次因為用戶數量太大,而導致API端點無法呼叫的案例,OpenAI API是全球同一個端點,因此當此問題發生時,很可能大家都會遭遇魚池之殃,全都無法使用。</p>
<p>另外就是,Azure OpenAI API針對具有暴力、自殘、猥褻、情色的文字的過濾相較於OpenAI API更加嚴格,你也可以從後台選擇不同等級的過濾器,來排除可能造成問題的文字,這對服務的安全性也是一種保障。</p>
<p>依照我現在自己測試的結果,最大的差異在於,微軟的API確實有比較嚴謹(有時候甚至過頭)的filter(過濾器),會對偏激或煽情的字眼非常敏感。在呼叫API時,你偶而會收到類似底下這樣的訊息(<a href="https://studyhost.blogspot.com/2024/01/azure-openai-contnet-filter-ai.html">註</a>):<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/07-212556-570864f9-a551-4d09-aa63-f42c943f9ae3.png" alt="圖片" width="700"></p>
<p>此外,就是目前(2024/1) OpenAI 有支援 Assistants API,但 Azure OpenAI 我還沒看到(2024/2更新,已經以preview方式提供),此外,就是對於模型的建立以及API呼叫的端點使用策略有點不同,其他,幾乎完全一樣。</p>
<p>這兩組 API 如此相似,那微軟和 OpenAI 公司之間,到底是什麼關係呢? 依照網路的說法,很多媒體都問過納德拉(微軟CEO,下圖左),微軟和 OpenAI 的合作關係如何定義,納德拉答案從來沒改過:「相互依賴」。(<a href="https://finance.technews.tw/2023/11/29/winner-isnt-sam-altman/">註</a>)<br>
<img src="https://img.technews.tw/wp-content/uploads/2023/05/24155419/OpenAI-Baltman-MS-Nadella1.jpg" alt="" width="700"><br>
Source:<a href="https://twitter.com/sama/status/1622689308829429760">Sam Altman</a></p>
<h3 id="azure-openai-的申請">Azure OpenAI 的申請</h3>
<p>目前,你要申請 OpenAI 的 API 使用權很簡單,只需要刷卡付錢付了錢之後,你要調用LLM或DALL-E生成圖片也好,生成文章也行,都非常自由,我在之前的文章中都有介紹過。</p>
<p>而Azure Open AI,之前在申請時明顯需要排隊等候,雖然一樣是雲端的服務,只要你有 Azure 訂閱帳號,就可以透過底下位置申請:<br>
<a href="https://portal.azure.com/#create/Microsoft.CognitiveServicesOpenAI">https://portal.azure.com/#create/Microsoft.CognitiveServicesOpenAI</a></p>
<p>然而,並不是每個人都可以順利取用,你雖然可以透過 Azure Portal 申請,但未經填表核准,你會看到的其實是底下這樣的畫面:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-151119-bfc02f32-8b1a-4f81-9725-390caf304290.png" alt="圖片" width="700"></p>
<p>這表示你的訂閱,目前沒有使用 Azure OpenAI 的條件。</p>
<p>Azure OpenAI主打定位是<strong>企業使用</strong>,因此要提前申請。其實申請也不難,就是填底下表單:<br>
網址位於: <a href="https://aka.ms/oai/access">https://aka.ms/oai/access</a></p>
<p><img src="https://arock.blob.core.windows.net/blogdata202401/15-151426-39c102aa-2cd0-4438-ae99-f98ace1fdcee.png" alt="圖片" width="700"></p>
<p>我填寫過數次此表,要通過,簡單的說有底下幾個條件。</p>
<ol>
<li>建議用公司帳號申請,別用 @gmail.com、@yahoo.com、@hotmail.com …等 一般mail 申請。</li>
<li>申請的Azure訂閱,建議不要是 free trial, 學生或微軟贊助訂閱,最好是企業的 EA訂閱、MSP(Managed Service Provider)、CSP(Cloud Service Provider)、LSP (License Solution Partner)等微軟的經銷商所賣出的訂閱。我自己測試的時候,用 PAYG 也失敗過。(但有學員最近反映說可以,觀察中)</li>
</ol>
<p>填表的時候,建議一開始別勾選太多,先從最基本的項目開始就行,除非你覺得都會用到,否則勾得愈多,要填的理由就愈多,被拒絕的機會就愈高:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-152344-d1de168c-29fe-41ca-9f41-b75c33a588a1.png" alt="圖片" width="700"></p>
<p>你必須針對你勾選的每一個服務,說明你的使用原因以及要如何使用,按下送件鈕之後,就是等。</p>
<p>通過後,你會收到一封類似底下這樣的信件,恭喜你上船了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-152634-15f7224b-941e-472e-84e9-a1300bf08935.png" alt="圖片" width="700"></p>
<p>如果被批退,則會收到:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-154743-8a8fff2f-8fe5-4659-a39b-a00e1ab47812.png" alt="圖片" width="700"></p>
<p>我被退件的原因,大多是訂閱並非 Managed by MS,這就是我前面說,建議你申請的訂閱,<strong>最好是企業的 EA訂閱、MSP(Managed Service Provider)、CSP(Cloud Service Provider)、LSP (License Solution Partner)等微軟的經銷商所賣出的訂閱</strong>的原因。</p>
<p>申請好之後,你在該訂閱底下,就可以建立 Azure OpeAI 服務了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-155010-f7c7842a-23ab-4ff1-997c-653a3dee41e4.png" alt="圖片" width="700"></p>
<p>申請好之後,你可以看到 Azure Portal 的 Azure OpenAI 服務首頁,有連結可以進到 Azure AI Studio:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-155217-deefa4df-e731-4027-881b-eb079f4b444f.png" alt="圖片" width="700"></p>
<p>進入之後的第一件事情,就是先佈署一個模型,和 OpenAI 不同,Azure OpenAI 的 API 有著自己的獨立端點(我覺得這樣相對比較安全一點),因此,你必須先佈署自己的 Model,才可以使用:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-160213-08318d34-b268-4ca7-b935-db3f143562a4.png" alt="圖片" width="700"></p>
<p>佈署完成之後,你可以切到 『遊樂場』 中的 『聊天』,嘗試輸入一下問題,你會發現立刻就會得到答案:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-160443-5a302586-f8bc-461e-a74a-6e13c61b5c63.png" alt="圖片" width="700"></p>
<p>不僅如此,如果你想要用 Rest API 來呼叫,可以參考這裡:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-160622-7420bd29-815c-482b-b24f-a1a302a852ff.png" alt="圖片" width="500"></p>
<p>你會看到除了透過 REST API 這個呼叫方式,還有 C#、Python 的語法,這是因為 Azure OpenAI 還有支援的SDK:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-161201-a2f9e4d2-7f61-4357-890d-21a7e25a97d6.png" alt="圖片" width="500"></p>
<p>但請特別留意到,Azure OpenAI 的 Rest API在呼叫時,Endpoint和OpenAI有所不同,Key的用法也和OpenAI不同,雖然Body 參數完全和OpenAI API相同,但Azure OpenAI 的 Rest API有著自訂的<code>端點</code>和<code>佈署模型</code>名稱,這兩個參數構成了整個 Endpoint 的一部份。</p>
<p>但只要掌握了這些差異,你可以輕易的透過程式碼或工具呼叫API:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/15-161924-1e3493de-017b-4cca-9e4f-9ab63158ef29.png" alt="圖片" width="700"><br>
並且享有<strong>企業等級</strong>的資安支援以及超級嚴謹的過濾器,不錯吧,趕快申請唷(因為你可能要等很久)。</p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-24219997318292643482024-02-11T17:07:00.001+08:002024-02-14T11:23:22.761+08:00周末讀書會 - 姿勢決定你是誰<p><img src="https://arock.blob.core.windows.net/blogdata202402/11-164351-9b6616d8-0510-418a-9530-65860cac5733.png" alt="圖片"></p>
<p>某次有位朋友問我:『你現在上台應該都不會緊張了吼,是吧?』<br>
我打從心底笑了出來,回答他:『並不是,我每次上台前都很緊張,不管你看不看得出來,而且沒有一次例外。』</p>
<p>最近,我看完半年前上課時某位老師推薦的『姿勢決定你是誰』一書,內頁第一句話寫著:『有一種勇敢,就是全世界只有你知道自己在害怕。』</p>
<p>其實不管場次大小,是線上或實體,每一次上台前我都還是會緊張、甚至焦慮。</p>
<p>但上台幾分鐘後,我大多能夠慢慢穩定下來,找到自己的節奏。過去我自己也不知道為什麼,但看完這本書之後,我才明白背後的原理。</p>
<p>『姿勢決定你是誰』這本書由 Amy Cuddy 著作,你可能有聽過她在 Ted的演說(我放在底下第一個留言),很多人聽了之後大受激勵。但我得說,其實書的完整內容比起Ted演說要深刻全面的多,從書名或演說15分鐘的內容,你很可能會誤會這本書真正要表達的事情。這本書要說的其實並非很多人誤以為的 fake it till you make it,而是『權力,讓你能夠表現出最佳狀態。』</p>
<p>你看到這邊可能會覺得不可思議。權力,不是那個會讓人腐化的可憎東西嗎? 沒錯,但這邊講的權力並不只是外在的『社會權力』,而是來自內心的『個人權力』。</p>
<p>『個人權力』指的是👉確信對自己的未來能夠掌握的程度。<br>
『個人權力』的反面就是『焦慮』,這個大家就很熟了。但,焦慮的來源是什麼呢?</p>
<p>其實剛剛好就是個人權力的相反,也就是『對自己未來遭遇的不確定性感到無法(或沒有足夠資源可以)控制的程度』。</p>
<p>而『焦慮』,正是讓你無法表現出最佳狀態的關鍵因素。<br>
愈是重要的場合,你愈是會焦慮,愈是焦慮,你愈無法表現出最好的自己。</p>
<p>但,人就是會焦慮啊,上台就是會緊張啊,如何解決這問題?<br>
👉如何讓自己在關鍵時刻能發揮全力,能夠把最好的、真實的那一面呈現出來?<br>
👉如何讓自己隨時能進入『最佳狀態』? 正是這本書真正在講的內容。</p>
<p>順帶一提,從這本書,我也大概搞懂了,為何球類比賽的時候,會有所謂的『主場優勢』? 為何有信仰的人,往往能夠更有力量面對未知的挑戰? 還有那著名的吸引力法則,為何真的有效?</p>
<p>我認為,都是因為恰恰好這些人都掌握到了發揮『最佳狀態』的秘訣。</p>
<p>我覺得,這本書對許多人都會有很大幫助。<br>
有興趣可以找來看看,在這農曆春節假期的周末,推薦給大家。</p>
<p>新的一年,你會成為一個更有力量的自己。</p>
<p>#周末讀書會</p>
<hr>
<p>ref: <a href="https://www.youtube.com/watch?v=Ks-_Mh1QhMc">https://www.youtube.com/watch?v=Ks-_Mh1QhMc</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-81956501677661604892024-02-09T22:44:00.003+08:002024-03-17T21:59:02.358+08:00Azure OpenAI 中的 Assistant API 功能<p>過去,如果你有用 Azure OpenAI 開發對談機器人,其中最麻煩的事情之一,大概就是記錄和處理歷史對談訊息。但歷史對談訊息對於AI的正確回覆佔有舉足輕重的角色,不記錄不行。</p>
<blockquote>
<p>這是因為本質上API的呼叫是無狀態的(Stateless)</p>
</blockquote>
<p>因此,在與API交談的過程中,你每次呼叫API都必須把過去的訊息,當作參數重新傳到後端,這樣API後面的AI Model才會知道先前跟用戶說過了什麼。但如此一來,對談越多,不就得花費愈多Token嗎? 是的,沒錯,這是過去透過OpenAI開發對談機器人時的一個難題。</p>
<p>2023年11/06,OpenAI舉辦了DevDay,在keynote的場次中,Sam Altman介紹了新的API --> Assistants API,把對談機器人的開發,再繼續優化到更簡單的步驟。</p>
<p>搭配Assistants API,你可以輕易建立出一個智能助理(或客服機器人),除了讓開發人員更省事之外,還包含了類似RAG的功能,可以將企業內的資訊先餵給這個AI助理。</p>
<p>如今,Azure OpenAI也提供了這個服務,在<code>美國東部2</code>、<code>澳大利亞東部</code>和<code>瑞典中部</code>率先提供了這個服務(Preview),同樣的,他提供了一個遊樂場後台:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-130641-46e4fce7-78d2-401f-be7a-ca6f62f63c27.png" alt="圖片"></p>
<p>初次進入,畫面上出現『找不到任何佈署』? 那你就給他來個新的佈署:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-134310-b141ec62-4de7-4f09-b84d-b5d52caa54f8.png" alt="圖片"></p>
<p>系統會引導你建立一個獨立的模型:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-134409-55c90a39-7605-4df3-8f1a-c7edc3fe8bc2.png" alt="圖片"></p>
<p>接著就可以透過該模型來建立助理了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-134517-08a6fc59-b598-4ae5-b59e-73398305fe75.png" alt="圖片"></p>
<p>填寫完智能助理的名稱、提示(system prompt) 之後,就可以儲存和測試了。</p>
<p>乍看之下,和原本的聊天對談沒什麼不同,但背後有一個很大的差異,那就是,過去的聊天對談,前後文(Context)的實踐是透過把先前與機器人的互動(訊息),每次重新回傳給API來實現的,而現在這個助理(Assistant API)則是透過一個新的物件,叫做Thread(執行緒),來保存這些對話記錄。簡單的說就是,你不用再自己保存對話記錄了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-134815-5bb012f4-69d9-4dc5-8018-701f71af46c3.png" alt="圖片"></p>
<p>Thread(執行緒)聽起來有點抽象,你可以把一個執行緒想成一連串的對話記錄,其中有一則一則的訊息(Messages):<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-153102-eac70ee4-9894-49c1-a8dd-170ccbe27ae1.png" alt="圖片"></p>
<p>當用戶輸入一則訊息(放上Thread)給機器人(assistant),機器人回覆這則訊息(也放上Thread),這樣就構成了一個Run。</p>
<p>也因此,透過 Assistant api 操作的對談流程,原則上大概是底下這樣的順序:</p>
<ol>
<li>建立Assistant</li>
<li>建立Thread</li>
<li>建立訊息(Message)</li>
<li>把訊息<strong>增添</strong>到Thread上</li>
<li>執行(<strong>Run</strong>)這個Thread</li>
<li><strong>取得</strong>Thread上助理回覆的結果</li>
</ol>
<p>對應到的就是底 Assistants API 的執行:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/09-224401-3adea0b1-f282-4f73-8296-da4e4ce0e516.png" alt="圖片"></p>
<p>也就是說,透過這個 Thread 物件,你不用再把歷史訊息存入資料庫或是檔案系統裡,你可以直接透過建立一個新的 Thread物件來保存用戶跟機器人之間的對談紀錄。</p>
<p>一般來說,我們會為機器人的每一個用戶,都至少建立一個 Thread,來保存過去的對談紀錄。或是在每一個新的對談情境開始的時候,建立一個新的對談紀錄。</p>
<p>透過Thread,我們可以減少 Token 的浪費,也無需特別篩選哪些對談訊息要保存與否,只需要把每一個用戶的訊息都丟上 Thread 即可,開發連續性對談的機器人助理變得更加容易。</p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-80651520298327009822024-02-08T22:54:00.001+08:002024-03-17T21:58:57.804+08:00Azure OpenAI 服務中的DALL-E-3<p>先前介紹過 OpenAI API 的 <a href="https://studyhost.blogspot.com/2023/11/dall-e3.html">DALL-E-3</a>,但如果你要在Azure OpenAI 上使用相同的功能,不管是模型的佈署和API的呼叫,兩者之間都有些不同。</p>
<p>使用在Azure OpenAI上的DALL-E-3,你必須把服務建立在瑞典中部(Sweden Central)的資料中心,才能享用該模型:<br>
<img src="https://hackmd.io/_uploads/Hkt-VOki6.png" alt="enter image description here" width="600"></p>
<p>目前只有該資料中心有提供 DALL-E-3 的模型選項,當你將AOAI的服務建立在Sweden Central資料中心,就會在模型佈署中,找到底下這個 dall-e-3 的選項:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/07-203208-2e37dedc-ae43-4fd7-8745-de1df055297f.png" alt="圖片" width="600"></p>
<p>如果你透過 Azure OpenAI Studio 這個後台測試 DALL-E,你會發現系統會自動幫你佈署 dalle3 模型:<br>
(動畫)<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/2024-02-07_20-51-56.gif" alt="enter image description here" width="600"></p>
<p>有了DALL-E-3模型之後,你就可以透過自然語言產生圖像了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/07-205522-a90307ce-4733-4c10-a9c6-db3721a35ea8.png" alt="圖片" width="600"></p>
<p>如果你要採用 API 來生成圖像,可以參考微軟<a href="https://learn.microsoft.com/zh-tw/azure/ai-services/openai/dall-e-quickstart?tabs=dalle3,command-line&pivots=rest-api">官網</a>上的 API 使用方式。</p>
<p>我們也可以透過 Postman 呼叫該 API:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/07-211552-7ba40f7c-2da1-48ab-8cff-367baee54a74.png" alt="圖片" width="600"></p>
<p>台北 101 的下雪美景,就這樣出現了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/07-211640-b5797bec-a9ce-48c1-8d53-2bb1d09e7b68.png" alt="圖片" width="600"></p>
<p>但你需要注意到,Auzre OpenAI DALL-E-3 的 API Endpoint 也明顯與Chat不同:</p>
<pre><code>https://{AOAI服務名稱}.openai.azure.com/openai/deployments/{Dalle3佈署名稱}/images/generations?api-version=2023-12-01-preview
</code></pre>
<p>不過掌握好了之後,透過程式碼來動態建立圖像,也就只是小菜一碟了。</p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-33541048666810622472024-02-05T21:28:00.001+08:002024-02-11T16:53:29.778+08:00LINE Bot 新功能 -- Clipboard Action<p><img src="https://arock.blob.core.windows.net/blogdata202402/05-210535-b454fd3b-d11f-4412-980f-67114250128b.png" alt="圖片" width="600"></p>
<p>LINE Messaging API <a href="https://developers.line.biz/en/news/2024/02/05/messaging-api-updated/#clipbord-action-20240205">今天</a>的更新增添了一項新功能:允許開發者在訊息中加入剪貼簿動作(Clipboard Action),這意味著使用者現在能夠透過單一點擊將特定文字直接複製到手機的剪貼簿中。</p>
<p>這個功能的加入為使用者提供了更多便利,特別是在需要複製優惠券代碼、網址連結或是其他重要訊息時,大大提高了互動效率和使用者體驗。</p>
<p>C# Developers 若要要使用這項新功能,可以採用全球最多 C# 開發人員使用的 <a href="https://www.nuget.org/packages/LineBotSDK/2.12.39">LineBotSDK</a> 套件😁。該套件是一個非常流行的 LINE Bot 開發工具,完整支援多種 LINE Messaging API 的功能。</p>
<p>以下提供一段 .net core 7.0 範例程式碼(使用最新版 2.12.39 LineBotSDK),展示如何建立一個包含剪貼簿動作的Button Template訊息:</p>
<pre><code>using isRock.LineBot;
string ChannelAccessToken = "👉ChannelAccessToken";
string AdminUserId = "👉AdminUserId";
var bot = new isRock.LineBot.Bot(ChannelAccessToken);
var act = new List<TemplateActionBase>();
// 建立一個剪貼簿動作,當用戶點擊時,指定的文字 "abc" 會被複製到剪貼簿
act.Add(new ClipboardAction() { label = "按這裡", clipboardText = "abc" });
// 建立Button Template訊息,設定文本、標題及動作
var TmpMsg = new ButtonsTemplate() { text = "測試複製到剪貼簿", title = "測試", actions = act };
// 使用 bot 物件推送消息給指定的用戶
bot.PushMessage(AdminUserId, TmpMsg);
</code></pre>
<p>透過這段程式碼,開發者可以在 LINE Bot 中建立一個按鈕,當用戶點擊這個按鈕時,預設的文字 “abc” 將會自動複製到手機的剪貼簿中。</p>
<p>執行結果如下:<br>
<img src="https://arock.blob.core.windows.net/blogdata202402/05-210422-c977568d-d412-49fb-b08f-4ef2927abaef.png" alt="圖片" width="300"></p>
<p>這不僅提升了與用戶的互動,還為用戶帶來了實際的便利性,尤其是在快速分享資訊的場景中。</p>
<p>這次的更新顯示 LINE 持續致力於提升其平台的功能性和使用者的互動體驗,進一步鞏固其作為一個全面通訊解決方案的地位。開發者可以利用這些新功能創造更豐富、更便利的用戶交互體驗,進一步增強用戶黏性和參與度。</p>
<p>更多資訊請參考 LINE 官方資訊:<br>
<a href="https://developers.line.biz/en/news/2024/02/05/messaging-api-updated/#clipbord-action-20240205">https://developers.line.biz/en/news/2024/02/05/messaging-api-updated/#clipbord-action-20240205</a></p>
<p>LineBotSDK 版本更新訊息:<br>
<a href="https://www.nuget.org/packages/LineBotSDK/2.12.39#releasenotes-body-tab">https://www.nuget.org/packages/LineBotSDK/2.12.39#releasenotes-body-tab</a></p>
<p>sample code:<br>
<a href="https://github.com/isdaviddong/Linebot-Demo-ClipboardAction.git">https://github.com/isdaviddong/Linebot-Demo-ClipboardAction.git</a></p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-26912778234441641202024-01-29T01:47:00.001+08:002024-02-11T16:53:38.416+08:00Microsoft Applied Skills 實作認證<p>時代在改變著。認證考試也是。</p>
<p>微軟推出全新的 Microsoft Applied Skills 系列的認證,現在主打免費、隨時隨地都可以考,而且是仿造真實世界的案例實作,也就是說,這是上機考試唷。</p>
<p><img src="https://arock.blob.core.windows.net/blogdata202401/29-013834-22da83a1-a7e1-4820-b024-d192dca1960e.png" alt="圖片" width="700"></p>
<p>通過了,你會得到一個類似底下這樣的證書,證明你在特定領域具有實作能力:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/28-113824-d21137b4-f19a-4ca5-a698-a80ff8eb68f1.png" alt="enter image description here" width="700"></p>
<p>考試時間共兩小時,算是充裕,前提是如果你對於考試的主題真的有足夠認識的話。</p>
<p>你一定以為,線上考試,那不就是可以open book? 應該很容易通過吧,並不一定。</p>
<p><img src="https://arock.blob.core.windows.net/blogdata202401/28-115338-c613db7e-1c5c-49b1-b408-ead647d0edc2.png" alt="圖片" width="700"></p>
<p>考試是採用網頁進行,網頁中會出現一台可以遠端操作的虛擬機(類似WVD),考生可以在網頁上透過實作,完成所有題目。</p>
<p>如同微軟一般的認證考試,作答完成送出之後,你會立刻看到結果:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/28-114832-5da992a6-70e2-4a34-80ea-7cc93bd54518.png" alt="圖片" width="700"></p>
<p>如果你沒通過,會收到底下這樣的訊息:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/28-114610-652358db-c88e-4a1a-a1d0-95c2d2106606.png" alt="圖片" width="300"></p>
<p>可以重考嗎? 可以,但要冷靜一下,72小時之後才能繼續。<br>
若是考過了,則會出現美麗的綠色畫面:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/28-114719-376be10a-ee69-4569-939a-33764ce92284.png" alt="圖片" width="300"></p>
<p>其實,我還蠻喜歡這個考試的。</p>
<ol>
<li>首先,它免費。相較於其他認證考試,它不用錢也可以考,沒通過頂多等個72小時,用功一點很容易可以考到過為止。</li>
<li>比起是非、選擇這種考試,Applied Skills 是真的要操作的,這對於真正有在應用的技術人員而言,其實是比較有利的,有時候根本不用特別準備,就可以去考,考了就過。說實在的,就算你原本不會某個領域,能憑真本事通過,大概本來不會的實作完之後也搞清楚了。基本上這個考試的目的就是要你真的搞懂某個技術實作,因此,這考試算是很務實的。</li>
<li>隨時隨地都可以考。傳統認證需要報名、排隊、跑去考試中心、待在小房間裡面幾小時,還不能上廁所😆。但這個考試,你隨時,隨地,想到就考,像我大半夜睡不著,手邊沒劇可以看,索性考個認證,也算是挺有成就感的。</li>
</ol>
<p>總的來說,這個認證考試挺好玩的。<br>
硬底子的技術夥伴們,不妨無聊的時候考個兩張來玩玩。</p>
<h4 id="瀏覽認證">瀏覽認證:</h4>
<p><a href="https://learn.microsoft.com/zh-tw/credentials/browse/?credential_types=applied%20skills">https://learn.microsoft.com/zh-tw/credentials/browse/?credential_types=applied skills</a></p>
<h4 id="常見問題">常見問題:</h4>
<p><a href="https://learn.microsoft.com/zh-tw/credentials/support/applied-skills-faq#applied-skills----------------">https://learn.microsoft.com/zh-tw/credentials/support/applied-skills-faq#applied-skills----------------</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-2760417602881613152024-01-26T21:44:00.001+08:002024-03-17T21:59:17.568+08:00使用 Python 呼叫 Azure OpenAI API 也很簡單<p>昨天去參加G社群舉辦的活動,想說來認識一下Gemini。<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/26-201458-bc7301bf-a742-47dc-85ab-499e93fea695.png" alt="圖片" width="700"><br>
來到了據說是全台灣最高的活動舉辦場合,也具體實作了一下 Gemini API 的使用。</p>
<p>聆聽分享的過程當中,台上講者問大家說:『現在已經有使用 OpenAI API 的舉手? 』(恩…很多)。<br>
又問:『現在已經在使用 Gemini 的呢?』(哇…也不少)。<br>
再問:『那使用 Azure OpenAI 的呢?』 我正想舉手,往四周一看,哇靠,怎麼一個人都沒有!</p>
<p>真的假的?<br>
原來來到不同的陣營,民調數據會差這麼多? 🤔</p>
<p>接著台上講者繼續問大家,用什麼語言寫AI程式,看來 Python 還是大宗,我本來想喊 C# 的,但看看周遭氛圍,我決定暫時先觀望一下。</p>
<p>然後講者開啟自己的 github repo,點選一個 badge ,把 github 的source code 帶到 colab 中,順口又問了一句:『應該大家都用過 colab 吧?』 (我本來又想喊…“沒有”)<br>
沒想到講師立即說:『恩…很好,顯然大家都有用過…』😮😮😮</p>
<p>我偷偷看了一下隔壁的朋友,耶欸,大家好像還真的都挺熟悉colab的呢。哇,果然隔『營』如隔山。</p>
<p>接著我看講者嘩啦嘩啦地在colab中運行每一個程式碼片段,行雲流水,很是順暢。也難怪,大家喜歡用 python,雖然從我的角度來看,一直覺得它其實跟 Visual Basic 有點像。</p>
<p>不過做Labs的過程中,我確實也開始覺得,有寫好的互動式腳本,上課時還是頗方便,大家只需要點個按鈕 clone 過去,然後程式碼都寫好了,只要改改參數,就可以一段一段運行了,難怪大家覺得 OpenAI API 和 Gemini API 用起來很簡單。</p>
<p>但其實,Azure OpenAI 也不難啦~</p>
<p>做完 Gemini Lab 後,我索幸順手也寫了一個 python 的 notebook ,用 python 來呼叫 Azure OpenAI ,我把它放在 <a href="https://github.com/isdaviddong/HOL_Notebook_OpenAI">github</a> 上了。又效法講者的作法,為它做了一個 badge ,讓用戶可以從 <a href="https://github.com/isdaviddong/HOL_Notebook_OpenAI">github repo</a> 直接連到 colab。操作動作如下:</p>
<iframe width="700" height="397" src="https://www.youtube.com/embed/gX8OngCF9XU" title="從 Github 中將程式碼導入 colab" allowfullscreen=""></iframe>
<p>然後我們就可以在 colab 中,透過互動式的方式,一段一段把程式運行完,體驗一下 Azure OpenAI API的呼叫。你看到上面的影片,就是整個操作過程。</p>
<p>由於notebook程式碼都寫好了,colab環境也是一個雲端的虛擬空間,因此整個操作的過程中,開發人員甚麼都不需要準備,只需要在網頁中,手動把程式碼中的 api_key, endpoint, deployment name 換掉即可(至於這三個參數怎麼取得,可以查看<a href="https://studyhost.blogspot.com/2024/01/azure-openai.html">這篇</a>的介紹)。</p>
<p>你會發現,只要設定好 Azure OpenAI API 所需的key, 個人獨有的 endpoint,以及模型的佈署名稱,就可以透過 python 呼叫雲端的 Azure OpenAI 服務。</p>
<p>而那個從 github 透過 badge 連結到 colab 開啟notebook檔的功能,居然還有一個名為 <a href="https://openincolab.com/">https://openincolab.com/</a> 的工具網站,可以幫你建立這個badge,真是方便。</p>
<p>你只需要在下圖左方的欄位中,輸入該 notebook 的URL 即可自動產生:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/26-202359-cb15b892-050d-469e-8e66-d01888a9caf9.png" alt="圖片" width="700"></p>
<p>在 github repo 的 <a href="http://readme.md">readme.md</a> 貼上產出的 badge ,就可以引導用戶把 github repo 中的 notebook 導入到 colab 運行,就如同前面的影片介紹的那般~<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/26-204654-9ec7db84-ff72-48ca-b0b7-4c4c8e0ab801.png" alt="圖片" width="700"></p>
<p>真是方便,有寫好的 notebook,Azure OpenAI API 用起來也很簡單的嘛😄。</p>
<p>repo: <a href="https://github.com/isdaviddong/HOL_Notebook_OpenAI">https://github.com/isdaviddong/HOL_Notebook_OpenAI</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-77647844433098324822024-01-24T20:02:00.003+08:002024-03-17T22:03:30.360+08:00使用 GitHub Copilot 建立單元測試<p><img src="https://arock.blob.core.windows.net/blogdata202401/24-195233-5f8753d7-319b-4d5b-a993-8bdd2e96c731.png" alt="圖片" width="600"><br>
過去,只要上到 DevOps 課程,我就會強調單元測試在 CI/CD Pipeline中的重要性,絕對是屬於必須的(must have)。自動化頻繁交付想要不斷的交付(產生)價值,而不是不斷的產生bug,那單元測試絕對不可或缺。</p>
<p>你可能會想,那最近幾年,敏捷開發與DevOps這麼普及,大家都號稱能夠頻繁交付,那想必單元測試實施的比例肯定也很高,對吧?</p>
<p>答案是:『不,並沒有』。</p>
<p>因為,開發團隊不寫單元測試的理由,比寫單元測試的理由實在多太多了,例如:</p>
<ol>
<li>測試程式本身需要花額外的時間</li>
<li>寫功能/趕進度 的時間都不夠了,怎麼有時間寫單元測試</li>
<li>不是每一個人都知道怎麼開始寫</li>
<li>方法(Mrthod)或類別的 相依性/耦合度 太高,難以撰寫單元測試</li>
<li>團隊中沒有這個氛圍,推動沒多久就無疾而終</li>
<li>PM或老闆不認為單元測試有價值</li>
<li>…</li>
</ol>
<p>隨手都可以舉出一大堆,這些都是上課時問學員,學員真實的回答。沒辦法,每個團隊都有各自難念的經,我尊重。</p>
<p>不過,那是去年。</p>
<p>今年開始,有一個非常大的理由,讓我覺得,可以重新要求開發人員,把 Unit Test 的建立視為標配,並且放入每一個 CI Pipeline當中。</p>
<p>沒錯,又是AI。</p>
<p>現在,透過 GitHub Copilot 你可以更輕鬆的建立單元測試,你可以用 GitHub Copilot 幫你產生測試案例,也可以用 GitHub Copilot 幫你重構,或是調整主程式,以配合單元測試的運行…</p>
<p>過去覺得需要花費大把時間、耗費許多工夫的作業,如今 GitHub Copilot 可以幫我省去近一半的時間。卡關不知道該怎麼做的時候,還能跟 GitHub Copilot Chat 聊聊,技術問題迎刃而解。</p>
<p>我底下錄了一段影片,展示了如何使用 GitHub Copilot 建立單元測試。如果,你的團隊過去也屬於(有諸多原因導致)無法傳寫單元測試的一族,不妨看一下影片,或許在新的一年,將有不同的可能性出現?</p>
<iframe width="600" height="397" src="https://www.youtube.com/embed/oOfC1uKYdZo" title="GitHub Copilot - 07 使用Copilot建立單元測試" allowfullscreen=""></iframe>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-1119236852588166842024-01-23T18:44:00.001+08:002024-02-11T16:54:25.314+08:00Git 版控到底有沒有正確的用法?<p>某天,朋友向我詢問一個問題 :『Git 版控到底有沒有正確的用法?』</p>
<p>因為團隊成員要求走自己習慣的 Git 協作流程,溝通無效,team member堅持 : 『像是 Git 這樣的工具,使用時沒有絕對的對錯,不是國外的大神說的就是對的,也沒有觀念是否正確的問題…』。</p>
<p>『很有魄力耶』我說。<br>
『但這樣我很困擾啊』朋友無奈地問:『Member這樣講是對的嗎?』</p>
<p>我回答道:<br>
『你可以說對,也可以說不對。<br>
所有東西都是工具,甚至,廣義來說整個軟體開發技術也都是工具,<br>
常常需要因時因地制宜,因此…<br>
對錯是相對的沒錯,但是到底<strong>相對於什麼呢? 得看目的</strong>。』</p>
<p>Git的使用,一般來說,有爭議或選擇的是兩個部分,Repo 大小的分割(專案顆粒度),以及 git working flow…</p>
<p>拿 git working flow來說,如果是早年的 Git 使用者,多半選擇 git flow,那是有當年時空背景因素的。Git 發展初期,需求是開源專案,開發人員可能並不在同一個辦公室協作,常有跨國合作的需求,當時網路狀況也不像現在品質那麼好,那時分支的建立就相當多且頻繁。</p>
<p>再加上 Git 切分分支的成本極低,到後期,甚至有很多團隊用分支來做為暫時性的程式碼存放或測試,這本身不是問題。但這些分支,終有一天需要合併,每次合併,都帶來不少的痛苦。過去沒有頻繁交付的需求,一兩個月合併一次花花時間,日子也就這麼過了,但如今,不同了。</p>
<p>最近幾年,我們是不建議切出具有<strong>長生命週期</strong> 且 <strong>數量多</strong>的分支的,因為分支本身就是一種<strong>程式碼隱藏</strong>,Continuous Delivery 的作者 Dave Farley 就說過, 從<strong>頻繁交付</strong>的角度來看,具有長生命週期且多分支的 git flow 是個不好的選擇:<br>
<a href="https://www.youtube.com/watch?v=_w6TwnLCFwA">https://www.youtube.com/watch?v=_w6TwnLCFwA</a></p>
<p>所以,如果要實踐敏捷的頻繁交付(一周數次,一天數次)那我會建議 git 分支數量愈少愈好,分支生命周期愈短愈好,以便能有利於持續整合,實現頻繁交付:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/19-102516-bc6bc0de-1100-4dcf-80e3-f8362c34fd23.png" alt="圖片" width="600"></p>
<p>但這是有前提的。<br>
前提是 : 『團隊有良好的自動化CI流程,包含程式碼的靜態掃描、套件安全性掃描、自動化測試…都<strong>必須</strong>在Pipeline中出現。』</p>
<p>如果你想實踐真正的持續整合(CI),就要盡可能地減少不力於頻繁整合的程式碼隱藏,而分支,毫無疑問是一種程式碼隱藏:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/19-103954-b0854ab0-544a-42a9-93a8-b8bd3777c50c.png" alt="圖片" width="600"></p>
<p>這就是技術能力較好的團隊,之所以對於 Git 版控會傾向於選擇不用 git flow 或走 trunk based development 的原因,但這當然必須建立在團隊的技術能力已經足夠成熟的前提上。</p>
<p>資訊業,是一個在持續發展中的行業,<strong>改變</strong>不僅相當頻繁而且往往昨是今非,因此,不同的團隊、不同的公司、不同的時空背景,同一個議題也可能會有不同的解答。</p>
<p>所以觀念正不正確,或選擇對不對,是依照 “<strong>目的</strong>” 來決定的,如果團隊的目標一致,<strong>選擇</strong>就是一種策略,對的選擇,就會讓團隊以更快的腳步接近目標,反之亦然。</p>
<p>所以你覺得,使用 Git 有沒有所謂的<strong>對錯</strong>呢?</p>
<p>參考文章:<br>
<a href="https://www.youtube.com/watch?v=_w6TwnLCFwA">https://www.youtube.com/watch?v=_w6TwnLCFwA</a><br>
<a href="https://www.atlassian.com/continuous-delivery/continuous-integration">https://www.atlassian.com/continuous-delivery/continuous-integration</a><br>
<a href="https://martinfowler.com/articles/continuousIntegration.html">https://martinfowler.com/articles/continuousIntegration.html</a><br>
<a href="https://techblog.lycorp.co.jp/zh-hant/Safely-Deliver-Large-Scale-Feature-Migration-With-Feature-Toggle">https://techblog.lycorp.co.jp/zh-hant/Safely-Deliver-Large-Scale-Feature-Migration-With-Feature-Toggle</a></p>
<hr>
<h5 id="相關課程:">相關課程:</h5>
<p>敏捷開發與Azure DevOps實戰<br>
<a href="https://www.studyhost.tw/NewCourses/ALM">https://www.studyhost.tw/NewCourses/ALM</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com1tag:blogger.com,1999:blog-4291069679343025964.post-91447352825508570212024-01-22T00:18:00.001+08:002024-03-17T22:03:41.138+08:00該開始使用 Github Copilot 了嗎?<p>每個月 10元美金,折合台幣 $315 左右,到底能帶給開發人員什麼?</p>
<p>據麥肯錫說:『使用微軟 GitHub Copilot 的軟體開發人員完成任務的速度比不使用該工具的人快 56%。』這個數字真的可信?</p>
<p><img src="https://arock.blob.core.windows.net/blogdata202401/21-231042-144ecd93-47c3-4ee8-887c-19b2922edfec.png" alt="圖片" width="600"></p>
<p>而 GitHub 與 Wakefield Research 合作,今年針對 500 位在千名以上員工企業的開發人員進行調查,蒐集到的回饋則是:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/21-231139-406b1566-1cd5-4582-bf3a-ab30dccbcff5.png" alt="圖片" width="600"></p>
<p>你如果問我,真的覺得有這麼高的果效嗎?<br>
我是覺得,這個問題要由開發者自己親身體驗後,由你自己來回答。</p>
<p>我最近接到非常多客戶詢問 Github Copilot 的教育訓練,team member 問我,Github Copilot 不就是申請好安裝起來就用嗎? 還需要上課嗎?</p>
<p>其實,網路上的資源那麼多,哪一門資訊技術真的非得上課才能學會呢? 絕大部分的課程也只是縮短你自己摸索花費的時間而已。</p>
<p>為了準備課程,我錄製了不少的影片,底下這兩個是這系列影片的開頭兩隻,或許對於還在對 Github Copilot 猶疑的朋友會有些幫助。第一個影片是 Github Copilot 的安裝與基礎使用介紹,第二個影片則是展示了如何使用 Github Copilot 很快的建立出一個前端 UI。</p>
<p>觀看第二支影片時,請特別注意 Github Copilot Chat 的部分,在影片中我們展示了怎麼透過 Github Copilot Chat 讓Github Copilot 幫我們把網頁改成支援 bootstrap 以及把表格轉換成中文,在這個過程中,你應該會自己體察到, Github Copilot 在你的工作場域中,到底能不能幫你節省時間。</p>
<h5 id="github-copilot---01-基本程式碼生成-與-qa">GitHub Copilot - 01 基本程式碼生成 與 QA</h5>
<iframe width="700" height="397" src="https://www.youtube.com/embed/5vJ05skCULg" title="GitHub Copilot - 01 基本程式碼生成 與 QA" allowfullscreen=""></iframe>
<h5 id="github-copilot---02-前端頁面html與bootstrap">GitHub Copilot - 02 前端頁面html與bootstrap</h5>
<iframe width="700" height="397" src="https://www.youtube.com/embed/5AAxSft_vIQ" title="GitHub Copilot - 02 前端頁面html與bootstrap" allowfullscreen=""></iframe>
<p>不管是對於新人或開發老手來說,這兩個影片,應該都能有效的帶您進入 AI 協同開發的領域,希望對大家有所幫助。</p>
<hr>
<p>後記:<br>
上課時,和學員談到這個問題。<br>
有學員問道:『依照上面這樣的展示,老師您會不會覺得,若開發人員將來廣泛的使用 AI ,那以後都只負責看程式碼都不用花腦袋寫 Code 了,那是否會讓開發人員的技術能力降低呢? 』</p>
<p>我還來不及回答,另一位學員開口說了:『這看人吧,搞不好有些人反而會因為能夠看到不同的程式碼寫法,讓功力得以提升,不是嗎?』</p>
<p>現場學員看著我,我笑著說:『或許都有吧,這真的要看人,但不管是你們說的哪一種,我想,這個趨勢是擋不住的了。這一年中,開發方式的改變,從<code>觀望</code>到<code>有感</code>,我有些朋友公司內的開發人員,甚至已經 “自費” 採購 Github Copilot ,只是為了增加開發過程的爽度。我很少看到開發人員願意自己花錢買東西讓工作更有成就感的。這一年, AI 帶來的改變真的不能說不大,接下來,就看大家自己怎麼做決定了…』</p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-59430167412037368432024-01-16T22:39:00.003+08:002024-02-11T16:54:41.839+08:00DevOps導入前後,該如何評估成效?<p>最近好巧,很多朋友詢問我,DevOps導入前後,該如何評估成效? 或是,企業可以從哪些角度來看自身的 DevOps 現況? 找到可以改善的空間和指標? 或許是因為最近 DORA(DevOps Research and Assessment) 蠻紅的,所以大家開始想了解如何評估 DevOps吧?</p>
<p>其實很久以前 Azure DevOps 的網站中就有這個服務,你可以在底下網址找到 :<br>
<a href="https://devopsassessment.net/">https://devopsassessment.net/</a></p>
<p>進入之後,點選『開始評量』就可以了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/16-222934-a07ef947-795f-4281-bef4-07047a3f0b3e.png" alt="圖片" width="700"></p>
<p>接著,可以在出現的領域中,選擇你關心的部分:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/16-223246-f60777c3-4ec2-4fae-bdd6-a9d07d489a14.png" alt="圖片" width="700"><br>
接著會出現一堆類似考試或問卷的題目,請認真乖乖作答,完成之後,你就會看到評估的結果,與改善的建議:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/16-223550-b7a1e045-7f6b-4ce4-b3bd-f5d1ffe02a0b.png" alt="圖片" width="700"></p>
<p>從上表中,可以清楚知道企業目前 DevOps 的成熟度,還有可以進行哪些改善項目,雖然這些項目看起來像是老生常談,但其實是歷久彌新,在公司導入 DevOps 的前後,不妨來這個網站評估看看,相信對選擇改善標的會有很大的幫助。</p>
<hr>
<h5 id="相關課程:">相關課程:</h5>
<p>敏捷開發與Azure DevOps實戰<br>
<a href="https://www.studyhost.tw/NewCourses/ALM">https://www.studyhost.tw/NewCourses/ALM</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-34843159611098289512024-01-16T21:39:00.001+08:002024-02-11T16:57:41.821+08:00你看過綠色的 VS Code嗎?<p>上課時,學員發現教室的電腦中安裝了奇怪的 VS Code,它是綠色的 Logo,連忙問我教室是不是被駭客入侵了!?</p>
<p>如同你知道的,VS Code 的 Logo 一直以來都是藍色的,怎麼會突然之間變成綠色呢? 有綠色 Logo 的VS Code 嗎?</p>
<p>不要懷疑,其實還真的是有,當然,也跟政治無關,綠色的 VS Code 長這樣:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/16-211900-a2e8520e-4734-434d-96da-a9f587ff8529.png" alt="圖片" width="700"></p>
<p>它是所謂的 Insider 版本。</p>
<p>微軟很多產品都有所謂的 Insider 版,Visual Studio Code Insiders是VS Code的測試版。它包含了最新的功能和錯誤修復,但是這些新功能可能存在著些許的不穩定性。</p>
<p>Insiders版本<strong>每天</strong>都會更新,包含最新的bug fix和new feature,讓使用者可以嘗試新功能。與普通版本的VS Code相比,普通版本較為穩定,通常也不包含尚未完全測試的新功能。</p>
<p><strong>使用者可以同時安裝和打開這兩個版本</strong>,並且可以使用特定的擴展來同步兩者之間的設置。因此,Insiders版本更適合那些希望體驗最新功能並願意承擔潛在不穩定風險的使用者。</p>
<p>底下這段影片展示了如何下載與安裝,並且把它和藍色的 VS Code 同時開啟:</p>
<iframe width="700" height="397" src="https://www.youtube.com/embed/JCMyzPHPgRE" title="VS Code Insider" allowfullscreen=""></iframe>
如果你是喜歡冒險犯難的勇者,綠色的 VS Code,或許更適合你。
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-91698792500856814532024-01-10T21:18:00.001+08:002024-02-11T16:57:26.173+08:00使用 Video Indexer 做為活動影片處理方案<p>又到了一年一度的尾牙節期。</p>
<p>朋友公司每年參與舉辦很多尾牙活動,身為主辦單位,活動的紀錄當然是重點之一,記錄不是問題,請了一大票工讀生,拍照攝影帶回了大把的素材,等到要整理的時候,才是惡夢的開始。</p>
<p>連續看他唸了好幾年,雖然不關我的事,但我還是很好奇他到底怎麼做影片的整理和歸類的?</p>
<p>『就一段一段看啊?』他說。<br>
『什麼?』我疑惑的問:『 那不是要花很多時間?』<br>
『當然啊,不然怎麼辦?』他問。<br>
怎麼辦,現在 AI 時代耶,當然是用 AI 處理啊。</p>
<p>我跟他介紹 Video Indexer ( <a href="https://www.videoindexer.ai/">https://www.videoindexer.ai/</a>),他驚為天人:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/10-205328-a02cc40a-0c37-4547-b923-3ec97c4997bd.png" alt="圖片" width="700"></p>
<p>這網站可以把上傳的影片逐格(frame)分析,不僅能夠自動為影片自動加上字幕(當然,支援中文),還自動幫你找到出現在影片裡面的每一個人物:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/10-205502-5606b1ae-4789-4190-9076-1b3e90245494.png" alt="圖片" width="700"></p>
<p>這個功能非常關鍵,它可以輕鬆地幫我們找到某人出現在影片中的每一個片段,以便於來做剪輯與後製。</p>
<p>以前,活動結束之後,要剪出特定人物的精華集,常常得先看完一整部片子,找出該人所有出現的段落。現在人人都有手機攝影,一場活動下來隨便也拍了十幾二十小時的影片,影片常常還來自不同的拍攝者,事情相當棘手。</p>
<p>如今,透過AI工具,可以直接幫你把某人出現在影片的哪裡,都標註的清清楚楚,使用Web界面點選人頭,就可以跳到該片段出現的位置,非常好用:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/10-205829-834a88fa-4949-4613-b4de-c5a05e4d3eba.png" alt="圖片" width="700"></p>
<p>不僅如此,AI工具還幫你標出影片中各種場景的tag,highlight各種出現的物件:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/10-205956-1e90e8d0-f747-49b1-b947-a8313bd81bdd.png" alt="圖片" width="500"></p>
<p>甚至還能判斷影片中每個段落的情緒:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/10-210139-8df75cd5-6c1e-44f9-828f-89bfb55ab0a1.png" alt="圖片" width="700"></p>
<p>有這個工具,你可以輕鬆地找到每一個你想要的精華,即便沒有看完所有的影片與段落,都不會錯過任何細節。</p>
<p>很讚吧!<br>
不用謝,今年辦完活動之後,不要再熬夜剪片,好好睡個覺吧。</p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-87558133934302989992024-01-08T01:16:00.001+08:002024-02-11T16:57:34.222+08:00Azure OpenAI Contnet Filter 之 我是善良的AI使用者<p>昨天在久違了的南部上課時,跟學員聊到 Azure OpenAI 和 OpenAI 兩者之間有一個很明顯的差異,那就是 ==> Azure OpenAI 明顯的對內容敏感很多,我是指,針對有疑慮的內容篩選( Contnet Filter )。</p>
<p>怎麼說呢?</p>
<p>如果你用API 呼叫,會發現,同樣的模型、同樣的API、同樣的提示,OpenAI 會乖乖地回答,Azure OpenAI 就硬生生地把我給過濾掉:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/07-212556-570864f9-a551-4d09-aa63-f42c943f9ae3.png" alt="圖片" width="700"></p>
<p>用戶問你有提供哪些服務不行嗎? 不知道這個 AI 是想到哪裡去了? 會不會太敏感了點?</p>
<p>如果你有Azure OpenAI 的帳號,歡迎你可以試試看,看看是否和我一樣,常常被 content filter 卡到,把我用戶傳來的問題給過 Ban了。<br>
(但有位學員說,它們公司自己用Azure OpenAI 搭建的 ChatGPT 都不會耶,他懷疑說是不是其實是 “我” 被 MS 盯上了,因為看到是我的帳號,因此才會被過Ban掉? … 這意思是我是黑名單? 😱 我不信。)</p>
<p>好吧,我是一個善良的AI使用者,為了謹慎一點,我可以接受過濾器嚴格,但不同類型的對話,應該也有不同的篩選等級吧? 有些服務可以嚴格一點,但有些服務則應該能調整的寬鬆一點才對啊,總不能全部都管的死死的。</p>
<p>那…這有辦法可以設定嗎?<br>
還真的有。</p>
<p>原來可以到 Azure AI Studio,選擇內容篩選即可:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/07-213334-a4baee0d-7538-4492-84f1-4d5e763ec183.png" alt="圖片" width="700"></p>
<p>你可以針對你的需要,放寬或調整內容篩選的嚴格性,也可以設置成針對特定提示文字進行封鎖:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/07-213559-388d0350-ad65-44ea-af5c-24ce4968cbc1.png" alt="圖片" width="700"></p>
<p>設定好這個組態之後,可以到你的<code>部署</code>,將其配置給你部署的模型,作為其篩選規範:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/07-213707-722a4a4c-da62-4ccd-9574-7a355b5079b3.png" alt="圖片" width="700"></p>
<p>如此一來,就可以針對篩選的嚴格性做出有差別的調整囉。</p>
<p>我本來就是一個善良的AI使用者,不過,能夠自己依照需要設定篩選的嚴格性,還是好一點的。</p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-33628634547883988412024-01-05T23:31:00.001+08:002024-02-11T16:57:51.193+08:00使用 Azure Vision API 之 奇怪錯誤訊息<p>最近 AI 很紅,連帶著 Azure AI 詢問度也很高。最近很多企業客戶紛紛參與Azure的 AI 教育訓練。這個訓練課程中, Computer Vision 也是重點之一。</p>
<p>其實 Azure 上的 Computer Vision 功能很強,模型也都封裝好放上雲端,可以透過REST API的方式進行呼叫,從2016年起,我們就在 Blog 上多次介紹過這個 API,相關文章可以參考<a href="https://studyhost.blogspot.com/search?q=vision">這裡</a>。</p>
<p>但這一陣子頻繁的帶著學員操作,看到學員在使用postman呼叫API時,常發生許多有趣的bug,整理一下,和大家一起分享。</p>
<p>要使用Computer Vision,你只需要申請好一組 endpoint,並且取得 key 即可,這很簡單:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-200114-0ada879a-ee1d-4d50-88cf-8b1daf4b2750.png" alt="圖片" width="700"></p>
<p>從<a href="https://westus.dev.cognitive.microsoft.com/docs/services/computer-vision-v3-2/operations/56f91f2e778daf14a499f21b">文件</a>上可以看到,使用此API,可以辨識人臉、取得圖片說明、判斷成人圖片,因此你使用了底下這樣的呼叫,可是卻硬生生地得到 HTTP 400 的錯誤:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-200847-b366f378-d0fa-49fc-b223-461c89677221.png" alt="圖片" width="700"></p>
<p>如果你對 Azure AI 熟悉的話不妨挑戰一下,先停在這邊,看看上面這個呼叫指令可能有什麼錯?</p>
<p>從訊息看起來是 <code>NotSupportedVisualFeature</code> 但你放大觀察<code>VisualFeature</code>的部分,看起來也沒啥問題:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-201323-9d047d8d-a44c-4ff5-94e7-68d55d1e1008.png" alt="圖片"></p>
<p>哪怎麼回事?</p>
<p>結果發現,網址列多一個空白:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-201459-825589b6-2be8-47fb-bd2b-f2746fa018ce.png" alt="圖片" width="700"></p>
<p>這樣也不行? 對,這樣也不行。</p>
<p>另外學員常常也碰到的錯誤像是收到 404,但 endpoint 明明正確:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-201852-e594393f-32dd-40d0-965d-a6382299bffc.png" alt="圖片" width="700"></p>
<p>結果是,http method用錯:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-201936-c9a35a58-4980-4f08-a7fa-9e2d9d07d8c7.png" alt="圖片" width="700"></p>
<p>從Get改為POST問題就解決了。</p>
<p>至於什麼把本來該放在 Header 的 key 錯放到 parameter 結果收到 401 的錯誤,也是見怪不怪了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/05-202332-e2d95b93-dd75-40ca-9743-a8c5cf01de96.png" alt="圖片" width="700"></p>
<p>這些都很簡單,但是稍微注意一下,會減少你走冤枉路的時間。畢竟,平常工作已經很累了,把時間花在這種 debug 事情上,有些冤枉了。</p>
<p>我們在透過程式碼呼叫雲端的API前,我都建議同仁先用 <code>postman</code> 測試一下,如果測不過,就先別急著寫程式了,先搞定API,測通了再寫code,往往事半功倍,否則如果從程式碼開始卡關,你會debug的更辛苦。😆</p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-71125242737471046832024-01-03T20:39:00.001+08:002024-02-11T16:58:06.135+08:00在 .net 8 中使用傳統的 WebAPI 專案範本<p>前幾天上課的時候,發現原本可以順暢使用的 LINE Bot WebHook Template (自動建立LINE Bot WebHook API專案的範本)突然間不能用了,學員哀號,身為現場指導老師,我當然跑不掉。</p>
<p>走向前往學員的電腦上一看,發現整個操作動作並無不妥:</p>
<pre><code>dotnet new webapi
dotnet add package linebotsdk
dotnet new install isRock.Template.LineWebHook
dotnet new linewebhook
</code></pre>
<p>但依照過去的做法,使用瀏覽器讀取 <a href="http://localhost">http://localhost</a>:???/api/LineBotChatGPTWebHook</p>
<p>結果出現<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/03-195210-95a7531b-c5b1-455e-aa9a-a32f8cca2e80.png" alt="圖片" width="600"></p>
<p>不對,照說透過我們 template 建立出來的 WebAPI ,其程式碼的內容應該是:</p>
<pre class=" language-cs"><code class="prism language-cs">namespace isRock.Template
{
public class LineBotChatGPTWebHookController : isRock.LineBot.LineWebHookControllerBase
{
[Route("api/LineBotChatGPTWebHook")]
[HttpPost]
public IActionResult POST()
{
(...略...)
</code></pre>
<p>這段 code 所產生的 WebAPI 就算不能使用瀏覽器以 http get 方式讀取,也應該是得到 http 405 method not allowed 而非 404 啊,這怎麼回事呢?</p>
<p>估計應該是 Route 沒抓到,查看 Program.cs ,Routing 的設定怎麼變成底下這個樣子了?</p>
<pre><code>pp.MapGet("/weatherforecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
})
.WithName("GetWeatherForecast")
.WithOpenApi();
app.Run();
</code></pre>
<p>一問之下,果不其然。這位學員安裝了 .net 8</p>
<p>從 .net 8 開始,如果你使用 dotnet new webapi 這樣的 CLI 指令建立 WebAPI ,你得到的並非傳統的 Controller WebAPI ,而是 <code>Minimal API</code>。</p>
<h3 id="why-">WHY ???</h3>
<p>在 .NET 8 中預設使用 Minimal API 作為 WebAPI 的範本,其主要原因是性能和原生 Ahead-of-Time (AOT) 編譯支援。如此一來,預設採用 Minimal API 的 WebAPI ,在建置階段應用程式即可通過原生 AOT 編譯獲得更小的部署大小、更快的啟動速度以及更低的記憶體使用量。此外,Minimal API 的設計強調減少程式碼配置的複雜性,使其成為構建微服務和高性能後端 API 的理想選擇。</p>
<p>簡單的說,就是配合微服務和 API 時代的來臨啦。<br>
但 Minimal API 並非全是優點。</p>
<p>Minimal API 的設計注重簡單,因此缺乏傳統基於 ControllerBase 的 API 的靈活性。例如,對於 filter、authtication、可測試性…等的支援就明顯不如傳統的 WebAPI,也無法有效地處理複雜的數據類型。</p>
<p>因此,倘若你想在 .net 8 建立傳統的 WebAPI 也不是不行。 在 .NET 8 中,要創建一個不是 Minimal API 的傳統 Web API,你可以使用以下CLI命令:</p>
<pre><code>dotnet new webapi --use-controllers
</code></pre>
<p>你會發現,它又把傳統的 Controller API還給你了:<br>
<img src="https://arock.blob.core.windows.net/blogdata202401/03-201300-ed9f1db9-0b98-4328-9bb4-757ad3037b77.png" alt="圖片" width="700"></p>
<p>在技術更迭這麼迅速的這個時代,使用最新的技術,可能不再是最好的選擇,只有適合自己團隊和當前專案的技術,才是正解。</p>
<p>ref:<br>
<a href="https://learn.microsoft.com/zh-tw/training/paths/aspnet-core-minimal-api/">https://learn.microsoft.com/zh-tw/training/paths/aspnet-core-minimal-api/</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-70395254020971337862023-12-27T01:16:00.001+08:002024-03-17T22:03:58.058+08:00以MS Bot Framework串接OpenAI API實現跨平台(頻道)機器人開發<p>前幾天介紹過如何透過 LINE Messaging API 來串接 OpenAI API,實現具有GPT能力的LIEN Bot。但如果你的 ChatBot 不想只支援 LINE 怎麼辦呢? Microsoft Bot Framework 是另一個不錯的選擇。</p>
<p>Microsoft Bot Framework 提供了一個健全的平台,讓開發者可以建立、測試、和部署具有高度互動性的聊天機器人,除了可以直接串接 LINE Bot, 還支援 Teams、Telegram、FB、Skype、Alexa、Web UI、甚至 email 和 SMS…等不同的Channel。</p>
<p>當它與 OpenAI 的 API 結合時,不僅可以快速的建立出對談機器人應用 ,更能確保了機器人可以在多種平台上運行,包括網頁、社交媒體平台和行動應用,使其更具可訪問性和便利性。</p>
<p>底下這個在MS Bot模擬器中的截圖,就是我們在上課的時讓學員做出的成果,你會看到透過 Bot Framework 設計的對談機器人,具備理解前後文與對談記憶,由於ChatGPT的加持,可以輕易的理解用戶的對談訊息,從而輕鬆地蒐集用戶的購票資訊,協助用戶進行購票。</p>
<p>這個範例的最後,產生了一個可以傳遞給 購票系統的 JSON 內容,只需要再加上呼叫 購票系統的API,就可以在對談中自動完成協助用戶購票的動作了。</p>
<p><img src="https://arock.blob.core.windows.net/blogdata202312/27-004918-3154c358-dfaa-4613-bba0-ac667a006162.png" alt="圖片" width="700"></p>
<p><img src="https://arock.blob.core.windows.net/blogdata202312/27-004932-d7372f44-5c57-4b01-98ca-35587fc071f8.png" alt="圖片" width="700"></p>
<p><img src="https://arock.blob.core.windows.net/blogdata202312/27-004945-632ee8e0-b14b-41ab-92d4-a35a2ca56dde.png" alt="圖片" width="700"></p>
<p><img src="https://arock.blob.core.windows.net/blogdata202312/27-005010-a34d45b3-0cac-41c1-bb95-d2489144d7a5.png" alt="圖片" width="700"></p>
<iframe width="700" height="370" src="https://www.youtube.com/embed/d8uBJhht1Bk" title="" allowfullscreen=""></iframe>
<p>讓 OpenAI API 產出 JSON 是為了方便開發人員後續可以直接呼叫 售票系統的 API 來完成真正的購票行為,如此一來可以更方便的做系統間的整合。</p>
<p>而採用 MS Bot Framework 開發的好處在於,可以輕易地透過 Azure Bot 的維護後台,以設定的方式,就可以讓串接好 ChatGPT 的 Bot 與各種不同的頻道進行整合:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/27-005854-b2e14baf-f827-4071-9c3a-c25e990eadb4.png" alt="圖片" width="700"></p>
<p>這樣我們只需要撰寫一次,就可以直接支援各種不同的操作介面或App。</p>
<p>基本款的 MS Bot Framework + ChatGPT 範例,可以參考筆者的 Github repo:<br>
<a href="https://github.com/isdaviddong/DemoChatGPTwithMSBotFramework.git">https://github.com/isdaviddong/DemoChatGPTwithMSBotFramework.git</a></p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-19526880169435513432023-12-25T12:23:00.001+08:002024-03-17T22:00:10.882+08:00使用LINE Bot搭配OpenAI API建立出新一代的AI機器人<p>ChatGPT的出現,是對談機器人一個明顯的分水嶺。</p>
<p>你肯定用過許多網路銀行的對談機器人服務,或是類似的其他機器人,然而效果總是讓人覺得差強人意。原因不外乎幾點,過去的對談機器人很明顯無法明白你說的話,這是NLU(natural language understanding)能力的不足。再來,過去的對談機器人大多沒有前後文的概念,也沒有記憶,因此對談起來常常讓你覺得答非所問,牛頭不對馬嘴,整體效果並不理想。</p>
<p>但ChatGPT卻讓人完全沒有這樣的感覺,主要是ChatGPT對於NLU有極強的能力,ChatGPT本身又有前後文記憶,這讓整體對談效果理想非常多。</p>
<p>透過OpenAI API,我們也可以用LINE Bot做一個類似ChatGPT的客服機器人,這一篇,就step by step來跟您介紹,如何實現一個ChatGPT能力加持的LINE Bot。</p>
<h3 id="建立line-webhook">建立LINE WebHook</h3>
<p>建立LINE Bot的方式過去我們在Blog有介紹很多次了,我們這邊就不再贅述。<br>
我們在建立好LINE Bot之後,可以建立一個WebHook的開發專案(使用 C#與 .net core):</p>
<pre><code>md folder
cd folder
# 建立 Web API 專案
dotnet new webapi -f net5.0
# 安裝套件
dotnet add package linebotsdk
# 安裝程式碼範本
dotnet new --install isRock.Template.LineWebHook
dotnet new linewebhook
# 開啟VS Code ( OR vs2019/vs2022)
code .
</code></pre>
<p>上面這段CLI指令會建立出一個 .net core 的 webapi 專案,建立好後透過 VS Code 開啟,並且修改 LineBotChatGPTWebHookController.cs 中的 Admin User ID 與 Channel Access Token:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/25-115806-f231007d-e756-49bf-9301-c5ec0153d532.png" alt="圖片" width="700"><br>
這個動作是讓 WebHook 可以控制你的LINE Bot來<code>接收</code>與<code>發送</code>訊息。</p>
<p>接著看同一支程式碼中的 117 行,由於我們要呼叫 OpenAI 的 ChatCompletion API,因此我們把程式碼中的 117 行從 <code>CallAzureOpenAIChatAPI</code> 換成 <code>CallOpenAIChatAPI</code> (這個範例同時支援OpenAI與AzureOpenAI),並且填入 OpenAI API Key:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/25-120324-49b4ff87-6588-41a4-81ff-98ea01abda1d.png" alt="圖片" width="700"></p>
<p>這樣就大功告成了。</p>
<p>由於這是一隻 WebHook,如果你需要測試,建議你使用 NGROK 之類的工具,讓 localhost 運行的 .net core 程式碼可以具有一個公開的endpoint,再把這個 endpoint 在LINE Bot的後台設定好,即可運行。例如:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/25-121329-813536df-6656-4031-972f-31a2eb755e51.png" alt="圖片" width="700"></p>
<p>別忘了,若要用NGROK進行測試,建議你同時修改 Startup.cs 的第 47行:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/25-120858-dc889a1a-04de-4b85-933d-cf8c059552bb.png" alt="圖片" width="700"></p>
<p>避免運行的時候強制走HTTPS模式,這會讓NGROK失效。</p>
<p>最後,執行的結果如下,由於我們在程式碼中給的 prompt 是讓它作為一個客服機器人,因此你會發現它很盡責的在回答各種問題:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/25-121606-8f16b8ea-c3bc-439c-af9c-59f4377b6a0f.png" alt="圖片" width="300"></p>
<p>透過ChatGPT(OpenAI API)加持,隨便做的 ChatBot 都比去年同期的 ChatBot效果硬是高了幾個檔次,不管是對談聊天或是問題回覆,都讓人心曠神怡。</p>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-8207887536924464932023-12-23T13:06:00.001+08:002024-02-11T16:56:49.948+08:00如何申請 OpenAI API 金鑰:Step By Step<h4 id="引言">引言</h4>
<p>在當今由AI驅動的世界中,讓你的應用程式能夠連接先進的人工智能技術,是許多開發者和企業的重要需求。提供ChatGPT 服務的 OpenAI ,提供了一系列強大的 API,包括著名的 GPT 模型,它們可以幫助開發人員在各種應用中實現自然語言處理(NLP)。要使用這些 API,首先需要申請一個 API 金鑰。</p>
<p>以下是申請過程的逐步指南。</p>
<h4 id="步驟-1:進入-openai-網站">步驟 1:進入 OpenAI 網站</h4>
<p>首先,前往 <a href="https://platform.openai.com/">OpenAI 開發人員官方網站</a>。在網站的右上角,您會找到“註冊”或“登錄”選項。如果您還沒有 OpenAI 賬戶,您需要先註冊一個。<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/18-225441-2ab0ffb7-4568-49c6-a869-a8878023ecb2.png" alt="圖片" width="600"></p>
<h4 id="步驟-2:登入賬戶">步驟 2:登入賬戶</h4>
<p>建議採用 Google 帳號以SSO方式進行登入:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/18-230048-08722d0a-9563-4fb1-9f10-cb404f850366.png" alt="圖片"></p>
<p>登入後,即可前往 <a href="https://platform.openai.com/account/billing/overview">https://platform.openai.com/account/billing/overview</a> 網址,並且設定付款方式:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/18-225640-ffcdfa65-9c90-419e-85d8-e1e4ca492df9.png" alt="圖片" width="600"></p>
<h4 id="步驟-3:申請-api-金鑰">步驟 3:申請 API 金鑰</h4>
<p>登入完成付款方式後,即可前往 <a href="https://platform.openai.com/api-keys">https://platform.openai.com/api-keys</a> 網址,建立新的 API 金鑰:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/18-225816-9c76c9ab-7926-474b-9ccf-8ea9a1a819e4.png" alt="圖片" width="600"></p>
<p>建立好金鑰後,即可開始使用 OpenAI 的 API囉。</p>
<p>不妨,先從<a href="https://studyhost.blogspot.com/2023/12/openai-completions-api.html">文件生成</a>和<a href="https://studyhost.blogspot.com/2023/11/dall-e3.html">圖像生成</a>開始?</p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0tag:blogger.com,1999:blog-4291069679343025964.post-4533466512445001522023-12-23T13:05:00.003+08:002024-03-17T22:04:24.428+08:00善用 OpenAI 的 Completions API<p><img src="https://arock.blob.core.windows.net/blogdata202312/18-211102-f7848cee-a408-4af7-a806-ea88927162fb.png" alt="圖片" width="700"></p>
<p>OpenAI 的 Completions API 雖然已經是屬於legacy的API,但其實一直以來它都是一個挺方便的文字生成工具。</p>
<p>這個 API 提供了對 GPT-3 和最新的 GPT-4 模型的存取,允許用戶輕鬆創建自然語言應用。無論是文章<code>自動生成</code>、<code>語言翻譯</code>還是<code>情緒分析</code>,Completions API 都是相當便捷好用的API。</p>
<p>要使用 OpenAI Completions API,開發人員可透過 POST 方法與 API 互動。在 Request 的 Header 中,應包含 <code>Authorization</code> 字段,其值為 <code>Bearer [你的API金鑰]</code>,以認證API的使用者身份。 (<a href="https://studyhost.blogspot.com/2023/12/openai-api-step-by-step.html">金鑰申請方式</a>)</p>
<p>Request 的 Body 則需包含數個參數,主要是 <code>model</code>(指定使用的 GPT 模型),<code>prompt</code>(輸入給模型的提示文本),以及 <code>max_tokens</code>(指定生成文本的最大長度)等。透過指定這些參數,開發者可精確控制生成出的文字,例如:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/17-225648-3d545347-7de3-4948-a40b-bbe5cc64a8f4.png" alt="圖片" width="700"></p>
<p>你會發現,當使用 OpenAI Completions API 的 POST 請求時,Body 部分的撰寫相當重要。這部分的內容指導了 AI 模型如何回應需求。其中,<code>prompt</code> 屬性是控制AI Model生成文字的起點,而 <code>max_tokens</code> 則指定生成內容的最大長度。其他可用的參數包括 <code>temperature</code>(控制回應的創造性),<code>top_p</code>(影響回應的多樣性),以及 <code>frequency_penalty</code> 和 <code>presence_penalty</code>(用於調節特定詞語的重複出現)。合理的設定這些細節,能夠讓開發者有效地定制模型的回應,以符合其特定應用場景的需求。</p>
<p>我們再透過一個例子來看 Completions API的另一種用法。假設我們想要生成一段關於人工智能未來趨勢的文字,我們的 POST 請求的 JSON Body 可以如下:</p>
<pre class=" language-json"><code class="prism language-json"><span class="token punctuation">{</span>
<span class="token string">"model"</span><span class="token punctuation">:</span> <span class="token string">"gpt-3.5-turbo-instruct"</span><span class="token punctuation">,</span>
<span class="token string">"prompt"</span><span class="token punctuation">:</span> <span class="token string">"描述未來五年內人工智能的發展趨勢"</span><span class="token punctuation">,</span>
<span class="token string">"max_tokens"</span><span class="token punctuation">:</span> <span class="token number">1450</span><span class="token punctuation">,</span>
<span class="token string">"temperature"</span><span class="token punctuation">:</span> <span class="token number">0.7</span><span class="token punctuation">,</span>
<span class="token string">"top_p"</span><span class="token punctuation">:</span> <span class="token number">1</span><span class="token punctuation">,</span>
<span class="token string">"frequency_penalty"</span><span class="token punctuation">:</span> <span class="token number">0.5</span><span class="token punctuation">,</span>
<span class="token string">"presence_penalty"</span><span class="token punctuation">:</span> <span class="token number">0</span>
<span class="token punctuation">}</span>
</code></pre>
<p>回應的結果是:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/17-230201-29cecc78-4f04-4bea-b1c9-c1cf9b19d0e0.png" alt="圖片" width="700"></p>
<p>在這個例子中,我們使用了 <code>gpt-3.5-turbo-instruct</code> 模型,並給出了具體的提示問題。我們設定 <code>max_tokens</code> 為 1450,以限制回應的長度。<code>temperature</code> 設為 0.7,這提供了合適的創造性平衡。此外,我們使用了 <code>top_p</code>、<code>frequency_penalty</code> 和 <code>presence_penalty</code> 來進一步細化回應的風格和內容。透過這樣的設定,API 將生成一段既信息豐富又創造性的文本,符合我們的需求。</p>
<p>使用上述例子,我們可以說明 GPT-3(及類似的 AI 模型)為何被稱為“文字接龍大師”。當我們給出一個具體的提示,GPT 能夠接續這一思路,生成一段連貫、有內容的文字。</p>
<h4 id="翻譯-與-情緒判斷">翻譯 與 情緒判斷</h4>
<p>除了生成連貫的文本外,OpenAI 的 Completions API 還可以用於進行情感識別和翻譯等任務。例如,我們可以將 API 配置為分析一段文本的情緒,識別出其是正面、負面還是中立,例如:</p>
<pre><code>{
"model": "gpt-3.5-turbo-instruct",
"prompt": "這段文本的情緒是什麼?'叫你老闆出來!' ",
"max_tokens": 60
}
</code></pre>
<p><img src="https://arock.blob.core.windows.net/blogdata202312/17-231324-fe550b3b-46ca-4fc0-a595-a2cc79f4a6e7.png" alt="圖片" width="700"></p>
<p>同樣地,API 也可以用於將一段文本從一種語言翻譯成另一種語言,這在全球化的溝通中尤為重要。例如:</p>
<pre><code>{
"model": "gpt-3.5-turbo-instruct",
"prompt": "將以下英文翻譯成中文: 'Artificial Intelligence is transforming the world.'",
"max_tokens": 60
}
</code></pre>
<p>結果如下:<br>
<img src="https://arock.blob.core.windows.net/blogdata202312/17-230703-d580b5c7-ca1e-4ff0-9998-d34124ec517e.png" alt="圖片" width="700"></p>
<p>這些多樣化的功能呈現出了 GPT 模型在自然語言處理領域的強大應用潛力。而透過 Completions API 的使用,開發人員可以方便地接入 GPT 模型的強大能力,進行文章生成、翻譯、情感分析等多種自然語言處理任務。這不僅能夠提高用戶的工作效率,也為各種應用增添了創新的可能性。這些進展再次證明了 GPT 模型在理解和生成人類語言方面的先進性和靈活性。</p>
<hr>
<p>相關課程:<br>
<a href="https://www.studyhost.tw/NewCourses/LineBot">https://www.studyhost.tw/NewCourses/LineBot</a></p>
DDhttp://www.blogger.com/profile/06691818343389399722noreply@blogger.com0