作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Tarek是一名专攻机器学习的软件和数据工程师, 软件架构, DevOps, 以及后端开发. 他曾担任Thndr的首席技术官, 这家公司得到了Y Combinator的支持, 并发表了几篇关于机器学习的研究论文. Tarek拥有斯图加特大学计算语言学硕士学位.
以前在
近年来, 人工智能已经主导了技术领域,并对几乎所有行业产生了变革性影响, 从创意艺术到金融再到管理. 大型语言模型 (法学硕士),如 OpenAI’s GPT and 谷歌的双子座 正在以惊人的速度改进,并开始在软件工程师的工具包中发挥重要作用.
尽管当前这一代法学硕士无法取代软件工程师, 这些模型可以作为智能数字助手,帮助编写代码和调试一些简单的日常任务. 在本文中, 我利用我开发人工智能和机器学习解决方案的经验来解释使用llm生成能够与外部资源交互的代码的复杂性.
LLM是一种机器学习模型,它经过了大量文本数据的训练,目标是理解和生成人类语言. LLM通常使用变压器构建, 一种基于“自我关注机制”的神经网络架构,这意味着整个输入序列是同时处理的,而不是一个字一个字地处理. 这使得模型可以分析整个句子, 显著提高其对潜在语义的理解,即文本传达的潜在意义和意图. 从本质上讲,法学硕士理解上下文,使他们能够有效地生成类似人类风格的文本.
网络越深,它就越能捕捉到人类语言中的微妙含义. 现代LLM需要大量的训练数据,并且可能包含数十亿个参数(从训练数据中学习的元素),因为人们希望增加深度可以提高推理等任务的性能. 培训 GPT-3, 从出版的书籍和互联网上抓取的原始数据是45TB的压缩文本. GPT-3包含大约1750亿个参数来实现其知识库.
除了GPT-3和 GPT-4, several other LLMs have made considerable advancements; these include Google’s PaLM 2 and LLaMa 2 from Meta.
因为他们的培训数据包括编程语言和软件开发, 法学硕士也学会了生成代码. 现代法学硕士能够将自然语言文本提示转换为各种编程语言和技术堆栈中的工作代码, 尽管利用这种强大的功能需要一定程度的技术专长.
而复杂的任务和解决问题很可能总是需要人类开发人员的关注, 法学硕士可以充当智能助手, 为不太复杂的任务编写代码. 将重复的任务交给LLM可以提高生产力并减少设计过程中的开发时间, 特别是对于早期阶段的任务,如原型和概念验证. 另外, LLM可以通过解释代码和查找语法错误来为调试过程提供有价值的见解,这些语法错误在编写了一整天的代码后可能很难被发现.
That said, 法学硕士生成的任何代码都应该被视为一个起点,而不是一个成品——代码应该经常被审查和彻底测试. 开发人员还应该意识到llm的局限性. 因为它们缺乏人类解决问题和即兴发挥的能力, 法学硕士们努力应对复杂的业务逻辑和挑战,这些挑战需要创新的解决方案. 另外, 法学硕士可能没有接受过适当的培训来处理特定领域的项目或使用专门的或专有的框架. Overall, 法学硕士可以是有效的助手, 但人类开发人员仍然是开发过程的重要组成部分.
大多数现代应用程序的一个关键组件是与外部资源进行接口的需求. 开发人员经常需要调用 API (应用程序编程接口), 一组指令或协议,为应用程序之间的通信提供了一种标准化的方式. 编写使用API的代码通常需要深入研究其文档, 哪些详细描述了所有的需求, 包括命名约定, 它支持的操作, 输入和响应的数据格式, 安全要求.
只要它提供了所需的信息, 法学硕士可能会加快这个过程, 通过帮助生成API请求的代码. 此示例演示了如何提示ChatGPT生成对 OpenWeather API 在Python中,以及如何避免错误,例如使用已弃用的函数. 然后,我们的示例展示了如何通过OpenAI的API发送相同的提示, 演示改变参数如何影响LLM的输出.
请注意,使用OpenWeather API是有成本的, 虽然API可以免费调用,每天000次.
我们的示例应用程序的需求包括显示当前温度和天气描述. 为了了解ChatGPT如何帮助我们编写这段代码,我们提示如下:
编写一个Python脚本,使用Python“请求”库在端点“http://api”上向OpenWeather API执行GET请求.openweathermap.org/data/2.5/weather”. API调用应该在“appid”键下的查询字符串参数中包含一个API键.API应该返回数据 JSON format. 函数应该以华氏温度为单位返回当前温度.
返回以下Python代码:
进口的要求
#将“YOUR_API_KEY”替换为实际的OpenWeather API密钥.
api_key = "YOUR_API_KEY"
Api_Url = "http://api " . url ".openweathermap.org/data/2.5/weather"
想要获取天气信息的城市.
city_name = "London"
# API请求参数.
params = {
“问”:city_name,
“appid”:api_key,
“单位”:“英制”#用“公制”表示摄氏度,用“英制”表示华氏度.
}
try:
# GET请求.
响应=请求.get (api_url params =参数)
检查请求是否成功(状态码200).
if response.Status_code == 200:
#解析并打印JSON响应.
Weather_data =响应.json()
print(“天气数据”,city_name)
打印(温度:“weather_data(“主要”)(“临时”),“°F”)
print(“描述:weather_data[‘天气’][0]["描述"])
else:
如果请求不成功,打印错误信息.
打印(“错误:”响应.status_code、响应.text)
例外情况如下:
print("发生错误:",e)
注意在提示符中, the actual location was not specified; however, 生成的代码包含一个名为 city_name
,默认值为“London”.“别忘了替换 YOUR_API_KEY
使用您的个人OpenWeather API密钥.
要测试代码,请使用 Python解释器 必须安装在您的机器上,之后可以使用IDE(例如?)运行代码 Visual Studio代码, or by 调用脚本 通过命令行. 以下是伦敦市的天气数据输出:
伦敦天气资料
温度:53.08°F
描述:阴云密布
在许多系统中, 从API检索到的信息可能需要存储或输入到另一个系统中, 例如数据库或其他API. 在这些情况下, 需要将信息转换为特定的格式, 例如XML或CSV, 或者合并成a SQL 在数据库表中插入或更新数据的命令. LLM可以通过生成自定义输出格式的代码来提供帮助. 这句话被添加到原提示中:
输出应该以SQL命令的形式返回,该命令将返回的数据插入到名为“current_weather”的表中。, 哪里的栏是“城市?,”“温度,”“weather_description,和“update_date”.”
ChatGPT返回与上面相同的代码, 添加了一些import语句并更新了输出格式:
进口的要求
import json
从datetime导入datetime
# …
try:
# GET请求.
响应=请求.get (api_url params =参数)
检查请求是否成功(状态码200).
if response.Status_code == 200:
#解析并打印JSON响应.
Weather_data =响应.json()
#提取相关信息.
City = city_name
Temperature = weather_data['main']['temp']
Weather_description = weather_data['天气'][0]['描述']
Update_date =日期时间.utcnow().strftime(“% Y - % m - H % d %: % m: % S ')
#生成插入SQL命令.
sql_command = f"INSERT INTO current_weather(城市天气), temperature, weather_description, update_date) VALUES ('{city}'), {温度}, “{weather_description}”, {update_date})”
#打印SQL命令.
打印(sql_command)
else:
如果请求不成功,打印错误信息.
打印(“错误:”响应.status_code、响应.text)
例外情况如下:
print("发生错误:",e)
运行这段代码将得到正确的SQL命令:
插入当前天气(城市), temperature, weather_description, update_date) VALUES ('London'), 53.37、'碎云','2024-02-06 04:43:35')
返回一个警告 utcnow()
已弃用的函数:
DeprecationWarning: datetime.datetime.utknow()已弃用,并计划在将来的版本中删除. 使用时区感知对象来表示UTC: datetime中的日期时间.datetime.now(datetime.UTC).
为了防止ChatGPT使用已弃用的函数,我们在提示符中添加:
请不要使用任何已弃用的函数.
添加这一行之后,ChatGPT将替换弃用的行 utcnow()
功能如下:
#使用timezone-aware对象update_date.
Update_date =日期时间.现在(时区.utc).strftime(“% Y - % m - H % d %: % m: % S ')
这段代码再次返回正确的SQL命令. SQL命令可以使用各种ide(如Visual Studio代码)或数据库管理工具中的查询编辑器进行测试. 在典型的web应用程序中, SQL命令将在API调用之后立即运行, 实时更新数据库中的表.
只要他们得到准确的指导, 法学硕士能够将他们的输出结构成几乎任何格式, 包括SQL命令, JSON,甚至调用另一个API.
许多llm都有相应的API,使开发人员能够以编程方式与llm进行交互,并将其无缝集成到应用程序中. 这使您能够创建自己的虚拟人工智能助手, 具有自动完成的代码生成等功能, refactoring, 和优化. 用户界面 是否可以针对特定域进行优化并自定义以填充预定义的提示模板. 以编程方式集成LLM还允许安排或触发任务, 促进自动虚拟助手的创建.
在这个例子中, 我们将执行相同的天气检索任务, 现在使用Python与 OpenAI API 而不是手动提示ChatGPT输入代码. 可以使用以下命令安装API:
PIP安装openai
要使用OpenAI API,需要一个API密钥. API有一个与之相关的成本, however, 新帐户在有限的时间内可以免费访问.
安装OpenAI API后,可以将其库导入到代码中. 下面的代码发送上面创建的提示,省略了输出a的指令 SQL command. 指定的模型是GPT-3.5:
进口openai
openai.api_key = "YOUR_API_KEY" #替换为您的实际API密钥.
响应= openai.chat.completions.create(
= ' gpt-3模型.5-turbo',
max_tokens = 1024,温度= 0.3, top_p=0.9,
messages=[
{'role': 'system', 'content': '你是一个智能人工智能助手.'},
{“角色”:“用户”, 'content': "编写一个Python脚本,使用Python 'requests'库在端点'http://api上向OpenWeather API执行GET请求.openweathermap.org/data/2.5/weather'. API调用应该在键'appid '下的查询字符串参数中包含一个API键.API返回的数据是JSON格式的. 请不要使用任何已弃用的函数."},
],
)
Response_message =响应.choices[0].message.content
打印(response_message)
LLM生成以下Python代码,用于检索伦敦的温度:
进口的要求
# API端点和API密钥.
Url = "http://api ".openweathermap.org/data/2.5/weather"
api_key = "YOUR_API_KEY"
#查询字符串参数.
params = {
'q': 'London,uk', #示例城市和国家代码.
“appid”:api_key
}
#发送GET请求.
响应=请求.get (url, params =参数)
检查请求是否成功.
if response.Status_code == 200:
解析JSON响应.
数据=响应.json()
#以摄氏度打印温度.
温度= data['main']['temp'] - 273.15
打印(f)“伦敦的温度是{温度:.2f}°C.")
else:
打印(f“错误:{反应.status_code}”)
注意,以华氏度为单位检索温度的指令也被省略了. LLM没有指定API调用中的单元, 但在显示结果时,它选择用数学方法将单位从开尔文转换为摄氏度.
使用API时, LLM的许多参数可以调整, 更改生成的响应. 有些参数会改变随机性和创造性的水平,而其他参数则侧重于重复. 而在生成自然语言文本时,参数可能会产生更大的影响, 调整它们也会影响代码生成.
在前面的代码中,可以在第7行调整GPT的参数:
max_tokens = 1024,温度= 0.3, top_p=0.9,
可调整的参数如下:
Parameter | Description | 代码生成的影响 |
---|---|---|
temperature | 温度参数调整生成文本的随机性, 本质上是回应的“创造性”. 温度越高,随机性越大, 而较低的温度会导致更可预测的反应. 温度可以设定在0到2之间. 默认值是0.7或1,取决于模型. | 较低的温度将产生更安全的代码,这些代码遵循在训练期间学习的模式和结构. 更高的温度可能会产生更多独特和非常规的代码, however, 它们也可能引入错误和不一致. |
max_tokens | The max_tokens 参数对LLM将生成的令牌数量设置限制. 如果设置得太低,回复可能只有几个字. 设得太高可能会浪费代币,增加成本. | 最大令牌应该设置得足够高,以包含需要生成的所有代码. 如果你不想从法学硕士那里得到任何解释,它可以减少. |
top_p | Top P, 或者细胞核取样, 通过限制法学硕士考虑的选择来影响下一个单词或短语可能是什么. top_p 最大值是1,最小值是0. Setting top_p to 0.1告诉LLM将下一个令牌限制为最可能的前10%. 将其设置为0.5将其改变为前50%,产生更大范围的反应. | 高P值较低, 生成的代码将更具可预测性和上下文相关性, 因为只有最可能的令牌才会被使用. 尽管提高最高产量可以增加产量的多样性, 它可能导致不相关或无意义的代码片段. |
frequency_penalty | The frequency_penalty 参数减少了LLM响应中单词或短语的重复. 通过高频惩罚,LLM可以避免重复之前使用过的单词. 较低的频率惩罚允许更多的重复. The frequency_penalty 参数的最大值为2,最小值为0. | 以更高的频率惩罚, the generated code will be less repetitive and potentially more innovative; however, 法学硕士可能会选择效率较低甚至不正确的元素. 使用较低的频率惩罚,代码可能无法探索替代方法. 可能需要通过实验来找到最优值. |
presence_penalty | The presence_penalty 参数与 frequency_penalty 参数,因为它们都鼓励更多样化的单词范围. 然而,尽管 frequency_penalty 惩罚在文本中出现多次的标记, presence_penalty 惩罚一个已经出现的标记,无论其出现的频率如何. 净效应是 frequency_penalty 尽量减少单词的重复,而 presence_penalty 专注于使用全新的词汇. The presence_penalty 参数的最大值为2,最小值为0. | 类似于频率惩罚, a high presence penalty encourages the LLM to explore alternative solutions; however, 生成的代码可能效率较低,甚至不正确. 较低的存在惩罚允许重复更多的代码, 哪个可以产生更简洁和高效的代码, 尤其是当有重复模式的时候. |
stop | A stop 序列告诉LLM何时停止生成文本. 例如,设置 stop to " /n "告诉LLM在一行之后停止. | 停止序列防止LLM生成多余或不相关的代码. 停止序列应该是代码段的自然结束点, for example, 函数或循环的结束. |
要查看这些参数如何影响实际的代码生成,我们将尝试调整 frequency_penalty
and presence_penalty
parameters.
When frequency_penalty
被设为1.5(更高的值), LLM生成额外的代码来捕获异常, 大概是为了避免重复以前的输出:
#...
try:
#发送带有参数的GET请求,并以JSON格式获取响应数据.
响应=请求.get (url, params =参数)
if response.Status_code == 200:
Weather_data =响应.json()
#从天气数据中打印出一些相关信息.
print(“城市:weather_data['名字'])
打印(温度:“weather_data(“主要”)(“临时”),“K”)
除了请求.exceptions.请求异常:
处理HTTP请求期间发生的任何错误.
打印(“错误:e)
而额外的代码是非常有益的, 重要的是要注意,结果是不可预测的. 错误处理功能可防止程序在外部API出现问题时超时或崩溃, 而是因为我们没有要求LLM生成处理异常的代码, 它的加入更像是一种幸运的猜测. 第二次使用相同的参数运行API调用很可能会产生不同的结果. 告诉LLM生成错误处理代码的唯一一致方法是将这些特定指令添加到初始提示符中.
Setting presence_penalty
to 2.0(最高值)也有类似的效果. LLM避免重复之前的输出,而是将对OpenWeather API的调用放在一个函数中, 将API密钥作为参数传递:
进口的要求
def get_weather (api_key):
Url = "http://api ".openweathermap.org/data/2.5/weather"
params = {
'q': 'London,uk', #示例城市和国家代码.
“appid”:api_key
}
if response.Status_code == 200:
数据=响应.json()
return data
else:
打印(“错误:”响应.status_code)
#将“YOUR_API_KEY”替换为OpenWeather中的实际API密钥.
api_key = "YOUR_API_KEY"
Weather_data = get_weather(api_key)
打印(weather_data)
虽然将API调用放在函数中是一个有用的调整, 将API密钥作为参数传递是很奇怪的. 在大多数用例中,应该传递的参数是 city
. 通过调整初始提示,可以很容易地纠正这种异常.
调整法学硕士的参数需要实验, 因为结果通常是不可预测的, 而调整某些参数往往似乎没有效果. 更改参数通常不会对是否遵循最佳实践产生一致的影响. In general, 允许更多可预测的结果和重复的设置将产生更简洁和高效的代码. 另一方面, 促进创造力和惩罚重复的设置可能会产生更具创造性和创新性的解决方案, 尽管出现不正常或不相关代码的可能性更高.
llm生成的代码工作并优化后, 开发过程的下一步是将其集成到现有的代码库中. 直接将代码粘贴到现有代码中可能会导致无组织的格式化和维护问题. 更精简的方法是将代码转换为可重用的函数或对象. 只要在提示符中添加详细的说明,就可以使用LLM完成此操作. 应该指定参数,以及输出格式.
让法学硕士创建一个 Weather
对象,它包含 get_weather
函数时,可在提示符中添加以下指令:
API调用应该放在一个名为“weather”的对象中,,其中包含一个名为“get_weather”的函数,,其中包含一个名为“城市”的论点.”
基于此提示,LLM生成以下Python代码:
进口的要求
类天气:
Def __init__(self, api_key):
self.Api_key = Api_key
self.temperature =无
Def get_weather(self, city):
Url = 'http://api '.openweathermap.org/data/2.5/weather'
params = {
'q': city,
“appid”:自我.api_key,
“单位”:“英制”#请求华氏温度.
}
响应=请求.get (url, params =参数)
数据=响应.json()
if response.Status_code == 200:
self.Temperature = data['main']['temp']
打印(f)在{城市}的温度是{自我.温度}°F.")
else:
打印(f”错误:{数据(“信息”)}”)
#将“YOUR_API_KEY”替换为OpenWeather中的实际API密钥.
api_key = "YOUR_API_KEY"
weather =天气(api_key)
weather.get_weather(伦敦)
LLM在a中生成工作函数 Weather
object. 现在可以将对象集成到另一个应用程序中, however, 应该结合错误处理,以确保应用程序不会崩溃或无意中显示敏感信息.
在现实世界中,API调用可能由于多种原因而失败. 为了确保可靠性,代码必须包含适当的错误处理. 在前面的许多例子中, llm生成的代码包含检查返回的HTTP状态码是否为200(成功响应),并显示任何其他响应的错误描述. 但是这种必要的检查并没有考虑到常见的错误场景,例如连接超时或DNS解析错误.
对于可靠的操作,代码应该包含错误处理机制,例如使用 try-catch
块. 以下文本被附加到前一个提示符:
对于错误处理,在进行API调用时合并一个try-catch块. 代码还应该确认HTTP响应状态为200,并在不是200时显示错误描述.
这个提示符生成的Python代码包含 try-catch
块来处理任何潜在的错误:
类天气:
Def __init__(self, api_key):
self.Api_key = Api_key
self.temperature =无
Def get_weather(self, city):
try:
#使用提供的城市和API密钥构造API URL.
Url = "http://api ".openweathermap.org/data/2.5/weather"
参数= {'q':城市,
“appid”:自我.api_key,
“单位”:“英制”#获取华氏温度.
}
#发送GET请求到API.
响应=请求.get (url, params =参数)
#检查响应状态是否为200 (OK).
if response.Status_code == 200:
#解析JSON响应
数据=响应.json()
#从响应中提取华氏温度.
self.Temperature = data['main']['temp']
else:
#如果响应状态不为200,则显示错误描述.
打印(f 'Error:{响应.Status_code} -{响应.json()(“信息”)}”)
除了请求.exceptions.请求异常:
#处理任何请求异常.
打印(f 'Error: {e}”)
而由LLM生成的代码提供了一个很好的起点, 附加功能或定制通常需要进一步修改. 例如,应该记录错误,并且配置错误(例如.g., API身份验证错误或“服务不可用”状态)应该生成通知给管理员. 此外,如果主API关闭,开发人员可能会添加代码来访问备用API.
一旦代码完成了它应该做的一切, 下一个关键步骤是测试并确认它在现实生活中是否适用. 测试应该是全面的, 使用各种各样的测试用例,包括潜在的错误条件和边缘用例. 为了提高可靠性和更快的反馈,您可以自动化测试. 评估真实世界的表现, 度量性能指标,如执行时间, memory usage, 资源消耗可以帮助识别系统中的潜在瓶颈. 从持续测试和监控中获得的见解可以帮助改进提示和微调LLM参数.
而法学硕士绝不是人类专业知识的替代品, 它们生成代码的能力是一种变革性的创新,可以为开发人员提供有价值的帮助. llm不仅可以加快开发周期, 基于法学硕士的智能虚拟助手可以快速生成代码的多种变体, 让开发人员选择最佳版本. 将更简单的任务委托给LLM可以提高开发人员的生产力, 让他们专注于需要专业知识和人类思维的复杂任务, 比如解决问题和设计下一代应用程序. 提示清晰,测试全面, 开发人员可以利用api将LLM的功能添加到应用程序中.
随着越来越多的开发者发现人工智能的好处, the technology will improve very quickly; however, 记住这一点很重要 负责任及合乎道德的使用. 就像所有生成式AI用户一样, 软件开发人员有责任密切关注数据隐私的侵犯, 知识产权, 安全问题, 意想不到的输出, 以及法学硕士培训中的潜在偏见. 法学硕士目前正在被大量研究, 随着技术的进步, 它们将演变成无缝集成的智能虚拟助手.
OpenAI API允许编程访问GPT模型, 使其能够集成到新的和现有的应用程序中. 此外,它还允许对ChatGPT接口的可用功能进行进一步定制.
人工智能虚拟助手响应人类语言提示,为用户提供个性化帮助. 人工智能虚拟助手可以以多种方式提供帮助, 包括任务自动化, 回答问题, navigation, 天气预报, 和调度.
生成代码, 首先选择你想要使用的法学硕士,并决定是否要通过编程或通过可用的用户界面,如OpenAI的ChatGPT或微软的Copilot访问它. 法学硕士应该给出一个提示,详细说明编程语言和所需的功能. 提示应该尽可能具体.
荷兰阿姆斯特丹
自2021年9月23日起成为会员
Tarek是一名专攻机器学习的软件和数据工程师, 软件架构, DevOps, 以及后端开发. 他曾担任Thndr的首席技术官, 这家公司得到了Y Combinator的支持, 并发表了几篇关于机器学习的研究论文. Tarek拥有斯图加特大学计算语言学硕士学位.
以前在
世界级的文章,每周发一次.
世界级的文章,每周发一次.