共用方式為


Codex 模型和 Azure OpenAI 服務

重要

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

Codex 模型系列是 GPT-3 系列的子系,已針對自然語言和數十億行程式碼進行定型。 此模型在 Python 中最能發揮功能,且熟悉數十種語言,包括 C#、JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL,甚至 Shell。

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

  • 將註解轉換成程式碼
  • 在內容中完成下一行或函式
  • 為您帶來知識,例如尋找實用程式庫或適用於應用程式的 API 呼叫
  • 新增留言
  • 重寫程式碼以提升效率

如何搭配程式碼使用完成模型

以下是一些使用 Codex 的範例,可在 Azure OpenAI Studio 的遊樂場中進行測試,其中部署了 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 建立網頁,將初始程式碼行放置在 HTML 文件 (<!DOCTYPE html>) 中您的註解之後,即告知 Codex 接下來應該執行的動作。 相同的方法適用於從註解建立函式 (在具有以 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 來執行此操作。 這種方法會耗用更多權杖配額,因此請謹慎使用 (例如透過針對 max_tokensstop 使用合理設定)。

使用 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:

下一步

深入了解驅動 Azure OpenAI 的基礎模型