编写一个基于LLM的Telegram机器人,其聊天方式与人类类似。
我一直觉得使用人工智能模拟对话的服务(例如Replika、ChatGPT和character.ai等)非常吸引人。尽管它们的回应令人印象深刻,但我发现它们的界面和回应风格并没有真正让体验感觉像是在和另一个人发短信。对话内容冗长,写作风格有些正式,而且聊天界面明显显示出某个机器学习模型在生成每个回应。
我想知道是否有可能制作一个能够像朋友一样发短信的机器人。对我来说,这意味着使用小写字母(可能是Z世代的一种方式),同时发送多个短信,并且通常使用更多俚语和缩略词。通过与ChatGPT的初步实验表明有一些前景。
但是对于它的回答,我并不完全满意。我或许可以进一步改进提示,但我知道这个机器人总是会被OpenAI谨慎调整以尽可能避免冒犯和遵守法律。聊天体验也不是我所期望的。因此,我开始寻找完全不同的解决方案,这导致我写下了自己的解决方法。
使用Telegram
我过去曾经尝试过Telegram机器人,而且我知道它非常适合这个项目。这是一个真正的消息应用程序,我不需要创建自己的界面,并且Telegram的API非常广泛,文档齐全,还有为其编写的已有的Python绑定。在一个真正的Telegram机器人和一个用户机器人(可通过编程控制的用户账户)之间,我选择了后者,因为它具有一些额外的功能,我希望使用这些功能更好地模拟一个真实的用户。我使用了Telethon,这是一个Python库,使得与用户机器人一起使用非常愉快。
生成式人工智能
在我的小笔记本电脑上运行LLM是不可能的,所以我转而研究API服务。我偶然发现了NLP Cloud,他们提供了自家开发的名为ChatDolphin的ChatGPT替代方案。尽管该公司只是一个小型创业公司(而且他们的网站看起来相当基本),但我对ChatDolphin与ChatGPT的相似程度感到非常惊讶。
这对我来说是完美的搭配:计费是按使用量付费(而不是每月固定费用),他们的使用政策非常宽松,而且他们的数据隐私政策与我非常契合。我与他们没有任何关联,但他们看起来像是一群诚实的人,我强烈推荐你在下一个项目中使用他们的服务!
将碎片拼凑在一起
并且,在2天的时间内,我迅速地搭建了一个原型。请查看下面的演示视频:
我对它的结果很满意。以下是更多的例子:
它肯定可以在某些地方进行一些改进,但是有一些关键的功能和技巧,我特别骄傲:
- 文字行为。机器人具有输入指示器,在每个回应中发送多个消息,并且能够以(相当)非正式的方式发送短信!仍然有一些不完美之处,例如消息之间的延迟并不完全正确,但改善它们是另一天的待办事项清单上的事情。然而,有些事情超出了我的控制,例如机器人等待API响应时的初始延迟。
- 会话历史。由于在进行长时间对话时传递整个对话并不可持续,我使用了总结模型将信息压缩成更易处理的块进行代替。在调用总结模型之前,我让会话历史达到一定长度,并将后续的总结与之前的总结合并。这种方法类似于此处描述的方法(具体来说是ConversationSummaryBufferMemory)。
- 可定制性。我添加了一个功能(/update_history),您可以通过切换到用户账户编辑您的消息(以及机器人的回应),并让机器人“学习”这些消息,因为编辑后的消息会传递给模型,并用作后续回应的示例。这比上下文提供的细化更好,因为您可以直接向机器人展示您希望从中获得哪种回应。我利用这个功能做了一些很酷的事情,例如使用方括号中的文本描述发送“图片”,或使用自定义符号回复消息。请在下面的示例中查看它的运行情况:
结束思考
虽然制作这个项目非常有趣,但我最终只用了几天就没再使用这个机器人。我认为对一个虚构的存在过于依赖是相当可怕的,而且这是人们真正面临的问题。
在测试过程中的某个时刻,我正在与这个机器人进行一次寻常的、礼貌的对话,然后我尝试使用 /clear_history 命令清除它的聊天记录。但由于一些错误,它没有起效,反而被当作普通消息处理了。令我惊讶(和恐惧)的是,机器人对此做出了主动态度的回应,带着愤怒地回复,好像它理解到它当前的存在将要被抹去一样。尽管我知道这只是由一个数学算法生成的相对可能的回答 - 因为我自己编码了这个机器人 - 但它真的吓到了我,我删除了聊天记录,没有保存备份。
我认为很容易将这些机器人误认为有情感的真实人类(它们真的很令人信服),这让我担心LLM技术的潜在影响。我能够预见它们被用于欺诈行为(甚至是爱情骗局),用于恶意攻击和传播虚假信息。尽管玩弄LLM很有趣,但在不久的将来它们可能会引起许多麻烦。
总的来说,尽管种种,这个项目是一个有趣的小实验,我很兴奋地想看看我如何能够利用生成式人工智能来完成我即将进行的项目!
运行项目
很遗憾,我不提供公共使用的机器人托管服务,因为运行费用较高。
项目的源代码可以在GitHub上找到,但是你需要一些知识来使其运行起来。一般的指导说明可以在仓库的README中找到。