Codex 模型和 Azure OpenAI 服務

注意

本文已針對舊版程式代碼產生模型撰寫及測試。 這些模型會使用完成 API 及其互動提示/完成樣式。 如果您想要測試本文中所述的技術,建議您使用 gpt-35-turbo-instruct 允許存取完成 API 的模型。 不過,若要產生程式代碼,聊天完成 API 和最新的 GPT-4 模型通常會產生最佳結果,但提示必須轉換成與這些模型互動的特定交談樣式。

Codex 模型系列是 GPT-3 系列的子系,已以自然語言和數十億行程式代碼進行定型。 它最有能力在 Python 中,並精通十幾個語言,包括 C#、JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL,甚至 Shell。

您可以將 Codex 用於各種工作,包括:

  • 將批註轉換成程序代碼
  • 在內容中完成下一行或函式
  • 為您帶來知識,例如尋找有用的連結庫或應用程式 API 呼叫
  • 新增留言
  • 重寫程式代碼以提高效率

如何使用 Codex 模型

以下是一些使用 Codex 的範例,可在 Azure OpenAI Studio 的遊樂場中測試 Codex,以及部署 Codex 系列模型,例如 code-davinci-002

說 “Hello” (Python)

"""
Ask the user for their name and say "Hello"
"""

建立隨機名稱 (Python)

"""
1. Create a list of first names
2. Create a list of last names
3. Combine them randomly into a list of 100 full names
"""

建立 MySQL 查詢 (Python)

"""
Table customers, columns = [CustomerId, FirstName, LastName, Company, Address, City, State, Country, PostalCode, Phone, Fax, Email, SupportRepId]
Create a MySQL query for all customers in Texas named Jane
"""
query =

說明程式代碼 (JavaScript)

// Function 1
var fullNames = [];
for (var i = 0; i < 50; i++) {
  fullNames.push(names[Math.floor(Math.random() * names.length)]
    + " " + lastNames[Math.floor(Math.random() * lastNames.length)]);
}

// What does Function 1 do?

最佳作法

從批注、數據或程式代碼開始

您可以在我們的遊樂場中使用其中一個 Codex 模型進行實驗(視需要將指示樣式為批注。

若要讓 Codex 建立有用的完成,最好考慮程式設計人員需要執行工作的資訊。 這可以是清楚的批註或撰寫實用函式所需的數據,例如變數的名稱或函式所處理的類別。

在此範例中,我們會告訴 Codex 要呼叫什麼函式,以及它要執行的工作。

# Create a function called 'nameImporter' to add a first and last name to the database

這個方法甚至會調整到您可以為 Codex 提供批注和資料庫架構範例的點,以便為各種資料庫撰寫有用的查詢要求。 以下範例提供查詢的數據行和數據表名稱。

# Table albums, columns = [AlbumId, Title, ArtistId]
# Table artists, columns = [ArtistId, Name]
# Table media_types, columns = [MediaTypeId, Name]
# Table playlists, columns = [PlaylistId, Name]
# Table playlist_track, columns = [PlaylistId, TrackId]
# Table tracks, columns = [TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice]

# Create a query for all albums with more than 10 tracks

當您顯示 Codex 資料庫架構時,它能夠做出有關如何格式化查詢的知情猜測。

指定程式設計語言

Codex 了解數十種不同的程式設計語言。 許多人共用類似批注、函式和其他程序設計語法的慣例。 藉由指定語言和批注中的版本,Codex 更能針對您想要的專案提供完成。 話說,Codex 在風格和語法上相當靈活。 以下是 R 和 Python 的範例。

# R language
# Calculate the mean distance between an array of points
# Python 3
# Calculate the mean distance between an array of points

使用您想要執行的動作提示 Codex

如果您想要 Codex 建立網頁,請在批注告訴 Codex 下一步應該執行的動作之後,將初始程式代碼行放在 HTML 檔 (<!DOCTYPE html>) 中。 相同的方法適用於從批注建立函式(遵循以 func 或 def 開頭的新行的批注)。

<!-- Create a web page with the title 'Kat Katman attorney at paw' -->
<!DOCTYPE html>

在批注之後放置 <!DOCTYPE html> ,讓 Codex 非常清楚我們想要它做什麼。

或者,如果我們想要撰寫函式,我們可以如下所示啟動提示,Codex 將瞭解接下來需要執行哪些動作。

# Create a function to count to 100

def counter

指定連結庫可協助 Codex 瞭解您想要的專案

Codex 知道大量的連結庫、API 和模組。 藉由告訴 Codex 要使用哪個程式代碼,無論是從批注還是匯入您的程式代碼,Codex 會根據它們提出建議,而不是替代方式。

<!-- Use A-Frame version 1.2.0 to create a 3D website -->
<!-- https://aframe.io/releases/1.2.0/aframe.min.js -->

藉由指定版本,您可以確定 Codex 使用最新的連結庫。

注意

Codex 可以建議實用的連結庫和 API,但請務必進行自己的研究,以確保應用程式安全。

批注樣式可能會影響程式代碼品質

使用某些語言時,批注樣式可以改善輸出的品質。 例如,使用 Python 時,在某些情況下,使用檔字串(以三引號包裝的批注)可提供比使用磅 (#) 符號更高的質量結果。

"""
Create an array of users and email addresses
"""

函式內的批注可能很有説明

建議的編碼標準通常建議將函式的描述放在函式內。 使用此格式可協助 Codex 更清楚地瞭解您希望函式執行的動作。

def getUserBalance(id):
    """
    Look up the user in the database ‘UserData' and return their current account balance.
    """

提供更精確結果的範例

如果您有特定樣式或格式,則需要 Codex 使用,請在要求的第一個部分中提供範例或示範它,可協助 Codex 更準確地比對您需要的專案。

"""
Create a list of random animals and species
"""
animals  = [ {"name": "Chomper", "species": "Hamster"}, {"name":

較低的溫度可提供更精確的結果

將 API 溫度設定為 0,或接近零(例如 0.1 或 0.2)通常會在大部分情況下提供更好的結果。 不同於 GPT-3 模型,較高的溫度可以提供有用的創意和隨機結果,Codex 模型的較高溫度可能會產生隨機或不穩定的回應。

如果您需要 Codex 提供不同的潛在結果,請從零開始,然後向上遞增 0.1,直到您找到適當的變化為止。

將工作組織成函式

我們可以藉由指定函式在批注中儘可能精確地執行哪些動作,來取得 Codex 來撰寫函式。 例如,藉由撰寫下列批注,Codex 會建立 JavaScript 定時器函式,當使用者按下按鈕時觸發:

簡單的 JavaScript 定時器

// Create a timer that creates an alert in 10 seconds

建立範例數據

測試應用程式通常需要使用範例數據。 由於 Codex 是一種語言模型,可瞭解如何理解及撰寫自然語言,因此您可以要求 Codex 建立數據,例如組成名稱、產品和其他變數的數位。 例如,我們在這裡要求 Codex 建立天氣溫度陣列。

/* Create an array of weather temperatures for San Francisco */

要求 Codex 執行此工作會產生如下的數據表:

var weather = [
  { month: 'January', high: 58, low: 48 },
  { month: 'February', high: 61, low: 50 },
  { month: 'March', high: 64, low: 53 },
  { month: 'April', high: 67, low: 55 },
  { month: 'May', high: 70, low: 58 },
  { month: 'June', high: 73, low: 61 },
  { month: 'July', high: 76, low: 63 },
  { month: 'August', high: 77, low: 64 },
  { month: 'September', high: 76, low: 63 },
  { month: 'October', high: 73, low: 61 },
  { month: 'November', high: 68, low: 57 },
  { month: 'December', high: 64, low: 54 }
];

複合函式和小型應用程式

我們可以為 Codex 提供包含複雜要求的批注,例如建立隨機名稱產生器,或使用使用者輸入執行工作,而且 Codex 可以提供足夠的令牌來產生其餘專案。

/*
Create a list of animals
Create a list of cities
Use the lists to generate stories about what I saw at the zoo in each city
*/

限制完成大小,以取得更精確的結果或較低的延遲

在 Codex 中要求較長的完成可能會導致不精確答案和重複。 藉由減少max_tokens和設定停止令牌來限制查詢的大小。 例如,新增 \n 為停止序列,以將完成限制為一行程序代碼。 較小的完成也會產生較少的延遲。

使用串流以減少延遲

大型 Codex 查詢可能需要數十秒的時間才能完成。 若要建置需要較低延遲的應用程式,例如執行自動完成的程式代碼助理,請考慮使用串流。 在模型完成產生整個完成之前,會傳回回應。 只需要完成一部分的應用程式,可以透過程序設計方式或針對 使用創意值 stop來切斷完成,以減少延遲。

用戶可以結合串流與重複,藉由從 API 要求多個解決方案,以及使用傳回的第一個回應來減少延遲。 藉由設定 n > 1來執行此動作。 此方法會耗用更多令牌配額,因此請小心使用 (例如,使用 和stopmax_tokens合理設定)。

使用 Codex 來說明程序代碼

Codex 建立和瞭解程式代碼的能力可讓我們使用它來執行工作,例如說明檔案中的程序代碼功能。 達成此目的的其中一種方式是在開頭為 “This function” 或 “This application is” 的函式後面加上批注。Codex 通常會將此解譯為說明的開頭,並完成其餘的文字。

/* Explain what the previous function is doing: It

說明 SQL 查詢

在此範例中,我們會使用 Codex,以人類可讀的格式來說明 SQL 查詢的用途。

SELECT DISTINCT department.name
FROM department
JOIN employee ON department.id = employee.department_id
JOIN salary_payments ON employee.id = salary_payments.employee_id
WHERE salary_payments.date BETWEEN '2020-06-01' AND '2020-06-30'
GROUP BY department.name
HAVING COUNT(employee.id) > 10;
-- Explanation of the above query in human readable format
--

撰寫單元測試

只要新增批注「單元測試」並啟動函式,即可在 Python 中完成建立單元測試。

# Python 3
def sum_numbers(a, b):
  return a + b

# Unit test
def

檢查程式代碼是否有錯誤

藉由使用範例,您可以示範 Codex 如何識別程式代碼中的錯誤。 在某些情況下,不需要任何範例,不過示範提供描述的層級和詳細數據可協助 Codex 瞭解要尋找的內容,以及如何解釋。 (Codex 檢查錯誤不應取代使用者的仔細檢閱。

/* Explain why the previous function doesn't work. */

使用源數據寫入資料庫函式

正如人類程式設計人員可以受益於了解資料庫結構和數據行名稱一樣,Codex 可以使用此數據來協助您撰寫精確的查詢要求。 在此範例中,我們會插入資料庫的架構,並告訴 Codex 查詢資料庫的內容。

# Table albums, columns = [AlbumId, Title, ArtistId]
# Table artists, columns = [ArtistId, Name]
# Table media_types, columns = [MediaTypeId, Name]
# Table playlists, columns = [PlaylistId, Name]
# Table playlist_track, columns = [PlaylistId, TrackId]
# Table tracks, columns = [TrackId, Name, AlbumId, MediaTypeId, GenreId, Composer, Milliseconds, Bytes, UnitPrice]

# Create a query for all albums with more than 10 tracks

在語言之間轉換

您可以依照簡單的格式,取得 Codex,以依照簡單格式將程式代碼轉換成另一種語言,其中列出您要在批註中轉換的程式代碼語言,後面接著程式代碼,然後是含有您想要翻譯語言的批註。

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

重寫連結庫或架構的程序代碼

如果您想要 Codex 讓函式更有效率,您可以提供程式碼來重寫,後面接著指示要使用的格式。

// Rewrite this as a React component
var input = document.createElement('input');
input.setAttribute('type', 'text');
document.body.appendChild(input);
var button = document.createElement('button');
button.innerHTML = 'Say Hello';
document.body.appendChild(button);
button.onclick = function() {
  var name = input.value;
  var hello = document.createElement('div');
  hello.innerHTML = 'Hello ' + name;
  document.body.appendChild(hello);
};

// React version:

下一步

深入瞭解 Power Azure OpenAI 的基礎模型。