赞
踩
需求:用户输入任意可以用加法解决的问题,都能得到计算结果。
# 加载环境变量 import openai import os import json from dotenv import load_dotenv, find_dotenv _ = load_dotenv(find_dotenv()) # 读取本地 .env 文件,里面定义了 OPENAI_API_KEY openai.api_key = os.getenv('OPENAI_API_KEY') def get_completion(messages, model="gpt-3.5-turbo"): response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, # 模型输出的随机性,0 表示随机性最小 functions=[{ # 用 JSON 描述函数。可以定义多个,但是只有一个会被调用,也可能都不会被调用 "name": "sum", "description": "计算数组中所有数字的和", "parameters": { "type": "object", "properties": { "numbers": { "type": "array", "items": { "type": "number" } } } }, }], ) return response.choices[0].message # prompt = "Tell me the sum of 1, 2, 3, 4, 5, 6, 7, 8, 9, 10." prompt = "桌上有 2 个苹果,四个桃子和 3 本书,一共有几个水果?" #prompt = "1+2+3+4+...+99+100=?" messages = [ {"role": "system", "content": "你是一个小学数学老师,你要教学生加法"}, {"role": "user", "content": prompt} ] response = get_completion(messages) messages.append(response) # 把大模型的回复加入到对话中 print(response) # 如果返回的是函数调用结果,则打印出来 if (response.get("function_call")): # 是否要调用 sum if (response["function_call"]["name"] == "sum"): args = json.loads(response["function_call"]["arguments"]) result = sum(args["numbers"]) print(result) messages.append( {"role": "function", "name": "sum", "content": str(result)}) # 整数 result,必须转成字符串 print(get_completion(messages).content)
def get_completion(messages, model="gpt-4"): response = openai.ChatCompletion.create( model=model, messages=messages, temperature=0, # 模型输出的随机性,0 表示随机性最小 functions=[ # 用 JSON 描述函数。可以定义多个,但是只有一个会被调用,也可能都不会被调用 { "name": "sum", "description": "计算数组中所有数字的和", "parameters": { "type": "object", "properties": { "numbers": { "type": "array", "items": { "type": "number", "description": "必须是数值类型" } } } }, }, { "name": "subtract", "description": "计算 a - b 的值", "parameters": { "type": "object", "properties": { "a": { "type": "number", "description": "被减数,必须是数值类型" }, "b": { "type": "number", "description": "减数,必须是数值类型" } } }, }, { "name": "multiply", "description": "计算数组中所有数字的积", "parameters": { "type": "object", "properties": { "numbers": { "type": "array", "items": { "type": "number", "description": "必须是数值类型" } } } }, }, { "name": "divide", "description": "计算 a/b 的值", "parameters": { "type": "object", "properties": { "a": { "type": "number", "description": "被除数,必须是数值类型" }, "b": { "type": "number", "description": "除数,必须是数值类型" } } }, } ], ) return response.choices[0].message prompt = "6 * 3 / (4+2) = ?" # prompt = "桌上有 2 个苹果,四个桃子和 3 本书,水果比书多多少?" # prompt = """ # 让我们一步步计算:小明在一家水果店买水果。他买了X斤苹果,每斤10元;4斤香蕉,每斤5元; # 和3斤橙子,每斤8元。他手头有100元。请问小明买完这些水果后,他还剩下多少钱? #""" messages = [ {"role": "system", "content": "你是一个小学数学老师,你要教学生四则混合运算"}, {"role": "user", "content": prompt} ] response = get_completion(messages) messages.append(response) # 把大模型的回复加入到对话中。非常重要! print(response) while (response.get("function_call")): # 是否要调用 sum args = json.loads(response["function_call"]["arguments"]) function_name = response["function_call"]["name"] if (function_name == "sum"): result = sum(args["numbers"]) elif (function_name == "subtract"): result = args["a"] - args["b"] elif (function_name == "multiply"): result = 1 for number in args["numbers"]: result *= number elif (function_name == "divide"): result = args["a"] / args["b"] else: result = "Unknown function" print(result) messages.append( {"role": "function", "name": function_name, "content": str(result)}) response = get_completion(messages) messages.append(response) # 把大模型的回复加入到对话中 print(response) print(response.content)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。