#前情提要#
我想做一个基于我的私有数据的对话机器人。探索基于openAI实现个性化对话机器人(一)-CSDN博客
前文已经介绍如何使用fine-tuning模型构建自己的chatbot,但是fine-tuning模型也是一个基于概率的模型,由于AI团队使用的训练集数据的规模极大且繁多,你想通过这单次的微调就很快改变模型比较有难度。又陷入了:如何根据我提供的知识进行精准对话呢?
幸运的是目前OpenAI团队推出了Retrieve助手,它可以基于你提供的私有数据和你进行对话,这样我们不就可以站在巨人的肩膀上做事了吗哈哈哈^^
https://platform.openai.com/docs/assistants/tools/knowledge-retrieval
总的来说,要是想结合openAI现有的模型进行私域数据对话,目前有2个方案:
(1)fine-tuning---这个之前介绍过了
(2)assistants---AI助手(有assistants、chat和complete)
assistants下有三个主要功能:
Functions:函数调用功能,可以让assistants在对话中调用函数并返回结果
Code interpreter:代码解释器,允许 Assistants API 在沙盒执行环境中编写和运行 Python 代码,让您的助手迭代运行代码以解决具有挑战性的代码和数学问题。 代码解释器每次会话收费 0.03 美元。
Retrieval:检索工具,可基于文本数据进行检索后对话,主要支持pdf、docx、html、txt以及各种编程语言的后缀文件。该功能每个助手每天支付 0.20 美元/GB 的检索文件费用,就是费用与上传的文件大小有关。
附上tools的原文档地址:https://platform.openai.com/docs/assistants/tools
#本文目的#
本文主要介绍openAI的assistants功能,并且使用assistants的retrieval功能进行基于私域数据的chatbot。
注:小厮认为这retrieve的实现可以参考一下这篇文章使用 LangChain、Pinecone 和 LLM(如 GPT-4 和 ChatGPT)构建基于文档的问答系统_langchain pinecone-CSDN博客
一、在openAI界面构建一个个性化assistant
#参数说明#
Name是你创建的当前机器人助手的名字;
Introduction是这个小助手的介绍(相当于你提示他现在是个啥角色);
Model:当前机器人使用的(LLM)模型;
TOOLS:助手提供的三种工具,上面有介绍;
Files:使用TOOLS必备的私域文件,点击add上传
#步骤#
(1)create一个助手,这里叫xxx chatbot233:
(2)填写name、introduction和model,还有上传你的私域(个性化)文件:
这里注意两个地方:
a) retrieval支持的model只有 gpt-4-1106-preview和 gpt-3.5-turbo-1106两个,选别的model下面TOOLS的Retrieval会变灰。
b) FILES上传文件有些古怪,我当时传docx后缀真是4都传不上去,一直报文件类型不支持,后来我把word转成pdf后就好了???如果docx解析不了就试试pdf吧。
(3)开始对话
现在在最底下的文本框中输入你的问题,点击runs,你的专属chatbot就会根据你上传的文件内容回答你的问题啦。
二、利用python代码构建你的个性化assistants
from openai import OpenAI
import time
import os
# Upload a file with an "assistants" purpose
client = OpenAI(
api_key="你的openAPI key"
)
# import检索文件
file = client.files.create(
file=open("路径/文件", "rb"),
purpose='assistants'
)
# Add the file to the new assistant
assistant = client.beta.assistants.create(
name="TSL chatbot233",
instructions="你现在是我的客服小蜜,请根据上传文件内容回答客户问题",
model="gpt-4-1106-preview",
tools=[{"type": "retrieval"}],
file_ids=[file.id]
)
# create a chat thread to save message
thread = client.beta.threads.create()
# 将Messages关联到Thread
while True:
# 获取用户输入
user_input = input("请提问:")
message = client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_input,
file_ids=[file.id]
)
# 创建运行模型
run = client.beta.threads.runs.create(
thread_id=thread.id,
assistant_id=assistant.id)
# 获取gpt的answer
while run.status != "completed":
print(run.status)
time.sleep(5)
run = client.beta.threads.runs.retrieve(
thread_id=thread.id,
run_id=run.id
)
messages = client.beta.threads.messages.list(thread_id=thread.id)
print(messages.data[0].content[0].text.value)
直接运行就可以在终端进行对话: