当前位置: 首页 > news >正文

使用Kimi开发自己的问答应用

概述

Kimi是大家常用的一个人工智能助手,本文使用Kimi开发文档,以node作为后端,开发与一个问答系统

实现效果

在这里插入图片描述

Kimi简介

Kimi是由Moonshot AI开发的人工智能助手,擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任务。无论是回答问题、处理文件还是进行网络搜索,都能提供支持。

  • 开发文档:https://platform.moonshot.cn/docs/intro

如下图,点击用户中心,在API Key管理可以添加key。
在这里插入图片描述

用量限制可查看账户的用量和剩余数量。

image.png

图中的相关名字解释如下:

  • 并发: 同一时间内我们最多处理的来自您的请求数
  • RPM: request per minute 指一分钟内您最多向我们发起的请求数
  • TPM: token per minute 指一分钟内您最多和我们交互的token数
  • TPD: token per day 指一天内您最多和我们交互的token数

实现

后端实现

后端是通过node的Express框架实现的。
核心实现步骤与代码如下:

1. 初始化与安装依赖

# 创建目录
mkdir kimi-server && cd kimi-server# 初始化package.json文件
npm init -y# 安装依赖
npm i express openai -S

2. 修改package.json

修改package.json文件中的scripts节点的内容如下:

"scripts": {"test": "echo \"Error: no test specified\" && exit 1",
+  "dev": "nodemon ./app.js",
+  "server": "pm2 start ./app.js --name kimi"
},

3. app.js

const express = require("express");
const kimiRouter = require("./router/kimi.js");const app = express();// 自定义跨域中间件
const allowCors = function (req, res, next) {res.header("Access-Control-Allow-Origin", req.headers.origin);res.header("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");res.header("Access-Control-Allow-Headers", "Content-Type");res.header("Access-Control-Allow-Credentials", "true");next();
};
app.use(allowCors); // 使用跨域中间件app.use(express.static("public"));app.use("/kimi", kimiRouter);app.listen(18080, () => {console.log("express server running at http://127.0.0.1:18080");
});

4. kimi.js

const express = require("express");
const OpenAI = require("openai");
const R = require("../R");
const router = express.Router();let r = new R();const client = new OpenAI({apiKey: "你的key",baseURL: "https://api.moonshot.cn/v1",
});let history = [];async function chat(prompt = '') {console.time("prompt", prompt);let response = "";if (prompt) {history.push({role: "user",content: prompt,});const completion = await client.chat.completions.create({model: "moonshot-v1-8k",messages: history,});history = history.concat(completion.choices[0].message);response = completion.choices[0].message.content;} else {response = "哈喽,你好!我是Kimi,由 Moonshot AI 提供的人工智能助手。";history.push({role: "system",content: response,});}console.log({prompt,response,});console.timeEnd("prompt");return response;
}router.get("/chat", async function (req, res) {const { prompt } = req.query;const reply = await chat(prompt);res.send(r.success({reply: reply,}));
});module.exports = router;

前端页面

1. index.html

前端页面通过CDN引入VueElement Plusmarkdown.js,实现代码如下:

<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>chat</title><!-- Import style --><link rel="stylesheet" href="//unpkg.com/element-plus/dist/index.css" /><link rel="stylesheet" href="./md.css" /><!-- Import Vue 3 --><script src="//unpkg.com/vue@3"></script><!-- Import component library --><script src="//unpkg.com/element-plus"></script><script src="//cdn.jsdelivr.net/npm/marked/marked.min.js"></script><style>html,body,#app {height: 100%;margin: 0;padding: 0;}::-webkit-scrollbar {width: 5px;height: 5px;background-color: #eee;}::-webkit-scrollbar-track {background-color: #eee;}::-webkit-scrollbar-thumb {background: #787878;border-radius: 10px;}.chat-container {display: flex;flex-direction: column;padding: 1rem;height: calc(100% - 2rem);}.chat-messages {flex-grow: 1;overflow-y: auto;padding: 10px;}.message {overflow: hidden;margin-bottom: 1rem;}.message:last-child {margin-bottom: 0;}.message p {margin: 0;}.message-bubble {padding: 10px;border-radius: 10px;display: inline-block;position: relative;max-width: 80%;text-align: justify;line-height: 1.5;}.message-bubble:after {content: ' ';border: 10px solid transparent;position: absolute;top: 0.5rem;}.message-bubble.received {background-color: #f0f0f0;margin-left: 0.3rem;}.message-bubble.received:after {border-right-color: #f0f0f0;left: -16px;}.message-bubble.sent {background-color: #007bff;color: white;float: right;margin-right: 1rem;}.message-bubble.sent:after {border-left-color: #007bff;right: -16px;}.chat-input {margin-top: 1rem;display: flex;}.chat-input input {flex: 1;padding: 1.5rem 0.3rem;}.chat-input button {padding: 1.5rem 1rem;border: none;border-radius: 5px;background-color: #007bff;color: white;cursor: pointer;}</style>
</head><body><div id="app"><div class="chat-container"><div class="chat-messages" ref="messages"><div v-for="message in messages" :key="message.id" class="message"><div :class="['message-bubble', message.type]" v-html="message.text"></div></div></div><div class="chat-input"><el-input :disabled="loading" v-model="newMessage" placeholder="请输入您的问题..."@keyup.enter="sendMessage"></el-input><el-button style="margin-left: 0.5rem;" type="primary" :loading="loading" @click="sendMessage">{{loading ? '回答...' : '点击发送'}}</el-button></div></div></div><script>let url = 'http://127.0.0.1:18080/kimi/chat?prompt='const storageKey = 'history-messages'const App = {data() {return {messages: [],newMessage: '',loading: false};},mounted() {const messages = JSON.parse(localStorage.getItem(storageKey) || '[]')if (messages.length > 0) {this.messages = messagesthis.scrollToBottom()} else {this.sendMessage(true)}},methods: {getMessage(msg = '') {return new Promise(resolve => {this.loading = truefetch(`${url}${msg}`).then(res => res.json()).then(res => {this.loading = falseif (res.code == 200) {resolve(res.data.reply)} else {resolve(res.msg)}})})},scrollToBottom() {setTimeout(() => {this.$refs.messages.scrollTop = this.$refs.messages.scrollHeight}, 100)},sendMessage(init = false) {if (this.newMessage.trim() !== '') {this.messages.push({id: this.messages.length + 1,text: this.newMessage,type: 'sent',});this.scrollToBottom()this.getMessage(this.newMessage).then(msg => {this.messages.push({id: this.messages.length + 1,text: marked.parse(msg),type: 'received',});localStorage.setItem(storageKey, JSON.stringify(this.messages));this.newMessage = '';this.scrollToBottom()})} else {this.getMessage().then(msg => {this.messages.push({id: this.messages.length + 1,text: marked.parse(msg),type: 'received',});localStorage.setItem(storageKey, JSON.stringify(this.messages));this.scrollToBottom()})}},},};const app = Vue.createApp(App);app.use(ElementPlus);app.mount("#app");</script>
</body></html>

2. md.css

md.css为优化markdown样式的外部引用,代码如下:

body {font-family: "Microsoft Yahei", Helvetica, arial, sans-serif;font-size: 14px;line-height: 1.6;padding-top: 10px;padding-bottom: 10px;background-color: white;padding: 30px;color: #516272;
}body>*:first-child {margin-top: 0 !important;
}body>*:last-child {margin-bottom: 0 !important;
}a {color: #4183C4;
}a.absent {color: #cc0000;
}a.anchor {display: block;padding-left: 30px;margin-left: -30px;cursor: pointer;position: absolute;top: 0;left: 0;bottom: 0;
}h1,
h2,
h3,
h4,
h5,
h6 {margin: 20px 0 10px;padding: 0;font-weight: bold;-webkit-font-smoothing: antialiased;cursor: text;position: relative;
}h1:hover a.anchor,
h2:hover a.anchor,
h3:hover a.anchor,
h4:hover a.anchor,
h5:hover a.anchor,
h6:hover a.anchor {background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA09pVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoMTMuMCAyMDEyMDMwNS5tLjQxNSAyMDEyLzAzLzA1OjIxOjAwOjAwKSAgKE1hY2ludG9zaCkiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OUM2NjlDQjI4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OUM2NjlDQjM4ODBGMTFFMTg1ODlEODNERDJBRjUwQTQiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo5QzY2OUNCMDg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo5QzY2OUNCMTg4MEYxMUUxODU4OUQ4M0REMkFGNTBBNCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PsQhXeAAAABfSURBVHjaYvz//z8DJYCRUgMYQAbAMBQIAvEqkBQWXI6sHqwHiwG70TTBxGaiWwjCTGgOUgJiF1J8wMRAIUA34B4Q76HUBelAfJYSA0CuMIEaRP8wGIkGMA54bgQIMACAmkXJi0hKJQAAAABJRU5ErkJggg==) no-repeat 10px center;text-decoration: none;
}h1 tt,
h1 code {font-size: inherit;
}h2 tt,
h2 code {font-size: inherit;
}h3 tt,
h3 code {font-size: inherit;
}h4 tt,
h4 code {font-size: inherit;
}h5 tt,
h5 code {font-size: inherit;
}h6 tt,
h6 code {font-size: inherit;
}h1 {font-size: 28px;color: #2B3F52;
}h2 {font-size: 24px;border-bottom: 1px solid #DDE4E9;color: #2B3F52;
}h3 {font-size: 18px;color: #2B3F52;
}h4 {font-size: 16px;color: #2B3F52;
}h5 {font-size: 14px;color: #2B3F52;
}h6 {color: #2B3F52;font-size: 14px;
}p,
blockquote,
ul,
ol,
dl,
li,
table,
pre {margin: 15px 0;color: #516272;
}hr {background: transparent url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAECAYAAACtBE5DAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6OENDRjNBN0E2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6OENDRjNBN0I2NTZBMTFFMEI3QjRBODM4NzJDMjlGNDgiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo4Q0NGM0E3ODY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo4Q0NGM0E3OTY1NkExMUUwQjdCNEE4Mzg3MkMyOUY0OCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PqqezsUAAAAfSURBVHjaYmRABcYwBiM2QSA4y4hNEKYDQxAEAAIMAHNGAzhkPOlYAAAAAElFTkSuQmCC) repeat-x 0 0;border: 0 none;color: #cccccc;height: 4px;padding: 0;}body>h2:first-child {margin-top: 0;padding-top: 0;
}body>h1:first-child {margin-top: 0;padding-top: 0;
}body>h1:first-child+h2 {margin-top: 0;padding-top: 0;
}body>h3:first-child,
body>h4:first-child,
body>h5:first-child,
body>h6:first-child {margin-top: 0;padding-top: 0;
}a:first-child h1,
a:first-child h2,
a:first-child h3,
a:first-child h4,
a:first-child h5,
a:first-child h6 {margin-top: 0;padding-top: 0;
}h1 p,
h2 p,
h3 p,
h4 p,
h5 p,
h6 p {margin-top: 0;
}li p.first {display: inline-block;
}li {margin: 0;
}ul,
ol {padding-left: 30px;
}ul :first-child,
ol :first-child {margin-top: 0;
}dl {padding: 0;
}dl dt {font-size: 14px;font-weight: bold;font-style: italic;padding: 0;margin: 15px 0 5px;
}dl dt:first-child {padding: 0;
}dl dt> :first-child {margin-top: 0;
}dl dt> :last-child {margin-bottom: 0;
}dl dd {margin: 0 0 15px;padding: 0 15px;
}dl dd> :first-child {margin-top: 0;
}dl dd> :last-child {margin-bottom: 0;
}blockquote {border-left: 4px solid #ECF0F3;/*padding: 0 15px;*/padding: 15px;background-color: #F7F9FA;color: #2B3F52;
}blockquote> :first-child {margin-top: 0;
}blockquote> :last-child {margin-bottom: 0;
}table {padding: 0;border-collapse: collapse;
}table tr {border-top: 1px solid #cccccc;background-color: white;margin: 0;padding: 0;
}table tr:nth-child(2n) {background-color: #f8f8f8;
}table tr th {font-weight: bold;border: 1px solid #cccccc;margin: 0;padding: 6px 13px;
}table tr td {border: 1px solid #cccccc;margin: 0;padding: 6px 13px;
}table tr th :first-child,
table tr td :first-child {margin-top: 0;
}table tr th :last-child,
table tr td :last-child {margin-bottom: 0;
}img {max-width: 100%;
}span.frame {display: block;overflow: hidden;
}span.frame>span {border: 1px solid #dddddd;display: block;float: left;overflow: hidden;margin: 13px 0 0;padding: 7px;width: auto;
}span.frame span img {display: block;float: left;
}span.frame span span {clear: both;color: #333333;display: block;padding: 5px 0 0;
}span.align-center {display: block;overflow: hidden;clear: both;
}span.align-center>span {display: block;overflow: hidden;margin: 13px auto 0;text-align: center;
}span.align-center span img {margin: 0 auto;text-align: center;
}span.align-right {display: block;overflow: hidden;clear: both;
}span.align-right>span {display: block;overflow: hidden;margin: 13px 0 0;text-align: right;
}span.align-right span img {margin: 0;text-align: right;
}span.float-left {display: block;margin-right: 13px;overflow: hidden;float: left;
}span.float-left span {margin: 13px 0 0;
}span.float-right {display: block;margin-left: 13px;overflow: hidden;float: right;
}span.float-right>span {display: block;overflow: hidden;margin: 13px auto 0;text-align: right;
}code,
tt {margin: 0 2px;padding: 0 5px;white-space: nowrap;border: 1px solid #eaeaea;background-color: #f8f8f8;border-radius: 3px;
}pre code {margin: 0;padding: 0;white-space: pre;border: none;background: transparent;
}.highlight pre {background-color: #f8f8f8;border: 1px solid #cccccc;font-size: 13px;line-height: 19px;overflow: auto;padding: 6px 10px;border-radius: 3px;
}pre {background-color: #f8f8f8;border: 1px solid #cccccc;font-size: 13px;line-height: 19px;overflow: auto;padding: 6px 10px;border-radius: 3px;
}pre code,
pre tt {background-color: transparent;border: none;
}sup {font-size: 0.83em;vertical-align: super;line-height: 0;
}code {white-space: pre-wrap;word-break: break-all;display: inline-block;
}* {-webkit-print-color-adjust: exact;
}@media screen and (min-width: 914px) {body {width: 960px;margin: 0 auto;}
}@media print {table,pre {page-break-inside: avoid;}pre {word-wrap: break-word;}
}

相关文章:

使用Kimi开发自己的问答应用

概述 Kimi是大家常用的一个人工智能助手&#xff0c;本文使用Kimi开发文档&#xff0c;以node作为后端&#xff0c;开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手&#xff0c;擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…...

TypeScript进阶

Typescript进阶 基础知识 JavaScript 的核心特点就是灵活&#xff0c;但随着项目规模的增大&#xff0c;灵活反而增加开发者的心智负担。例如在代码中一个变量可以被赋予字符串、布尔、数字、甚至是函数&#xff0c;这样就充满了不确定性。而且这些不确定性可能需要在代码运行…...

jenkins邮件的配置详解

Jenkins邮件的配置涉及多个步骤和细节,以下是详细的配置指南: 一、前期准备 确定邮件服务:明确Jenkins将要使用的邮件服务,如QQ邮箱、163邮箱、公司邮箱(基于Microsoft 365或Exchange Server)等。获取SMTP配置信息:根据邮件服务类型,获取相应的SMTP服务器地址、端口号…...

小皮面板(PHPSTUDY)配置多个域名或IP

问题描述 小皮面板默认采用nginx的静态部署&#xff0c;按照使用nginx的习惯只需要额外添加一个server即可&#xff0c;但是会发现直接往配置文件里添加新的server是不生效的&#xff0c;小皮的官网论坛几乎已经停止维护&#xff0c;因此资料较少&#xff0c;原本也没有仔细使…...

【大语言模型】LangChain LCEL 表达式语言

【大语言模型】LangChain LCEL 表达式语言 一、简介二、LCEL的优势三、LCEL 的基本使用1、Runnable 对象 四、实战实例 一、简介 LangChain LCEL 的全称为 LangChain Expression Language 即可直译为 LangChain 表达式。 为了构造更复杂的 LLM 应用并且更为简便快捷的构造 LLM…...

Leetcode 3382. Maximum Area Rectangle With Point Constraints II

Leetcode 3382. Maximum Area Rectangle With Point Constraints II 1. 解题思路2. 代码实现 题目链接&#xff1a;3382. Maximum Area Rectangle With Point Constraints II 1. 解题思路 这一题是题目3380. Maximum Area Rectangle With Point Constraints I的进阶版&#…...

MitelMiCollab 身份绕过导致任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品描述: Mitel MiCollab 是一个企业协作平台,它将各种通信工具整合到一个应用程序中,提供语音和视频通话、消息传递、状态信息、音频会议、移动支持和团队协作功能。0x02 漏洞描述: Mitel MiCollab 的 NuPoint 统一消息 (NPM) 组件中存在身份验证绕过漏洞,由于输入…...

DVWA 靶场 SQL 注入报错 Illegal mix of collations for operation ‘UNION‘ 的解决方案

在 dvwa 靶场进行联合 SQL 注入时&#xff0c;遇到报错 Illegal mix of collations for operation UNION报错如下图&#xff1a; 解决办法&#xff1a; 找到文件MySQL.php 大致位置在dvwaincludesDBMS 目录下 使用编辑器打开 检索$create_db 第一个就是 在{$_DVWA[ ‘db_d…...

京准电钟分享:医院网络内NTP时间同步服务器作用是什么?

京准电钟分享&#xff1a;医院网络内NTP时间同步服务器作用是什么&#xff1f; 京准电钟分享&#xff1a;医院网络内NTP时间同步服务器作用是什么&#xff1f; 时间同步技术必定将是整个大数据处理系统的重要支撑和保障。时间同步技术使数据产生与处理系统的所有节点具有全局…...

HTML DOM API

HTMLInputElement HTMLInputElement 接口提供了特定的属性和方法&#xff0c;用于管理 <input> 元素的选项、布局和外观。 HTMLInputElement 和 <input> 之间的关系可以理解为接口与具体元素的关系&#xff1a; <input> 元素&#xff1a; <input> 是…...

java时间处理SimpleDateFormat详解

文章目录 常用构造函数日期格式模式常见用法1. 格式化日期2. 解析日期字符串 注意事项示例扩展&#xff1a;指定区域和时区 SimpleDateFormat 是 Java 中用于日期和时间格式化的类&#xff0c;属于 java.text 包。它允许开发者将日期对象格式化为字符串&#xff0c;或者将字符…...

redis-stack redisSearch环境安装搭建

RedisSearch在redis许可证变更之后显得是redis中的一大特色&#xff0c;闲来无事学习记录一下。 尝试通过源码编译redisSearch&#xff0c;貌似非常费劲&#xff0c;所以建议使用docker或者Linux的发行包进行安装redis-stack。redis-stack是基于redis的模块化机制进行一个扩展…...

go返回多个errors

起因 有时候大家可能需要返回多个errors的场景&#xff0c;所以这个时候可能就会考虑如何实现、怎么实现比较好 实现 package mainimport ("errors""fmt" )func main() {errs : retErrors("hello,world")fmt.Println(errs) }func retErrors(t…...

Monkey结合appium模拟操作特定界面

目录 1. 使用 Monkey 操作特定界面&#xff08;通过UI标识来限制&#xff09; 2. 结合 uiautomator 或 appium 定位特定元素 步骤&#xff1a; 3. 使用 Monkey Appium 控制特定界面点击 4. 如何结合 Appium 与 Monkey 5. 限制 Monkey 只点击固定界面上的元素 使用 --pc…...

Ubuntu22.04深度学习环境安装【cuda+cudnn】

为了复现一篇深度学习论文&#xff0c;特意安装了Linux系统。前一天已经安装Linux显卡驱动&#xff0c;现在需要安装cuda、cudnn等。 论文代码 论文PDF 确定包版本&#xff1a; 根据论文提供的代码。在requirements.txt中发现cuda版本为11.7,cudnn为8.5.0&#xff0c;python没…...

go语言的sdk项目搭建与git 操作标签tag并推送至远程仓库

在搭建 SDK 项目并结合 Git 操作标签&#xff08;Tag&#xff09;时&#xff0c;通常会涉及项目初始化、版本管理、Git 标签的创建与管理等内容。以下是一个完整的步骤指南&#xff0c;帮助您搭建 SDK 项目并学习如何使用 Git 标签。 ### 1. **搭建 SDK 项目** 首先&#xff…...

从零用java实现 小红书 springboot vue uniapp (1)

前言 偶尔会用小红书发一些笔记 闲来无事 想自己实现一个小红书 正好可以学习一下 帖子 留言 im 好友 推送 等功能 下面我们就从零 开发一个小红书 后台依旧用我们的会员系统的脚手架 演示 http://120.26.95.195:8889/ 客户端我们使用uniapp 我们首先对主页进行一个分解 顶部我…...

Python爬虫——HTML中Xpath定位

Xpath是一种路径查询语言。利用一个路径表达式从html文档中找到我们需要的数据位置&#xff0c;进而将其写入到本地或者数据库中。 学习Xpath爬虫&#xff0c;我们首先学习一下python中lxml库 关于库 lxml 终端下载Xpath需要用到的模块 pip install lxml 关于HTML 超文本标…...

电脑无法识别usb设备怎么办?电脑无法识别usb解决方法

usb设备是我们常解除的外部操作以及存储设备&#xff0c;它可以方便用户数据传输以及操作输入。但在使用过程中&#xff0c;大家基本都碰到过电脑无法识别usb设备这种情况。这种情况下&#xff0c;我们应该怎么办呢&#xff1f;下面将为你介绍几种可能的原因和解决方法&#xf…...

思特奇政·企数智化产品服务平台正式发布,助力运营商政企数智能力跃迁

数字浪潮下,产业数字化进程加速发展,信息服务迎来更广阔的天地,同时也为运营商政企支撑系统提出了更高要求。12月4日,2024数字科技生态大会期间,思特奇正式发布政企数智化产品服务平台,融合应用大数据、AI等新质生产要素,构建集平台服务、精准营销、全周期运营支撑、智慧大脑于…...

[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?

&#x1f9e0; 智能合约中的数据是如何在区块链中保持一致的&#xff1f; 为什么所有区块链节点都能得出相同结果&#xff1f;合约调用这么复杂&#xff0c;状态真能保持一致吗&#xff1f;本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里&#xf…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

API网关Kong的鉴权与限流:高并发场景下的核心实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中&#xff0c;API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关&#xff0c;Kong凭借其插件化架构…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

小智AI+MCP

什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析&#xff1a;AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github&#xff1a;https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...

如何把工业通信协议转换成http websocket

1.现状 工业通信协议多数工作在边缘设备上&#xff0c;比如&#xff1a;PLC、IOT盒子等。上层业务系统需要根据不同的工业协议做对应开发&#xff0c;当设备上用的是modbus从站时&#xff0c;采集设备数据需要开发modbus主站&#xff1b;当设备上用的是西门子PN协议时&#xf…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)

一、题目解析 对于递归方法的前序遍历十分简单&#xff0c;但对于一位合格的程序猿而言&#xff0c;需要掌握将递归转化为非递归的能力&#xff0c;毕竟递归调用的时候会调用大量的栈帧&#xff0c;存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧&#xff0c;而非…...