如何使用OpenAI API从文档中提取数据?

我想从租赁协议中提取关键术语。

为此,我想将合同的PDF发送给一个AI服务,该服务必须以JSON格式返回一些关键术语。

有哪些不同的库和公司可以做到这一点?到目前为止,我已经探索了OpenAI API,但它并不像我想象的那么简单。

当使用ChatGPT界面时,它运作得很好,所以我以为使用API应该同样简单。

看起来我需要先读取PDF文本,然后再将文本发送给OpenAI API。

任何其他实现此目标的想法都将不胜感激。


回答:

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


你想要使用的是Assistants API

截至今天,有3个工具可用:

你需要使用知识检索工具。正如官方OpenAI文档中所述:

检索功能通过外部知识(如专有产品信息或用户提供的文档)增强助手。一旦文件被上传并传递给助手,OpenAI将自动将你的文档分块,索引并存储嵌入,并实现向量搜索以检索相关内容来回答用户查询。

我过去曾构建过一个客户支持聊天机器人。以此为例。在你的案例中,你希望助手使用你的PDF文件(我使用了knowledge.txt文件)。查看我的GitHubYouTube

customer_support_chatbot.py

import osfrom openai import OpenAIclient = OpenAI()OpenAI.api_key = os.getenv('OPENAI_API_KEY')# 步骤1:上传一个带有“assistants”用途的文件my_file = client.files.create(  file=open("knowledge.txt", "rb"),  purpose='assistants')print(f"This is the file object: {my_file} \n")# 步骤2:创建一个助手my_assistant = client.beta.assistants.create(    model="gpt-3.5-turbo-1106",    instructions="You are a customer support chatbot. Use your knowledge base to best respond to customer queries.",    name="Customer Support Chatbot",    tools=[{"type": "retrieval"}])print(f"This is the assistant object: {my_assistant} \n")# 步骤3:创建一个线程my_thread = client.beta.threads.create()print(f"This is the thread object: {my_thread} \n")# 步骤4:向线程添加一条消息my_thread_message = client.beta.threads.messages.create(  thread_id=my_thread.id,  role="user",  content="What can I buy in your online store?",  file_ids=[my_file.id])print(f"This is the message object: {my_thread_message} \n")# 步骤5:运行助手my_run = client.beta.threads.runs.create(  thread_id=my_thread.id,  assistant_id=my_assistant.id,  instructions="Please address the user as Rok Benko.")print(f"This is the run object: {my_run} \n")# 步骤6:定期检索运行以检查其状态是否已完成while my_run.status in ["queued", "in_progress"]:    keep_retrieving_run = client.beta.threads.runs.retrieve(        thread_id=my_thread.id,        run_id=my_run.id    )    print(f"Run status: {keep_retrieving_run.status}")    if keep_retrieving_run.status == "completed":        print("\n")        # 步骤7:检索助手添加到线程中的消息        all_messages = client.beta.threads.messages.list(            thread_id=my_thread.id        )        print("------------------------------------------------------------ \n")        print(f"User: {my_thread_message.content[0].text.value}")        print(f"Assistant: {all_messages.data[0].content[0].text.value}")        break    elif keep_retrieving_run.status == "queued" or keep_retrieving_run.status == "in_progress":        pass    else:        print(f"Run status: {keep_retrieving_run.status}")        break

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

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