提升用户体验:采用OpenAI助手API实现交互式聊天机器人

升级用户体验:借助OpenAI助手API打造人机互动聊天机器人

介绍

随着OpenAI推出ChatGPT和GPT 3模型,世界向使用集成AI的应用程序转变。在我们使用的日常应用程序中,从电子商务到银行应用程序,AI嵌入了应用程序的一部分,特别是大型语言模型。其中之一是OpenAI助手API,即聊天机器人。OpenAI最近发布了Beta版的助手API,这是一款旨在提升用户体验的工具。

学习目标

  • 学习创建具有特定指令的定制AI助手的过程。
  • 探索助手API中的持久性和无限长线程的概念。
  • 演示使用OpenAI库创建AI助手的过程,指定参数如名称、指令、模型和工具。
  • 学习创建运行以在特定线程上执行AI助手的过程。
  • 了解助手API的定价结构,考虑语言模型令牌、代码解释器会话和检索工具的使用等因素。

本文是Data Science Blogathon的一部分。Data Science博文马拉松。

什么是助手API?它能做什么?

OpenAI最近推出了助手API,目前处于Beta阶段。此API允许我们使用OpenAI大型语言模型和工具构建和集成AI助手到我们的应用程序中。公司为特定目的定制这些助手,并为其提供相关数据。这些助手的例子包括提供与天气相关信息的AI天气助手或回答与旅行相关问题的AI旅行助手。

这些助手是为了状态性而构建的。也就是说,它们在很大程度上保留了以前的对话,从而使开发人员不用担心状态管理,并将其交给OpenAI处理。典型的流程如下:

  • 创建助手,选择要加载的数据,使用的模型,助手的指令和要使用的工具。
  • 然后,创建线程。线程存储用户的消息和LLM的回复。该线程负责管理助手的状态,并由OpenAI负责管理。
  • 创建线程后,我们向其添加消息。这些是用户键入给AI助手的消息或助手的回复。
  • 最后,在该线程上运行助手。基于该线程上的消息,AI助手调用OpenAI LLM提供合适的响应,并可能在中间联系一些工具,我们将在下一部分讨论。

所有这些助手、线程、消息和运行都被称为助手API中的对象。除了这些对象,还有一个称为运行步骤的对象,它提供了助手在运行过程中所采取的详细步骤,从而提供了对其内部工作的见解。

工具——助手API的工具库

我们不断提到工具,那么它与OpenAI助手API有什么关系?工具就像武器,它允许助手API执行附加任务。这些包括OpenAI托管的工具,如知识检索和代码解释器。我们还可以使用函数调用定义自定义工具,但本文不涉及此内容。

因此,让我们详细了解剩下的工具。

  • 代码解释器:它在沙盒环境中解释Python代码,使助手API能够执行自定义的Python脚本。在数据分析等场景中非常有用,助手可以生成用于分析CSV数据的代码并运行它,然后提供用户响应。
  • 函数调用:开发人员可以定义自定义工具,允许助手通过利用这些工具及其输出逐步构建响应。
  • 检索:对于AI助手至关重要,它涉及提供分析所需的数据。例如,创建产品助手时,相关信息会被切分、嵌入并存储在向量存储中。当回答用户查询时,助手从知识库中检索这些数据。

构建我们的助手

在本节中,我们将介绍如何创建一个助手,向线程添加消息,并在该线程上运行助手。我们将从下载OpenAI库开始。

# 安装包含Assistants API的openai库!pip install openai

确保您使用的是最新版本(在撰写本文时,最新版本是v.1.2.3)。让我们从创建客户端开始。

# 导入os库以读取环境变量import os# 导入openai库以与Assistants API交互from openai import OpenAI# 将OPENAI API KEY存储在环境变量中os.environ["OPENAI_API_KEY"] = "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"# 通过提供API KEY创建我们的OpenAI客户端client = OpenAI(api_key = os.environ['OPENAI_API_KEY'])

创建助手

首先,我们从openai库导入OpenAI类。然后,我们将OpenAI API令牌存储在环境变量中。然后,用api_key作为变量实例化一个OpenAI类。client变量是OpenAI类的实例。现在是时候创建我们的助手了。

# 创建助手assistant = client.beta.assistants.create(    name="PostgreSQL专家",    instructions="您是一位PostgreSQL专家,可以用示例简单地回答任何问题",    model="gpt-4-1106-preview",    tools=[{"type":"retrieval"}])
  • 要创建助手,我们从assistants类调用create()方法,并传递以下参数
  • name:这是我们助手的名称。在此示例中,我们称之为PostgreSQL专家
  • instructions:这是提供给助手的上下文/附加信息。
  • model:助手将用于生成回复的模型。在这种情况下,我们使用了一种新推出的GPT-4预览模型
  • tools:这些是我们在前一节中讨论的工具,助手将使用它们来生成回复。我们将工具作为字典列表传递。在这里,我们使用检索工具来导入数据

加载文档

因此,我们已经创建并将助手分配给assistant变量。下一步是加载文档。

# 上传文件file = client.files.create(    file=open(        "/content/LearnPostgres.pdf",        "rb",    ),    purpose="assistants",)# 更新助手assistant = client.beta.assistants.update(    assistant.id,    file_ids=[file.id],)
  • 上面的代码是用来创建并导入文档到助手中。在这里,我有一个包含有关PostgreSQL学习信息的PDF(点击此处下载PDF)。
  • 我们使用OpenAI的files类使用create()方法将其创建为一个文件,并将“assistants”作为purpose变量的值传递给它,因为需要将其添加到助手中。
  • 在第二步中,我们使用已创建的文件更新助手。为此,我们调用update()方法,并传递助手ID(我们已经创建了一个助手对象,该对象包含唯一的ID)和文件ID(每个已创建的文件都有其唯一的ID)。

由于我们在助手配置中包含了检索工具,它会处理我们的LearnPostgres.pdf文件的分块,将其转换为嵌入式表示,并从中提取相关信息。

创建线程并存储消息

在这个部分,我们将创建一个Thread并向其添加Messages。首先我们将创建一个新的Thread。

# 创建一个Threadthread = client.beta.threads.create()

threads类的create()方法用于创建一个Thread。Thread代表一个对话会话。与assistants类似,Thread对象也有一个与之关联的唯一ID。注意,我们没有向它传递任何Assitant ID,这意味着Thread是独立的,与assistant没有耦合。现在,让我们向我们新创建的Thread添加一条消息。

# 向thread添加第一条消息message = client.beta.threads.messages.create(    thread_id=thread.id,    role="user",    content="如何在PostgreSQL中创建表")
  • 消息是包含用户查询和回复的对话块。要向Thread添加消息,我们使用messages类的create()方法,它接受以下参数
  • thread_id:与每个创建的Thread关联的唯一ID。在这里,我们传递了之前开始的Thread的thread ID。
  • role:谁是发送者/发送此消息?在我们的例子中,是用户。
  • content:这是用户的查询。在我们的例子中,我们给它设置为“如何在PostgreSQL中创建表。”

运行我们的助手

现在,我们通过在我们想要助手运行的Thread上创建一个Run来运行助手。

# 创建一个Runrun = client.beta.threads.runs.create(    thread_id=thread.id,    assistant_id=assistant.id)
  • 要创建一个Run,我们使用runs类的create()方法,并将Thread ID(即我们希望助手运行的Thread,也就是哪个对话会话)和Assistant ID(即哪个助手将运行)传递给它,并将其传递给run变量。
  • 创建一个Run不会产生响应。相反,我们需要等待Run完成。Run可以被视为一项异步任务,我们必须轮询Run是否已完成。

创建一个函数

该Object提供一个名为status的变量,其中包含特定Run的queued / in-progress / completed状态。为此,我们创建以下函数。

import time# 创建一个函数来检查Run是否已完成def poll_run(run, thread):    while run.status != "completed":        run = client.beta.threads.runs.retrieve(            thread_id=thread.id,            run_id=run.id,        )        time.sleep(0.5)    return run    # 等待Run完成run = poll_run(run, thread)
  • 在这里,我们创建了一个名为poll_run()的函数。这个函数接受我们前面创建的Run和Thread对象。
  • 当Run的status“completed”时,我们认为Run已处理完成。因此,我们轮询run来检查它的status是否已完成。
  • 在这个循环中,我们调用来自runs类的retrieve()方法,并传递Run ID和Thread ID。retrieve方法将返回带有更新status的相同Run对象。
  • 现在,我们每隔0.5秒检查一次Run对象,轮询其完成状态。
  • 如果Run的status变为completed,则返回Run。

在此Run步骤中,我们创建的助手将利用检索工具从指定与适用数据相关的可用数据调用模型中检索与用户查询相关的信息,并生成响应。这个生成的响应存储在Thread中。现在,我们的Thread有两条消息:一条是用户查询,另一条是助手的响应。

如何在对话中存储消息?

让我们把消息存储在我们的对话中。

# 从对话中提取消息messages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages:    print(f"{m.role}: {m.content[0].text.value}")
  • 在第一步中,我们通过调用messages类的list()方法提取对话中的所有消息。我们将要提取的对话消息的线程ID传递给该方法
  • 接下来,我们循环遍历列表中的所有消息并将其打印出来。我们上传到对话中的消息以及助理生成的消息存储在消息对象的message.content[0].text.value

上面的图片显示了助理的回复在上方,用户的查询在下方。现在,让我们发出第二条消息,测试助理是否能够访问先前的对话。

# 创建第二条消息message2 = client.beta.threads.messages.create(    thread_id=thread.id,    role="user",    content="给你创建的表添加一些值")# 创建一个Runrun = client.beta.threads.runs.create(    thread_id=thread.id,    assistant_id=assistant.id)# 等待Run方法完成run = poll_run(run, thread)# 提取消息messages = client.beta.threads.messages.list(thread_id=thread.id)for m in messages:    print(f"{m.role}: {m.content[0].text.value}")
  • 在这里,我们创建了另一条消息,名为message2,这次我们传递了查询“给你创建的表添加一些值。”这个查询涉及到先前的对话,因此将其传递给了我们的对话
  • 然后我们按照同样的步骤创建一个Run,用助理运行它,并进行轮询

最后,我们提取并打印出对话中的所有消息。

助理确实可以访问先前对话中的信息,并使用检索工具为所提供的查询生成响应。因此,通过OpenAI助理API,我们可以创建自定义助理,并在我们的应用程序中以任何形式集成它们。OpenAI还计划发布许多助力器API可用的工具。

助理API定价

助理API的计费根据所选择的模型和使用的工具而定。检索工具和代码解释器各自都有单独的费用。从模型开始,OpenAI的每个模型都有一个独立的费用,基于输入和输出令牌的数量。因此,有关模型定价,请点击这里查看所有OpenAI大型语言模型的价格。

至于代码解释器,其价格为每个会话0.03美元,默认情况下,每个会话的活动时间为一小时。一个会话与一个对话线程关联,因此如果您运行了N个线程,成本为N * 0.03美元。

另一方面,检索工具的定价为每GB每助理每天0.20美元。如果N个助理访问此工具,则价格为N * 0.2 /天。线程的数量不会影响检索的定价。

数据隐私和伦理关切

关于伦理关切和用户数据的使用,OpenAI将数据隐私放在首位。用户将是发送到OpenAI API的数据和从API接收的数据的唯一所有者。此外,OpenAI不会对用户数据进行训练,数据的存留期由用户控制。即使在OpenAI训练的自定义模型中,也只属于创建它们的用户。

OpenAI遵循严格的合规要求。它通过AES-256对数据进行静态加密,在传输过程中使用TLS 1.2+进行动态加密。OpenAI已通过SOC 2合规性审计,这意味着OpenAI对数据隐私和安全投入了严格的努力。OpenAI实施严格的访问控制,用于管理组织内部的数据访问权限。

结论

OpenAI助手API提供了一种将人工智能助手创建和集成到应用程序中的新方法。这些助手是为应对特定目的/任务而开发的。通过我们对API的功能和工具进行探索,包括代码解释器、信息检索和自定义工具的创建,我们发现开发人员现在拥有了强大的武器库。助手的状态性通过线程无缝管理,减轻了开发人员的负担,使他们能够专注于创建定制的人工智能体验。

重点提示

  • 助手API使开发定制的针对特定任务的人工智能助手成为可能。
  • 包括代码解释器和信息检索等工具扩展了人工智能助手的应用范围,使其能够运行定制的Python代码和访问外部知识。
  • API引入了持续和无限长的线程,简化了状态管理并为开发人员提供了灵活性。
  • 线程和助手是相互隔离的,允许开发人员利用重复的线程并运行其他助手。
  • 函数调用工具允许开发人员通过响应生成过程使用助手可以使用的自定义工具。

常见问题

参考资料

以下是关于OpenAI助手API的官方文档:

  • https://platform.openai.com/docs/assistants/overview
  • https://platform.openai.com/docs/api-reference/assistants

本文中显示的媒体不归Analytics Vidhya所有,而是由作者按照自己的决定进行使用。