集成Netty

项目github链接

通过上一节的学习我们已经可以训练得到一只傲娇的聊天AI_PigPig了。

本章将介绍项目关于Netty的集成问题,在集成Netty之后,我们的AI_PigPig可以通过web应用与大家日常互撩。
由于只是一个小测试,所以不考虑性能方面的问题,在下一章我们将重点处理效率难关,集成Redis。

关于Netty的学习大家可以看我的另一篇文章,本节中关于Netty部分的代码改编自该文章中的netty聊天小练习,文章中会有详细的讲解。

Python代码改动

首先对测试训练结果的代码进行改动,将输入输出流重定向自作为中间媒介的测试文件中。

完整代码链接

with tf.Session() as sess:#打开作为一次会话# 恢复前一次训练ckpt = tf.train.get_checkpoint_state('.')#从检查点文件中返回一个状态(ckpt)#如果ckpt存在,输出模型路径if ckpt != None:print(ckpt.model_checkpoint_path)model.saver.restore(sess, ckpt.model_checkpoint_path)#储存模型参数else:print("没找到模型")#测试该模型的能力while True:#从文件中进行读取#input_string = input('me > ')#测试文件输入格式为"[内容]:[名字]"#eg.你好:AI【表示AI的回复】#你好:user【表示用户的输入】with open('./temp.txt','r+',encoding='ANSI') as myf:#从文件中读取用户的输入line=myf.read()list1=line.split(':')#长度为一,表明不符合输入格式,设置为"no",则不进行测试处理if len(list1)==1:input_string='no'else:#符合输入格式,证明是用户输入的#input_string为用户输入的内容input_string=list1[0]myf.seek(0)#清空文件myf.truncate()#写入"no",若读到"no",则不进行测试处理myf.write('no')# 退出if input_string == 'quit':exit()#若读到"no",则不进行测试处理if input_string != 'no':input_string_vec = []#输入字符串向量化for words in input_string.strip():input_string_vec.append(vocab_en.get(words, UNK_ID))#get()函数:如果words在词表中,返回索引号;否则,返回UNK_IDbucket_id = min([b for b in range(len(buckets)) if buckets[b][0] > len(input_string_vec)])#保留最小的大于输入的bucket的idencoder_inputs, decoder_inputs, target_weights = model.get_batch({bucket_id: [(input_string_vec, [])]}, bucket_id)#get_batch(A,B):两个参数,A为大小为len(buckets)的元组,返回了指定bucket_id的encoder_inputs,decoder_inputs,target_weights_, _, output_logits = model.step(sess, encoder_inputs, decoder_inputs, target_weights, bucket_id, True)#得到其输出outputs = [int(np.argmax(logit, axis=1)) for logit in output_logits]#求得最大的预测范围列表if EOS_ID in outputs:#如果EOS_ID在输出内部,则输出列表为[,,,,:End]outputs = outputs[:outputs.index(EOS_ID)]response = "".join([tf.compat.as_str(vocab_de[output]) for output in outputs])#转为解码词汇分别添加到回复中print('AI-PigPig > ' + response)#输出回复#将AI的回复以要求的格式进行写入,方便Netty程序读取with open('./temp1.txt','w',encoding='ANSI') as myf1:myf1.write(response+':AI')

Netty程序

完整代码参见链接netty包下。

在原本的ChatHandler类中添加了从文件中读取数据的方法readFromFile,以及向文件中覆盖地写入数据的方法writeToFile。

    //从文件中读取数据private static String readFromFile(String filePath) {File file=new File(filePath);String line=null;String name=null;String content=null;try {//以content:name的形式写入BufferedReader br=new BufferedReader(new FileReader(file));line=br.readLine();String [] arr=line.split(":");if(arr.length==1) {name=null;content=null;}else {content=arr[0];name=arr[1];}br.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return content;}//向文件中覆盖地写入private static void writeToFile(String filePath,String content) {File file =new File(filePath);try {FileWriter fileWriter=new FileWriter(file);fileWriter.write("");fileWriter.flush();fileWriter.write(content);fileWriter.close();} catch (IOException e) {e.printStackTrace();}}

对原来的channelRead0方法进行修改,将输入输出流重定向到临时文件中。

    @Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {System.out.println("channelRead0");//得到用户输入的消息,需要写入文件/缓存中,让AI进行读取String content=msg.text();if(content==null||content=="") {System.out.println("content 为null");return ;}System.out.println("接收到的消息:"+content);//写入writeToFile(writeFilePath, content+":user");//给AI回复与写入的时间,后期会增对性能方面进行改进Thread.sleep(1000);//读取AI返回的内容String AIsay=readFromFile(readFilePath);//读取后马上写入writeToFile(readFilePath,"no");//没有说,或者还没说if(AIsay==null||AIsay==""||AIsay=="no") {System.out.println("AIsay为空或no");return;}System.out.println("AI说:"+AIsay);clients.writeAndFlush(new TextWebSocketFrame("AI_PigPig在"+LocalDateTime.now()+"说:"+AIsay));}

客户端代码

<!DOCTYPE html>
<html><head><meta charset="utf-8" /><title></title></head><body><div>发送消息:</div><input type="text" id="msgContent"/><input type="button" value="点我发送" onclick="CHAT.chat()"/><div>接受消息:</div><div id="receiveMsg" style="background-color: gainsboro;"></div><script type="application/javascript">window.CHAT = {socket: null,init: function() {if (window.WebSocket) {CHAT.socket = new WebSocket("ws://192.168.0.104:8088/ws");CHAT.socket.onopen = function() {console.log("连接建立成功...");},CHAT.socket.onclose = function() {console.log("连接关闭...");},CHAT.socket.onerror = function() {console.log("发生错误...");},CHAT.socket.onmessage = function(e) {console.log("接受到消息:" + e.data);var receiveMsg = document.getElementById("receiveMsg");var html = receiveMsg.innerHTML;receiveMsg.innerHTML = html + "<br/>" + e.data;}} else {alert("浏览器不支持websocket协议...");}},chat: function() {var msg = document.getElementById("msgContent");CHAT.socket.send(msg.value);}};CHAT.init();</script></body>
</html>

测试结果

客户端发送消息

用户与AI日常互撩

集成Netty|tensorflow实现 聊天AI--PigPig养成记(2)相关推荐

  1. 引入Redis|tensorflow实现 聊天AI--PigPig养成记(3)

    引入Redis 项目github链接 在集成Netty之后,为了提高效率,我打算将消息存储在Redis缓存系统中,本节将介绍Redis在项目中的引入,以及前端界面的开发. 引入Redis后,完整代码链 ...

  2. 使用TensorFlow.js的AI聊天机器人三:改进了文本中的情感检测

    目录 使用通用语句编码器设置TensorFlow.js代码 GoEmotion数据集 通用句子编码器 训练AI模型 让我们发现情绪 终点线 下一步是什么? 下载项目代码-9.9 MB TensorFl ...

  3. 使用TensorFlow.js的AI聊天机器人一:检测文本中的情绪

    目录 设置TensorFlow.js代码 GoEmotion数据集 言语包 训练AI模型 检测文本中的情绪 终点线 下一步是什么? 下载项目代码-9.9 MB TensorFlow + JavaScr ...

  4. Apache Kafka流+机器学习(Spark,TensorFlow,H2O.ai)

    我于2017年5月开始在Confluent工作,担任技术传播者,专注于围绕开源框架Apache Kafka的主题. 我认为机器学习是当今最热门的流行语之一,因为它可以在任何行业中增加巨大的商业价值. ...

  5. springcloud工作笔记099---springboot集成netty,进行线程管理,socket通讯

    技术交流QQ群[JAVA,C++,Python,.NET,BigData,AI]:170933152 一.依赖 <!-- https://mvnrepository.com/artifact/i ...

  6. 聊天 AI 软件的简单实现

    对于写一个聊天 AI 软件的 demo,我们可以采用 Python 编程语言和 Tensorflow 框架来实现,以下是一个示例代码: import tensorflow as tf import n ...

  7. 抓住人工智能红利,百度AI达人养成营带你速成深度学习

    未来几年,什么行业是最值得期待的"风口"?又是学什么专业才可以薪资爆表? 国际权威调研机构IDC发布的一份报告显示,2024年中国人工智能市场规模将达到127.5亿美金.随之而来的 ...

  8. 使用TensorFlow.js进行AI在网络摄像头中翻译手势和手语

    目录 起点 检测手势 其他手势和手语 技术脚注 终点线 下一步是什么? TensorFlow + JavaScript.现在,最流行,最先进的AI框架支持地球上使用最广泛的编程语言,因此,让我们在我们 ...

  9. Netty网络编程聊天项目

                                     Netty网络编程聊天项目 后端编写 导入依赖    <dependencies><dependency>&l ...

最新文章

  1. 京东物流基于Doris的亿级数据自助探索应用
  2. 关于WM_NCHITTEST消息(移动无标题对话框多个)
  3. 大型互联网公司必考java面试题与面试技巧
  4. LinkedList 源码分析(JDK 1.8)
  5. Spring boot修改静态资源映射
  6. 6种常见的无线组网架构
  7. 在CISCO上做单臂路由
  8. PHP中用于精确计算的bcmath扩展
  9. Python对自定义离散点进行指定多项式函数拟合
  10. 434. 字符串中的单词数
  11. qq浏览器打开word 技术原理_知道为什么计算机可以上网的同时,可以写word还可以听歌吗?...
  12. Apache HttpClient 4 3开发指南
  13. POJ 3253 Fence Repair 贪心
  14. NetDevOps常用数据库python实战-influxDB_grafana
  15. 利用swap()函数来收缩内存
  16. AVR单片机项目教程 基于C语言,AVR单片机项目教程--基于C语言(第2版)
  17. Darkhotel组织渗透隔离网络的Ramsay组件分析
  18. Ubuntu 16.04静态IP设置
  19. P2394 yyy loves Chemistry I
  20. 小说作者推荐:漫漫何其多合集

热门文章

  1. Android之一起制作简易唱片播放器
  2. 基于double-check模式尝试将消息放到batch中
  3. 【UIKit】UIView基础学习
  4. java webpack web项目_spring + spring mvc + mybatis + react + reflux + webpack Web工程例子
  5. HM16.0之帧间预测——xCheckRDCostInter()函数
  6. Castle DynamicProxy基本用法(AOP)
  7. Webpack 4 + React + Typescript 搭建启动模版
  8. [剑指offer] 跳台阶
  9. 机器视觉学习笔记(4)——单目摄像机标定参数说明
  10. linux的零碎知识