OpenAI应用实战
构建一个AI助手
Assistants API是一个提供了人工智能助手功能的API。它允许开发者集成各种助手功能,如自然语言理解、对话管理和任务执行,从而创建自定义的虚拟助手。
Assistants API 目前支持三种类型的工具:
代码解释器 Code Interpreter(步骤相关)
检索 Retrieval
函数调用 Function calling
以下是使用 Assistants API 标准流程:
通过定义其自定义指令并选择 LLM 来创建一个助手(Assistant)。如果有需求,可以添加文件并启用诸如代码解释器、检索和函数调用等工具。
当用户开始对话时,创建一个线程(Thread)。
当用户提问时,向线程添加消息(Messages)。
通过调用模型和工具在线程上运行助手以生成响应。
from openai import OpenAI
client = OpenAI()
# 第一步:
assistant = client.beta.assistants.create(
name="Lao Liu",
instructions="你是一个数学助手,擅长用中文解答数学问题。",
tools=[{"type": "code_interpreter"}],
model="gpt-4o" # 或确认模型名称正确,如 "gpt-4-turbo"
)
# 第二步:
thread = client.beta.threads.create()
# 第三步:
message = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content='请帮我解一个方程:3x + 2x + 8 = 5'
)
# 第四步:
# 1、等待处理完成之后,在得到所有结果
# run = client.beta.threads.runs.create_and_poll(
# thread_id=thread.id,
# assistant_id=assistant.id,
# instructions='请用“老刘”来称呼用户,并且用户拥有高级用户权限。'
# )
#
# print('run的状态为:'+ run.status)
# if run.status == 'completed':
# # 输出最终的结果
# messages = client.beta.threads.messages.list(thread_id=thread.id)
# print('\n消息:\n')
# for msg in messages:
# print(f'Role:{msg.role.capitalize()}')
# # print(msg)
# print(msg.content[0].text.value + '\n')
#2、采用流的方式来得到结果: 逐个token的返回
stream = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
instructions='请用“老刘”来称呼用户,并且用户拥有高级用户权限。',
stream=True # 采用持续的流方式来返回结果
)
# 遍历流中的事件
for event in stream:
# 返回的每一个token都是一个json对象
print(event.model_dump_json(indent=2, exclude_unset=True))
# 关闭和删除线程, 和助手
client.beta.threads.delete(thread_id=thread.id)
client.beta.assistants.delete(assistant_id=assistant.id)
构建一个AI助手
from openai import OpenAI
client = client = OpenAI()
# 第一步:
assistant = client.beta.assistants.create(
name='Lao Liu', # 助手的名称
instructions='你是一个Python高级程序员,根据消息生成可运行的Python代码。',
tools=[{'type': 'code_interpreter'}], # 指定的工具
model='gpt-4o'
)
# 第二步:
thread = client.beta.threads.create()
# 第三步:
message = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content='冒泡排序咋个写法?'
)
# 第四步:
# 1、等待处理完成之后,在得到所有结果
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id,
instructions='请用“老刘”来称呼用户,并且用户拥有高级用户全新。'
)
if run.status == 'completed':
# 输出最终的结果
messages = client.beta.threads.messages.list(thread_id=thread.id)
print('\n消息:\n')
for msg in messages:
print(f'Role:{msg.role.capitalize()}')
print(msg.content[0].text.value + '\n')
message = client.beta.threads.messages.create(
thread_id=thread.id,
role='user',
content='那红黑树呢?'
)
run = client.beta.threads.runs.create_and_poll(
thread_id=thread.id,
assistant_id=assistant.id,
instructions='请用“老刘”来称呼用户,并且用户拥有高级用户全新。'
)
if run.status == 'completed':
# 输出最终的结果
messages = client.beta.threads.messages.list(thread_id=thread.id)
print('\n消息:\n')
for msg in messages:
print(f'Role:{msg.role.capitalize()}')
print(msg.content[0].text.value + '\n')
GPT的图片输入
from openai import OpenAI
client = client = OpenAI()
# 处理在线图片
resp = client.chat.completions.create(
model='gpt-4-turbo',
messages=[
{
'role': 'user',
'content': [
{'type': 'text', 'text': '介绍一下这张图片'}, # 输入为文本数据
{'type': 'image_url', 'image_url': {
#最好是国外的
'url': 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg'
}}
]
}
],
max_tokens=400
)
print(resp.choices[0].message.content)
识别本地图片
import base64
import os
import requests
os.environ['http_proxy'] = '127.0.0.1:7890'
os.environ['https_proxy'] = '127.0.0.1:7890'
# 采用发送http请求的方式来调用:openai的接口。
def import_image(img_path, prompt='请介绍一下图片的内容', max_tokens=1000):
"""
把本地的图片数据作为大语言模型的输入,
本地的图片:必须要转换为Base64的编码
:param img_path:
:param prompt:
:param max_tokens:
:return:
"""
# 实现图片的Base64编码
def encode_image(path):
with open(path, 'rb') as f:
return base64.b64encode(f.read()).decode('utf-8')
base64_image = encode_image(img_path)
# 构建一个请求头
header = {
'Content-Type': 'application/json',
'Authorization': f'Bearer {os.getenv("OPENAI_API_KEY")}' # openai的认证token
}
# 构建请求负载
payload = {
'model': 'gpt-4-turbo',
'messages': [
{
'role': 'user',
'content': [
{'type': 'text', 'text': prompt}, # 输入为文本数据
{'type': 'image_url', 'image_url': {
'url': f'data:image/jpeg;base64,{base64_image}'
}}
]
}
],
'max_tokens': max_tokens
}
# 发送请求,
resp = requests.post('https://api.openai.com/v1/chat/completions', headers=header, json=payload)
# 处理和打印响应数据
if resp.status_code == 200: # 状态码为200才是成功的
resp_data = resp.json()
content = resp_data['choices'][0]['message']['content']
return content
else: # 请求失败
return f'请求失败,状态码为: {resp.status_code}, 失败的信息:{resp.text}'
print(import_image('./images/gdp_1980_2020.jpg'))
print('='*50)
print(import_image('./images/handwriting_0.jpg'))
这张图片是一个显示四个国家(美国、中国、日本和德国)从1980年到2020年间国内生产总值(GDP)比较的折线图。图中用不同的颜色表示不同的国家:蓝色代表美国,红色代表中国,紫色代表日本,绿色代表德国。
从图中可以看出,美国的GDP在这四十年间持续增长,到2020年接近20万亿美元。中国的GDP从1990年代开始显著增长,特别是进入2000年后增长速度加快,到2020年接近美国,显示出强劲的经济增长态势。日本的GDP增长在1990年代后期放缓并在2000年后持平,而德国的GDP增长相较于其他国家较为平稳,但增速较慢。
总的来说,这个图表清晰地展示了这四个经济大国在过去几十年的经济发展和变化趋势。
==================================================
这张图片显示了一本笔记本的一页,内容涉及深度学习和自然语言处理的相关知识点,主要写的是有关模型调整(Tuning)的各种方法。笔记内容详述不同的模型微调技术,包括Prompt Tuning和LoRA (Low-Rank Adaptation),这些技术通常用于提升小模型的性能。
1. **Prompt Tuning** 部分介绍了通过嵌入(Embeddings)和Transformer模型的调整来处理输入X和输出Y的关系。
2. **LoRA(Low-Rank Adaptation)** 部分则讨论了通过修改权重矩阵W的低秩逼近(Delta W = AB)来改善模型性能,其中A和B是低维矩阵。
此外,笔记中还提到了这些方法对模型存储大小的影响,比如LoRA与标准模型(LLaMA)的存储大小对比,显示LLaMA-653B版本需要78GB,而采用LoRA方法后只需要48GB。
整体而言,这页笔记展示了深入的技术细节和数学公式,反映出记录者在理解和应用先进的机器学习技术方面的努力。
进程已结束,退出代码为 0
生成图片的案例
# lsd
# 2025/6/21 16:25
import base64
from openai import OpenAI
client = OpenAI()
# resp = client.images.generate(
# model='dall-e-3',
# prompt='一只可爱的名字叫嘻嘻的一岁一个月的香槟色的泰迪犬',
# size='1024x1024',
# quality='standard',
# #生成两张图片
# n=1
#
# )
# print(resp.data[0].url)
resp = client.images.generate(
model='dall-e-3',
prompt='一只可爱的名字叫嘻嘻的一岁一个月的香槟色的泰迪犬,在海滩上奔跑',
size='1024x1024',
quality='hd',
n=1,
style='natural',#自然风格
response_format='b64_json'
)
print(resp)
b64_img = resp.data[0].b64_json
with open('./images/xixi.jpg', 'wb') as f:
#转二进制
f.write(base64.b64decode(b64_img))
TTS模型
from openai import OpenAI
client = OpenAI()
with client.audio.speech.with_streaming_response.create(
model='tts-1',
voice='echo',
input='二营长,你他娘的意大利炮呢?给我拉过来'
) as resp:
resp.stream_to_file('./audio/test1.mp3')
语言识别模型
转录:把语音转为文字和tts反过来的
转录代码:
from openai import OpenAI
client = OpenAI()
audio_file = open('./audio/test1.mp3','rb')
transcription = client.audio.transcriptions.create(
model='whisper-1',
file=audio_file,
)
print(transcription.text)
翻译:
from openai import OpenAI
client = OpenAI()
# audio_file = open('./audio/test1.mp3','rb')
#
# transcription = client.audio.transcriptions.create(
# model='whisper-1',
# file=audio_file,
#
# )
# print(transcription.text)
audio_file = open('./audio/test1.mp3','rb')
# 转录 + 翻译(翻译成英文)
translation = client.audio.translations.create(
model='whisper-1',
file=audio_file,
prompt='Translate into English'
)
print(translation.text)
音频中英文转换
#将相声音频翻译为英文输出
gdg_audio_file = open('./audio/gdg.mp3', 'rb')
english_gdg_audio_file = './audio/gdg_english.mp3'
# 转录 + 翻译(翻译成英文)
translation = client.audio.translations.create(
model='whisper-1',
file=gdg_audio_file,
prompt='Translate into English'
)
english_txt = translation.text
print(translation.text)
gdg_audio_file.close()
with client.audio.speech.with_streaming_response.create(
model='tts-1',
voice='onyx',
input=english_txt
) as response:
response.stream_to_file(english_gdg_audio_file)