浅尝 OpenAI 最新福利 Assistants API
OpenAI 今天在开发者大会上发布了 Assistants API,现在可以自定义 AI 助手了。
之前使用 ChatGPT 基本靠提示词,联网功能、 DalleE3 画图功能、代码解析器不能一起工作,需要切换各种模式,相当受限。现在有了 Assistants 助理,可以一下子整合指令、模型、工具(包括各种 API)和私有知识库(文件)来完成对话。毫无疑问,功能更丰富也更灵活了,大大突破了提示词的局限。
什么是助手 API?
一些新的概念整理如下:

对象 | 释义 |
---|---|
Assistant | 使用 OpenAI 模型和调用工具的专用 AI |
Thread | 助理与用户之间的对话会话 |
Message | 由助理或用户创建的消息,包括文本、图像和其他文件。消息存储为线程中的列表。 |
Run | 在线程中调用助手。助手根据配置和线程的消息,调用模型和工具来执行任务。生成的消息会附加到线程。 |
Run Step | 助手运行时执行步骤的详细列表。“运行步骤”可以检查助手是如何获得最终结果的。 |
助手实际上是一个集合,可以自定义以下命令的组合,来帮助用户达成目标:
-
指令(Instructions):助手和模型要做什么,也就是之前我们已经很熟悉的提示词
-
模型:GPT-3.5 或 GPT-4 模型的型号。如果要用到检索工具(Retrieval tool),就需要指定
gpt-3.5-turbo-1106
或gpt-4-1106-preview
。 -
工具:使用
tools
参数可给予助手多达 128 个工具的访问权限。Assistants API 目前支持三种 OpenAI 官方的工具 :-
代码解释器(Code Interpreter)
-
检索(Retrieval)
-
函数(Functions):通过
function
调用第三方工具,可以自定义函数签名。未来 OpenAI 会发布更多工具,用户还可以共享已经定义好的 Assistants。
-
-
文件:使用
file_ids
参数给予工具访问文件的权限。文件使用File
opload endpoint 上传,并且必须将purpose
设置为assistants
才能与此 API 一起使用。每个助手最多可以附加 20 个文件,每个文件最大 512 MB。组织上传的所有文件不应超过 100 GB。
如何创建助手?
Assistants API 的典型流程是:创建助手—创建线程—添加消息—运行—显示。
步骤 1:创建助手
在 API 中自定义指令并选择模型来创建助手 ,可以启用代码解释器、检索和函数调用等工具。下面是一个创建数学老师的例子,需要开启代码解释器。
assistant = client.beta.assistants.create(
name="数学老师",
instructions="您是一名数学老师,请编写并运行代码来回答数学问题",
tools=[{"type": "code_interpreter"}],
model="gpt-4-1106-preview"
)
步骤 2:创建线程
线程和消息表示助理和用户之间的对话会话。建议在用户发起会话后,立即为每个用户创建一个线程,并在用户回复时将 Messages 添加进来。
thread = client.beta.threads.create(
messages=[
{
"role": "user",
"content": "Create 3 data visualizations based on the trends in this file.",
"file_ids": [file.id]
}
]
)
线程没有大小限制,支持任意多的消息。API 将使用如截断等技术,确保请求在最大上下文限制之内。
助理可以访问多种格式的文件 作为创建文件或对话的一部分。使用工具时,助理还可以创建文件(图像/电子表格等)并引用。例如,要创建基于 .csv
数据可视化的助手,先上传文件,然后用上传的文件创建助手。
file = client.files.create(
file=open("speech.py", "rb"),
purpose='assistants'
)
assistant = client.beta.assistants.create(
name="数据可视化助手",
instructions="你很擅长创建美观的数据可视化。请分析.csv文件中的数据,总结趋势,并将与趋势相关的数据进行可视化,并简要说明你观察到的趋势。",
model="gpt-4-1106-preview",
tools=[{"type": "code_interpreter"}],
file_ids=[file.id] #在助手级别传递的文件可由所有具有此助手的用户访问
)
步骤 3:在线程中添加消息
在用户提问时向线程添加消息 。消息包含用户的文本,以及上传的文件。目前不支持图像文件。
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="请帮助我解这个方程 `3x + 11 = 14`"
)
现在,如果你在线程中列出消息 ,会看到这条消息在创建线程时被添加到线程中:
{
"object": "list",
"data": [
{
"created_at": 1696995451,
"id": "msg_4rb1Skx3XgQZEe4PHVRFQhr0",
"object": "thread.message",
"thread_id": "thread_34p0sfdas0823smfv",
"role": "user",
"content": [{
"type": "text",
"text": {
"value": "请帮助我解这个方程 `3x + 11 = 14`",
"annotations": []
}
}],
...
第 4 步:运行助手
创建一个Run 来让助手响应用户消息。助手会读取线程,并决定是否调用工具或使用模型来回答用户查询。随着运行的进行,助手将消息附加到带有role="assistant"
的线程。
你可以选择在创建运行时向助手传递其他指令:
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
instructions="请称呼该用户为王总,他是我们的 VIP 会员。"
)
默认情况下,Run 将使用 Assistant 对象中指定的 model
和 tools
配置,我们也可以在创建 Run 时修改:
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
model="gpt-4-1106-preview",
instructions="additional instructions",
tools=[{"type": "code_interpreter"}, {"type": "retrieval"}]#启用代码解释器和检索
)
运行对象可以有多个状态。

状态 | 定义 |
---|---|
queued | 当首次创建队列或完成required_action 时,它们将(马上)移动到排队状态 in_progress 。 |
in_progress | 在进行中时,助手使用模型和工具来执行步骤。可以通过检查 RunSteps(运行步骤) 来查看 Run(运行)的进度。 |
completed | 运行完成。现在可以查看助手添加到线程的所有消息,以及 run 采取的所有步骤。可以向线程添加更多用户消息并创建另一个 Run 来继续对话。 |
requires_action | 当使用函数调用 工具时,一旦模型确定了要调用的函数的名称和参数,Run 将移动到required_action 状态。然后,必须运行这些函数并在运行继续之前提交输出 。如果在 expires_at 时间戳截止(约创建后 10 分钟)前未输出,则进入过期状态。 |
expired | 当函数调用在 expires_at 之前没有提交并且过期时,变成过期状态。此外,如果运行时间过长,超过了 expires_at 中规定的时间,系统也会终止运行。 |
cancelling | 可以尝试使用 Cancel Run 端点取消 in_progress 运行。一旦取消成功,运行状态将变为cancelled 。 |
cancelled | 已取消运行 |
failed | 可以通过查看 Run 中的 last_error 对象来查看失败的原因。失败的时间戳将记录在 failed_at 下。 |
第 5 步:显示助手的响应
这将在 queued
状态下创建运行。为了使运行状态保持最新,需要定期 检索 Run 对象,以确定应用程序下一步应该做什么。
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
运行完成后,可以检索助手添加到线程的消息。
messages = client.beta.threads.messages.list(
thread_id=thread.id
)
最后,将它们展示给用户。在此运行期间,助手向线程添加了两条新消息。
作用 | 内容 |
---|---|
user | 我需要解方程#1。你能帮帮我吗? |
assistant | 当然。为了求解方程(3x + 11 = 14) 和(x) ,你需要将(x) 隔离在方程的一侧。你可以这样做:从等式的两边减去 11 得到(3x = 3) 。然后,将两边除以 3,求解(x) 。让我为你计算一下(x) 的值。 |
assistant | 方程(3x + 11 = 14) 的解是(x = 1) 。 |