02_openai开发

news/2025/3/9 12:17:43/文章来源:https://www.cnblogs.com/zhangxiaxuan/p/18757811

基本概念

  • Tokens(标记):在自然语言处理中,token是输入文本被分割成的小单元。一个token可以是一个单词、一个子词,甚至是一个字符。这取决于文本的具体分割方式。

OpenAI常用参数

1. max_tokens(最大token数)

定义:指令生成的回答中包含的最大token数。例如,如果设置为100,那么模型生成的回答中token数不会超过100个。

用法:用来控制生成内容的长度。特别是在需要简短回答或有限字数情况下,这个参数非常实用。

2. temperature(温度/文风的温度)

定义:控制文本生成的随机性。值范围通常在0到1之间。值越大,生成文本越随机;值越小,生成文本越确定。

用法:用来调整模型回答的创造性。高温度适合创造性任务;低温度适合需要确定性高的回答。

  • 温度 = 0:模型会产生最确定的输出,但可能显得重复或模板化。
  • 0 < 温度 < 0.5:输出将倾向于较为稳定和保守,提供高度相关且一致的回应。
  • 温度 = 0.5:产生的文本会有一个适中的平衡,既不过于随机也不过于保守。
  • 0.5 < 温度 < 1:输出会更具创意和变化,但可能牺牲一些连贯性。
  • 温度 = 1:模型会产生最大程度的创意和随机性,可能产生出奇不意的答案,但风险也更高。

3. n(生成次数)

定义:模型对每个输入生成的回答数量。设置为n就会生成n个独立的回答。

用法:用来获取多个回答,便于选择或综合。

image-20250224153700953

4. top_p(控制采样)

定义:确定生成文本时考虑的token累计概率。值为0到1之间,常用来替代温度设置。top_p为0.9时,模型仅在最有可能的token集合(累计概率达到0.9)中进行选择。

用法:控制生成内容的多样性,top_p越小,生成内容越确定。

5. presence_penalty(出现惩罚/阻止调整)

定义:影响模型生成新主题内容的倾向。值范围通常在-2.0到2.0之间。较高的值鼓励模型生成前面未出现过的新内容。

用法:用来避免重复内容,增加多样性。

6. frequency_penalty(频率惩罚、短语效应)

定义:影响模型是否重复使用某些词或短语。值范围通常在-2.0到2.0之间。较高的值会减少模型重复使用某些词或短语的频率。

用法:用来减少重复词语,提高输出的流畅度和多样性。

7. stream

定义stream 参数用于控制是否以流式方式接收生成的文本。流式输出意味着生成的文本会逐步发送,而不是一次性全部发送。

用法

  • stream=True:启用流式输出,生成的文本会逐步发送。
  • stream=False:禁用流式输出,生成的文本会一次性发送。

总结

  • max_tokens:控制生成内容的长度。
  • temperature:控制生成内容的随机性和创造性。
  • n:生成多个回答供选择。
  • top_p:通过概率控制生成内容的多样性。
  • presence_penalty:鼓励生成新内容,避免重复。
  • frequency_penalty:减少词语重复,提高多样性。
  • stream:控制生成的文本是否以流式方式逐步发送。

接口调用

Request方式调用

import os
import requestsfrom dotenv import load_dotenvload_dotenv()url = os.getenv('OPENAI_BASE_URL') + '/chat/completions'data = {"model": "gpt-3.5-turbo","n": 2,"messages": [{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "Hello!"}]
}headers = {"Authorization": 'Bearer' + os.getenv("OPENAI_API_KEY")
}response = requests.post(url, headers=headers, json=data)print(response.text)

SDK方式调用

from dotenv import load_dotenv
from openai import OpenAIload_dotenv()client = OpenAI()
response = client.chat.completions.create(model='gpt-3.5-turbo',messages=[{"role": "system","content": "You are a helpful assistant."},{"role": "user","content": "Hello!"}]
)print(response.choices[0].message.content)

常用接口调用

embeddings

文本向量化

from dotenv import load_dotenv
from openai import OpenAIload_dotenv()model = "text-embedding-ada-002"client = OpenAI()
response = client.embeddings.create(model='text-embedding-ada-002',input="Hello world!"
)print(response.data[0].embedding)

使用图片

import base64
from dotenv import load_dotenv
from openai import OpenAIload_dotenv()client = OpenAI()def encode_image(image_path):with open(image_path, "rb") as image_file:return base64.b64encode(image_file.read()).decode('utf-8')base64_image = encode_image('./cat.jpeg')response = client.chat.completions.create(model='gpt-4o',messages=[{"role": "user","content": [{"type": "text","text": "这张照片里有什么?"},{"type": "image_url","image_url": {"url": f'data:image/jpeg;base64,{base64_image}'}}]}]
)print(response.choices[0].message.content)

模型需要 'gpt-4o'

作业

使用代码统计token 数量开发控制台循环聊天

import tiktoken
from openai import OpenAI
from dotenv import load_dotenv# 用户最大输入TOKEN
MAX_TOKEN = 100
MAX_RESPONSE_TOKEN = 500load_dotenv()client = OpenAI()encoder = tiktoken.encoding_for_model('gpt-3.5-turbo')def content_tokens(text):tokens = encoder.encode(text)return len(tokens)def main():messages = [{"role": "system","content": "You are a helpful assistant."},]print("开始聊天吧,输入/bye退出")total_token = 0while True:user_input = input("用户: ")if user_input.strip().lower() == '/bye':breakuser_token = content_tokens(user_input)if user_token > MAX_TOKEN:print(f'您的输入超出token限制 max{MAX_TOKEN}, 当前{user_token}')continuetotal_token += user_tokenmessages.append({"role": "user","content": user_input})response = client.chat.completions.create(model='gpt-3.5-turbo',messages=messages,max_tokens=MAX_RESPONSE_TOKEN,temperature=0.7,top_p=1,n=1)assistant_message = response.choices[0].message.contentassistant_token = content_tokens(assistant_message)total_token += assistant_tokenprint(f"助手: {assistant_message}")print(f"用户tokens数:{user_token},助手tokeens数:{assistant_token},总token数:{total_token}")if __name__ == "__main__":main()

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

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

相关文章

day20 yum的详细的讲述

day20 yum的精讲 yum是centos 7中很重要的工具需要我们去了解和学习 1.学习的任务和背景 一般开发团队需要数据库的环境来测试程序 现在需要运维人员来协助在测试机器上Centos7上安装好 MySQL-5.6.43版本来作为前期迁移的准备的工作 同时== 配备好本地的yum源==方便后续软件包的…

Active Directory审核的常见误区(3)

一、忽略过时、未激活和孤立的用户帐户 存在未使用的用户帐户在AD域中是一个重大的安全隐患。离职员工和黑客可能会因此漏洞而去窃取企业的重要资源。这时候,制定处理离职员工的策略就显得至关重要,这包括禁用他的AD用户帐户、将他从电子邮件组中删除、撤销他对业务应用程序的…

java.net.UnknownHostException: upload-as0.qiniup.com: Name or service not known on问题排查

参考地址:https://blog.csdn.net/weixin_43700340/article/details/88393833 ping upload-as0.qiniup.com还有百度不通,但是局域网可以ping通ping网关可以ping通,ping公共地址也可以ping通如果直接ping百度的ip是可以通的通过上面的博客知道应该是DSN出了问题 也试过了这个命…

Java使用Amazon S3客户端实现前后端联动文件分片上传

在使用对象存储的时候,遇到超大文件上传的应用场景,可以通过前后端联动的方式,实现超大文件从前端直接向对象存储服务进行分片上传,具体实现过程如下: Maven依赖: <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</art…

IOMMU和IOVA

IOMMU和IOVA 默认情况下,任何硬件都可以访问整个系统,因此它可以在任何地方执行DMA 事务。这有许多安全隐患。例如,流氓和/或不可信进程(包括在VM (虚拟机)内运行的进程)可能使用硬件设备来读写内核空间,和几乎其他任何存储位置。为了解决这个问题,现代系统配备了输入输出…

linux无法连接宿主机网络问题

很奇怪,之前我是可以连接宿主机互联网的,突然有一天不行了, 没找到具体的原因, 网上找了一下怎么解决,网络就又好了, 先记录一下,有时间在研究。 1、在虚拟机中创建的“电脑”上,右键选则setting(设置)。 2、选择NAT模式,然后点击Edit--》virtual network editor,点…

Node.js 路由

我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。 因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参数。这一功能应当属于路由还是服务器(甚至作为一个模块自身的功能)? 我们需要的所有数据都会…

SageMath 9.3软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【051】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件)双击解压安装包安装,弹窗安装对话框点击下一步选择I accept,点击下一步默认,点击下一步默认文件夹,点击下一步安装路径选择D盘,点…

GoLand 2024软件下载与安装教程

1、安装包 扫描下方二维码关注「软知社」,后台回复【048】三位数字即可免费获取分享链接,无广告拒绝套路; 2、安装教程(建议关闭杀毒软件)下载并解压压缩包,双击exe文件安装,弹窗安装对话框点击下一步创建桌面快捷方式,点击下一步默认,点击安装等待安装过程运行软件,点…

VisualStudio快速更改方法签名

右键——快速操作和重构 更改方法签名 更改签名中,即可进行添加或删除 *****有道无术,术尚可求;有术无道,止于术。*****

eclipse xml Indent using spaces not work /eclipse xml 使用空格缩进功能未生效问题解决

eclipse xml Indent using spaces not work eclipse xml 使用空格缩进功能未生效问题解决 设置xml格式化配置Line width: 设置每行宽度Line width设定为80到100个字符。 Split multiple attributes each on a new line: 标签的每个属性都单独一行显示 Preserve whitespace in t…

【多线程】AQS详解

AQS是什么 AbstractQueuedSynchronizer是一个抽象的队列同步器,AQS利用模板方法模式解决了开发者在实现同步器时的复杂问题,提供了一个通用的加锁解锁框架。 AQS执行原理 AQS为实现的同步器提供了通用的执行框架,定义了对资源state的获取和释放流程。AQS核心思想是在CLH锁的…