一、项目对比展现Assistant API优势
- 在之前的项目中,使用Gradio搭建前端交互界面,借助Chat类API实现流式传输,并融入解析PDF文件的本地RAG流程。开发此项目不仅耗费大量时间,还需要编写大量代码。
- 若采用Assistant API,仅需在创建对象时添加
tools=[{"type":"file_search"}]
参数,就能轻松实现功能更强大的本地知识问答。file_search
工具可在OpenAI云服务器创建向量知识库,使Assistant对象具备精准的本地知识问答能力,且能解析更多文本类型,充分体现了Assistant API低代码、高精度的特性。
二、Assistant API流支持及实现方式
- 推出意义:2024年3月14日,OpenAI推出Assistant API的流支持,极大降低了利用该API构建可交互式聊天应用程序的门槛,实现实时通信和快速响应,提升用户体验。
- 实现方法
- 基于WebSocket的直接实时通信:WebSocket是一种能在浏览器和服务端建立双向实时连接的网络通信协议。在在线游戏、实时聊天等需要前端和后端频繁实时互动的场景中应用广泛。其优势在于实时性强,无需频繁建立和断开连接,减少资源消耗,且支持双向通信,服务端和客户端可随时主动发送数据。
- 模拟流:适用于不支持实时交互的老旧浏览器或特定项目环境。它通过长轮询和服务器发送事件(SSE)来实现。长轮询是客户端向服务器发送请求,服务器仅在有新数据时才响应,客户端收到响应后立即发起新请求,以此维持长时间的实时连接。SSE则是服务端有数据时推流给前端,推送完成后主动关闭,前端监测到事件流关闭后停止接收请求。模拟流因依赖标准HTTP请求和响应,理解和实现相对简单,在实际应用中更为常用。
三、Assistant API开启流式传输的方法
- 开启阶段:在Assistant API的
run
动态运行状态下,有三个阶段添加stream=true
可开启流式传输。create run
用于创建run运行状态;create thread and run
将创建线程、追加message到线程并启用运行状态整合到一个接口;submit tool outputs
用于在识别到用户问题需调用外部工具且工具获取结果后,将结果提交到当前run运行状态以执行后续流程。
- 代码实现:构建应用实例时,遵循Assistant API标准流程。
from openai import OpenAI
# 构建OpenAI客户端对象的实例
client = OpenAI()
# Step 1. 创建Assistant对象
assistant = client.beta.assistants.create(
model="gpt-4o-mini-2024-07-18",
name="Good writer", # 优秀的作家
instructions="You are an expert at writing excellent literature" # 你是一位善于写优秀文学
)
# Step 2. 创建Thread对象
thread = client.beta.threads.create()
# Step 3. 向Thread中添加Message
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="写一篇关于一个小女孩在森林里遇到一只怪兽的故事。详细介绍她的所见所闻,并描述她的心里活动"
)
# 在Create Run的过程中, 添加stream=True参数,开启流媒体传输
print(f"assistant_id:{assistant.id}")
print(f"thread_id:{thread.id}")
run = client.beta.threads.runs.create(
assistant_id=assistant.id,
thread_id=thread.id,
stream=True # 开启流式传输
)
#run变成openai的stream对象
print(run)
for event in run:
print(event)
- 首先实例化
OpenAI client
,使用client.assistants.create
创建assistant
对象,设置模型(如gpt-4o-mini-2024-07-18
)、名称(如“Good writer”)和指令(如“You are an expert at writing excellent literature” )。 - 接着通过
client.threads.create
创建thread
对象,再利用client.threads.messages.create
向线程中追加提问信息,指定线程ID、用户角色和具体问题内容。 - 在
create run
时,绑定assistant
和thread
对象,并添加stream=true
参数开启流式传输。 - 通过
for
循环遍历run
对象,可获取每一个中间过程的数据。
四、Assistant API流式传输中的事件流
开启流式传输后,API返回openai.Stream
对象,数据通过该对象逐渐推送,而非一次性返回完整结果。循环遍历run
对象可获取丰富的事件流信息,如ThreadRunCreated
表示运行创建事件,ThreadRunQueued
表示排队事件,ThreadRunInProgress
表示运行进行中事件等。每个事件都包含event
和data
属性,这些事件流信息是理解和处理Assistant API流式输出的关键,开发者基于此进行进一步的开发和优化。