了解如何生成或操作代码
原文链接:Code completion – OpenAI API
介绍
Codex 模型系列是我们的 GPT-3 系列的后代,该系列经过自然语言和数十亿行代码的训练。它最擅长Python,精通十几种语言,包括JavaScript,Go,Perl,PHP,Ruby,Swift,TypeScript,SQL甚至Shell。在最初的有限测试期内,Codex 使用是免费的。了解更多。
您可以将 Codex 用于各种任务,包括:
- 将注释转换为代码
- 在上下文中完成下一行或函数
- 为您提供知识,例如查找有用的库或应用程序的 API 调用
- 添加注释
- 重写代码以提高效率
要了解 Codex 的实际应用,请查看我们的 Codex JavaScript 沙盒或其他演示视频。
快速入门
要自己开始使用 Codex,请尝试在操场中打开这些示例。
说“Hello”(Python)
1 2 3 |
""" Ask the user for their name and say "Hello" """ |
创建随机名称(Python)
1 2 3 4 5 |
""" 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)
1 2 3 4 5 |
""" 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)
1 2 3 4 5 6 7 8 |
// 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 创建一个有用的补全,考虑程序员执行任务需要哪些信息是有帮助的。这可能只是一个明确的注释或编写有用函数所需的数据,例如变量的名称或函数处理的类。
1 |
# Create a function called 'nameImporter' to add a first and last name to the database |
在这个例子中,我们告诉Codex调用函数什么以及它将执行什么任务。
此方法甚至可以扩展到您可以向 Codex 提供注释和数据库架构示例的程度,以使其为各种数据库编写有用的查询请求。
1 2 3 4 5 6 7 8 |
# 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 在样式和语法方面相当灵活。
1 2 |
# R language # Calculate the mean distance between an array of points |
1 2 |
# Python 3 # Calculate the mean distance between an array of points |
提示 Codex 您希望它执行的操作。如果您希望 Codex 创建网页,请将第一行代码放在 HTML 文档 () 之后,告诉 Codex 下一步应该做什么。相同的方法适用于从注释创建函数(在注释后面加上以 或 开头的新行)。<!DOCTYPE html>
func
def
1 2 |
<!-- Create a web page with the title 'Kat Katman attorney at paw' --> <!DOCTYPE html> |
放在我们的评论之后,可以让Codex非常清楚地知道我们希望它做什么。<!DOCTYPE html>
1 2 3 |
# Create a function to count to 100 def counter |
如果我们开始编写函数,Codex 将了解它下一步需要做什么。
指定库将有助于 Codex 了解您想要什么。Codex 知道大量的库、API 和模块。通过告诉 Codex 使用哪些方法(无论是从注释中还是将它们导入到代码中),Codex 将根据它们而不是替代方案提出建议。
1 2 |
<!-- 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 时,在某些情况下,使用 doc 字符串(用三引号括起来的注释)可以比使用井号 (#) 提供更高质量的结果。
1 2 3 |
""" Create an array of users and email addresses """ |
将注释放在函数中可能会有所帮助。推荐的编码标准通常建议将函数的描述放在函数内部。使用此格式有助于 Codex 更清楚地了解您希望函数执行的操作。
1 2 3 4 |
def getUserBalance(id): """ Look up the user in the database ‘UserData' and return their current account balance. """ |
提供示例以获得更精确的结果。如果您有需要 Codex 使用的特定样式或格式,在请求的第一部分中提供示例或演示将有助于 Codex 更准确地满足您的需求。
1 2 3 4 |
""" Create a list of random animals and species """ animals = [ {"name": "Chomper", "species": "Hamster"}, {"name": |
Lower temperatures,结果越精确。在大多数情况下,将 API 温度设置为 0 或接近零(例如 0.1 或 0.2)往往会提供更好的结果。与 GPT-3 不同,在 GPT-<> 中,较高的温度可以提供有用的创意和随机结果,而 Codex 的较高温度可能会给您带来非常随机或不稳定的响应。
如果需要 Codex 提供不同的潜在结果,请从零开始,然后向上递增 .1,直到找到合适的变体。
将任务组织到函数中。我们可以通过在注释中以尽可能精确的术语指定函数应该做什么来让 Codex 编写函数。通过编写以下注释,Codex 创建了一个 Javascript 计时器函数,该函数在用户按下按钮时触发:
一个简单的JavaScript计时器
1 |
// Create a timer that creates an alert in 10 seconds |
我们可以使用 Codex 对知名库执行常见任务,例如使用 Stripe API 创建客户:
在 Python 中创建 Stripe 客户
1 |
# Create a Stripe customer from an email address |
创建示例数据。测试应用程序通常需要使用示例数据。由于 Codgen 是一种了解如何理解和编写自然语言的语言模型,因此您可以要求 Codex 创建数据,例如由组成的名称、产品和其他变量组成的数组。
1 |
/* Create an array of weather temperatures for San Francisco */ |
请求 Codex 执行此任务将生成如下表:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 可以生成其余部分,前提是有足够的令牌。
1 2 3 4 5 |
/* 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 */ |
限制完成大小以获得更精确的结果或更低的延迟。要求在法典中完成更长的时间可能会导致答案不准确和重复。通过减少和设置令牌来限制查询的大小。例如,添加为序列以将完成限制为一行代码。较小的完成也会产生更少的延迟。max_tokens
stop
\n
stop
使用流式处理来减少延迟。大型 Codex 查询可能需要数十秒才能完成。要构建需要较低延迟的应用程序, 例如执行自动完成的编码助手,请考虑使用流式处理。响应将在模型完成生成整个完成之前返回。只需要部分完成的应用程序可以通过编程方式或使用 的创意值来切断完成,从而减少延迟。stop
用户可以将流式处理与重复相结合,通过从 API 请求多个解决方案并使用返回的第一个响应来减少延迟。通过设置 .此方法会消耗更多的令牌配额,因此请谨慎使用(例如,使用 和 的合理设置)。n > 1
max_tokens
stop
使用Codex解释代码。Codex 创建和理解代码的能力使我们能够使用它来执行任务,例如解释文件中的代码的作用。实现此目的的一种方法是在以“此函数”或“此应用程序是”开头的函数后添加注释。法典通常会将此解释为解释的开始,并完成文本的其余部分。
1 |
/* Explain what the previous function is doing: It |
解释 SQL 查询。在此示例中,我们使用 Codex 以人类可读的格式解释 SQL 查询正在执行的操作。
1 2 3 4 5 6 7 8 9 |
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 中完成,只需添加注释“单元测试”并启动函数即可。
1 2 3 4 5 6 |
# Python 3 def sum_numbers(a, b): return a + b # Unit test def |
检查代码是否存在错误。通过使用示例,您可以向 Codex 展示如何识别代码中的错误。在某些情况下,不需要举例,但是展示提供描述的水平和细节可以帮助法典委员会了解要查找的内容以及如何解释它。(食典委对错误的检查不应取代用户的仔细审查。
1 |
/* Explain why the previous function doesn't work. */ |
使用源数据编写数据库函数。正如人类程序员可以从了解数据库结构和列名中受益一样,Codex 可以使用此数据来帮助您编写准确的查询请求。在此示例中,我们插入数据库的架构,并告诉 Codex 要查询数据库的内容。
1 2 3 4 5 6 7 8 |
# 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 从一种语言转换为另一种语言,在注释中列出要转换的代码的语言,然后是代码,然后是包含要翻译成的语言的注释。
1 2 3 4 5 6 7 8 |
# Convert this from Python to R # Python version [ Python code ] # End # R version |
重写库或框架的代码。如果希望 Codex 使函数更高效,可以向其提供要重写的代码,然后提供有关使用哪种格式的说明。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
// 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: |
插入代码试用版
完成终结点还支持通过在前缀提示之外提供后缀提示来在代码中插入代码。这可用于在函数或文件的中间插入补全。
1 2 3 4 5 6 7 |
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 |
通过为模型提供额外的上下文,它可以更具可操纵性。但是,对于模型来说,这是一项更具限制和挑战性的任务。
1 |
最佳实践
插入代码是测试版中的一项新功能,您可能需要修改使用 API 的方式以获得更好的结果。以下是一些最佳做法:
使用 max_tokens > 256。该模型更擅长插入较长的完成项。如果max_tokens太小,模型可能会在连接到后缀之前被切断。请注意,即使使用较大的max_tokens,也只需为生成的代币数量付费。
更喜欢finish_reason==“停止”。当模型到达自然停止点或用户提供的停止序列时,它将finish_reason设置为“停止”。这表明模型已成功连接到后缀,并且是完成质量的良好信号。这对于在使用 n > 1 或重新采样时在几个完成之间进行选择尤其重要(请参阅下一点)。
重新采样 3-5 次。虽然几乎所有完成都连接到前缀,但在更困难的情况下,模型可能难以连接后缀。我们发现,在这种情况下,重新采样 3 或 5 次(或使用 k=3,5 的 best_of)并选择以“停止”作为其finish_reason的样本可能是一种有效的方法。在重新采样时,您通常需要更高的温度来增加多样性。
注意:如果所有返回的示例都有 finish_reason == “length”,则可能是max_tokens太小并且模型在设法自然连接提示和后缀之前耗尽了令牌。考虑在重新采样前增加max_tokens。
编辑代码 beta
编辑终结点可用于编辑代码,而不仅仅是完成代码。您提供一些代码和有关如何修改它的说明,模型将尝试相应地对其进行编辑。这是重构和调整代码的自然接口。在此初始测试期内,编辑端点的使用是免费的。code-davinci-edit-001
例子
迭代构建程序
编写代码通常是一个迭代过程,需要在此过程中优化文本。编辑使不断优化模型的输出变得很自然,直到最终结果得到完善。在此示例中,我们使用斐波那契作为如何基于代码迭代构建的示例。
1编写函数
2重构它
3重命名函数
4添加文档
最佳实践
编辑端点仍处于 alpha 阶段,我们建议遵循以下最佳做法。
- 请考虑使用空提示!在这种情况下,编辑的使用方式与完成类似。
- 尽可能具体地说明。
- 有时,模型找不到解决方案,并会导致错误。我们建议您重新措辞您的指示或输入。