|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 isdkz 于 2023-6-14 17:53 编辑
openai的api迎来了重大更新 ,详情可以看https://openai.com/blog/function-calling-and-other-api-updates
但是英语不好,浏览器的翻译太鸡肋,于是我找上了chatgpt,让他来帮我阅读更新日志并讲给我听
这次更新主要是三点,更长的上下文,函数调用和更低的api价格
openai官方虽然没有明说,但是我尝试了最新的0613镜像惊奇地发现这次api的速度快上了不少,感觉比web端还快
其中最让人眼前一亮的是函数调用功能,同样地,api文档我又找上了chatgpt来帮我阅读
大致了解了function calling的使用方法之后,我决定上手实现一个小功能出来
我们知道大语言模型玩的是文字游戏,所以对于数学方面它是不太擅长的,稍微复杂一点就会算错了
既然有了 function calling,我们何不将chatgpt不擅长的事情交给 function 来完成呢
于是我实现了一个可以将十六进制数转十进制数以及可以进行四则运算的chat
- import openai
- import json
- import os
- openai.api_key = os.environ.get('OPENAI_API_KEY')
- def get_response(prompt):
- # 第一步,向模型发送用户的问题和它可以访问的函数
- response = openai.ChatCompletion.create(
- model="gpt-3.5-turbo-0613",
- messages=[{"role": "user", "content": prompt}],
- functions=[
- {
- "name": "hex2dec",
- "description": "Convert hexadecimal to decimal",
- "parameters": {
- "type": "object",
- "properties": {
- "expression": {
- "type": "string",
- "description": "a hexadecimal expression, e.g. 0x1e, 1e",
- },
- },
- },
- },
- {
- "name": "arithmetic",
- "description": "Perform arithmetic operations.",
- "parameters": {
- "type": "object",
- "properties": {
- "expression": {
- "type": "string",
- "description": "A arithmetic expression, e.g. 1x2, 1+3",
- },
- },
- },
- }
- ],
- function_call="auto",
- )
- message = response["choices"][0]["message"]
- # 第二步,检查模型是否想要调用一个函数
- if message.get("function_call"):
- function_name = message["function_call"]["name"]
- functions = {
- 'hex2dec': lambda x: f'{int(x, 16)}',
- 'arithmetic': lambda x: f'{eval(x)}'
- }
- # 第三步,调用函数
- # 注意:模型返回的 JSON 可能不是有效的 JSON
- function_response = functions[function_name](
- json.loads(message["function_call"]["arguments"]).get('expression', 0)
- )
- # 第四步,向模型发送函数调用和函数响应的信息
- response = openai.ChatCompletion.create(
- model="gpt-3.5-turbo-0613",
- messages=[
- {"role": "user", "content": prompt},
- message,
- {
- "role": "function",
- "name": function_name,
- "content": function_response,
- },
- ],
- )
- return response["choices"][0]["message"]["content"]
- print(get_response('985*396+(783-249)的结果是多少?'))
- print(get_response('十六进制数AB2D的十进制是多少?'))
复制代码
|
评分
-
查看全部评分
|