聊天机器人之接入智能回复(四)

智能回复实现思路

目前市场上有许多大语言模型,他能帮助我们更好的解决问题或者陪伴我们聊天。最先兴起的就是OpenAI的ChatGPT,但是我们国内使用不太方便。所以这里我使用咱们国内的平台做一个简单展示。

首先这里咱们使用的是讯飞星火认知大模型,这个提供了免费额度的API使用,推荐可以进行实名认证可以获取更多的额度。

具体实现就是利用前面俩篇文章提到的接收和发送消息的功能来组合实现,当咱们接收到某个消息的时候咱们可以把接收到的消息传递给语言模型,让他给我们回复,得到回复之后咱们再使用之前的发送接口,将信息发送回去,这样就实现了一个智能回复。

星火API 使用

我从官网下载了一个python使用案例,稍做修改,直接上代码。
SparkApi.py的代码

import _thread as thread
import base64
import datetime
import hashlib
import hmac
import json
from urllib.parse import urlparse
import ssl
from datetime import datetime
from time import mktime
from urllib.parse import urlencode
from wsgiref.handlers import format_date_timeimport websocket  # 使用websocket_client
answer = ""class Ws_Param(object):# 初始化def __init__(self, APPID, APIKey, APISecret, Spark_url):self.APPID = APPIDself.APIKey = APIKeyself.APISecret = APISecretself.host = urlparse(Spark_url).netlocself.path = urlparse(Spark_url).pathself.Spark_url = Spark_url# 生成urldef create_url(self):# 生成RFC1123格式的时间戳now = datetime.now()date = format_date_time(mktime(now.timetuple()))# 拼接字符串signature_origin = "host: " + self.host + "\n"signature_origin += "date: " + date + "\n"signature_origin += "GET " + self.path + " HTTP/1.1"# 进行hmac-sha256进行加密signature_sha = hmac.new(self.APISecret.encode('utf-8'), signature_origin.encode('utf-8'),digestmod=hashlib.sha256).digest()signature_sha_base64 = base64.b64encode(signature_sha).decode(encoding='utf-8')authorization_origin = f'api_key="{self.APIKey}", algorithm="hmac-sha256", headers="host date request-line", signature="{signature_sha_base64}"'authorization = base64.b64encode(authorization_origin.encode('utf-8')).decode(encoding='utf-8')# 将请求的鉴权参数组合为字典v = {"authorization": authorization,"date": date,"host": self.host}# 拼接鉴权参数,生成urlurl = self.Spark_url + '?' + urlencode(v)# 此处打印出建立连接时候的url,参考本demo的时候可取消上方打印的注释,比对相同参数时生成的url与自己代码生成的url是否一致return url# 收到websocket错误的处理
def on_error(ws, error):print("### error:", error)# 收到websocket关闭的处理
def on_close(ws,one,two):print(" ")# 收到websocket连接建立的处理
def on_open(ws):thread.start_new_thread(run, (ws,))def run(ws, *args):data = json.dumps(gen_params(appid=ws.appid, domain= ws.domain,question=ws.question))ws.send(data)# 收到websocket消息的处理
def on_message(ws, message):# print(message)data = json.loads(message)code = data['header']['code']if code != 0:print(f'请求错误: {code}, {data}')ws.close()else:choices = data["payload"]["choices"]status = choices["status"]content = choices["text"][0]["content"]print(content,end ="")global answeranswer += content# print(1)if status == 2:ws.close()def gen_params(appid, domain,question):"""通过appid和用户的提问来生成请参数"""data = {"header": {"app_id": appid,"uid": "1234"},"parameter": {"chat": {"domain": domain,"temperature": 0.5,"max_tokens": 2048}},"payload": {"message": {"text": question}}}return datadef main(appid, api_key, api_secret, Spark_url,domain, question):# print("星火:")wsParam = Ws_Param(appid, api_key, api_secret, Spark_url)websocket.enableTrace(False)wsUrl = wsParam.create_url()ws = websocket.WebSocketApp(wsUrl, on_message=on_message, on_error=on_error, on_close=on_close, on_open=on_open)ws.appid = appidws.question = questionws.domain = domainws.run_forever(sslopt={"cert_reqs": ssl.CERT_NONE})

具体使用代码 test.py,咱们这里使用v3的版本。

import SparkApi
#以下密钥信息从控制台获取
appid = "填写你自己的"     #填写控制台中获取的 APPID 信息
api_secret = "填写你自己的"   #填写控制台中获取的 APISecret 信息
api_key ="填写你自己的"    #填写控制台中获取的 APIKey 信息#用于配置大模型版本,默认“general/generalv2”
# domain = "general"   # v1.5版本
domain = "generalv3"   # v3.0版本
# domain = "generalv2"    # v2.0版本
#云端环境的服务地址
Spark_url = "wss://spark-api.xf-yun.com/v3.1/chat"  # v3.0环境的地址
# Spark_url = "ws://spark-api.xf-yun.com/v1.1/chat"  # v1.5环境的地址
# Spark_url = "ws://spark-api.xf-yun.com/v2.1/chat"  # v2.0环境的地址text =[]# length = 0def getText(role,content):jsoncon = {}jsoncon["role"] = rolejsoncon["content"] = contenttext.append(jsoncon)return textdef getlength(text):length = 0for content in text:temp = content["content"]leng = len(temp)length += lengreturn lengthdef checklen(text):while (getlength(text) > 8000):del text[0]return textdef get_answer(question):question = getText("user", question)SparkApi.main(appid, api_key, api_secret, Spark_url, domain, question)getText("assistant", SparkApi.answer)print(SparkApi.answer)return SparkApi.answerif __name__ == '__main__':text.clearwhile (1):Input = input("\n" + "我:")question = checklen(getText("user", Input))SparkApi.answer = ""print("星火:", end="")SparkApi.main(appid, api_key, api_secret, Spark_url, domain, question)getText("assistant", SparkApi.answer)# print(str(text))

运行代码效果

在这里插入图片描述

具体实现自动回信

这里咱们就需要对之前写的接收消息的代码进行修改。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : QS
# @QQ      : 376494614
# @File    : test_flask_reciver.pyimport requests
from flask import Flask, request, jsonify
from flask_cors import CORS
import json
from test import get_answerapp = Flask(__name__)port = 6999
url = "http://127.0.0.1"
test_url = f"{url}:{port}/"
post_url = f"{url}:{port}/send"headers = {"Content-Type": "application/json"
}def reply_msg(reciver, question):answer = get_answer(question)data = {"type": 1, "data": {"wxid": reciver, "msg": answer}}requests.post(post_url, headers=headers, data=json.dumps(data))@app.route('/reciver', methods=["POST"])
def diy_recive_msg():if request.method == 'POST':payload = request.get_data(as_text=True)# 按照顺序打印输出# payload = json.dumps(payload, sort_keys=True, indent=2, ensure_ascii=False)# print('[全数据]\r', payload)datas = json.loads(payload)print(datas)msg = datas["msg"]if "\u2005" in msg and "@" in msg:# 代表为atmsg_split = msg.split("\u2005")# 这里只有at当前用户一个人的时候生效if len(msg_split) < 2:returnif msg_split[0] == "@你的昵称":  # 这里引号内替换为你自己的昵称sender = datas["chatid"]reply_msg(sender, msg_split[1])if datas["type"] == 1:# 为私信sender = datas["wxid"]reply_msg(sender, msg)return datasif __name__ == '__main__':# 下面的代码是消息接收的部分# app.config.from_object(Config())app.config['JSON_AS_ASCII'] = FalseCORS(app, supports_credentials=True)# 开启定时任务# scheduler = APScheduler()# scheduler.init_app(app)# scheduler.start()app.run(host='127.0.0.1', port=6666, debug=True, use_reloader=False)

实现效果
在这里插入图片描述

终语

到这里一个简单的聊天机器人就实现了,你也可以通过调用其他库来实现不同的功能。比如说可以增加一个定时任务,去定时获取天气预报数据,来准时为你的朋友们来实现一个天气提醒功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/618894.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣题目超出时间限制,String和StringBuilder

2182. 构造限制重复的字符串 简单说下遇到的问题&#xff0c;代码就不细说了&#xff08;在最后&#xff09;&#xff0c;遇到只有超出时间限制的问题&#xff0c;然后看那案例真的无语&#xff0c;但再怎么计算我代码的时间复杂度&#xff0c;大概也就是O&#xff08;n&#…

Bean作用域及生命周期

关于Bean对象&#xff0c;在将其存储到spring中以后&#xff0c;在使用或读取该Bean对象时&#xff0c;如果该对象是公有的&#xff0c;难免就会出现被一方修改&#xff0c;从而影响另外一方读取到的对象准确性的情况。因此了解Bean的作用域和生命周期就是十分必要的了。 首先…

Fedora Linux 中安装 nginx

Fedora 35 中安装 nginx 的方法非常简单。 运行下面的命令&#xff1a; sudo dnf install nginx 在提示你需要确认的地方&#xff0c;输入 y 后回车即可。 开机自动启动 如果你希望在你的操作系统重启的时候自动启动 nginx&#xff0c;请输入下面的命令&#xff1a; syst…

【昕宝爸爸小模块】如何让Java的线程池顺序执行任务

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…

文本翻译GUI程序,实现简单的英汉互译

项目地址&#xff1a;mendianyu/txtTranslate: 文本翻译GUI程序&#xff0c;实现简单的英汉互译 (github.com) 文本翻译GUI程序&#xff0c;实现简单的英汉互译 项目结构 三个java文件加一个pom文件 项目运行效果 语言可选择en(英语) zh(汉语) auto(自动识别&#xff0c;仅源语…

序章 熟悉战场篇—了解vue的基本操作

了解vue 的基本目录&#xff1a; dist 是打包后存放的目录(后续可以改)node_modules 是依赖包public 是静态index页面src 是存放文件的目录assets 是存放静态资源的目录components 是存放组件的目录views 是存放页面文件的目录&#xff08;没有views 自己新建一个&#xff09;A…

使用FreeBASIC设计8051单片机汇编编译器

在STC论坛上看到有人用C语言实现8051汇编编译器&#xff08;源码&#xff09;&#xff0c;好奇下&#xff0c;试着用FB写了一下。 基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格&#xff08;数据来自网络&#xff0c;如果发现有误请联系QQ149…

为什么mysql的索引结构用B+树而不用skipList?

【学习笔记】B树和skipList的时间复杂度都是O(log n)&#xff0c;为什么mysql底层要用B树而不用skipList&#xff1f;_推导b树的查询效率为什么是o(logn)-CSDN博客 1.b树的非叶子节点存的是数据页地址&#xff0c;而跳表存的是真实数据&#xff0c;所以&#xff0c;在相同内存…

【InternLM 大模型实战】第四课

XTuner 大模型单卡低成本微调实战 FINETUNE简介指令跟随微调增量预训练微调LoRA & QLoRA XTuner简介功能亮点适配多种生态适配多种硬件 8GB 显卡玩转LLMFlash AttentionDeepSpeed ZeRO 动手实战环节环境配置微调准备配置文件模型下载数据集下载修改配置文件开始微调将得到的…

监督学习 - 神经网络(Neural Networks)

什么是机器学习 神经网络&#xff08;Neural Networks&#xff09;&#xff0c;也称为人工神经网络&#xff08;Artificial Neural Networks&#xff0c;ANNs&#xff09;是一种受到生物神经网络启发而设计的机器学习模型。神经网络由神经元&#xff08;或节点&#xff09;组成…

HTML标签(一)

目录 HTML语法规范 基本语法概述 标签关系 HTML基本结构标签 第一个HTML网页 开发工具 VSCode的使用&#xff1a; VScode工具生成骨架标签新增代码 文档类型声明标签 lang语言种类 字符集 总结 HTML常用标签 标签语义 标题标签 段落标签 换行标签 文本格式化…

unity urp 视差卡牌

总体效果大概四层&#xff0c;从后往前排序为&#xff1a;卡背、背景、画像、边框 首先卡背比较简单&#xff0c;只要判断如果网格的背面就直接采样卡背图片展示即可 资源准备&#xff1a; 然后是背景&#xff0c;网上找到一张这样的图。 但他还不符合要求&#xff0c;我们的…

Tomcat源码解析(一): Tomcat整体架构

Tomcat源码系列文章 Tomcat源码解析(一)&#xff1a; Tomcat整体架构 目录 一、Tomcat整体架构1、Tomcat两个核心组件功能2、Tomcat支持的多种I/O模型和应用层协议 二、Connector连接器1、连接器功能汇总2、ProtocolHandler组件2.1、Endpoint2.2、Processor 3、Adapter组件 三…

好大夫问诊数据爬虫记录

好大夫问诊数据爬虫入库字段记录 获取医生的病程列表 uid Column(Integer, primary_keyTrue, autoincrementTrue) gender Column(String(10)) # 性别 age Column(Integer) # 年龄 # 总交流次数 total_communication_times Column(Integer) # 医生回复次数 doctor_reply_t…

uniapp 编译后文字乱码的解决方案

问题: 新建的页面中编写代码&#xff0c;其中数字和图片都可以正常显示&#xff0c;只有中文编译后展示乱码 页面展示也是乱码 解决方案: 打开HuilderX编辑器的【文件】- 【以指定编码重新打开】- 【选择UTF-8】 然后重新编译就可以啦~ 希望可以帮到你啊~

synchronized锁升级

在 Java 中&#xff0c;synchronized 锁可以进行升级&#xff0c;以提高锁的效率。具体来说&#xff0c;当多个线程竞争同一个锁时&#xff0c;锁的状态会按照以下顺序进行升级&#xff1a; 无锁&#xff1a;没有其他线程竞争锁。偏向锁&#xff1a;一段同步代码一直被同一个线…

2024年海外推广怎么做?

要说如何做海外推广&#xff0c;绝大多数的外贸小伙伴都能说上一些&#xff0c;但是大部分人对于推广系统知识略知一二&#xff0c;没有构建一个系统化的知识框架。 海外推广的几大步骤 1.定策略 做海外推广前&#xff0c;我们需要制定一套营销策略&#xff0c;需要去定义一…

基本工具配置

github加速 github.ur1.fun java # ubuntu20.04 安装 openjdk-17-jdk sudo apt install openjdk-17-jdk java -version javac -version which java参考 openjdk gradle换源 修改gradle-wrapper.properties distributionBaseGRADLE_USER_HOME distributionPathwrapper/dis…

【Vue计算属性详细介绍】

Vue计算属性详细介绍 1. 计算属性2. 基本特点3. 定义方法4. Getter 和 Setter5. 计算属性 vs 方法6. 计算属性 vs 侦听器7. 限制 1. 计算属性 计算属性&#xff08;Computed properties&#xff09;是Vue框架中一个非常重要的概念&#xff0c;它们用于声明式地定义可供模板读取…

2023极客大挑战web小记

拿到题目提示post传参还以为是道签到题 刚开始直接把自己极客大挑战的username以及password怼上去&#xff0c;但是不对。看看F12&#xff0c;有提示。 当一个搜索蜘蛛访问一个站点时&#xff0c;它会首先检查该站点根目录下是否存在robots.txt&#xff0c;如果存在&#xff0c…