随着Chatgpt的发布以及随后的生成AI的普遍兴奋,聊天机器人也收到了新的炒作。上一代聊天机器人没有期望,有些人已经被称为中等死亡。好吧,似乎他们错了。
今天,我们将尝试使用聊天机器人来解决许多SaaS创业公司面对的关键问题 - 产品越复杂 - 解释它的作用以及它与竞争对手的差异越难。我们可以向LLM模型传授所需的知识并构建聊天机器人,该聊天机器人可以可靠地回答How is Codesphere's service different from Vercel?
类型的问题,以便后来将其嵌入着陆页中?让我们找出答案。
我们的示例聊天机器人的代码将少于500行,并将使用Python和Flask作为Web服务器实现。关于模型,我们有两个可用的选项:
1。创建自定义模型:
- 它将针对我们的特定用例进行专门培训。
- 培训过程可能很昂贵。
- 我们需要自己创建数据集。
2。使用多功能的预训练模型,例如chatgpt:
- 它已经受过训练。
- 它需要少量使用费用。
- 它没有专门为我们的用例培训。
- 模型的培训数据仅延长到一定日期。
目前,我们将使用OpenAi的Chatgpt API,因为它非常容易入门,这对跟随的任何人都非常有用。
代码:https://github.com/codesphere-cloud/usp-chatbot-blog
Live Demo(受我们API信用的可用性约束):https://41764-3000.2.codesphere.com/
您也可以单击一键在CodeSphere中部署免费工作区。如果您没有创建一个免费帐户:https://signup.codesphere.com/
然后使用它直接部署:https://codesphere.com/https://github.com/codesphere-cloud/usp-chatbot-blog
我们已经在考虑使用CodeSphere中的自托管Llama2测试相同的用例 - 请在我们即将发行的博客文章之一中关注它。
用户界面的开发
我们的网站需要一种表格,用户可以通过该表格向聊天机器人提出问题。通过使用HTML表单可以轻松实现这一点。然后,我们将使用JavaScript拦截表单提交。用户的问题将插入HTML模板中,并添加到聊天历史记录中。随后,我们将向API发送get请求,并以相同的方式将收到的答案附加到聊天记录中。
python脚本:
app = Flask( __name__ )
app.static_folder = 'static'
@app.route("/")
def home():
now=datetime.now()
time=now.strftime("%H:%M")
return render_template("index.html", time=time)
@app.route("/get")
def get_bot_response():
userText = request.args.get('msg')
response = chatbot_response(userText)
return response
if __name__ == " __main__":
port=int(os.environ.get("PORT", 3000))
app.run(host="0.0.0.0", port=port)
Web服务器的第一个功能是使用HTML文件向用户显示接口。我们将当前时间添加到网页中,以便聊天机器人的第一条消息将具有当前的时间戳。第二个功能负责接收用户问的问题并寄回聊天机器人的响应。在第三行中,我们从GET请求中得到问题。然后,这个问题将传递给chatbot_response
函数,该功能生成答案。最后,我们将生成的答案发送回用户。
生成响应:
f=open("onepager_developer.txt", "r")
onepager_developer=f.read()
f.close()
def chatbot_response(question):
input_data=[
{"role": "system", "content" : str("You are a chatbot on codespheres website.You need to compare codesphere with alternatives in 3 short bullet points. With the following context:\n"+onepager_developer)},
{"role":"user", "content": str(question)}]
completion = openai.ChatCompletion.create(
model="gpt-3.5-turbo",
messages = input_data
)
response_gpt=json.loads(str(completion))
data=response_gpt["choices"][0]
reason_to_stop=data["finish_reason"]
if reason_to_stop == "stop":
response=data["message"]["content"]
response=response.replace("\n", "<br>")
else:
response="An error occurred."
return response
对于此项目,我们将使用OpenAI的“ GPT-3.5-Turbo”模型。首先,我们需要使用命令pipenv install openai
下一步安装库,我们为库提供了我们的API密钥来提出请求。我们创建一个对话列表,为模型提供其他信息。这使我们能够克服未针对此应用程序进行专门培训的模型的限制,并且缺乏截止日期后发生的信息。在对话列表中,我们首先告诉模型如何响应以及响应的外观。
然后,我们为模型提供有关我们主题的信息,在这种情况下,代码。之后,用户的问题包含在对话中,并以user
的角色向模型呈现,我们将OpenAI库的角色告知我们要使用的模型并提供先前生成的数据,因此该模型具有更多信息来生成响应。由于响应以JSON格式返回,因此将字符串转换为JSON以方便访问数据。
处理JSON响应:
如果模型将stop
返回为finish_reason
,则意味着不会发生错误,我们可以提取消息。但是,如果在一代期间发生错误,则响应将为An error occurred.
。要在网页上正确显示答案,我们使用<br>
创建新的行而不是\n
。使用替换函数替换。
改善响应:
OpenAI的答案仍然相对通用。为了改善它们,我们将提供TXT文件的上下文放置到存储库中。 CHATGPT或更好的聊天机器人将在字面上使用此文件中提供的上下文,我们必须使用几个版本来获得一些可接受的结果,并且我们相信这里仍然有很大的改进空间。我们的背景越好 - 我们的聊天机器人朋友作为事实提出的结果越好。
在实际将其显示在登陆页面上之前,UI设计也需要改进,但这是我要说的另一篇文章的话题。
结论:
创建聊天机器人并不像人们想象的那样困难,尤其是在使用预训练模型时。尽管这些模型可能没有精确的知识并且有一定的截止日期,但在给定信息中运行时,它们仍然可以提供良好的答案。
快乐编码!