通过python 调用OpenAI api_key提交问题解答

news2025/1/18 1:55:51

通过python 调用OpenAI api_key提交问题解答


  • ✨可以通过网页版的jupyter notebook调用,也可以通过spyder窗口等IDE窗口.

🌼通过python 调用OpenAI api_key接口,可以避免国内网页不能访问的问题。前提是需要自己已经注册了OpenAI帐号,并且在帐号内申请了api_key才行。

jupyter notebook调用

在这里插入图片描述

import openai
openai.api_key = "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"
def completion(prompt):
    completions = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        max_tokens=1024,
        n=1,
        stop=None,
        temperature=0.8,
    )
    
    message = completions.choices[0].text
    return message
print(completion("基于Keil生成一个8051单片机串口通讯的代码"))
  • 📍返回的结果:
需要实现的功能

1) 串口中断,当收到第一个字节的时候,接收,直到收到数据完成的标志,保存在数组中。

2) 开启接收中断,接收一个字节,当收到第一个字节的时候,接收,直到收到数据完成的标志,保存在数组中。


#### 代码实现


#include<reg52.h>

#define FOSC 11059200L
#define BAUD 9600
#define T1MS (65536-FOSC/12/BAUD)
#define N1 0x40 
#define N2 0x00 
#define BUFFER_SIZE 16
 

sbit LED = P1^1; 
sbit rs = P3^6; 
sbit rw = P3^7; 
sbit en = P3^5; 
sbit buzzer = P2^2; 

unsigned char code table[]={
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46
  };

void delay(int i)
{
    while(i--);
}

void write_com(unsigned char com)
{
    P0 = com;
    rs = 0;
    rw = 0;
    en = 1;
    delay(5);
    en = 0;
}

void write_dat(unsigned char dat)
{
    P0 = dat;
    rs = 1;
    rw = 0;
    en = 1;
    delay(5);
    en = 0;
}

void init()
{
    write_com(0x38);
    write_com(0x01);
    write_com(0x06);
    write_com(0x0c);
    write_com(0x0f);
}

void write_str(unsigned char y, unsigned char x, unsigned char *s)
{
    unsigned char addr;
    if(y == 1)
    addr = 0x80 + x - 1;
    else if(y == 2)
    addr = 0xc0 + x - 1;
    write_com(addr);
    while(*s)
    {
        write_dat(*s);
        s++;
    }
}

void write_cmd(unsigned char y, unsigned char x)
{
    unsigned char addr;
    if(y == 1)
    addr = 0x80 + x - 1;
    else if(y == 2)
    addr = 0xc0 + x - 1;
    write_com(addr);
}


void lcd_pulse()
{
    en=1;
    delay(5);
    en=0;
}


void write_com1(unsigned char command)
{
    rs=0;
    rw=0;
    P0=command;
    lcd_pulse();
}

void write_dat1(unsigned char dat)
{
    rs=1;
    rw=0;
    P0=dat;
    lcd_pulse();
}


void lcd_init()
{
    write_com1(0x38);
    write_com1(0x06);
    write_com1(0x0c);
    write_com1(0x01);
    write_com1(0x80);
}

void write_char(unsigned char c)
{
    write_dat1(c);
}

void write_string(unsigned char *s)
{
    while(*s)
    {
        write_char(*s);
        s++;
    }
}


void timer0_init(void) 
{
    TMOD = 0x01; 
    TH0=T1MS;TL0=T1MS;
    ET0=1; 
    EA=1;
    TR0=1; 
}

unsigned char hours;
unsigned char minutes;
unsigned char seconds;
unsigned char t;
unsigned char time_update;
unsigned char count;
unsigned char data[BUFFER_SIZE];
unsigned char *p;
void timer0_interrupt() interrupt 1//模拟中断,每1s中断一次 
{
    TH0=T1MS;TL0=T1MS;
    write_cmd(1,1);
    write_char(table[hours/10]);
    write_char(table[hours%10]);
    write_char(':');
    write_char(table[minutes/10]);
    write_char(table[minutes%10]);
    write_char(':');
    write_char(table[seconds/10]);
    write_char(table[seconds%10]);
    seconds++;
    time_update=1;
}

void timer1_init()
{
    TH1=N1;TL1=N2;
    ET1=1;
    EA=1;
    TR1=1;
}


void timer1_interrupt() interrupt 3
{
    TH1=N1;TL1=N2;
    if(seconds==60)
    {
        seconds=0;
        minutes++;
    }
    if(minutes==60)
    {
        minutes=0;
        hours++;
    }
    if(hours==24)
        hours=0;
}

void init_serial()
{
    TMOD=0x20;
    SCON=0x50;
    TL1=N1;TH1=N2;
    ES=1;
    EA=1;
    TR1=1;
    count=0;
    p=data;
}

void serial_interrupt(void)   interrupt 4 
{
    if(TI==1)
    {
        TI=0;
        count=0;
        p=data;
    }
    else
    {
        SBUF=0x41+count;
        count++;
        if(count==BUFFER_SIZE)
        {
            count=0;
            p=data;
        }
        else
            p++;
        RI=0;
    }
}


void main()
{  
    write_cmd(1,1);
    write_str(2,1,"  TEMPERATURE  ");
    timer1_init();
    timer0_init();
    lcd_init();
    init_serial();
    while(1)
    {
        if(count==BUFFER_SIZE)
        {
            write_cmd(1,1);
            write_str(2,1,"  TEMPERATURE  ");
            write_str(1,9,p);
            write_str(2,9,p+8);
        }
    }
}

🌻spyder窗口调用

在这里插入图片描述

# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""

import openai
openai.api_key = "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"

def completion(prompt):
    completions = openai.Completion.create(
        engine="text-davinci-002",
        prompt=prompt,
        max_tokens=2048,
        n=1,
        stop=None,
        temperature=0.8,
    )
    
    message = completions.choices[0].text
    return message

print(completion("stm32f103vct6串口1初始化代码"))
  • 📜openai调用,提问stm32f103vct6串口1初始化代码返回数据:
波特率为115200

//串口初始化函数
//bound:波特率
void uart1_init(u32 bound)
{
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	 
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);	//使能USART1,GPIOA,AFIO时钟
  	GPIO_PinRemapConfig(GPIO_Remap_USART1, DISABLE);          //取消复用
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.09
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA9

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化PA10

  //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器

   //USART 初始化设置

	USART_InitStructure.USART_BaudRate = bound;//串口设置波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;	//收发模式
	USART_Init(USART1, &USART_InitStructure); //初始化串口1

	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
	USART_Cmd(USART1, ENABLE);                    //使能串口1

}
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	u8 Res;
#if SYSTEM_SUPPORT_OS 	//如果使用OS,由于串口接收中断优先级不能设置过高,因此当遇到串口错误时直接调用OS的相应服务
	OSIntEnter();    
#endif
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
	{
#if EN_USART1_RX			//如果使能接收
		Res =USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(Res==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}   		 
    	if(USART_RX_STA&0x8000)//接收完成
    	{
			USART_RX_BUF[USART_RX_STA&0X3FFF]=0;//添加结束符
			memcpy(USART_TX_BUF,USART_RX_BUF,USART_REC_LEN);
			USART_RX_STA=0;//接收状态标记清零	  
    	}
#endif 
	}	
	else if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)  //发送中断
	{
#if EN_USART1_TX			//如果使能了接收
		USART1->DR = Tx1Buffer[Tx1Counter++]; //写DR寄存器数据发送
		if(Tx1Counter == Tx1Count){
			USART1->CR1 &= ~USART_CR1_TXEIE;		//关闭TX发送中断
		}
#endif
	}


print(completion("stm32f103vct6串口1初始化代码"))
,总线资源申请好后,调用这个函数初始化
	return 0;
}


//不使用串口,释放资源
static void __exit uart_exit(void)
{
	//释放设备号
	unregister_chrdev(dev_no,DEV_NAME);
	
	//释放设备结构体
	cdev_del(&uart_cdev);
	
	//删除设备类
	device_destroy(uart_class,MKDEV(dev_no,0));
	
	//释放设备类
	class_destroy(uart_class);

	//释放资源
	
	//1.释放硬件资源:释放ioremap的空间
	iounmap(va);
	
	//2.释放设备号
	release_region(0x40011000,0x400);
}

module_init(uart_init);
module_exit(uart_exit);
MODULE_LICENSE("GPL");

🍁以上不管那种方式调用,都需要提前安装好openai模块

openai模块安装

  • openai模块安装命令: pip install openai
    在这里插入图片描述

jupyter notebook安装

  • 安装指令:pip install jupyter
    在这里插入图片描述
  • 🚩安装完成后,启动命令:jupyter notebook

spyder安装

  • spyder安装命令:pip install spyder
    在这里插入图片描述
  • 🚩安装完成后,启动命令:spyder

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

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

相关文章

linux中crontab定时任务导致磁盘满和云监控未报警的的坑

一个后台开发者&#xff0c;兼职运维工作中&#xff0c;配置linux中crontab定时任务&#xff0c;导致磁盘满和云监控未报警的问题的坑。 1.磁盘满 使用命令 df -h2.问题排查 2.1排查日志 命令 cat /var/log/messages日志文件的默认路径是&#xff1a;/var/log 下面是几个…

外贸常用工具(建议顶置收藏)

领英精灵 推荐理由&#xff1a;可批量群发消息并单独显示&#xff0c;相当于20人的发送效率。 做外贸的人一定会在Linkedin平台开发客户&#xff0c;但Linkedin平台没有提供群发消息的功能&#xff0c;如果要快速发消息的话&#xff0c;只能一个一个发&#xff0c;这种发送效…

使用Lame库实现wav、pcm转mp3

文章目录 前言 一、Lame库是什么&#xff1f; 二、使用步骤 0.创建native项目 1.下载Lame库 2.pcm转MP3 3.wav转MP3 4、native方法如下 三、注意 总结 前言 因为使用android录音后生成的文件是wav或者pcm格式&#xff0c;项目要求最后的文件需要是mp3格式&#xff0c;于…

tomcat10部署报错WebStatFilter cannot be cast to jakarta.servlet.Filter

异常信息09-Feb-2023 23:08:49.946 严重 [main] org.apache.catalina.core.StandardContext.filterStart 启动过滤器异常[DruidWebStatFilter]java.lang.ClassCastException: com.alibaba.druid.support.http.WebStatFilter cannot be cast to jakarta.servlet.Filterat org.ap…

上科大最新工作!实时面捕天花板,微表情像素级一致,AI让你告别手Key|SIGGRAPH Asia 2022

驱动一个数字人往往被拆分为追踪 (Tracking) 与重定向 (Retargeting) 两个环节。 追踪由专业的面部捕捉设备及其辅助算法完成&#xff0c;负责记录演员的面部动作信息&#xff0c;重定向则是将捕捉到的动作信息迁移到新的角色。 在传统的流程中&#xff0c;这两个环节往往是分…

全价值链赋能,数字化助力营销价值全力释放 | 爱分析报告

报告编委 张扬 爱分析联合创始人&首席分析师 文鸿伟 爱分析高级分析师 王鹏 爱分析分析师 外部专家&#xff08;按姓氏拼音排序&#xff09; 黄洵 客易达 联合创始人 毛健 云徙科技 副总裁 & COO 特别鸣谢&#xff08;按拼音排序&#xff09; 报告摘要 在…

SpringSecurity前后端分离(一篇就够了)

SpringSecurity前后端分离 从上至下操作&#xff0c;直接上手SpringSecurity 文章目录SpringSecurity前后端分离1、项目环境maven依赖数据库表2、自定义UserService接口3、屏蔽Spring Security默认重定向登录页面以实现前后端分离功能1、实现登录成功/失败、登出处理逻辑1、表…

鉴源论坛 ·观擎丨民机机载软件的开发与验证

作者 | 蔡喁 上海控安可信软件创新研究院副院长 版块 | 鉴源论坛 观擎 01 机载软件过程保证的目的和背景 民机机载软件研制过程一直是行业内公认的要求最为严苛、开发验证难度最大的软件开发实例之一。由于其高安全以及严格的政府监管特性&#xff0c;使得传统其他领域的软件…

1. 用Qt开发的十大理由

用Qt的十大理由 原因最主要的是很多大公司都在用&#xff0c;有钱景。 先来看看各大公司的评价&#xff1a; 奔驰&#xff1a;们用 Qt 开发了绝大部分的UI体验和软件&#xff0c;包括屏幕动画&#xff0c;屏幕间的过渡和小组件。 FORMLABS&#xff1a;凭借Qt的快速迭代&…

记录一下slf4j2打印一直不成功

整理一个之前的老项目问题&#xff0c;发现日志一直打印不出来&#xff0c;本地启动发现了第一个问题日志如下&#xff1a;此处可发现&#xff0c;jar包冲突问题&#xff0c;去掉冲突的jar包即可&#xff0c;此处不做过多赘述。然后发现了重新启动项目&#xff0c;发现jar包冲突…

工业废水的种类及其处理工艺简析

随着工业的迅速发展&#xff0c;工业废水的种类和数量随之增加&#xff0c;对水体的污染也日趋严重&#xff0c;威胁人类的健康和正常生活。所以工业废水的处理对于环保至关重要。 保护生态环境、更好地做好工业废水的处理&#xff0c;了解工业废水及其种类与处理非常必要。 工…

国内chatgpt 在VRAR上的应用场景

人工智能不鸣则已&#xff0c;一鸣惊人! 近日OpenAI发布了聊天AI ChatGPT&#xff0c;短短几天&#xff0c;其用户量直冲百万级&#xff0c;甚至服务器一度被注册用户挤爆了。 这种被网友惊叹“超越谷歌搜索”的神器究竟是怎么做到的? ChatGPT 简而言之&#xff1a;ChatGPT是一…

三行按键扫描详细解析

三行按键扫描基础 核心算法&#xff1a; unsigned char trg; unsigned char cont; void KeyRead( void ) {unsigned char readDate P3^0xff; // 第一行trg readDate & (ReadData ^ cont); // 第二行cont readDate; // 第三行 }用定时器每隔10ms执行一次按键扫描读取函…

C++:类和对象(上)

文章目录1 面向过程与面向对象的初步认识2 类的引入3 类的定义4 类的访问限定符及封装4.1 访问限定符4.2 封装5 类的实例化6 类对象模型6.1 如何计算类的大小6.2 类对象的存储方式猜测7 this指针7.1 this指针的引出7.2 this指针的特性8 C语言和C栈&#xff08;Stack&#xff09…

J-Tech Talk|如何使用Grafana Cloud Alert进行实时监控

J-Tech Talk由 Jina AI 社区为大家带来的技术分享围绕 Python 的相关话题工程师们将深入细节地讲解具体的问题分享 Jina AI 在开发过程中所积累的经验在新一代基于云原生的微服务架构中&#xff0c;不管是业务还是基础设施&#xff0c;服务的可观测性 至关重要&#xff01;它涵…

git、gitee、github关系梳理及ssh不对称加密大白话解释

温馨提示&#xff1a;本文不会讲解如何下载、安装git&#xff0c;也不会讲解如何注册、使用gitee或GitHub&#xff0c;这些内容网上一大把&#xff0c;B站上的入门课程也很多&#xff0c;自己看看就好了。 本文仅对 git、gitee、github的关系梳理及ssh公钥私钥授权原理用白话讲…

whistle 一个神奇的前端调试工具(抓包\代理工具)

在进行前端开发过程中&#xff0c;我们常常需要对一些接口进行处理&#xff0c;以及当后端接口没有弄好需要我们mock一些假数据&#xff0c;针对这些场景&#xff0c;我们就可以使用whistle 来解决。首先&#xff0c;我们要知道能满足我们需求的工具有很多&#xff0c;例如&…

第十五章 栅格数据重分类、栅格计算器、插值分析

文章目录第十五章 栅格数据分析第一章 栅格数据重分类第一节 栅格数据重分类第二节 栅格重分类的使用第三节 重分类的使用中的空值使用第四节 重分类的案例&#xff1a;分类统计面积第五节 坡度矢量分级图生成第二章 栅格计算器第一节 栅格计算器介绍第二节 栅格计算器使用第三…

操作系统题目收录(六)

1、某系统采用基于优先权的非抢占式进程调度策略&#xff0c;完成一次进程调度和进程切换的系统时间开销为1us。在T时刻就绪队列中有3个进程P1P_1P1​、P2P_2P2​和P3P_3P3​&#xff0c;其在就绪队列中的等待时间、需要的CPU时间和优先权如下表所示。若优先权值大的进程优先获…

Revit怎么生成电线和电器配件,管道附件?

一、Revit中如何自动生成电线 首先框选所有的照明设备&#xff0c;使用过滤器命令&#xff0c;只选中照明设备&#xff0c;如图1所示。 框选之后会出现创建电力系统的界面&#xff0c;选择如图2所示电力的命令。 出现图3中所示选择弧形导线或者带倒角导线&#xff0c;即可以自动…