【大模型入门】访问GPT的API

目录

0 前言

免费访问GPT的API

Windows下环境变量的设置

1 非流式输出

1.1 使用requests库

1.2 使用OpenAI库

2 流式输出

2.1 使用requests库

2.2 使用OpenAI库

3 使用OpenAI库与GPT聊天(存储对话历史版)

4 嵌入向量embeddings

4.1 创建嵌入向量

4.2 嵌入对象结构


0 前言

免费访问GPT的API

GPT_API_free:https://github.com/chatanywhere/GPT_API_free?tab=readme-ov-file

获取OPENAI_BASE_URL(API请求的代理地址)和OPENAI_API_KEY(API密钥)的值

Windows下环境变量的设置

“高级系统设置”-“环境变量”,设置环境变量OPENAI_BASE_URL、OPENAI_API_KEY和对应的值

1 非流式输出

1.1 使用requests库

先看一下OpenAI API支持的大模型列表

import requests
import os# API请求的代理地址
BASE_URL = os.environ.get('OPENAI_BASE_URL')
# API密钥
API_KEY = os.environ.get('OPENAI_API_KEY')
# 请求头
headers = {"Authorization": f"Bearer {API_KEY}"}
# 发送get请求,得到响应
response = requests.get(url=f'{BASE_URL}/v1/models',headers=headers)
# OpenAI API支持的大模型列表
print(response.json())

这里截取模型列表的部分输出:

接着使用requests库与GPT聊天(非流式输出的形式)

import requests
import os# API请求的代理地址
BASE_URL = os.environ.get('OPENAI_BASE_URL')
# API密钥
API_KEY = os.environ.get('OPENAI_API_KEY')
# 请求地址
url = f'{BASE_URL}/v1/chat/completions'
# 请求头
headers = {"Authorization": f"Bearer {API_KEY}"}
# 请求体
body = {"model": "gpt-3.5-turbo","messages": [{"role": "user","content": "say hello"}]
}
# 发送post请求,返回响应
response = requests.post(url=url,headers=headers,json=body)
# 打印输出的内容
print(response.json()['choices'][0]['message']['content'])

输出: 

response.json()方法的理解:

1.2 使用OpenAI库

import os
from openai import OpenAIclient = OpenAI(# 老版本(v1以下的版本)OPENAI_API_BASE# 新版本(v1及以上的版本)OPENAI_BASE_URL# 我目前用的openai版本是1.93.0,所以环境变量的名称设置为OPENAI_BASE_URLbase_url = os.environ.get("OPENAI_BASE_URL"),api_key = os.environ.get("OPENAI_API_KEY"),
)chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "user","content": "Say this is a test",}],
)print(chat_completion.choices[0].message.content)

输出: 

chat_completion对象的理解:

将请求过程封装成函数,方便直接调用

def chat(prompt,model_name="gpt-3.5-turbo"):chat_completion = client.chat.completions.create(model = model_name,messages = [{"role": "user","content": prompt,}],)answer = chat_completion.choices[0].message.contentreturn answer

访问大模型的API,API请求地址和API密钥属于敏感信息,很重要。之前是使用os库加载环境变量,下面使用dotenv加载环境变量:

先创建一个文件“.env”,所在位置与代码文件同级。

在文件“.env”中,写入环境变量OPENAI_BASE_URL、OPEN_API_KEY和对应的值。

代码如下: 

import dotenv
from openai import OpenAI# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "user","content": "Say this is a test",}],
)print(chat_completion.choices[0].message.content)

输出:

2 流式输出

2.1 使用requests库

import requests
import os
import json# API请求的代理地址
BASE_URL = os.environ.get('OPENAI_BASE_URL')
# API密钥
API_KEY = os.environ.get('OPENAI_API_KEY')# 请求地址
url = f'{BASE_URL}/v1/chat/completions'# 请求头
headers = {"Authorization": f"Bearer {API_KEY}"}# 请求体
body = {"model": "gpt-3.5-turbo","messages": [{"role": "user","content": "1000字介绍大模型"}],"stream": True
}# 当stream=True时,requests不会立即下载响应内容,而是在访问content属性时才开始下载
response = requests.post(url=url,headers=headers,json=body,stream=True)for line in response.iter_lines():# 每个data数据最后面有两个换行符,也就是换行后,会产生一行空,这行空应该跳过打印if not line:continue# 解码成字符串,然后分割得到data后面的值,并转换为字典形式data = json.loads(line.decode('utf-8').lstrip('data: '))# finish_reason为停止原因,包含:None(未停止)或者stop(输出结束)finish_reason = data['choices'][0]['finish_reason']if finish_reason == "stop":break# 打印每个data中content,不换行print(data['choices'][0]['delta']['content'],end='')

流式输出:

每个data数据的理解:

for line in response.iter_lines():# 每个data数据最后面有两个换行符,也就是换行后,会产生一行空,这行空应该跳过打印if not line:continueprint(line)

这里截取了一部分data输出: 

2.2 使用OpenAI库

from openai import OpenAI
import dotenv# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()stream = client.chat.completions.create(model="gpt-3.5-turbo",messages=[{"role": "user","content": "1000字介绍大模型"}],stream=True
)for chunk in stream:# 内容不为None就输出if chunk.choices[0].delta.content is not None:print(chunk.choices[0].delta.content,end='')# 内容为None(也就是输出结束时退出循环)else:break

流式输出:

每个chunk的理解:

for chunk in stream:print(chunk)

这里截取了一部分chunk输出:

3 使用OpenAI库与GPT聊天(存储对话历史版)

在1.2和2.2中,我们使用OpenAI库与GPT聊天,但是GPT并没有记住我们每次聊天的内容,也就是对话历史。先来看下面的示例:

import dotenv
from openai import OpenAI# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [# system(系统):指令/角色扮演{"role": "system","content": "You are a helpful assistant."},# user(用户):用户消息是助手需要响应的请求或评论{"role": "user","content": "您好,我叫ahead"}]
)print(chat_completion.choices[0].message.content)

输出:

我们再次访问GPT的API,看看GPT能否记住我的名字?

chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "您好,我叫什么名字"}]
)print(chat_completion.choices[0].message.content)

输出:

第二次对话,GPT大模型并不知道我的名字,可见大模型并没有存储第一次对话的历史。

为了解决这个问题,我们可以在messages参数中指定assistant参数,它是用来存储以前的大模型回应。下面是在messages参数中添加了assistant参数的示例:

chat_completion = client.chat.completions.create(model = "gpt-3.5-turbo",messages = [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "您好,我叫ahead"},# assistant(助手):助手消息存储以前的助手回应{"role": "assistant","content": "您好,ahead!有什么问题我能帮您解决的吗?"},{"role": "user","content": "您好,我叫什么名字"}]
)# 大模型根据assistant提供的回应,记住我的名字了
print(chat_completion.choices[0].message.content)

输出: 

第二次对话,GPT大模型记住我的名字了,可见大模型存储了第一次对话的历史。

最后,附上messages参数的详细介绍:

4 嵌入向量embeddings

4.1 创建嵌入向量

import dotenv
from openai import OpenAI# 加载环境变量
dotenv.load_dotenv(".env")# 创建客户端
client = OpenAI()# 创建嵌入向量,并返回一个包含嵌入对象的列表
embeddings_response = client.embeddings.create(model = "text-embedding-ada-002",input = "你好"
)

4.2 嵌入对象结构

例如,data=[Embedding(embedding=[0.0002107498439727351, -0.0062210820615291595,...],

index=0, object='embedding')]

其中,Embedding就是一个嵌入对象,里面含有嵌入向量embedding

获取嵌入向量:

# 嵌入向量,是一个浮点数列表
embeddings_response.data[0].embedding

这里截取部分embedding输出:

获取嵌入向量的长度:

# 嵌入向量的长度,也就是浮点数的个数
len(embeddings_response.data[0].embedding)

 输出:1536

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

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

相关文章

Jenkins 部署脚本

java版 #!/bin/bashAPP_NAME"springboot-demo-0.0.1-SNAPSHOT" JAR_PATH"/home/package/target/${APP_NAME}.jar" LOG_PATH"/home/package/logs/app.log"# 查找并停止旧进程 PID$(ps aux | grep "$APP_NAME.jar" | grep -v grep | awk…

NV183NV185美光固态闪存NV196NV201

美光固态闪存技术深度解析:NV183、NV185、NV196与NV201系列 一、技术架构与核心参数对比 1. 制程工艺与容量布局 美光NV183/NV185/NV196/NV201系列采用176层3D NAND技术,通过垂直堆叠提升存储密度。其中: NV183:主打256GB容量段…

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓

基于单片机PWM控制逆变电源设计资料集:全面掌握逆变电源设计精髓 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代电子技术中,逆变电源的设计与应用占据了至关重要的位置。今天,我将为您介绍一个优秀的开源项目——基于单片…

Docker Buildx 构建多架构镜像(Redis、Mysql、Java8、Nginx)

目标 ARM64 麒麟电脑无法直接拉取 Redis 镜像,需在 Windows x86 电脑上通过 多架构构建工具(如 Docker Buildx) 生成适配 ARM64 的 Redis 镜像,再打包传输到目标设备。 一、核心问题:跨架构镜像兼容性 直接保存的 redi…

代理IP的安全陷阱:如何避免中间人攻击与IP池污染?

在跨境业务、数据采集等场景中,代理IP已成为刚需工具。然而,其隐藏的安全风险却常被忽视——轻则泄露隐私,重则导致账号封禁、数据劫持甚至金融损失。本文将深入剖析两大核心风险(中间人攻击与IP池污染),并…

深入理解大语言模型中的超参数:Temperature、Top-p 与更多

随着大语言模型(LLM)如 GPT、Claude、Gemini 的广泛应用,调优生成文本的质量与风格成为开发者和研究人员的重要课题。其中,超参数(Hyperparameters)如 temperature 和 top_p 扮演了核心角色,影响…

译码器Multisim电路仿真汇总——硬件工程师笔记

目录 74LS实现二线三线译码器 1 74LS139D和74LS138D基础知识 1.1 74LS139D 二线四线译码器 1.1.1 功能特点 1.1.2 引脚功能 1.1.3 工作原理 1.1.4 应用场景 1.1.5 使用方法 1.1.6 注意事项 1.6.7 逻辑真值表 1.2 74LS138D 3线8线译码器 1.2.1 功能特点 1.2.2 引脚…

国产 OFD 标准公文软件数科 OFD 阅读器:OFD/PDF 双格式支持,公务办公必备

各位办公软件小达人们,今天咱来聊聊数科OFD阅读器! 软件下载地址安装包 这软件啊,是基于咱国家自主OFD标准的版式阅读软件,主要用来阅读和处理OFD/PDF电子文件,还能用于公务应用扩展。它支持打开和浏览OFD/PDF格式的文…

vue中的toRef

在 Vue 中, toRef 函数用于将响应式对象的属性转换为一个独立的 ref 对象,同时保持与原始属性的关联。其参数格式及用法如下: toRef 的参数说明 1. 参数 1:源对象(必须) - 类型: Object &…

暖通锅炉的智能管控:物联网实现节能又舒适​

暖通锅炉系统在建筑供暖、工业供热等领域扮演着重要角色,其运行效率和能源消耗直接关系到用户的使用体验和成本支出。传统的暖通锅炉管理方式往往依赖人工操作和经验判断,存在能耗高、调节不灵活、舒适性差等问题。随着物联网技术的发展,暖通…

PHP:从入门到进阶的全面指南

PHP(Hypertext Preprocessor)作为一种广泛使用的开源脚本语言,尤其适用于 Web 开发并可嵌入 HTML 中。自诞生以来,PHP 凭借其简单易学、功能强大以及丰富的生态系统,成为了众多网站和 Web 应用程序开发的首选语言之一。…

EXCEL 基础函数

1、绝对引用、相对引用 1.1相对引用 相对引用,这是最常见的引用方式。复制单元格公式时,公式随着引用单元格的位置变化而变化 例如在单元格内输入sum(B2:C2),然后下拉填充柄复制公式。 可以看到每个单元格的公式不会保持sum(B2:C2)&#…

升级到MySQL 8.4,MySQL启动报错:io_setup() failed with EAGAIN

在升级到MySQL 8.4后,许多用户在启动数据库时遇到了一种常见错误:“io_setup() failed with EAGAIN”。本文将深入探讨该错误的原因,并提供详细的解决方案。错误分析错误描述当你启动MySQL时,可能会在日志文件中看到以下错误信息&…

【ECharts Y 轴标签优化实战:从密集到稀疏的美观之路】

ECharts Y 轴标签优化实战:从密集到稀疏的美观之路 📋 文章背景 在开发数据可视化模块时,我们遇到了一个常见但棘手的图表显示问题:ECharts 图表的 Y 轴标签过于密集,影响了用户体验和数据的可读性。本文将详细记录整个…

【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Pytorch完整源码和数据)

目录 效果一览程序获取程序内容代码分享效果一览 程序获取 获取方式一:文章顶部资源处直接下载:【锂电池剩余寿命预测】GRU门控循环单元锂电池剩余寿命预测(Pytorch完整源码和数据) 获取方式二:订阅电池建模专栏获取电池系列更多文件。 程序内容 1.【锂电池剩余寿命预测…

Minstrel:多智能体协作生成结构化 LangGPT 提示词

一、项目概述 Minstrel 是一个基于 LangGPT 框架的多智能体系统,自动生成结构化、人格化的提示词。它通过多个协作代理,提升提示词的准确性、多样性和灵活性,适合非 AI 专家使用 (github.com)。 二、问题动机 当前 LLM 提示设计经验依赖强…

Golang发送定时邮件

前面尝试过用Python来发送邮件,下面测试一下Golang如何发送邮件 需要使用三方库如下 1.安装github.com/jordan-wright/email go get github.com/jordan-wright/email安装完成之后代码如下 package mainimport ("github.com/jordan-wright/email""log""…

CodeSys的软PLC忘记了用户名和密码怎么办

Codesys的win v3 x64软PLC忘记用户名和密码怎么办 概述检查文件成功 概述 我曾经多次在运行了软PLC后忘记了自己的用户名和密码。有些是回忆起来了,但有些真的想不起来了。没有办法后来是重新装的CodeSys。这次从网上看到大佬写的文章,试了一下&#xf…

【论文】微服务架构下分布式事务一致性解决方案设计与实践

摘要 2022年3月至2023年6月,我作为首席架构师主导完成了某大型电商平台订单系统的微服务化改造项目。该项目日均处理订单量达300万笔,旨在解决原有单体架构在业务高峰期出现的性能瓶颈和事务一致性问题。本文重点论述在微服务架构下,如何通过Saga事务模式、事件溯源和最终一…

Matplotlib 安装部署与版本兼容问题解决方案(pyCharm)

引言 Matplotlib 是 Python 中最常用的可视化库之一,它是一个综合性的绘图库,能够创建静态的、动画的和可交互的可视化图形图像,能够创建折线图、散点图,还是复杂的热力图、3D 绘图等 matplotlib官网地址:https://ma…