引言
OpenAI在2023年11月6号的开发者大会上,发布了面向开发者的 Assistants API
,可以称得上是本厂发布会最大的亮点之一,另OpenAI开发者大为震撼。
此前,为构建基于LLM的应用(如各种Agent),众多AIGC的开发者和初创公司需要花费大量精力研发如何管理会话上下文、复用会话的Prompt。 包括使用 LangChain
的 PromptTemplate
和 Memory
等技术。
这也是构建AIGC应用的几个痛点
在开发者大会上,奥特曼列举的这些痛点,从而引入 Assistants API
。
- 状态管理
- Prompt 和 Content 管理
- 额外的能力
- 检索
OpenAI 从基建的维度解决这些问题,提供了相关的能力。 原本AIGC开发者和初创公司投入许多精力研发的功能,现在只需要几行简洁的代码就可以实现。
相当于把这些初创公司革命了。
什么是Assistant API
Assistants API
是一个开发者工具,它允许开发者在自己的应用程序中构建人工智能助手。这些助手根据指令 instructions
运作,并且可以利用模型 models
、工具tools
和知识库knowledge
来回应用户的查询。
当前,Assistants API
支持三种类型的工具:
- 代码解释器
Code Interpreter
- 检索
Retrieval
- 函数调用
Function calling
OpenAI计划在未来推出更多内置工具,并允许开发者在其平台上提供自己的工具。
为了方便开发者能够快速上手体验 Assistants API
, OpenAI还提供了Assistants playground 。
Assistants API
核心概念
下图包含了Assistants API
的核心概念和对象
- Assistant(助手): 这是一个特定目的的人工智能助手,它使用OpenAI的模型并调用工具来执行任务。开发者可以构建Assistant来响应用户的特定需求。
- Thread(线程): 这代表助手和用户之间的对话会话。线程存储消息,并自动处理内容截断,以适应模型的上下文限制。
- Message(消息): 由助手或用户创建的消息。消息可以包括文本、图像和其他文件类型,并以列表形式存储在线程上。
- Run(运行): 这是在线程上调用助手的一个实例。助手使用其配置和线程上的消息来通过调用模型和工具执行任务。作为运行的一部分,助手会向线程追加消息。
- Run Step(运行步骤): 这是助手在运行过程中所采取的详细步骤列表。助手可以在其运行过程中调用工具或创建消息。检查运行步骤可以让你内省助手是如何得出其最终结果的。
Assistant 如何工作
结合Assistants API
的设计初衷(状态管理、Prompt 和 Content 管理、额外的能力、检索), Assistant 是如何工作的
- 调用模型(Prompt 管理): 作为AI助手,调用LLM是最基础的能力。 Assistant可以根据特定的指令调用OpenAI的模型,这些指令用于调整其个性和能力,以便更好地适应特定的应用场景。
- 访问多种工具(Extend Capabilities): Assistant能够同时访问多个工具。这些工具可以是OpenAI托管的工具,如代码解释器和知识检索工具,也可以是开发者自己构建/托管的工具(通过函数调用)。
- 使用持久线程(会话管理、Context管理): Assistant可以访问持久的线程。线程通过存储消息历史并在对话对于模型的上下文长度过长时进行截断,简化了AI应用程序的开发。开发者创建一个线程后,只需在用户回复时向其追加消息即可。通过持久现成,Assistant 可以实现会话管理。
- 处理文件(Retrieval):Assistant可以处理多种格式的文件,无论是在创建时还是在助手与用户之间的线程中。使用工具时,Assistant还可以创建文件(例如,图像、电子表格等),并在它们创建的消息中引用这些文件。
Assistant 创建步骤
Step 1: Create an Assistant
首先,我们需要创建一个Assistant
代码语言:javascript复制client = OpenAI(
organization='org-xxxxx', # 替换为自己的organization id
)
assistant = client.beta.assistants.create(
name="Math Tutor",
instructions="You are a personal math tutor. Write and run code to answer math questions.",
tools=[{"type": "code_interpreter"}],
model="gpt-3.5-turbo-1106"
)
print(assistant.id)
此处调用 client.beta.assistants.create
创建了一个数学解题助手
参数名 | 描述 |
---|---|
name | "Math Tutor",指定了Assistant的名称。 |
instructions | 定义了Assistant的指令和它的角色。 |
tools | 列出了Assistant可以使用的工具,这里是代码解释器。 |
model | 指定了Assistant使用的OpenAI模型。 |
执行后,会打印出Assistant的id: asst_xxxx
Step 2: Create a Thread
一个线程代表一个对话:
代码语言:javascript复制thread = client.beta.threads.create()
print(thread.id)
执行后会打印thread.id: thread_xxx
Step 3: Add a Message to a Thread
向Thread中添加一条消息
代码语言:javascript复制message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content="I need to solve the equation `3x 11 = 14`. Can you help me?"
)
Step 4: Run the Assistant
运行assistants, assistants会读取线程并决定是调用工具(如果启用了)还是简单地使用模型来进行响应。
代码语言:javascript复制run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id,
)
print(run.id)
client.beta.threads.runs.create
是异步的
Step 5: Check the Run status
默认情况下, client.beta.threads.runs.create
会进入排队,我们可以通过 client.beta.threads.runs.retrieve
来查看 Run
是否执行完成
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
logger.info(run)
Step 6: Display the Assistant's Response
如果 Run
已经执行完成( status='completed'
), 就可以通过 client.beta.threads.messages.list
来获取 Assistant 的响应了:
messages = client.beta.threads.messages.list( thread_id=thread.id )
logger.info(messages)