GitHub Copilot 作為 AI 程式碼輔助工具,能有效提升開發效率。其 @workspace 指令能根據專案程式碼函式庫提供更精確的程式碼建議,例如在驗證客戶電子郵件地址時,Copilot 能參考專案中的驗證函式生成對應程式碼,避免手動編寫重複程式碼。此外,@vscode 和 @terminal 指令則方便開發者快速查詢 VS Code 操作方法和終端機指令。軟體代理程式則代表開發者執行任務,自動化流程並做出決策。簡單代理程式根據預先定義的規則運作,而結合 AI 的代理程式則能處理更複雜的任務,例如理解自然語言並從互動中學習。大語言模型(LLM)賦予代理程式更自然的表達能力,並透過工具呼叫機制擴充套件其功能,例如查詢天氣、預訂服務等。然而,LLM 仍需克服「幻覺」回應的挑戰,並在高階對話管理中需要更完善的上下文和狀態追蹤機制。
使用 GitHub Copilot 提升開發效率
瞭解 Copilot 的進階功能
本章節將探討 GitHub Copilot 的進階功能,包括如何使用 @workspace、@vscode 和 @terminal 指令來提升開發效率。
使用 @workspace 指令最佳化程式碼
在開發過程中,我們經常需要確保程式碼能夠正確地驗證客戶端傳送的資料。例如,在建立一個客戶管理 API 時,我們需要驗證客戶的電子郵件地址是否正確。讓我們看看如何使用 @workspace 指令來最佳化這段程式碼。
首先,我們有一個 app.py 檔案,其中包含了一個使用 Flask 建立的 API:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/customers', methods=['GET'])
def get_customers():
return jsonify({'customers': ['item1', 'item2', 'item3']})
# TODO, create a POST route for customers. It should validate the request body, and ensure it has a valid email address.
if __name__ == '__main__':
app.run(debug=True)
內容解密:
- 上述程式碼建立了一個基本的 Flask API,包含一個 GET 路由來取得客戶列表。
- TODO 註解指示我們需要建立一個 POST 路由來新增客戶,並且驗證請求中的電子郵件地址。
當我們使用 Copilot 生成 POST 路由的程式碼時,初始結果可能無法滿足需求:
@app.route('/customers', methods=['POST'])
def post_customers():
return jsonify({'message': 'success'})
內容解密:
- 這段程式碼僅傳回了一個成功訊息,但沒有進行任何驗證。
為了最佳化這段程式碼,我們可以使用 @workspace 指令,告訴 Copilot 考慮整個工作區的檔案:
@workspace improve selected code to validate request body to ensure it contains a valid email address, use primarily functionality from other files in the workspace to solve the problem.
Copilot 將根據 utils.py 檔案中的 validate_email 函式生成最佳化後的程式碼:
from flask import request
from utils import validate_email
@app.route('/customers', methods=['POST'])
def post_customers():
data = request.get_json()
if 'email' not in data:
return jsonify({'message': 'No email provided'}), 400
email = data['email']
if not validate_email(email):
return jsonify({'message': 'Invalid email format'}), 400
return jsonify({'message': 'success'})
內容解密:
- 這段程式碼從請求中取得 JSON 資料,並檢查是否包含
email欄位。 - 使用
validate_email函式驗證電子郵件地址的有效性。 - 如果驗證失敗,傳回錯誤訊息和對應的 HTTP 狀態碼。
使用 @vscode 和 @terminal 指令
除了 @workspace 指令外,Copilot 還提供了 @vscode 和 @terminal 指令,分別用於查詢 Visual Studio Code 的操作方法和終端機指令。
例如,使用 @vscode 指令查詢如何在 Visual Studio Code 中開啟終端機視窗:
@vscode How do I open a terminal window?
Copilot 將提供詳細的操作步驟和相關資訊。
同樣地,使用 @terminal 指令查詢如何在 Git 中建立一個名為 upstream 的遠端倉函式庫:
@terminal show me how to create a remote called upstream in Git that points to a remote repo.
Copilot 將提供相關的 Git 指令和詳細說明:
git remote add upstream {remote_repo_url}
內容解密:
- 這條指令用於在 Git 中新增一個名為
upstream的遠端倉函式庫。 - 需要將
{remote_repo_url}替換為實際的遠端倉函式庫 URL。
軟體開發中的代理程式(Agents)
簡介
本章將介紹軟體開發中的代理程式(Agents)概念。我們將探討代理程式的定義、工作原理,以及如何在專案中使用它們。同時,也會介紹一些流行的代理程式框架以及如何開始使用它們。
代理程式可以解決的問題
代理程式的主要理念是擁有一個能夠代表你行事的程式。例如,自動化任務、做出決策,以及與其他代理程式和人類互動。這些程式可以為你節省時間,使你的生活更加便捷,或讓你的業務更有效率。
在本章中,我們將:
- 介紹軟體開發中的代理程式概念
- 解釋代理程式的定義和工作原理
- 討論不同型別的代理程式及其應用
什麼是代理程式?
如前所述,代理程式是能夠代表你行事的程式。它們可以執行任務、做出決策,並與其他代理程式和人類互動。代理程式可以應用於廣泛的領域。
以下幾點使程式成為代理程式,而非一般的程式:
- 明確的目標:例如,恆溫器保持溫度在25度並採取適當的行動來維持該溫度,或者金融代理程式試圖最大化你的利潤。
- 自主性:代理程式會做出必要的決策,以確保達到預先定義的目標。對於金融代理程式來說,這可能意味著在滿足特定觸發條件時買賣股票。
- 感測器:感測器可以是物理的,也可以是軟體中的API,使代理程式能夠瞭解「世界是什麼樣子」。對於恆溫器來說,感測器是溫度指示器,而對於金融代理程式來說,感測器可以是朝向股票市場的API,使代理程式能夠根據目標做出決策。
代理程式如何運作?
代理程式透過接收輸入、處理輸入並產生輸出來運作。它們可以被程式設計來執行特定的任務、做出決策,並與其他代理程式和人類互動。代理程式也可以從互動中學習並隨著時間的推移提高其效能。
簡單代理程式與使用AI的代理程式
代理程式並不是新事物,它們已經存在很長時間了。新的發展是,現在的代理程式正被AI所驅動。讓我們來比較一下兩者:
- 簡單代理程式:傳統的代理程式被程式設計來執行特定的任務,並根據預先定義的規則和邏輯做出決策。
- 使用AI的代理程式:由AI驅動的代理程式可以執行更複雜的任務,並做出更聰明的決策。它們可以理解自然語言,從互動中學習,並隨著時間的推移提高其效能。
簡單代理程式
簡單代理程式,如前所述,是有限的,因為它們是為特定的任務而設計的。與它們的互動通常也是有限的——你可以使用關鍵字,或者你表達自己的方式是有限的。
簡單代理程式的一個例子是聊天機器人。這類別聊天機器人被程式設計為理解有限的一組關鍵字和短語。例如,「告訴我更多關於你的產品」或「你的退貨政策是什麼?」。任何超出這些關鍵字和短語的對話嘗試都會導致聊天機器人無法理解使用者。
簡單代理程式不是很好的對話者
當你與人類對話時,你期望他們對幾個話題有深入的瞭解,並且至少能夠談論其他話題。對於簡單代理程式來說,我們可能會遇到以下的對話:
- 使用者:「告訴我關於你的產品。」
- 代理程式:「我們有廣泛的產品,包括電子產品、服裝和配件。請表明您的興趣。」
- 使用者:「我對服裝感興趣,適合目前的天氣。」
- 代理程式:「我可以提供服裝建議,但我不知道目前的天氣。」
我們可以觀察到兩個有趣的事情:
- 對話感覺很短,重要的資訊要麼在句子的末尾,要麼就在逗號前面,這表明使用了較簡單的解析方式來提取重要的資訊。
- 它無法處理非產品資訊,如天氣,這可能有助於過濾回應。
藉助工具呼叫和大語言模型(LLMs)改善對話
大語言模型(LLM)是一種改進,因為它擅長以更自然的方式表達,同時也能從流暢的文字中解析和識別意圖。你還可以透過某種稱為工具呼叫的功能為LLM提供額外的知識,在這種功能中,你告訴LLM關於各種功能的資訊,如服裝API、天氣API等,這些功能可以更好地處理對話,使其類別似於與人類的對話。讓我們以同樣的對話為例,使用LLM並強調其差異:
- 使用者:「你們有什麼產品?」
- 代理程式:「我們有廣泛的產品,包括電子產品、服裝和配件。」
- 使用者:「很好,我對服裝感興趣,適合目前的天氣。你能推薦些什麼嗎?」
- 代理程式:「你能告訴我你的位置,以便我能更好地為你提供服裝建議嗎?」
- 使用者:「當然,我在亞利桑那州鳳凰城。」
- 代理程式:「我看到鳳凰城目前的溫度是90華氏度。我可以建議這些短褲嗎?」
這次對話之所以進行得更好,是因為這個LLM透過工具呼叫,以更自然的方式表達自己。它呼叫了具有鳳凰城作為輸入的天氣API,然後以天氣回應作為過濾器呼叫了服裝API。
對話式代理程式的結構
對話式代理程式通常由以下元件組成:
- 輸入:通常以自然語言的形式輸入到代理程式。應該說,這可以是許多不同的口語,而不僅僅是你在過去必須硬編碼的英語。
- 處理:通常使用自然語言處理(NLP)技術對輸入進行處理。
內容解密:
- 輸入元件 的設計需要能夠接受多種語言輸入,這使得對話式代理程式更加靈活和使用者友好。
- 處理元件 使用NLP技術,能夠理解和解析使用者輸入的自然語言,從而作出適當的回應或執行相應的操作。
軟體開發中的代理(Agents)技術深度解析
代理技術的核心運作機制
代理技術在軟體開發中的應用日益廣泛,尤其是在結合大語言模型(LLM)的情況下,能夠顯著提升系統的互動能力和智慧化水平。代理的核心運作流程包括輸入處理、任務委派、結果輸出等關鍵步驟,形成一個持續執行的迴圈。
對話式代理的處理流程
對話式代理的工作原理如圖21.2所示,呈現了一個從輸入到處理,再到委派任務並輸出的迴圈過程。這種迴圈並非單純的重複,而是體現了代理持續運作的特性——它始終處於待命狀態,等待使用者輸入並作出相應反應。
增強LLM能力的工具呼叫機制
大語言模型(LLM)只能根據其訓練資料進行回應,對於未經訓練的領域可能會產生錯誤的「幻覺」回應。為瞭解決這一問題,可以透過提供外部工具來擴充套件LLM的能力。工具呼叫的過程涉及兩個關鍵組成部分:
- JSON格式的函式描述
- 函式功能說明
工具呼叫的實踐案例
以取得當前天氣資訊的函式為例,透過提供JSON格式的函式規範,可以讓LLM學會根據使用者的輸入語義判斷是否呼叫該函式。例如,使用者可能輸入以下不同的陳述式:
- 「今天鹽湖城的天氣怎麼樣?」
- 「舊金山的溫度是多少?」
- 「明天紐約會下雨嗎?」
- 「倫敦的天氣如何?」
- 「外面很暖和嗎?」
LLM能夠理解這些陳述式背後共同的意圖——查詢天氣狀況,並提取出必要的引數,如地點和溫度單位。
使用工具擴充套件GPT功能
要實作上述功能,需要按照GPT模型可理解的JSON格式提供函式規範。這個規範包含了函式名稱、描述、引數及其型別等資訊。以get_current_weather函式為例,其JSON規範如下:
{
"type": "function",
"function": {
"name": "get_current_weather",
"description": "取得當前天氣",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和州,例如:舊金山,加利福尼亞州"
},
"format": {
"type": "string",
"enum": ["攝氏", "華氏"],
"description": "使用的溫度單位,可根據使用者位置推斷"
}
},
"required": ["location", "format"]
}
}
}
程式碼實作與解析
以下是連線GPT模型並呼叫get_current_weather函式的範例程式碼:
import openai
import requests
def get_current_weather(location, format):
# 呼叫天氣API
response = requests.get(f"https://api.weather.com/v3/wx/forecast/daily/5day?location={location}&format={format}")
return response.json()
# 定義工具函式規範
tool = {
"type": "function",
"function": {
"name": "get_current_weather",
"description": "取得當前天氣",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "城市和州,例如:舊金山,加利福尼亞州"
},
"format": {
"type": "string",
"enum": ["攝氏", "華氏"],
"description": "使用的溫度單位,可根據使用者位置推斷"
}
},
"required": ["location", "format"]
}
}
}
# 呼叫GPT模型
prompt = "今天鹽湖城的天氣怎麼樣?"
response = openai.Completion.create(
model="text-davinci-003",
prompt=prompt,
max_tokens=150,
tools=[tool]
)
# 解析回應並呼叫函式
function_response = response.choices[0].function_response
location = function_response.parameters.location
format = function_response.parameters.format
weather = get_current_weather(location, format)
內容解密:
- 程式邏輯:程式碼首先定義了一個
get_current_weather函式,用於呼叫天氣API取得指定地點的天氣資訊。 - 技術原理:GPT模型根據提供的JSON函式規範,可以理解使用者輸入的語義並提取必要引數,決定是否呼叫指定的函式。
- 引數解析:從GPT模型的回應中解析出函式名稱和引數值,然後呼叫相應的函式取得結果。
- 實務應用:這種機制可以擴充套件到更複雜的任務,如預訂機票、酒店、租車和餐廳等。
高階對話管理
當對話變得更加複雜時,僅僅增加函式是不夠的。GPT模型需要記住對話的上下文和狀態,才能有效地管理高階對話。這需要更精細的對話管理和狀態追蹤機制,以確保對話的連貫性和準確性。
未來發展趨勢
隨著代理技術和LLM能力的持續進步,我們可以預見更智慧、更靈活的對話式系統將不斷湧現,為軟體開發帶來更多創新可能性。開發者需要深入理解這些技術的工作原理,才能更好地設計和實作符合使用者需求的高階對話系統。