浅尝 OpenAI 最新福利 Assistants API

00OpenAIAIChatGPTAPI

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-1106gpt-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 对象中指定的 modeltools 配置,我们也可以在创建 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)
© 00RSS