Assistant API中流式输出的开启方法

一、项目对比展现Assistant API优势

  • 在之前的项目中,使用Gradio搭建前端交互界面,借助Chat类API实现流式传输,并融入解析PDF文件的本地RAG流程。开发此项目不仅耗费大量时间,还需要编写大量代码。
  • 若采用Assistant API,仅需在创建对象时添加tools=[{"type":"file_search"}]参数,就能轻松实现功能更强大的本地知识问答。file_search工具可在OpenAI云服务器创建向量知识库,使Assistant对象具备精准的本地知识问答能力,且能解析更多文本类型,充分体现了Assistant API低代码、高精度的特性。

二、Assistant API流支持及实现方式

  1. 推出意义:2024年3月14日,OpenAI推出Assistant API的流支持,极大降低了利用该API构建可交互式聊天应用程序的门槛,实现实时通信和快速响应,提升用户体验。
  2. 实现方法
    • 基于WebSocket的直接实时通信:WebSocket是一种能在浏览器和服务端建立双向实时连接的网络通信协议。在在线游戏、实时聊天等需要前端和后端频繁实时互动的场景中应用广泛。其优势在于实时性强,无需频繁建立和断开连接,减少资源消耗,且支持双向通信,服务端和客户端可随时主动发送数据。
    • 模拟流:适用于不支持实时交互的老旧浏览器或特定项目环境。它通过长轮询和服务器发送事件(SSE)来实现。长轮询是客户端向服务器发送请求,服务器仅在有新数据时才响应,客户端收到响应后立即发起新请求,以此维持长时间的实时连接。SSE则是服务端有数据时推流给前端,推送完成后主动关闭,前端监测到事件流关闭后停止接收请求。模拟流因依赖标准HTTP请求和响应,理解和实现相对简单,在实际应用中更为常用。

三、Assistant API开启流式传输的方法

  1. 开启阶段:在Assistant API的run动态运行状态下,有三个阶段添加stream=true可开启流式传输。
    • create run用于创建run运行状态;
    • create thread and run将创建线程、追加message到线程并启用运行状态整合到一个接口;
    • submit tool outputs用于在识别到用户问题需调用外部工具且工具获取结果后,将结果提交到当前run运行状态以执行后续流程。
  2. 代码实现:构建应用实例时,遵循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时,绑定assistantthread对象,并添加stream=true参数开启流式传输。
  • 通过for循环遍历run对象,可获取每一个中间过程的数据。

四、Assistant API流式传输中的事件流

开启流式传输后,API返回openai.Stream对象,数据通过该对象逐渐推送,而非一次性返回完整结果。循环遍历run对象可获取丰富的事件流信息,如ThreadRunCreated表示运行创建事件,ThreadRunQueued表示排队事件,ThreadRunInProgress表示运行进行中事件等。每个事件都包含eventdata属性,这些事件流信息是理解和处理Assistant API流式输出的关键,开发者基于此进行进一步的开发和优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值