大家好,我是寒草 🌿
无限未来,无限创造,乘风破浪,一往无前 ☀️
如果喜欢我的文章,可以关注 ➕ 点赞,与我一同成长吧~
加我微信:hancao97,邀你进群,一起学习交流,成为更优秀的工程师~
背景
前一阵,我看了一部剧,叫《破事精英》,第五集中有这样一个画面,欧阳莫非的电脑里有个人工智能,名字叫做:jarvis。
大家对这个名字的了解可能更多来自于漫威宇宙中钢铁侠的人工智能管家,含义是:Just A Rather Very Intelligent System。
而我看完之后,瞬间燃起了兴趣,我也要在我的终端里安个脑子,并给她起了一个与众不同的名字:“哈奈”。
我叫寒草,即 hancao,而我取我的第一个字加上 ai 两个字母,就是:han ai,调整结构为:ha nai,音译:哈奈。
命令行工具开发
其实这个场景很常见,交互方式类比 vue-cli,create-react-app 等等,所以本次的项目也无非是一个命令行工具而已。
初始化 npm 项目
npm init
配置 package.json
主要关心 package.json 中的 bin 字段
{
"name": "hanai",
"version": "1.0.0",
"description": "",
"bin": {
"hanai": "./bin/cli.js"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
}
bin 字段中的对象 key 其实就是命令名,value 就是命令运行时执行的入口文件。
创建入口文件并指定运行环境
#!/usr/bin/env node
console.log('hello hanai');
美化输出,安装 colors
因为要接入对话机器人,我还是希望用户输入和机器人的输出有样式区分,于是我安装了 colors 来处理命令行中输出的样式。
github 地址:colors
用法也十分简单:
const colors = require('colors');
console.log('hello hanai'.white.bgBlack)
业务逻辑定义
这里我们一起思考本项目的交互逻辑,首先用户在命令行的输入有两种:
第一种交互
hanai // ai 需要主动询问用户,并开启交流模式
如下图:
第二种交互
hanai 北京天气 // ai 回答问题,并开启交流模式
如下图:
处理用户输入
通过readline.createInterface
方法创建一个 interface
类,这个类下面有一个方法.question
,用这个方法在命令行上抛出一个问题,在第二个参数传入一个函数进行监听,一旦用户输入完毕敲下回车,就会触发回调函数。
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question(`(๑′ㅂ\`๑) ${honorific},好久不见呀,请问您找我有什么事情么?\n`.white.bgBlack, question => {
// ...
})
完整业务编码
和 ai 交互代码待后文补充
#!/usr/bin/env node
const readline = require('readline');
const colors = require('colors');
const axios = require('axios');
const question = process.argv[2];
const honorific = '草哥';
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const getHanaiAnswer = async (question) => {
// 逻辑
return answer;
}
const handleNullQustion = (question) => {
if(!question) {
console.log(`╮(╯▽╰)╭ ${honorific},如果没什么事,我就退下了。`.white.bgBlack);
process.exit(0);
}
}
const createCommiunication = async (hanaiQuestion) => {
handleNullQustion(hanaiQuestion);
const hanaiAnswer = await getHanaiAnswer(hanaiQuestion);
rl.question(`${hanaiAnswer}\n`.white.bgBlack, async question => {
handleNullQustion(question);
createCommiunication(question);
})
}
if(!question) {
console.log(`✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
HANAI(哈奈)
Technology creates beauty
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨\n\n`.white.bgBlack);
rl.question(`(๑′ㅂ\`๑) ${honorific},好久不见呀,请问您找我有什么事情么?\n`.white.bgBlack, question => {
createCommiunication(question);
})
} else {
createCommiunication(question);
}
接入 AI 机器人
预研
接下来就是看看哪里有提供智能问答的 api,功夫不负有心人,微信就有:openai.weixin.qq.com
我们扫码登陆之后就可以开始配置自己的机器人了,其中自定义的简单问答我只设置了自我介绍:
预置技能我也是该勾选的都勾选了:
随后就可以发布自己的机器人了:
我们是在第三方平台使用 api,于是我们可以来到开放 API:
我们可以在文档跟随指引,接入 api 了:
developers.weixin.qq.com/doc/aispeec…
api 接入
这里我用 axios 进行接口调用了。
const signUrl = `${basicUrl}sign/${token}`;
const { signature } = (await axios.post(signUrl, {
userid
})).data;
const answerUrl = `${basicUrl}aibot/${token}`;
const { answer } = (await axios.post(answerUrl, {
signature,
userid,
query: question
})).data;
return answer;
全局安装
项目目录下执行 npm link
,将当前的代码安装在 npm 全局目录。
npm link
最终结果
偷偷吐槽:这个 ai 太笨了...
结束语
此次文章内容来自一次灵光乍现,写文章+代码实现大概花了半天吧,但是整体感觉还是很有趣的,现在也可以通过命令行询问一些基础问题了。最近特别特别忙,一天在公司 12 小时打底,各种耗精力的事情便需要取舍了,但是还是想保持用技术创造美好
的初心。
今天是周六,明天继续规划我自己的项目,加油加油~
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
凡事以理想为因,实行为果
愿诸君一路前行,从不孤独
✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨
感谢阅读,欢迎各位加我微信:hancao97,与我一起交流成长。
-To Be Continued && Hello World-