OpenAI API 代码补全

2023-03-16 17:46 更新

介绍

Codex 模型系列是我们的 GPT-3 系列的后代,该系列已经过自然语言和数十亿行代码的训练。它最擅长 Python,精通 JavaScript、Go、Perl、PHP、Ruby、Swift、TypeScript、SQL,甚至 Shell 等十几种语言。在最初的有限测试期间,Codex 使用是免费的。

您可以将 Codex 用于各种任务,包括:

  • 将注释变成代码

  • 在上下文中完成你的下一行或函数

  • 为您带来知识,例如为应用程序查找有用的库或 API 调用

  • 添加评论

  • 重写代码以提高效率

快速开始

要自己开始使用 Codex,请尝试在 Playground 中打开这些示例。

说 "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 设计的提示。

最佳实践

从注释、数据或代码开始。您可以在我们的 playground 中尝试使用其中一种 Codex 模型(需要时将样式说明作为注释。)

为了让 Codex 创建有用的完成,考虑程序员执行任务需要哪些信息会很有帮助。这可能只是一个清晰的注释或编写有用函数所需的数据,例如变量名称或函数处理的类。

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

在此示例中,我们告诉 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 by Adele

当您向 Codex 显示数据库架构时,它能够对如何格式化查询做出有根据的猜测。

指定语言。 Codex 了解数十种不同的编程语言。许多人对注释、函数和其他编程语法有着相似的约定。通过在注释中指定语言和版本,Codex 能够更好地完成您想要的内容。也就是说,Codex 在风格和语法方面相当灵活。

# 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 清楚地知道我们想要它做什么。

# Create a function to count to 100

def counter

如果我们开始编写函数,Codex 将了解下一步需要做什么。

指定库将帮助 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":

较低的 temperature 可提供更精确的结果。在大多数情况下,将 API temperature 设置为 0 或接近于零(例如 0.1 或 0.2)往往会产生更好的结果。与 GPT-3 不同,更高的 temperature 可以提供有用的创造性和随机结果,Codex 的更高 temperature 可能会给你真正随机或不稳定的响应。

如果您需要 Codex 提供不同的潜在结果,请从零开始,然后向上递增 0.1,直到找到合适的变化。

将任务组织成功能。我们可以通过在注释中尽可能准确地指定函数应该做什么来让 Codex 编写函数。通过编写以下注释,Codex 创建了一个 Javascript 计时器函数,该函数在用户按下按钮时触发:

一个简单的 JavaScript 定时器

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

我们可以使用 Codex 与众所周知的库一起执行常见任务,例如使用 Stripe API 创建客户:

在 Python 中创建 Stripe 客户

# Create a Stripe customer from an email address

创建示例数据。测试应用程序通常需要使用示例数据。因为 Codgen 是一种理解如何理解和编写自然语言的语言模型,所以您可以要求 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 查询可能需要数十秒才能完成。要构建需要较低延迟的应用程序,例如执行自动完成的编码助手,请考虑使用流式处理。在模型完成生成整个完成之前将返回响应。仅需要部分完成的应用程序可以通过以编程方式或使用创造性的停止值来切断完成来减少延迟。

用户可以通过从 API 请求多个解决方案并使用返回的第一个响应,将流式处理与复制结合起来以减少延迟。通过设置 n > 1 来做到这一点。这种方法消耗更多的令牌配额,因此请谨慎使用(例如,通过对 max_tokens 和 stop 使用合理的设置)。

使用 Codex 来解释代码。 Codex 创建和理解代码的能力使我们能够使用它来执行任务,例如解释文件中代码的作用。实现此目的的一种方法是在以“This function”或“This application is”开头的函数之后添加注释。食典委通常将此解释为解释的开始并完成文本的其余部分。

/* 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 对错误的检查不应取代用户的仔细审查。)

/* 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 by Adele

语言之间的转换。您可以让 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:

插入代码

完成端点还支持通过提供除前缀提示之外的后缀提示来在代码中插入代码。这可用于在函数或文件中间插入补全。

def get_largest_prime_factor(n):
    if n < 2:
        return False
    def is_prime(n): >  for i in range(2, n): >  if n % i == 0: >  return False >  return True >     largest = 1
    for j in range(2, n + 1):
        if n % j == 0 and is_prime(j):
    return largest

通过为模型提供额外的上下文,它可以更加可控。然而,这对模型来说是一个更具约束性和挑战性的任务。

Best practices

插入代码是测试版中的一项新功能,您可能需要修改使用 API 的方式以获得更好的结果。以下是一些最佳实践:

使用 max_tokens > 256。该模型更擅长插入更长的补全。如果 max_tokens 太小,模型可能会在连接到后缀之前被切断。请注意,即使使用更大的 max_tokens,您也只会根据生成的代币数量付费。

更喜欢 finish_reason == “stop”。当模型到达自然停止点或用户提供的停止序列时,它会将 finish_reason 设置为“停止”。这表明该模型已设法很好地连接到后缀,并且是完成质量的良好信号。这对于在使用 n > 1 或重采样时在几个完成之间进行选择尤其相关(请参阅下一点)。

重新采样 3-5 次。虽然几乎所有补全都连接到前缀,但在更困难的情况下,模型可能难以连接后缀。我们发现,在这种情况下,重采样 3 次或 5 次(或使用 k=3,5 的 best_of)并选择带有“stop”作为其 finish_reason 的样本可能是一种有效的方法。重采样时,您通常需要更高的温度来增加多样性。

注意:如果所有返回的样本都有 finish_reason == "length",很可能是 max_tokens 太小,模型在设法自然地连接提示和后缀之前用完了标记。考虑在重采样之前增加 max_tokens。

编辑代码

edits 端点可用于编辑代码,而不仅仅是完成它。您提供一些代码和如何修改它的说明,code-davinci-edit-001 模型将尝试相应地对其进行编辑。这是重构和调整代码的自然界面。在此初始测试期间,编辑端点的使用是免费的。

示例

迭代构建程序

编写代码通常是一个迭代过程,需要一路完善文本。编辑自然而然地不断完善模型的输出,直到最终结果得到完善。在此示例中,我们使用斐波那契作为如何迭代构建代码的示例。

写一个函数


重构它


重命名函数


添加文档


最佳实践

edits 端点仍处于 alpha 阶段,我们建议遵循这些最佳实践。

  1. 考虑使用空提示!在这种情况下,编辑可以类似于完成使用。

  2. 说明尽可能具体。

  3. 有时,模型无法找到解决方案并会导致错误。我们建议改写您的说明或输入。


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号