我想从租赁协议中提取关键术语。
为此,我想将合同的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
文件)。查看我的GitHub和YouTube。
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