当前位置: 首页 > news >正文

【大模型入门】访问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加载环境变量:

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.lryc.cn/news/581281.html

相关文章:

  • 【Halcon】WPF 自定义Halcon显示控件完整流程与 `OnApplyTemplate` 未触发的根本原因解析!
  • day 60 python打卡
  • ffplay6 播放器关键技术点分析 1/2
  • Windows内核并发优化
  • rk3128 emmc显示剩余容量为0
  • 深度学习5(深层神经网络 + 参数和超参数)
  • 力扣网编程55题:跳跃游戏之逆向思维
  • 前端相关性能优化笔记
  • Python数据容器-list和tuple
  • 四、jenkins自动构建和设置邮箱
  • PHP语法基础篇(九):正则表达式
  • CppCon 2018 学习:Smart References
  • 有限状态机(Finite State Machine)
  • 相机位姿估计
  • 2 大模型高效参数微调;prompt tunning
  • 【Linux】自旋锁和读写锁
  • 全素山药开发指南:从防痒处理到高可用食谱架构
  • DeepSeek扫雷游戏网页版HTML5(附源码)
  • C#指针:解锁内存操作的底层密码
  • 机械时代的计算
  • 【Linux】常用基本指令
  • 爬虫工程师Chrome开发者工具简单介绍
  • 推荐算法系统系列五>推荐算法CF协同过滤用户行为挖掘(itembase+userbase)
  • Python实例题:基于 Python 的简单电子词典
  • 洛谷刷题9
  • Django中关于templates目录和static目录存放位置的总结
  • Django跨域
  • python使用fastmcp包编写mcp服务端(mcp_server)和mcp客户端(mcp_client)
  • jxWebUI--用数据表输入输出数据
  • 前端进阶之路-从传统前端到VUE-JS(第三期-VUE-JS配套UI组件的选择)(Element Plus的构建)