上一篇文章,我们用Open AI的Completion接口实现了一个用户评论情感分析功能,有的人说有点大材小用了,那好吧,今天就给大家安排一个更高级的应用:聊天机器人,目前一些所谓的套壳大模型估计也是这么做的。
我们先把调用API代码封装到一个函数中。
想要实现问答,仍然要在Prompt提示词上做点文章,我们需要在提示词里,在问题之前加上 “Q :” 表示这是一个问题,然后另起一行,加上 “A :” 表示我想要一个回答,那么 Completion 的接口就会回答你在 “Q : ”后面的问题。例如,我们问 AI “AI都有哪些分支?”。
大模型就会列出所有分支。
先暂停一下,让我么看看Completion接口中的那些参数都是什么意思。
temperature参数:这个参数的输入范围是0-2之间的浮点数,代表输出结果的随机性,值越小随机性越小,设置为0,同一个问题,模型每次都输出同样的内容;值越大,回答越丰富多样,如何设置?要看业务场景,娱乐,自媒体这些富有创造性,容错性高的可以设置大一些;医疗,金融,法律相对要保守些。
engine参数:选择open ai发布的哪一个模型,这里我们使用的是 text-davinci-003。
prompt参数:提示语。
max_tokens参数:允许模型生成内容的最大token数量,我们这里用的 text-davinci-003 模型,允许最多有4096个token。需要注意,这个数量既包括你输入的提示语,也包括AI产出的回答,两个加起来不能超过4096个token,如果超过这个限制就会被截断。另外,调用API是按token数收费的,目前有些大模型支持200k上下文长度,如果不做限制,钱包就得瑟瑟发抖。
n参数:代表你希望AI给你生成几条内容供你选择,这个也需要根据用户场景设置。
stop参数:代表你希望模型输出的内容在遇到什么内容的时候就停下来,合理设置也可以避免不必要的token浪费。
让我们继续。
一般聊天机器人都支持多轮对话,需要在回答用户当前问题时能记住之前的对话,也就是上下文。
你虽然调用的是open ai的API,但它可不会为你保存上下文,这个还得你自己来做。
最简单的方法是把之前的聊天内容和当前的问题拼在一起传给大模型。例如:
眼尖的人立马会跳出来提出问题:刚才不是说text-davinci-003的最大token数是4096嘛,这么拼下去能记住几轮对话啊?
是的,采用这种方法,就必须采用token窗技术截断太早之前的对话。
也有的人说,不用担心,现在的模型都支持200k上下文长度了。
但这个长度早晚有用完的时候,所以,为了防患于未然,有人就提出了另一种方法,就是对之前的聊天内容使用大模型进行总结,然后把总结后的内容作为上下文和新问题一起传给大模型。
总结:
今天我们基于Completion接口实现了一个简易的聊天机器人,但如何保存聊天记录,为了防止提示词token数超过最大限制,如何实现token窗,以及如何实现对过往聊天内容的总结还没有涉及,这个留到下篇文章讲,届时我将介绍LangChain这个开源框架去实现这些功能。