OpenAI Assistants API: 如何上传文件并将其用作知识库?

我的目标是创建一个聊天机器人,我可以向其提供一个包含大量文本的文件,然后使用OpenAI Assistants API在查询聊天机器人时实际使用该文件。我将使用gpt-3.5-turbo模型来回答问题。

我目前的代码如下:

file_response = client.files.create(   file=open("website_content.txt", "rb"),   purpose="assistants")query_response = client.assistants.query(   assistant_id="my_assistant_id",    input="Tell me about xxx?",   files=[file_response['id']] )

然而,这并不起作用,我认为可能有几个原因。首先,我并不完全理解它应该如何工作,所以我在寻找一些指导。我已经通过仪表板创建了一个助手,但现在我想只上传一个文件然后查询它。我是否需要使用其他东西,比如通过API的“threads”,还是不需要?

我该怎么做?


回答:

注意:下面的代码适用于OpenAI Assistants API v1。在2024年4月,OpenAI Assistants API v2发布。请查看迁移指南


我创建了一个客户支持聊天机器人,并制作了一个关于它的YouTube教程

过程如下:

步骤1:上传一个带有“assistants”用途的文件

my_file = client.files.create(  file=open("knowledge.txt", "rb"),  purpose='assistants')

步骤2:创建一个助手

my_assistant = client.beta.assistants.create(    model="gpt-3.5-turbo-1106",    instructions="您是一个客户支持聊天机器人。使用您的知识库来最佳地回应客户查询。",    name="Customer Support Chatbot",    tools=[{"type": "retrieval"}])

步骤3:创建一个线程

my_thread = client.beta.threads.create()

步骤4:向线程添加消息

my_thread_message = client.beta.threads.messages.create(  thread_id=my_thread.id,  role="user",  content="在您的在线商店里我可以买到什么?",  file_ids=[my_file.id])

步骤5:运行助手

my_run = client.beta.threads.runs.create(  thread_id=my_thread.id,  assistant_id=my_assistant.id,)

步骤6:定期获取运行状态以检查其是否已完成

keep_retrieving_run = client.beta.threads.runs.retrieve(    thread_id=my_thread.id,    run_id=my_run.id)

步骤7:一旦运行状态为“completed”,检索助手添加到线程中的消息

all_messages = client.beta.threads.messages.list(    thread_id=my_thread.id)print(f"用户: {my_thread_message.content[0].text.value}")print(f"助手: {all_messages.data[0].content[0].text.value}")

查看完整代码

重要说明

助手有时可能会表现得有些奇怪。Assistants API仍处于测试阶段,似乎OpenAI在保持其可靠性方面遇到了困难,正如官方OpenAI论坛上所讨论的那样。

助手有时可能会回答说它无法访问您上传的文件。您可能会认为自己做错了什么,但如果您稍后或第二天运行相同的代码,助手将成功访问所有文件并给出答案。

我得到的奇怪回应如下:

  • 助手: 我目前无法访问您上传的文件。您能提供一些关于您销售的产品或您有什么具体问题吗?
  • 助手: 我目前无法直接访问您上传的文件内容。但是,如果您能提供一些细节或具体问题,我很乐意帮助您找到所需的信息。
  • 助手: 我目前无法查看您上传的文件的具体内容。您能提供更多关于文件或其内容的细节,以便我进一步帮助您吗?
  • 助手: 我看到您上传了一个文件。我可以如何帮助您处理它?

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注