当前位置:   article > 正文

Codex 模型和 Azure OpenAI 服务_codex代码生成

codex代码生成

在本文中

  1. 如何使用 Codex 模型
  2. 最佳实践
  3. 下一步

笔记

本文是根据遗留代码生成模型编写和测试的。这些模型使用完成 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 的Playground 中通过部署 Codex 系列模型(例如code-davinci-002.

说“你好”(Python)

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

创建随机名称 (Python)

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)

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)

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?

最佳实践

从评论、数据或代码开始

您可以在我们的 Playground 中尝试使用 Codex 模型之一(需要时将样式说明作为注释。)

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

在此示例中,我们告诉 Codex 调用该函数的内容以及它将执行什么任务。

Python

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

这种方法甚至可以扩展到您可以向 Codex 提供注释和数据库模式示例,以使其为各种数据库编写有用的查询请求。下面是我们为查询提供列和表名称的示例。

Python

# 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
# R language
# Calculate the mean distance between an array of points

Python

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

提示 Codex 你想要它做什么

如果您希望 Codex 创建网页,请在您的注释后将第一行代码放入 HTML 文档 ( <!DOCTYPE html>),告诉 Codex 接下来应该做什么。相同的方法适用于从注释创建函数(注释后面是一个以 func 或 def 开头的新行)。

HTML

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

放在<!DOCTYPE html>我们的评论之后可以让法典非常清楚地知道我们希望它做什么。

或者,如果我们想编写一个函数,我们可以按如下方式启动提示,Codex 将了解下一步需要做什么。

指定库将有助于 Codex 了解您想要的内容

Codex 知道大量的库、API 和模块。通过通过注释或将它们导入到您的代码中告诉 Codex 使用哪些选项,Codex 将根据它们而不是替代方案提出建议。

HTML
<!-- 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 时,在某些情况下,使用文档字符串(用三引号括起来的注释)可以比使用井号 ( #) 符号提供更高质量的结果。

Python

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

函数内的注释可能会有所帮助

推荐的编码标准通常建议将函数的描述放在函数内部。使用这种格式有助于 Codex 更清楚地了解您希望该函数执行的操作。

Python

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

提供示例以获得更精确的结果

如果您有需要 Codex 使用的特定样式或格式,在请求的第一部分提供示例或演示将有助于 Codex 更准确地匹配您的需求。

Python

"""
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 开始,然后向上递增 0.1,直到找到合适的变化。

将任务组织成功能

我们可以通过在注释中尽可能精确地指定函数应该执行的操作来让 Codex 编写函数。例如,通过编写以下注释,Codex 创建一个 JavaScript 计时器函数,当用户按下按钮时会触发该函数:

一个简单的 JavaScript 计时器

JavaScript

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

创建示例数据

测试应用程序通常需要使用示例数据。由于 Codex 是一种了解如何理解和编写自然语言的语言模型,因此您可以要求 Codex 创建数据,例如由虚构名称、产品和其他变量组成的数组。例如,在这里我们要求 Codex 创建一系列天气温度。

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

要求 Codex 执行此任务将生成如下表:

JavaScript
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 可以在有足够令牌的情况下生成其余内容。

JavaScript
/*
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 和设置停止标记来限制查询的大小。例如,添加\n作为停止序列以将完成限制为一行代码。较小的完成也会产生较少的延迟。

使用流式传输来减少延迟

大型 Codex 查询可能需要数十秒才能完成。要构建需要较低延迟的应用程序(例如执行自动完成的编码助手),请考虑使用流式传输。响应将在模型完成生成整个完成之前返回。仅需要部分完成的应用程序可以通过以编程方式或使用 的创造性值来切断完成来减少延迟stop

用户可以通过从 API 请求多个解决方案并使用返回的第一个响应,将流式传输与重复结合起来,以减少延迟。通过设置来做到这一点n > 1。这种方式会消耗较多的代币配额,请谨慎使用(例如,对max_tokens和进行合理的设置stop)。

使用Codex解释代码

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

JavaScript
/* Explain what the previous function is doing: It

解释 SQL 查询

在此示例中,我们使用 Codex 以人类可读的格式解释 SQL 查询正在执行的操作。

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

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

# Unit test
def

检查代码是否有错误

通过使用示例,您可以向 Codex 展示如何识别代码中的错误。在某些情况下,不需要示例,但是展示提供描述的级别和细节可以帮助法典了解要查找的内容以及如何解释它。(Codex 对错误的检查不应取代用户的仔细审查。)

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

使用源数据编写数据库函数

正如人类程序员会从理解数据库结构和列名称中受益一样,Codex 可以使用这些数据来帮助您编写准确的查询请求。在此示例中,我们插入数据库的架构并告诉 Codex 查询数据库的内容。

Python

# 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 从一种语言转换为另一种语言,方法是遵循一种简单的格式,在注释中列出要转换的代码的语言,然后是代码,然后是包含您希望将其翻译成的语言的注释。

Python

# Convert this from Python to R
# Python version

[ Python code ]

# End

# R version

重写库或框架的代码

如果您希望 Codex 使某个功能更加高效,您可以向其提供要重写的代码,然后附上有关使用何种格式的说明。

JavaScript

// 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 提供支持的底层模型

反馈

即将推出:整个 2024 年,我们将逐步淘汰 GitHub Issues 作为内容反馈机制,并用新的反馈系统取而代之。有关详细信息,请参阅:Provide feedback for Microsoft Learn content - Contributor guide | Microsoft Learn

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/492952
推荐阅读
相关标签
  

闽ICP备14008679号