python调用oepnai API

news2024/12/27 2:03:58

目录

  • apiAI官网
  • 介绍([Introduction](https://platform.openai.com/docs/api-reference/introduction))
    • 安装官方SDK
    • 认证(Authentication)
      • 申请API KEY
      • 请求组织(Requesting organization)
    • 发送请求
      • 关于chat tokens
      • 关于国内支付
  • Chat
    • Create chat completion
    • Request body
  • 总结

apiAI官网

https://openai.com/

在这里插入图片描述

介绍(Introduction)

安装官方SDK

可以通过官方提供的pythonSDK与openai API进行交互,或者使用社区维护的第三方库,如:sashabaranov/go-openai,发送http请求调用openai API.

官方python sdk:pip install openai
社区go三方库(目前star 5.9k)go get github.com/sashabaranov/go-openai

认证(Authentication)

这段话都可以看懂,就不翻译了

The OpenAI API uses API keys for authentication. Visit your API Keys page to retrieve the API key you’ll use in your requests.

Remember that your API key is a secret! Do not share it with others or expose it in any client-side code (browsers, apps). Production requests must be routed through your own backend server where your API key can be securely loaded from an environment variable or key management service.

All API requests should include your API key in an Authorization HTTP header as follows:

Authorization: Bearer OPENAI_API_KEY

申请API KEY

前往View API keys申请apikey:
在这里插入图片描述
然后点击Settings将组织ID也记录下来:
在这里插入图片描述

请求组织(Requesting organization)

For users who belong to multiple organizations, you can pass a header to specify which organization is used for an API request. Usage from these API requests will count against the specified organization’s subscription quota.

(对于属于多个组织的用户,您可以传递标头来指定 API 请求使用哪个组织。 这些 API 请求的使用量将计入指定组织的订阅配额。)

Example with the openai Python package:

import os
import openai
openai.organization = "YOUR_ORG_ID"
openai.api_key = os.getenv("OPENAI_API_KEY")
openai.Model.list()

在这里插入图片描述

发送请求

复制粘贴官网的实例:

def gpt_3dot5_turbo():
    api = "https://api.openai.com/v1/chat/completions"

    headers = {
        "Content-Type": "application/json",
        "Authorization": AUTH_VALUE
    }

    json_data = {
        "model": "gpt-3.5-turbo-16k-0613",
        "message": [{"role": "user", "content": "What is the hello in Chinese?"}],
        "temperature": 0.7
    }

    response = requests.post(url=api, headers=headers, json=json_data)
    response.encoding = "utf-8"

    print(response.status_code)
    print(response.json())

但是,OpenAI已经于2021年11月1日停止了免费试用计划,使用OpenAI的Chat API(包括ChatGPT)进行开发者调用是需要付费的。所以,直接请求上述接口会报错:You exceeded your current quota, please check your plan and billing details.

绑卡支付:
在这里插入图片描述
正常访问:

在这里插入图片描述
按上面代码的写法,只能回答单个问题,并且无法形成上下文,原因在于messages这个参数只有一个字典。要想形成上下文,就必须按上下文对话的顺序把对话封装成字典,而且这个字典中,key为role时,对应的取值必须是system、user和assistant!

另外,字典中每一个role的取值,对应的功能都不太一样,其中system用于在会话开始之初给定chatGPT一个指示或声明,使得后续的回答更具有个性化和专业化。user是用于给用户提问的或者说是用来给用户输入prompt的。assistant是用于输入chatGPT的回答内容。

当使用OpenAI的对话模型时,以下是系统、用户和助手角色在一个假设的旅行规划对话中的具体示例:

  1. 系统(System)角色的例子:
    系统:欢迎来到旅行规划助手!你想要去哪个目的地旅行?
    这里系统角色起始了对话,并提供了引导性的问题,以引导用户进入对话主题。

  2. 用户(User)角色的例子:
    用户:我计划去巴黎度假,我想了解一些旅游景点和当地美食。
    用户提供了自己的旅行目的地和需求,指导对话的方向。

  3. 助手(Assistant)角色的例子:
    助手:巴黎是个美丽的城市,有很多令人惊叹的景点和美食。你可以游览埃菲尔铁塔、卢浮宫和巴黎圣母院等著名景点。当谈到美食,巴黎的法国菜和甜点非常有名,你可以尝试法式奶酪、可颂面包和马卡龙。
    助手作为对话模型,理解用户的需求并提供相关信息,包括巴黎的景点和美食推荐。

在这个例子中,系统角色起始了对话,用户角色提供了自己的需求和信息,而助手角色根据用户的输入生成了有关巴黎旅行的回复。通过这样的交互,系统、用户和助手共同参与对话,实现了一个旅行规划的对话场景。

下面给出简单实现上下文的python代码来帮助理解:(可以看出,保持上下文是需要利用role来将问答重复传入的)

class Chat:
    def __init__(self,conversation_list=[]) -> None:
        # 初始化对话列表,可以加入一个key为system的字典,有助于形成更加个性化的回答
        # self.conversation_list = [{'role':'system','content':'你是一个非常友善的助手'}]
        
        self.conversation_list = []
    
    # 打印对话
    def show_conversation(self,msg_list):
        for msg in msg_list:
            if msg['role'] == 'user':
                print(f"\U0001f47b: {msg['content']}\n")
            else:
                print(f"\U0001f47D: {msg['content']}\n")

    # 提示chatgpt
    def ask(self,prompt):
    	# 添加用户问题
        self.conversation_list.append({"role":"user","content":prompt})
        # 调用模型
        response = openai.ChatCompletion.create(model="gpt-3.5-turbo",messages=self.conversation_list)
        # 获得响应并取出会话内容
        answer = response.choices[0].message['content']
        
        # 把chatGPT的回答也添加到对话列表中,这样下一次问问题的时候就能形成上下文了
        self.conversation_list.append({"role":"assistant","content":answer})
		# 展示上下文
        self.show_conversation(self.conversation_list)

关于chat tokens

总而言之,key=user用于提问;key=system用于设置环境或主体;key=assistant用于把之前gpt的回答写入,这样对话就有了上下文。

因此,在保持上下文的情况下问答会消耗非常多的tokens

在这里插入图片描述
官方也提供了一个tokens计算机:https://platform.openai.com/tokenizer

官方这次的收费标准是 $0.002/1K tokens,大概 750 词。虽然1k个token看起来很多。但其实,发送一段供API响应的文本可能就会花费不少token。

基本问1个问题就要耗费100~200个token,算起来其实不少的,尤其在连续会话中,为了保持对话的连续性,必须每次都要回传历史消息,并且输入都要算 token 数算钱的,满打满算,按量付费其实也不便宜。

按照一般的经验来看,在英语中“一个 token 通常对应大约 4 个字符”,而1个汉字大致是2~2.5个token。

举一个官方的说明例子可能更直观一些:根据 OpenAI 官方文档,“ChatGPT is great!”这组单词就需要六个 token—— 它的 API 将其分解为“Chat”、“G”、“PT”、“is”、“great”和“!”。

在这里插入图片描述

关于国内支付

付费购买openai api的调用额度需要国外银行卡,如果有国外的同学,同事,亲戚家人等最好不过了,没有则可以使用虚拟卡(depay和onekey等)支付。

以下是我找到的一些教程:

  1. 国内Onekey Card快速开通ChatGPT Plus教程【亲测有效】:https://juejin.cn/post/7223343320298324029
  2. Depay虚拟卡绑定支付宝、美团、微信的使用场景和建议:https://juejin.cn/post/7208498140159410236
  3. 国内开通Chat GPT Plus保姆级教程【典藏】:https://www.chatgpt-plus.site/chatgpt-plus/

Chat

Given a list of messages comprising a conversation, the model will return a response.

Create chat completion

接口:https://api.openai.com/v1/chat/completions
方法:POST
描述:Creates a model response for the given chat conversation.

Request body

字段名字段类型是否必填描述信息
modelstring必填模型ID,See the model endpoint compatibility table for details on which models work with the Chat API.
messagesarray必填一个包含迄今为止对话的消息列表,Example Python code.在这里插入图片描述
functionsarray非必填A list of functions the model may generate JSON inputs for.在这里插入图片描述
function_callstring or object非必填控制模型如何对函数调用进行响应。 “none"表示模型不调用函数,并直接回应给最终用户。 “auto"表示模型可以在最终用户和调用函数之间选择。通过指定特定函数 {“name”: “my_function”},强制模型调用该函数。当没有函数存在时,默认值为"none”。如果存在函数,则默认为"auto”。
temperaturenumber非必填默认值为1,What sampling temperature to use, between 0 and 2. Higher values like 0.8 will make the output more random, while lower values like 0.2 will make it more focused and deterministic.We generally recommend altering this or top_p but not both.
top_pnumber非必填默认值为1,一种与温度采样相对应的另一种方法被称为nucleus采样,其中模型考虑具有top_p概率质量的标记的结果。因此,0.1表示只考虑构成前10%概率质量的标记。我们通常建议更改此参数或温度,而不是两者同时更改。
ninteger非必填默认值为1,How many chat completion choices to generate for each input message.

其他参数如:
在这里插入图片描述
在这里插入图片描述

总结

官方文档总结的十分详细,每一个功能点都给足了示例,具体参考内容还贴到了github,不存在不会使用的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CAJ文献如何转成PDF?分享两个免费的方法!

CAJ格式是中国知网(CNKI)常见的电子文献格式,但有时我们可能更倾向于将其转换为PDF格式以便于查阅、存储和共享。为了帮助大家完成这个任务,下面将分享两种免费的方法来将CAJ文献转换为PDF格式。无论您是研究学者、学生还是对特定…

学校招生报名小程序开发笔记(一)

背景 这是一个以报名为核心的职业学校招生小程序,目的是方便想要系统学习技能,入门某项技能或者领域的初高中毕业生,了解该学校的基本情况及各个专业,并提供报名路径,致力于技能型人才培养 功能规划 主要功能包括专…

使用 Pytest 运行 yaml 文件来驱动 Appium 自动化测试

目录 前言: 获取 yaml 文件 YamlTest 测试类 Appium 初始化 Pytest 测试类 自定义 runtest demo: 自定义错误输出 Yaml 使用方式规则 前言: 使用Pytest来运行yaml文件来驱动Appium自动化测试是一种方便且灵活的方法。通过将测试数据…

【异常解决】postman请求提示Full authentication is required to access this resource

Full authentication is required to access this resource解决办法 报错问题:在使用 postman 测试接口时,该接口需要在 Header 中传入 access_token,实际上也在请求的 Header 中添加上了 access_token 参数,但是服务端还是返回4…

【STM32零基础入门教程01】STM32入门基础知识

本篇内容为STM32零基础入门教程的第一篇,网上STM32的教程很多,有些初学者还是望而却步。其实STM32并不难,只是一个新的事物出现在我们面前一时间不适应,思来想去我打算写点东西一方面自己有点知识的积累,另一方面希望可…

Python教程(4)——Python开发工具PyCharm的下载与安装

PyCharm是一种专业的Python集成开发环境(IDE),由JetBrains公司开发和维护。它提供了丰富的功能和工具,帮助开发人员更高效地编写、调试和测试Python代码。如果是一些大型Python项目强烈推荐用这个来开发。今天我们来介绍一下PyCha…

【实战】 七、Hook,路由,与 URL 状态管理(中) —— React17+React Hook+TS4 最佳实践,仿 Jira 企业级项目(十二)

文章目录 一、项目起航:项目初始化与配置二、React 与 Hook 应用:实现项目列表三、TS 应用:JS神助攻 - 强类型四、JWT、用户认证与异步请求五、CSS 其实很简单 - 用 CSS-in-JS 添加样式六、用户体验优化 - 加载中和错误状态处理七、Hook&…

Docker基础(二)

1、Docker工作原理 Docker是一个Clinet-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接受命令并管理运行在主机上的容器。 容器,是一个运行时环境,就是我们前面说的…

论文笔记:Deep Spatio-Temporal Residual Networks for Citywide Crowd FlowsPrediction

2017 AAAI 使用时空残差网络ST-ResNet 进行 城市区域流入流出客流量预测 1 研究对象 城市客流流入流出 根据经纬度将城市划分为网格 IJ 1.1 难点 空间依赖性 时间依赖性 外部影响 2 模型 3 实验 北京出租车数据纽约自行车数据 评价指标:RMSE

Java List中通过对象属性排序,可实现多条件排序

直接上代码: import com.google.common.collect.Lists; import lombok.AllArgsConstructor; import lombok.Data;import java.util.Comparator; import java.util.List; import java.util.stream.Collectors;/*** List 对象属性排序*/Data AllArgsConstructor clas…

[java安全]动态代理

文章目录 【java安全】动态代理前言本质重要方法Proxy#newProxyInstance()InvocationHandler#invoke() 举例 【java安全】动态代理 前言 java中代理分为两种:静态代理、动态代理 而动态代理又分为:jdk动态代理、CGLIB动态代理 本文我们来谈谈jdk动态代…

Iceberg从入门到精通系列之十七:Apache InLong往Iceberg同步数据

Iceberg从入门到精通系列之十七:Apache InLong往Iceberg同步数据 一、概览二、版本支持三、依赖项四、SQL API 用法五、多表写入六、动态表名映射七、动态建库、建表八、动态schema变更九、Iceberg Load 节点参数十、数据类型映射 一、概览 Apache Iceberg是一种用…

【机器学习算法】主成分分析(PCA)

主成分分析(PCA) PCA(Principal Component Analysis) 是实现数据降维的一种算法。正如其名,假设有一份数据集,每条数据的维度是d,PCA通过分析这d个维度的前k个主要特征(这k个维度在原有d维特征的基础上重新构造出来,且是全新的正交…

SpringBoot+React学科竞赛管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SpringBootReact框架开发的学科竞赛管理系统。首先,这是一个前后端分离的项目,代码简洁…

初学者怎么学习c++(合集)

学习c方法1 找一本好的书本教材,辅助看教学视频。好的教材,可以让你更快更好的进入C/C的世界。在校学生的话,你们的教材通常都是不错的。如果是自学,推荐使用谭浩强出的C/C经典入门教材。看视频是学习比较直观的方式。建议先看课本…

从零开始理解Linux中断架构(20)--关于二级中断控制-链式chained Handler

二级中断控制器是个双重角色,在上级中断控制器看来他是个中断设备,在连接到他的下级设备来看,他是个中断控制器。所以处理完成基本的中断控制器管理功能:映射本地中断,还要多个动作:修改上级中断的默认irq Handler,向上级中断设置自己的链式中断处理函数。 中断控制的层…

Springboot实现过滤器

一、导言 在Spring Boot中,过滤器是一种用于对HTTP请求进行预处理和后处理的组件。相较于拦截器,过滤器属于Servlet规范的一部分,它能够在请求进入Web容器之前或返回给客户端之前进行操作。 要在Spring Boot中实现过滤器,可以按…

指针进阶(万字深层次指针解析)

❤️ 作者简介 :对纯音乐情有独钟的阿甘 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识,对纯音乐有独特的喜爱 📗 日后方向 : 偏向于CPP开发以及大数据方向,如果你也感兴趣的话欢迎关注博主,期待更新 指针进阶 …

Java正则表达式,不定期更新

Java正则表达式 1. 匹配数字(包含负数、小数)2. 匹配不是纯数字和纯字母且需要8位以上的密码3. 密码:字母、数字、符号(_-*.,!#符号可自定义)三选二4. 密码:必须包含大写、小写、数字、符号(_-*…

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了! 这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助! 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…