分享好友 最新动态首页 最新动态分类 切换频道
保姆级教程:如何用Python自制聊天机器人?
2024-12-26 14:46

导语 | 近日, ChatGPT 作为 2023 年最火的技术之一,它将人工智能的应用和发展推向了一个新的高度。各种大模型也雨后春笋般涌现,基于大模型的聊天机器人层出不穷,腾讯的混元大模型便是其中一大翘楚。如果你连不上混元大模型,本文也给出一种解决方案让你能跑起来代码,看得到效果。今天,我们特邀了小樱桃 CEO 杜金房老师,他将为我们介绍如何使用 Python 连接腾讯混元大模型制作一个聊天机器人,并介绍底层通信协议和实现原理。

作者简介

杜金房,小樱桃 CEO,北京信悦通科技创始人,烟台小樱桃网络科技创始人,FreeSWITCH 中文社区创始人,RTS 社区和 RTSCon 创始人,《FreeSWITCH 权威指南》、《Kamailio 实战》、《深入理解 FFmpeg》作者,FreeSWITCH 开源项目核心 Committer。致力打造 XSwitch 通信云平台,基于腾讯云建设。现在,他正在写一本新书《大道至简,给所有人看的编程书》,旨在带大家洞悉编程本质。写作过程中,以编程课的形式在微信小程序上滚动发布,便于读者追更。

引言

腾讯混元大模型(Tencent Hunyuan)是由腾讯研发的大语言模型,具备强大的中文创作能力,复杂语境下的逻辑推理能力,以及可靠的任务执行能力。可应用于聊天、文档、会议、广告、营销等各种场景。

如果你没有用过混元大模型,可以先在微信中搜索微信小程序“腾讯混元助手”体验一下。腾讯混元大模型也支持 API 调用,可以在 https://cloud.tencent.com/product/hunyuan 购买。下面的例子需要使用 API。

准备

下面步骤主要基于你已经熟悉 Python 程序,且已经有了一个腾讯云账号,并购买了混元大模型服务。

在第一次使用腾讯云 API 之前,我们首先需要在腾讯云控制台(https://console.cloud.tencent.com/cam/capi)上申请安全凭证,安全凭证包括 SecretID 和 SecretKey, SecretID 是用于标识 API 调用者的身份,SecretKey 是用于加密签名字符串和服务器端验证签名字符串的密钥。SecretKey 必须严格保管,避免泄露。

在 https://console.cloud.tencent.com/hunyuan 进入控制台,点击左侧菜单栏的“ API 密钥”,然后点击“新建密钥”按钮,生成一个 API 密钥。在后面的代码中我们将用到这个 API 密钥。

确保已经安装了 Python 开发环境,腾讯云 SDK 支持 Python 2 和 Python 3,但建议使用 Python 3。

首先,我们安装腾讯云 Python SDK:

其次,设置环境变量,在终端中输入以下命令,将 SecretID 和 SecretKey 替换成你的 API 密钥:

到此,环境就已准备好了。

快速体验

腾讯云提供了一个 Demo,可以从以下地址获取:

https://github.com/TencentCloud/tencentcloud-sdk-python/blob/master/examples/hunyuan/v20230901/chat_std.py

下载后,运行:python chat_std.py 随后,你将看到如下输出:

如果看到类似上面的内容,就表示成功了。当然,每次输出的内容都不一样。

输出调试信息

当然,上述示例也会打印一些调试信息,下面是其中的一条 JSON 示例。可以看出,大模型返回了一个 Note,应该是规避一些法律风险。Choices 是一个数组,里面包含了多个候选项;Delta 是增量数据;Role 是角色,这里是 assistant,表示大语言模型助手;而实际的内容在 Content 中。

GPT 的全称是 Generative Pre-trained Transformer,即生成式预训练大语言模型。这里的生成代表生成内容。一般来说,生成内容需要很高的算力,比较慢,需要一个过程,因此,现阶段几乎所有的大语言模型在成内容时都是渐近生成的。当你在使用 ChatGPT 等聊天的时候,也是看到字或词是一个一个“蹦”出来的。下面是几个 JSON 示例(简单起见,只放了 Delta 部分):

代码解析

下面是完整的示例代码,我在其中添加了详细的注释:

聊天

为了能愉快地聊天,我们还需要一个循环,这样可以不断地从控制台输入问题,然后得到回答。不过,控制台输入不是我们的重点,篇幅关系,在此就忽略了。

下面,我们讲一下聊天的逻辑。理论上,每次运行时,只需要更换 msg.Content = "你好,可以讲个笑话吗" 部分的代码,大模型就会输出不同的内容。这部分就是大家常说的“提示词”。

但是,大模型是非常健忘的。也就是说,它不记得它说过什么。如果你想跟大模型优雅地对话,你需要替它记住聊过的内容。我们将代码改成如下的样子:

从上述代码中,我们给 req.Messages 提供了三条信息,前两条是第一次的用户提问和应答,第三条是用户的第二次追问。这样,大模型就能根据对话的上下文生成新的内容。

在实际应用中,可以将问答交互的流程保存到内存列表对象中,也可以保存到数据库中,在下次提问时附上前面的内容就可以了。关于这一点,我们就不特别举例了。

值得一提的是,大模型对上下文的支持是有限制的,因此,列表不能无限的长。下面部分来自官方文档说明,供参考:

● 长度最多为 40, 按对话时间从旧到新在数组中排列。

● Message 的 Role 当前可选值:user、assistant,其中,user 和 assistant 需要交替出现 (一问一答),最后一个为 user 提问,且 Content 不能为空。

● Messages 中 Content 总长度不超过 16000 token,超过则会截断最前面的内容,只保留尾部内容。建议不超过 4000 token。

Token

大模型一般都使用 Token 做为输入和输出的计量单位,它代表了大模型计算能力。混元大模型中,1 token 约等于 1.8 个中文汉字或 3 个英文字母。在腾讯云平台上有一个 Token 计算器,可以帮助你计算 Token 数量。

进阶

上面我们讲了使用 Python 跟大模型聊天的关键点,并给出了一个完整的示例代码。考虑到篇幅关系,我们并没有写一个完整的客户端程序。下面的几种建议读者可以自行练习:

● 把聊天的历史记录记在内存中,每次请求提供上下文。

● 让 Python 脚本接受命令行输入,通过命令行版聊天。

● 使用 PyGUI 之类的客户端库做一个 GUI 程序,让用户可以更方便地使用。

● 在 Python 程序中增加一个 HTTP Server,然后再写一个前端的网页输入框,在浏览器中聊天。

自制大模型

考虑到现在腾讯混元大模型还需要申请才能使用,而且也并不是所有读者都能立即申请到大模型体验。下面,我们自己动手做一个简单的大模型,用于测试我们的程序,同时,也学习一下相应的底层交互原理。

实现HTTP Server

我们先实现一个简单的 HTTP Server,用于接收用户的输入,然后模拟大模型返回输出。这里我们使用一个轻量级的 Web 服务器。下面是完整的代码及注释:

写好后,存成 mock_server.py,执行 python mock_server.py 可以启动一个 Web 服务器,监听8080 端口。

接下来,我们可以打开另一个终端窗口,使用 curl 命令发一个请求,就可以看到返回的结果:

如果相看更详细的 HTTP 信息(包括请求和返回的 HTTP 头域),可以使用-v 参数:

发一个 POST 请求试试,随便传一个参数:

注意,在实际操作中,你看到的中文可能是 JSON 编码器转义过的,如这就是 “这” 这个字。

让聊天程序连接我们自己的大模型

上面我们已经准备好了一个大模型的模拟器,现在我们来修改一下聊天程序,让它连接我们自己的大模型。

首先,打开 chat_std.py,找到如下一行:

改成如下的样子,详见代码内注释。

保存后,运行 python chat_std.py,你将看到如下输出:

这就表示,我们的聊天机器人程序成功连接到了我们自制的大模型。这种通过 Mock 方式模拟的 API 服务器在开发中经常用到,它可以简化开发过程,人为制造一些流程和场景,甚至在做压力测试时也可以大大节省 Token 的费用。正所谓“磨刀不误砍柴工”。

SSE

最后,我们来说一下 SSE 协议。SSE 的全称是 Server-Sent Event,即服务端推送事件,是一个流式协议,用于 HTTP 长连接中的服务端事件推送。大模型类的聊天程序广泛使用了该协议,包括 ChatGPT 和腾讯混元大模型。

SSE 协议很简单,在 HTTP 输出头中增加 Content-Type: text/event-stream,然后在每次输出的数据前面加 data:(注意这里有一个空格),并在每次输出的数据后面加上两个换行符 。这样,客户端就可以通过 data: 来判断每次输出的数据了。上面例子中的数据输出就是 SSE,下面再写一遍加深印象:

如果一行数据比较长,也可以分成多行输出,但每行都要以 data: 开头,以 结尾,最后一行以 结尾。如(注意,下面是一个句子):

前面可以加一个 id:,表示数据的序号,这样客户端就可以判断数据的顺序了。如:

也可以给这个句子(事件)起个名字,如:

以冒号开头的行是一个注释,如:

HTTP 请求只能发送一次,服务端在 HTTP 连接不断开的情况下,可以一直推送数据,这也就是你在使用 ChatGPT 时经常看到的慢慢往外“蹦”字的效果。同样,用户的每次询问都需要重新发起一个新的 HTTP 请求。

理解SSE协议有助于理解程序跟大模型间的通信原理,从而更好地理解大模型及其API。

小结

最新文章
营销网站优化怎么做的
优化营销网站的过程涉及多方面的策略,以提高网站在搜索引擎中的排名、提升用户体验,并增加转化率。以下是一些关键步骤和策略:1. 关键词研究: - 使用工具(如Google Keyword Planner,SEMrush,Ahrefs)识别相关的、高搜索量的关键词。
让中国卖家赚更多的钱亚马逊的这场全球峰会为什么开在南京
这对一直称雄国际的亚马逊构成了不小的挑战。面对两大竞争对手,亚马逊被迫更新了对卖家的收费标准,对价格低于15美元的服装,收取佣金从17%削减至5%;价格在15美元至20美元之间的服装,佣金降至10%。会上,亚马逊发布了明年中国业务的战略
小红书推行“号店一体”,社区和商业化的博弈仍在持续
小红书正在进一步完善交易闭环。近日,小红书宣布,从8月2日起正式推行“号店一体”机制,建立新的账号体系和一系列政策。具体而言,“号店一体”调整生效后,将为小红书社区商业生态带来三个核心变化,包括账号体系、开店政策和账号与店铺
海外facebook帐号批发网,facebook 账号 购买
在当今数字化时代,社交媒体平台如Facebook已成为人们沟通和交流的重要工具。随着市场需求的增加,海外Facebook帐号批发网应运而生,成为许多企业和个人获取Facebook账号的便捷渠道。通过这些平台,用户可以快速购买到大量的Facebook账号,
阜新微信小程序自定义顶部导航栏颜色和透明头部
如果您在寻找阜新微信商城小程序、阜新商城小程序、阜新微信小程序的专家,您来对地方了!我们拥有20年的行业经验,能够为您的提供极佳的APP、阜新微信小程序、阜新商城小程序方案。今天应客户要求需要将阜新微信商城小程序导航栏的颜色成
西安微信小程序注册事项
说到微信小程序,可以说是这几年挺流行的。特别是因为小程序不需要下载任何软件,可以随身使用,非常方便。所以一旦上市,就受到很多朋友的喜欢。不过可能有朋友认为只有技术人员才能注册微信小程序。其实这个想法并不是特别正确,只要掌握
汽修工具品牌排行榜前十名每年变化大吗
汽修工具品牌排行榜前十名每年变化大吗?变化不算特别大。目前常见的前十名品牌有世达/SATA、博世/BOSCH、绿林/greener、史丹利/STANLEY、德力西/DELIXI、长城精工、捷科/JETech、宝工/Pro’sKit、得力工具、钢盾/SHEFFIELD 。像世达,它是
使用 Python 爬虫抓取汽车品牌市场数据:销量、广告与消费者反馈
在现代商业环境中,数据已经成为最重要的资产之一,尤其在汽车行业。汽车制造商、经销商以及广告商都依赖于市场数据来优化他们的营销策略、产品开发和品牌定位。对于研究汽车行业的市场趋势和消费者反馈,抓取不同汽车品牌的市场销量、广告
这一抹红色,是从未忘却的纪念
它是飘落在地球上的一根红飘带是贵州旅游打卡的新地标它是什么?全国首个以长征为主题的全域行浸式数字科技体验馆“红飘带”项目9259如果奇迹有颜色那一定是中国红那,这样的红色你见过吗?它取自赤水河边的泥岩之色象征长征的艰辛历程和革
百度推广和安全联盟认证已被取消,现为百度信誉V认证
目前,在百度搜索框中输入某些关键词并搜索到一些自然网站排名时,把鼠标移动到百度推广蓝色V认证上面,发现没有显示百度推广身份认证和安全联盟认证字样,而是显示V已经通过百度信誉认证。由此看来,百度已经将百度推广认证和安全联盟认证
相关文章
推荐文章
发表评论
0评