AI Development Notes 1 - introduction with the OpenAI API Development

news2025/1/8 3:33:05

Official document:https://platform.openai.com/docs/api-reference/chat/create

1. Use APIfox to call APIs

2.Use PyCharm to call APIs

2.1-1 WIN OS.Configure the Enviorment variable

#HK代理环境,不需要科学上网(价格便宜、有安全风险,适合个人开发调试)
setx OPENAI_BASE_URL "https://api.openai-hk.com/v1"
setx OPENAI_API_KEY "hk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

#官方环境,需要科学上网(价格高、安全可靠,适合个人企业生产部署)
setx OPENAI_BASE_URL "https://api.openai.com/v1"
setx OPENAI_API_KEY "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Temporaily use the API through HK proxy.

Check if environment variable is configured successfully.

import os

print(os.getenv('OPENAI_BASE_URL'))

2.1-2 MAC OS Configure the Environment variable

#HK代理环境,不需要科学上网
export OPENAI_BASE_URL='https://api.openai-hk.com/v1'
export OPENAI_API_KEY='hk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

#官方环境,需要科学上网
export OPENAI_BASE_URL='https://api.openai.com/v1'
export OPENAI_API_KEY='sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

 if Mac os is unable to read the configured environment variables,u need to modify the .zshrc file.

Refer to the URL below.

MacOS环境变量source生效但重启后又失效 - 程序员小艺 - 博客园

2.2 Call an API using PyCharm

2.2.1.as APIfox(HTTPClient):Make a POST request to call the API,similar to how it's done in APIfox.

import requests
import json
import os

url = os.getenv('OPENAI_BASE_URL') + "/chat/completions"
# print(os.getenv('OPENAI_BASE_URL'))
payload = json.dumps({
    "model": "gpt-4o",
    "messages": [
        {"role": "system", "content": "assistant"},
        {"role": "user", "content": "Hello"}
    ]
})
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('OPENAI_API_KEY'),
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

2.2.2 Use the offical SDK to call the API

First,domwload the OpenAI package using the console and import it.

# pip install openai==1.40.3

Call the API using the SDK

from openai import OpenAI
# pip install openai==1.40.3
import os
# 从环境变量中读取OPENAI_BASE_URL
print(os.getenv('OPENAI_BASE_URL'))
# 初始化 OpenAI 服务。
client = OpenAI()
completion = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {"role": "system", "content": "assistant"},
        {"role": "user", "content": "Hello"}
    ]
)
print(completion.choices[0].message.content)

There was a problem when running the code

Traceback (most recent call last):
  File "D:\BaiduNetdiskDownload\AIapp\sub\1_AI及LLM基础\day02_OpenAI 开发\day2-demo\sdk_call.py", line 7, in <module>
    clien = OpenAI()
  File "C:\Users\Administrator\PycharmProjects\PythonProject\.venv_learn\Lib\site-packages\openai\_client.py", line 123, in __init__
    super().__init__(
    ~~~~~~~~~~~~~~~~^
        version=__version__,
        ^^^^^^^^^^^^^^^^^^^^
    ...<6 lines>...
        _strict_response_validation=_strict_response_validation,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Users\Administrator\PycharmProjects\PythonProject\.venv_learn\Lib\site-packages\openai\_base_client.py", line 843, in __init__
    self._client = http_client or SyncHttpxClientWrapper(
                                  ~~~~~~~~~~~~~~~~~~~~~~^
        base_url=base_url,
        ^^^^^^^^^^^^^^^^^^
    ...<5 lines>...
        follow_redirects=True,
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "C:\Users\Administrator\PycharmProjects\PythonProject\.venv_learn\Lib\site-packages\openai\_base_client.py", line 741, in __init__
    super().__init__(**kwargs)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^
TypeError: Client.__init__() got an unexpected keyword argument 'proxies'

 The error could be caused by an outdated SDK versiong,trying to update SDK version

pip install --upgrade openai

After updating the SKD ,the code now runs successfully.

 SDK provide a more convenient interface;under the hood,they rely on the request libary for making HTTP request

2.3 Call the embedding(嵌入 向量数据库) API in Python

embedding transforms prompt words into vector representations(向量表示)

2.3.1 request(HTTP)

One advantage of using the request library is that it provides access to the full response,including headers,status code and body.

import requests
import json
import os

url = os.getenv('OPENAI_BASE_URL') + "/embeddings"

payload = json.dumps({
    "model": "text-embedding-ada-002",
    "input": "cat"
})
headers = {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer ' + os.getenv('OPENAI_API_KEY'),
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)

2.3.2 SDK

Meanwhile,SDK typically provide only pre-processed or pre-packaged object,which may limit access to the raw response date(原始数据). Tip:press Ctrl+B jump to the method

from openai import OpenAI

# 初始化 OpenAI 服务。
client = OpenAI()


# 调用嵌入 API
def get_embedding(text, model="text-embedding-ada-002"):
    response = client.embeddings.create(
        input=text,
        model=model
    )
    return response.data[0].embedding

# 示例文本
text = "Hello, world!"

# 获取嵌入向量
embedding = get_embedding(text)

print("Embedding vector:", embedding)

2.4 Call the vision-endabled GPT4o using a local/online image

2.4.1 request local image

use # to comment code

import os
import base64 #use base64 transform image
import requests


def encode_image(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')


# Path to your image
image_path = "../images/cat.jpeg"

# Getting the base64 string
base64_image = encode_image(image_path)

headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer " + os.getenv('OPENAI_API_KEY')
}

payload = {
    "model": "gpt-4o",
    "messages": [
        {
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "这张照片里有什么?"
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/jpeg;base64,{base64_image}"#input base64 format to url
                    }
                }
            ]
        }
    ],
    "max_tokens": 300
}

response = requests.post(os.getenv('OPENAI_BASE_URL') + "/chat/completions", headers=headers, json=payload)

print(response.json())

2.4.2 SDK online

from openai import OpenAI

client = OpenAI()
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "这张照片里有什么?"},
                {
                    "type": "image_url",
                    "image_url": {
                        "url": "https://p7.itc.cn/q_70/images03/20220805/7a369d8407144b11bfd598091095c959.jpeg",
                        #"url": f"data:image/jpeg;base64,{base64_image}"
                    },
                },
            ],
        }
    ],
    max_tokens=50,
)
print(response.choices[0])

2.5 Respond whit the specified Json schema

JSON is well-suited for converting data into objects

from openai import OpenAI

client = OpenAI()

response = client.chat.completions.create(
    model="gpt-4o",
    response_format={"type": "json_object"},#ensure respond is JSON schcema
    messages=[
        {"role": "system", "content": "你是一个助手,请用中文输出JSON"},
        {"role": "user", "content": "帮我写一个冒泡算法?"}
    ]
)
print(response.choices[0].message.content)

before not using JSON schema(more suitable for page display or user reading

 after using JSON schema

2.6 Seed for reproducible output(重现输出)

As the seed value adcreases,the differences become more pronounced(obvious明显)

from openai import OpenAI
client = OpenAI()

for i in range(3):
    response = client.chat.completions.create(
        model="gpt-4o",
        # 对于三个请求中的每一个,使用相同的 seed 参数 42,同时将所有其他参数保持相同,我们便能够生成更一致的结果。
        seed=2, #种子
        temperature=0.7,
        max_tokens=50,
        messages=[
            {"role": "system", "content": "你是一个生成故事机器人"},
            {"role": "user", "content": "告诉我一个关于宇宙是如何开始的故事?"}
        ]
    )
    print(f'故事版本{i + 1}:' + response.choices[0].message.content)
    del response #this statement is not necessary and can be omitted

seed = 2

 seed = 40

2.7 Count tokens

Count tokens in the development console for looped chat.

Need to install the tiktoken libary

pip install --upgrade tiktoken
from openai import OpenAI
# pip install --upgrade tiktoken
#tiktoken 用来统计token使用
import tiktoken#package for count token

client = OpenAI()
# 初始化 tiktoken 编码器
encoder = tiktoken.encoding_for_model("gpt-4")

def count_tokens(text):
    encoder.encode(text)
    # 将输入的文本text转换为对应的token列表。具体来说,它使用tiktoken库中的编码器将文本进行编码,以便后续处理。
    tokens = encoder.encode(text)
    # 统计文本中的 token 数量
    return len(tokens)


def main():
    # 初始化聊天记录
    messages = [
        {"role": "system", "content": "You are a helpful assistant."}
    ]

    print("开始聊天吧!输入 'exit' 退出。")

    total_tokens = 0

    while True:
        # 获取用户输入
        user_input = input("用户: ")

        if user_input.lower() == 'exit':
            break

        # 添加用户消息到聊天记录
        messages.append({"role": "user", "content": user_input})

        # 统计用户输入的 token 数量并累加
        user_tokens = count_tokens(user_input)
        total_tokens += user_tokens

        # 调用 GPT-4 模型
        response = client.chat.completions.create(
            model="gpt-4",
            messages=messages,
            max_tokens=150,
            temperature=0.7,
            top_p=1,
            n=1
        )

        # 获取助手的回复
        assistant_message = response.choices[0].message.content.strip()

        # 添加助手的回复到聊天记录
        messages.append({"role": "assistant", "content": assistant_message})

        # 统计助手回复的 token 数量并累加
        assistant_tokens = count_tokens(assistant_message)
        total_tokens += assistant_tokens

        # 输出用户输入和助手的回复
        print(f"助手: {assistant_message}")

        # 输出当前聊天记录的总 token 数量
        print(f"用户tokens数: {user_tokens},助手tokens数: {assistant_tokens},总token数: {total_tokens}")


if __name__ == "__main__":#Only when the module is run as the main program directly
    main()

2.8 Consol chat loop with session length management based on maximum token limit

from openai import OpenAI
# pip install tiktoken
import tiktoken

client = OpenAI()

# 这是 API 请求和响应的总 token 数量限制。对于 GPT-4 模型,这个值通常是 4096。
MAX_TOKENS = 8  # 设置最大 token 数量
# 这是我们预留给模型响应的 token 数量。我们需要在计算对话的最大 token 数量时减去这个值,以确保有足够的空间来容纳模型的响应。
MAX_RESPONSE_TOKENS = 6  # 设置响应中预留的最大 token 数量
encoder = tiktoken.encoding_for_model("gpt-4")
def count_tokens(text):
    encoder.encode(text)
    # 将输入的文本text转换为对应的token列表。具体来说,它使用tiktoken库中的编码器将文本进行编码,以便后续处理。
    tokens = encoder.encode(text)
    # 统计文本中的 token 数量
    return len(tokens)
# 假设 MAX_TOKENS 是 4096,而 MAX_RESPONSE_TOKENS 是 500,那么:
# 我们希望对话历史的 token 数量不要超过 3596 (4096 - 500)。
# 这样,当我们发送对话历史给 API 时,仍然有 500 个 token 的空间用于模型生成的响应。
def manage_token_limit(messages):
    current_tokens = count_tokens(messages)
    if current_tokens > (MAX_TOKENS - MAX_RESPONSE_TOKENS):
        print(f"当前会话 token 数量: {current_tokens}, 超过最大 token 数量: {MAX_TOKENS - MAX_RESPONSE_TOKENS}")
        return False
    return True


def get_gpt_response(messages):
    """获取 GPT-4 的响应"""
    response = client.chat.completions.create(
        model="gpt-4",
        messages=messages
    )
    return response.choices[0].message.content.strip()


def main():
    
    print("Chat with GPT-4. Type 'exit' to end the conversation.")
  
    while True:
        messages = []#this statement must be inside the while loop to ensure that the variable is reset on each iteration(每次迭代)
        user_input = input("用户: ")
        if user_input.lower() == 'exit':
            break

        messages.append({"role": "user", "content": user_input})

        # 管理用户输入以确保总 token 数量不超过限制
        if not manage_token_limit(user_input):
            continue

        response = get_gpt_response(messages)
        print(f"GPT: {response}")#The role of 'f' is to format string for input variables

        messages.append({"role": "assistant", "content": response})


if __name__ == "__main__":
    main()

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

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

相关文章

路由组件与一般组件的区别

路由组件与一般组件的区别 1. 基本概念 1.1 路由组件 路由组件是指通过路由规则映射的组件&#xff0c;通常放在 pages 或 views 文件夹中。 1.2 一般组件 一般组件是指通过 import 导入后直接使用的组件&#xff0c;通常放在 components 文件夹中。 2. 主要区别 2.1 存…

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令

K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台&#xff1b;我这里是安装的其他开…

【C++】18.继承

文章目录 1.继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1定义格式1.2.2继承关系和访问限定符1.2.3继承基类成员访问方式的变化 1.3 继承类模板 2.基类和派生类对象赋值转换3.继承中的作用域3.1 隐藏规则&#xff1a;3.2 考察继承作用域相关选择题 4.派生类的默认成员函数4…

51单片机——8*8LED点阵

LED 点阵的行则为发光二极管的阳极&#xff0c;LED 点阵的列则为发光二极管的阴极 根据 LED 发光二极管导通原理&#xff0c;当阳极为高电平&#xff0c;阴极为低电平则点亮&#xff0c;否则熄灭。 因此通过单片机P0口可控制点阵列&#xff0c;74HC595可控制点阵行 11 脚 SR…

FastDeploy部署paddlecls分类模型(windows)

目录 写在前面 总体步骤 C SDK编译库 方式1&#xff1a;编译安装 方式2&#xff1a;下载预编译库 准备模型、文件、代码和数据 模型文件类型 samples代码 待预测图像 使用 FastDeploy C SDK 将cpp源码编译为exe 编写cpp代码 cpp代码编译exe 运行可执行程序exe 将…

电脑如何无线控制手机?

想在电脑上无线控制手机&#xff0c;需要用到Total Control控制软件&#xff0c;具体步骤如下&#xff1a; 1、首先我们在电脑上安装上控制软件Total Control并打开。 2、开启手机USB调试和ADB仅充电模式。 3、手机电脑均连接上相同局域网。 4、连接(首次使用需要用手机U…

C++ Qt练习项目 QChar功能测试

个人学习笔记 代码仓库 GitCode - 全球开发者的开源社区,开源代码托管平台 新建项目 设计UI 1、拖入group box去掉名字 2、拖入2个LineEdit 3、拖入两个Label 4、拖入两个PushButton 5、点栅格布局 1、拖入GroupBox 2、拖入4个PushButton 3、点栅格布局 1、拖入GroupBo…

QT c++ 样式 设置 标签(QLabel)的渐变色美化

上一篇文章中描述了按钮的纯色&#xff0c;本文描述标签的渐变色美化。 1.头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> //#include "CustomButton.h"#include <QVBoxLayout> #include <QLinearGradient> #include <QLabel…

【C++面向对象——输入输出流】处理二进制文件(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 一、流类库中常用的类及其成员函数 二、标准输入输出及格式控制 三、文件的应用方法&#xff08;二进制文件、文本文件&#xff09; 编程要求 实验步骤 通关代码 测试结果 任务描述 本关任务&#xff1a; 用二进制方式打开指定的…

基于大数据爬虫+Python+数据可视化大屏的慧游数据爬虫与推荐分析系统(源码+论文+PPT+部署文档教程等)

博主介绍&#xff1a;**CSDN毕设辅导第一人、**全网粉丝50W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流 **技术范围&#xff1a;**S…

Linux Shell 脚本编程基础知识篇—awk的条件判断(3)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;今天周五了&#xff0c;又是一周过去了&#x1f606; 本文是有关Linux shell脚本编程的awk命令的条件语句&#xff0c;后续我会不断增加相关内容 ~~ 回顾:【awk字符串函数和内置变量】 更多Linux 相关内容请点击&#x1f449;【Li…

MITRE ATTCK 简介:初学者指南

网络安全已成为当今数字世界的一个关键问题。随着网络威胁日益复杂&#xff0c;组织需要一种结构化的方法来理解和应对这些风险。这就是 MITRE ATT&CK 框架发挥作用的地方。如果您是网络安全新手或刚刚开始探索威胁分析和缓解&#xff0c;本指南将为 MITRE ATT&CK 提供…

生物医学信号处理--绪论

前言 参考书籍&#xff1a;刘海龙&#xff0c;生物医学信号处理&#xff0c;化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号&#xff1a;ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…

理解 Tomcat 架构与自定义实现

前言 Tomcat 是一个轻量级的 Web 容器&#xff0c;被广泛应用于 Java Web 开发中。通过它&#xff0c;我们可以轻松地部署和运行 Web 应用。在本文中&#xff0c;我们将深入分析 Tomcat 的核心架构&#xff0c;同时结合一段代码&#xff0c;手动实现一个简化的 Tomcat 服务&am…

怎样修改el-table主题样式

起因&#xff1a;el-table有主题样式&#xff0c;部分需要单独设置 环境&#xff1a;ideanodejs插件谷歌浏览器 第一步&#xff1a;找到scss文件&#xff1a; 谷歌浏览器打开表格页面&#xff0c;ctrlshifti打开开发者工具&#xff0c;点击后鼠标移动到表格单元格上单击一下…

模型 九屏幕分析法

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。九屏幕法&#xff1a;全方位分析问题的系统工具。 1 九屏幕分析法的应用 1.1 新产品研发的市场分析 一家科技公司计划开发一款新型智能手机&#xff0c;为了全面评估市场潜力和风险&#xff0c;他们…

CSS 学习之 padding 与图形绘制

padding 属性和 background-clip 属性配合&#xff0c;可以在有限的标签下实现一些 CSS 图形绘制效果&#xff0c;我这里举两个小例子&#xff0c;重在展示可行性。 例 1:不使用伪元素&#xff0c;仅一层标签实现大队长的“三道杠”分类图标效果。此效果在移动端比较常见&…

AI在电子制造中的应用:预测质量控制

一、 电子制造中存在的质量问题 电子制造过程中&#xff0c;由于生产工艺复杂、材料种类繁多、生产环境要求高等因素&#xff0c;可能会出现各种质量问题。 常见质量问题如下&#xff1a; 1. 空焊 原因&#xff1a;锡膏活性较弱、钢网开孔不佳、铜铂间距过大或大铜贴小元件、…

(已开源-AAAI25) RCTrans:雷达相机融合3D目标检测模型

在雷达相机融合三维目标检测中&#xff0c;雷达点云稀疏、噪声较大&#xff0c;在相机雷达融合过程中提出了很多挑战。为了解决这个问题&#xff0c;我们引入了一种新的基于query的检测方法 Radar-Camera Transformer (RCTrans)。具体来说&#xff1a; 首先设计了一个雷达稠密…

WPS计算机二级•数据查找分析

听说这里是目录哦 通配符&#x1f30c;问号&#xff08;?&#xff09;星号&#xff08;*&#xff09;波形符&#xff08;~&#xff09; 排序&#x1f320;数字按大小排序以当前选定区域排序以扩展选定区域排序 文字按首字母排序 快速筛选分类数据☄️文字筛选数字筛选颜色筛选…