AI 对话完善【人工智能】

news2024/11/25 18:41:34

AI 对话【人工智能】

  • 前言
  • 版权
  • 开源
  • 推荐
  • AI 对话
    • v0版本:基础
    • v1版本:对话
      • 数据表
      • tag.js
      • TagController
    • v2版本:回复中
      • textarea.js
      • ChatController
    • v3版本:流式输出
      • chatLast.js
      • ChatController
    • v4版本:多轮对话
      • QianfanUtil
      • ChatController
    • v5:其他修改
      • 前端样式:跳转到最后一个消息
      • 前端样式:Message保留空白符
      • 前端样式:最新回复保留空白符
  • 最后

前言

2024-4-7 15:04:07

以下内容源自《【人工智能】》
仅供学习交流使用

版权

禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://jsss-1.blog.csdn.net
禁止其他平台发布时删除以上此话

开源

日星月云 / AI对话完善版

jsss-1/aichat

推荐

百度智能云+SpringBoot=AI对话【人工智能】

对话Chat-千帆大模型平台

AI 对话

以下版本除了最简单的AI对话,还完善了一下功能。

以下是部分代码,完整代码请移步GIT。

v0版本:基础

聊天

v1版本:对话

新建新对话

可以置顶(取消置顶)、删除、修改对应的对话

在这里插入图片描述

数据表

create table tag
(
    id       int auto_increment
        primary key,
    user_id  int           not null,
    tag_name varchar(16)   not null,
    top      int default 0 null
);

create table conversation
(
    id           int auto_increment
        primary key,
    tag_id       int         null,
    user_message text        null,
    bot_message  text        null,
    create_time  varchar(32) null,
    username     varchar(16) null
);

tag.js

$(document).ready(function () {

    tagList();

    $("#editBlock").hide();

    $(".add-button").on("click", function() {
        addTag();
    });



});

function tagSearch(data) {
    var data=$("#search-input").val();
         
    if(!data){
        //没有数据搜索全部
        tagList();
        return false;
    }

    $.ajax({
        type: "GET",
        url: SERVER_PATH + "/tag/search",
        data: {
            data: data
        },
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            set_tags(result.data);
        }
    });
}

function addTag() {
    $.ajax({
        type: "POST",
        url: SERVER_PATH + "/tag/addTag",
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            tagList();
        }
    });
}


function tagList() {
    $.ajax({
        type: "GET",
        url: SERVER_PATH + "/tag/tagList",
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            set_tags(result.data);
        }
    });
}

function set_tags(tags) {
    if (!tags) {
        return false;
    }

    $(".tag-list").empty();

    $.each(tags, function (i, tag) {
        var btnClass = tag.top === 0 ? "top-btn" : "notop-btn";
        var topClass = tag.top === 0 ? "ptTag" : "topTag";

        var tagDiv = `
            <div class="tag">
                <img class="tag-btn ${topClass}"></img>
                <span class="show-btn" data-id="${tag.id}">${tag.tagName}</span>
                <div class="button-group">
                    <img class="icon-btn ${btnClass}" data-id="${tag.id}"></img>
                    <img class="icon-btn modify-btn" data-id="${tag.id}" data-name="${tag.tagName}"></img>
                    <img class="icon-btn delete-btn" data-id="${tag.id}"></img>
                </div>
            </div>`;
        
        $(".tag-list").append(tagDiv);
    });
    


    $(".show-btn").on("click", function() {
        var tagId = $(this).data('id');
        window.location.href="aichat.html?tagId="+tagId;
    });

    $(".notop-btn").on("click", function() {
        var tagId = $(this).data('id');
        var newTop=0;
        topTag(tagId,newTop);
    });

    $(".top-btn").on("click", function() {
        var tagId = $(this).data('id');
        var newTop=top=1;
        topTag(tagId,newTop);
    });

    $(".modify-btn").on("click", function() {
        var tagId = $(this).data('id');
        var tagName = $(this).data('name'); // 获取标签名称
    
        // 将标签名称填充到输入框中
        $("#newName").val(tagName);
    
        // 显示编辑界面块
        $("#editBlock").show();
    
        // 保存按钮点击事件
        $("#saveBtn").off("click").on("click", function() {
            var newName = $("#newName").val();

            if(!newName){
                alertBox("请输入新名字");
                return false;
            }

            modify(tagId,newName);

            // 关闭编辑界面块
            $("#editBlock").hide();
        });

        $("#cancelBtn").on("click", function() {
            $("#editBlock").hide();
        });
    });

    $(".delete-btn").on("click", function() {
        var tagId = $(this).data('id');
       
        // 弹出确认删除的提示框
        var confirmDelete = confirm("确定要删除这个标签吗?");
    
        // 如果用户点击确定删除,则执行删除操作
        if (confirmDelete) {
            deleteTag(tagId);
        } 

    });

}

function topTag(tagId,newTop){

    $.ajax({
        type: "POST",
        url: SERVER_PATH + "/tag/top",
        data: {
            tagId: tagId,
            top: newTop
        },
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            tagList();
        }
    });
}

function modify(tagId,newName){

    $.ajax({
        type: "POST",
        url: SERVER_PATH + "/tag/modify",
        data: {
            tagId: tagId,
            tagName: newName
        },
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            tagList();
        }
    });
}

function deleteTag(tagId){

    $.ajax({
        type: "GET",
        url: SERVER_PATH + "/tag/delete",
        data: {
            tagId: tagId
        },
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            tagList();
        }
    });
}



TagController

package com.jsss.qianfan.controller;

import com.jsss.common.BusinessException;
import com.jsss.common.ErrorCode;
import com.jsss.common.ResponseModel;
import com.jsss.entity.User;
import com.jsss.qianfan.entity.Tag;
import com.jsss.qianfan.service.TagService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("tag")
@CrossOrigin(origins = "${jsss.web.path}", allowedHeaders = "*", allowCredentials = "true")
public class TagController implements ErrorCode {

    @Autowired
    RedisTemplate redisTemplate;

    @Autowired
    TagService tagService;


    @GetMapping("/tagList")
    public ResponseModel getTags(String token) {

        User user = null;
        if (StringUtils.isNotEmpty(token)) {
            user = (User) redisTemplate.opsForValue().get(token);
        }

        if (user == null) {
            throw new BusinessException(USER_NOT_LOGIN, "用户未登录");
        }

        List<Tag> tags = tagService.searchByUserId(user.getUserId());

        return new ResponseModel(tags);


    }


    @PostMapping("/addTag")
    public ResponseModel addTag(String token) {
        User user = null;
        if (StringUtils.isNotEmpty(token)) {
            user = (User) redisTemplate.opsForValue().get(token);
        }

        if (user == null) {
            throw new BusinessException(USER_NOT_LOGIN, "用户未登录");
        }

        String tagName = "新对话";

        Tag tag = new Tag(null, user.getUserId(), tagName, 0);
        tagService.addTag(tag);

        return new ResponseModel("添加成功");
    }

    @PostMapping("/modify")
    public ResponseModel modifyTag(Integer tagId, String tagName) {
        if (StringUtils.isEmpty(tagName)){
            throw new BusinessException(PARAMETER_ERROR, "缺失新的tag名");
        }
        tagService.updateTagName(tagId, tagName);
        return new ResponseModel("修改成功");
    }

    @PostMapping("/top")
    public ResponseModel topTag(Integer tagId, Integer top) {
        tagService.updateTagTop(tagId, top);
        String res = top == 1 ? "置顶成功" : "取消置顶成功";
        return new ResponseModel(res);
    }

    @GetMapping("/delete")
    public ResponseModel deleteTag(Integer tagId) {
        tagService.deleteTag(tagId);
        return new ResponseModel("删除成功");
    }

    @GetMapping("/search")
    public ResponseModel searchTag(String token, String data) {


        User user = null;
        if (StringUtils.isNotEmpty(token)) {
            user = (User) redisTemplate.opsForValue().get(token);
        }

        if (user == null) {
            throw new BusinessException(USER_NOT_LOGIN, "用户未登录");
        }


        List<Tag> tags = tagService.searchTag(user.getUserId(),data);

        return new ResponseModel(tags);

    }


}

v2版本:回复中

用户发送问题之后,显示回复中,得到回复后显示。

前端发送请求之后,先会得到“回复中”;
之后,去轮询获取最新回复。

后端接受请求之后,先存入到数据库中一个未回复请求。
然后异步得到回复之后,再去更新数据库。

在这里插入图片描述

textarea.js

var textarea = document.getElementById("messageInput");

var isSendingMessage = false; // 添加一个变量用于标识是否正在发送消息

textarea.addEventListener("keydown", function(event) {
    if (event.key === "Enter" && !event.shiftKey) {
        event.preventDefault();


        if (isSendingMessage) {
            // 如果正在发送消息,则在文本框中添加换行符
            textarea.value += "\n";
        } else{
            var message = textarea.value.trim();
            textarea.value = "";
    
            if(!message){
                alertBox("输入内容不能为空!");
                return false;
            }
    
    
            var tagId=$.getUrlParam("tagId");;
    
            if(!tagId){
                alertBox("没有对应的参数");
                return false;
            }

            isSendingMessage = true; // 设置为true表示正在发送消息
    
            $.ajax({
                type: "POST",
                url: SERVER_PATH+"/chat/chat",
                data:{
                    "tagId": tagId,
                    "content":message
                },
                xhrFields: {withCredentials: true},
                success:function(result){
                    isSendingMessage = false; // 发送完成后设置为false
                    if (result.status) {
                        alertBox(result.data.message);
                        return false;
                    }

                    //请求成功之后
                    list(tagId);
                    
                    getChat(result.data.id);
                   
                }
            });
      
        }

        
    }
});

textarea.addEventListener("keydown", function(event) {
    if (event.key === "Enter" && event.shiftKey) {
        // 在 Shift+Enter 情况下允许换行
        textarea.value += "\n";
        event.preventDefault();
    }
});

function getChat(chatId){
    var tagId=$.getUrlParam("tagId");;
    
    $.ajax({
        type: "GET",
        url: SERVER_PATH+"/chat/getChat",
        data:{
            "id": chatId,
        },
        xhrFields: {withCredentials: true},
        success:function(result){
            isSendingMessage = false; // 发送完成后设置为false
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }

            if (result.data.botMessage == "回复中...") {
                // 继续轮询,100ms 一次
                setTimeout(function() {
                    getChat(chatId);
                }, 100);
            } else {
                // 获取到最终回复
                // 处理回复逻辑
                list(tagId);
            }
           
        }
    });
}


ChatController

    @PostMapping("/chat")
    public ResponseModel chat(Integer tagId,String content){
        if (tagId==null){
            throw new BusinessException(PARAMETER_ERROR,"没有指定响应的tag");
        }

        if (StringUtils.isEmpty(content)){
            throw new BusinessException(PARAMETER_ERROR,"输入内容不能为空");
        }

        Tag tag = tagService.searchById(tagId);
        if (tag==null){
            throw new BusinessException(NOT_FIND,"没有找到对应的对话");
        }

        String username=userService.selectUserById(tag.getUserId()).getUsername();


        Conversation conversation = new Conversation(null, tagId,username, content, "回复中...", format(new Date()));
        chatService.addChat(conversation);


        // 异步处理AI回复
        CompletableFuture.runAsync(() -> {
            Integer id=conversation.getId();

            String res = null;
            try {
                res = qianfanUtil.addMessage(content);
            } catch (Exception e) {
                res = "回复失败";
            }
            Conversation aiConversation = new Conversation();
            aiConversation.setId(id);
            aiConversation.setBotMessage(res);
            chatService.updateChat(aiConversation);
        });

        return new ResponseModel(conversation);

    }

v3版本:流式输出

流式输出,终止生成。

前端实现,让消息一个字符一个字符显示

在这里插入图片描述

chatLast.js

var lastId;
var interval;

$(document).ready(function () {
    
    $("#stopButton").on("click", function() {
        var latestReply = $(".latest-reply");
        var latestReplyText = latestReply.text();
        clearInterval(interval); // 停止字符流输出
        $("#stopButton").hide();
        updateStop(lastId,latestReplyText);
    });

    

});

function listLastReply(tagId) {
    $.ajax({
        type: "GET",
        url: SERVER_PATH + "/chat/list",
        data: {
            tagId: tagId
        },
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            set_conversations_last(result.data);
        }
    });
}

function set_conversations_last(conversations) {
    if (!conversations) {
        return false;
    }

    $(".conversation-list").empty();

    var len=conversations.length;

    $.each(conversations, function (i, conversation) {
        var questionDiv = '<div class="question-container">' +
            '<table class="question">' +
            '<td>' +
            '<span>' + conversation.createTime + '</span>' +
            '<div class="user-message">' + conversation.userMessage + '</div>' +
            '</td>' +
            '<td type="text">' + conversation.username + '</td>' +
            '</table>' +
            '</div>';

        var answerDiv = '<div class="answer-container">' +
            '<table class="answer">' +
            '<td type="text">AI</td>' +
            '<td>' +
            '<span>' + conversation.createTime + '</span>' +
            '<div class="bot-message">' + conversation.botMessage + '</div>' +
            '</td>' +
            '</table>' +
            '</div>';

        if(i!=len-1){
            $(".conversation-list").append(questionDiv);
            $(".conversation-list").append(answerDiv);
        }

    });

    // 获取最新对话的回复
    var lastConversation = conversations[len - 1];
    lastId=lastConversation.id;

    var questionDiv = 
        '<div class="question-container">' +
            '<table class="question">' +
                '<td>' +
                    '<span>' + lastConversation.createTime + '</span>' +
                    '<div class="user-message">' + lastConversation.userMessage + '</div>' +
                '</td>' +
                '<td type="text">' + lastConversation.username + '</td>' +
            '</table>' +
        '</div>';

    $(".conversation-list").append(questionDiv);


    var answerDiv = 
    '<div class="answer-container">' +
        '<table class="answer">' +
            '<td type="text">AI</td>' +
            '<td>' +
                '<span>' + lastConversation.createTime + '</span>' +
                '<div class="bot-message latest-reply">' + lastConversation.botMessage + '</div>' +
            '</td>' +
        '</table>' +
    '</div>';

    $(".conversation-list").append(answerDiv);


    // 逐字显示最新回复
    var latestReply = $(".latest-reply");
    var latestReplyText = latestReply.text();
    latestReply.empty();
    var index = 0;
    interval = setInterval(function() {
        if (index < latestReplyText.length) {
            $("#stopButton").show();
            latestReply.append(latestReplyText.charAt(index));
            index++;
        } else {
            clearInterval(interval);
            $("#stopButton").hide();
        }
    }, 10); // 逐字显示的速度,您可以根据需要调整

    
    
}

function updateStop(tagId,message){
    $.ajax({
        type: "POST",
        url: SERVER_PATH + "/chat/updateStop",
        data: {
            id: tagId,
            botMessage: message
        },
        xhrFields: {withCredentials: true},
        success: function (result) {
            if (result.status) {
                alertBox(result.data.message);
                return false;
            }
            
        }
    });
}

ChatController

    @PostMapping("/updateStop")
    public ResponseModel updateStop(Integer id,String botMessage){
        Conversation conversation=new Conversation();
        conversation.setId(id);
        conversation.setBotMessage(botMessage);
        chatService.updateChat(conversation);
        return new ResponseModel();
    }

v4版本:多轮对话

实现上下文有关的对话

多次调用qianfan.addMessage().addMessage()

在这里插入图片描述

QianfanUtil

    public String addMessagePlus(List<Message> messages, String content) {

        ChatResponse response = qianfan.chatCompletion()
                .messages(messages)
                .addMessage("user", content)
                .temperature(0.7)
                .execute();


        return response.getResult();

    }

ChatController



    @PostMapping("/chat")
    public ResponseModel chat(Integer tagId, String content) {
        if (tagId == null) {
            throw new BusinessException(PARAMETER_ERROR, "没有指定响应的tag");
        }

        if (StringUtils.isEmpty(content)) {
            throw new BusinessException(PARAMETER_ERROR, "输入内容不能为空");
        }

        Tag tag = tagService.searchById(tagId);
        if (tag == null) {
            throw new BusinessException(NOT_FIND, "没有找到对应的对话");
        }

        String username = userService.selectUserById(tag.getUserId()).getUsername();


        Conversation conversation = new Conversation(null, tagId, username, content, "回复中...", format(new Date()));
        chatService.addChat(conversation);


        // 异步处理AI回复
        CompletableFuture.runAsync(() -> {
            Integer id = conversation.getId();

            String res = null;
            try {
//                res = qianfanUtil.addMessage(content);
                res = qianfanUtil.addMessagePlus(getMessages(tagId), content);
            } catch (Exception e) {
                res = "回复失败";
            }
            Conversation aiConversation = new Conversation();
            aiConversation.setId(id);
            aiConversation.setBotMessage(res);
            chatService.updateChat(aiConversation);
        });

        return new ResponseModel(conversation);

    }

    public List<Message> getMessages(Integer tagId) {
        List<Message> messages = new ArrayList<>();
        List<Conversation> conversations = chatService.searchByTagId(tagId);
        int size = conversations.size() - 1;//最新的不需要
        for (int i = 0; i < size; i++) {
            Conversation conversation = conversations.get(i);
            Message userMessage = new Message();
            userMessage.setRole("user");
            userMessage.setContent(conversation.getUserMessage());
            messages.add(userMessage);
            Message botMessage = new Message();
            botMessage.setRole("assistant");
            botMessage.setContent(conversation.getBotMessage());
            messages.add(botMessage);

        }

        return messages;
    }

v5:其他修改

在这里插入图片描述

前端样式:跳转到最后一个消息

在aichat.html中

		<script>
			function scrollToLastMessage() {
				// 找到消息容器
				var messageContainer = document.querySelector(".message-container");
				
				// 找到消息容器中最后一个子元素
				var lastMessage = messageContainer.lastElementChild;
				
				// 将最后一个消息元素滚动到可见区域
				lastMessage.scrollIntoView({ behavior: 'auto', block: 'end' });
			}

			function onLoad() {
				setTimeout(scrollToLastMessage, 100); // 添加100毫秒的延迟
			}

			window.addEventListener('load', onLoad);
			
		</script>

前端样式:Message保留空白符

savePre(conversation.userMessage)
savePre(conversation.botMessage)
function savePre(content){
    return content.replace(/\n/g, "<br>").replace(/ /g, "<span>&nbsp;</span>");
}

前端样式:最新回复保留空白符

   var botMessageWithBrAndSpace = lastConversation.botMessage.replace(/\n/g, "\\n");

    var answerDiv = 
    '<div class="answer-container">' +
        '<table class="answer">' +
            '<td type="text">AI</td>' +
            '<td>' +
                '<span>' + lastConversation.createTime + '</span>' +
                '<div class="bot-message latest-reply">' + botMessageWithBrAndSpace + '</div>' +
            '</td>' +
        '</table>' +
    '</div>';

    $(".conversation-list").append(answerDiv);

  
    // 逐字显示最新回复
    var latestReply = $(".latest-reply");
    var latestReplyText = botMessageWithBrAndSpace;

    latestReply.empty();
    var index = 0;
    interval = setInterval(function() {
        if (index < latestReplyText.length) {
            $("#stopButton").show();
            if (latestReplyText.charAt(index) === "\\") {
                if (latestReplyText.charAt(index + 1) === "n") {
                    latestReply.append("<br>");
                    index++; // 跳过"n"
                } else {
                    latestReply.append(latestReplyText.charAt(index));
                }
            } else if(latestReplyText.charAt(index)===' '){
                latestReply.append("&nbsp;");

            }else {
                latestReply.append(latestReplyText.charAt(index));
            }
            index++;
        
        } else {
            clearInterval(interval);
            $("#stopButton").hide();
        }
    }, 25); // 逐字显示的速度,您可以根据需要调整

    
    
}

最后

2024-4-10 17:02:49

迎着日光月光星光,直面风霜雨霜雪霜。

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

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

相关文章

【分析 GClog 的吞吐量和停顿时间、heapdump 内存泄漏分析】

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容GClog分析以优化吞吐量和停顿时间步骤1: 收集GClog步骤2: 分析GClog步骤3: 优化建议步骤4: 实施优化 Heapdump内存泄漏分析步骤1: 获取Heapdump步骤2: 分析Heapdump步骤3: 定位泄漏对象步骤4: 分析泄漏原因步骤5: 修复泄漏…

linux服务使用./xxx.sh执行脚本命令

设置脚本文件为全权限 chmod 777 xxx.sh直接使用./xxxx.sh即可

go语言学习--4.方法和接口

目录 1.方法 2.接口 2.1结构体类型 2.2具体类型向接口类型赋值 2.3获取接口类型数据的具体类型信息 3.channel 3.1阻塞式读写channel操作 2.3非阻塞式读写channel操作 4.map 4.1插入数据 4.2删除数据 4.3查找数据 4.4扩容 1.方法 方法一般是面向对象编程(OOP)的一…

2万亿训练数据!Stable LM 2-12B加入开源队列

公*众*号&#xff1a;AI疯人院 4月9日&#xff0c;知名大型模型开源平台Stability.ai在其官网上发布了全新的类ChatGPT模型——Stable LM 2 12B。 据了解&#xff0c;Stable LM 2 12B模型拥有120亿个参数&#xff0c;其训练数据涵盖了英语、西班牙语、德语等7种语言的2万亿个…

【MATLAB源码-第179期】基于matlab的64QAM调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyi…

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.2 月末操作:GR/IR重组

2.6.2 月末操作&#xff1a;GR/IR重组 SAP在采购订单收货和发票校验时分别产生凭证&#xff0c;中间采用GR/IR过渡。GR即为收货&#xff0c;IR即为收票。月末&#xff0c;GR/IR的余额根据收货和收票的情况进行判断&#xff0c;转入“应付暂估”或“在途物资”&#xff0c;次月自…

【Python】FANUC机器人OPC UA通信并记录数据

目录 引言机器人仿真环境准备代码实现1. 导入库2. 设置参数3. 日志配置4. OPC UA通信5. 备份旧CSV文件6. 主函数 总结 引言 OPC UA&#xff08;Open Platform Communications Unified Architecture&#xff09;是一种跨平台的、开放的数据交换标准&#xff0c;常用于工业自动化…

4.19号驱动

1. ARM裸机开发和Linux系统开发的异同 相同点&#xff1a;都是对硬件进行操作 不同点&#xff1a; 有无操作系统 是否具备多进程多线程开发 是否可以调用库函数 操作地址是否相同&#xff0c;arm操作物理地址&#xff0c;驱动操作虚拟地址 2. Linux操作系统的层次 应用层…

Redis群集模式

目录 一、集群的作用 二、Redis集群的数据分片 三、集群的工作原理​编辑 四、搭建Redis群集模式 1.准备环境 1.1 首先安装redis 1.2 在etc下创建redis 1.3再在redis中创建redis-cluster/redis600{1..6}文件 1.4 做个for循环 1.5 开启群集功能 1.6启动redis节点 1.…

c语言---预处理详解(详解)

目录 一、预定义符号二、define 定义常量三、define定义宏四、带有副作用的宏参数五、宏替换的规则六、宏函数的对比七、#和##7.1 #运算符7.2 ##运算符 八、命名约定九、#undef十、命令行定义十一、条件编译十二、头文件的包含12.1头⽂件被包含的方式&#xff1a;12.1.1本地文件…

anylabeling使用和安装

源码地址&#xff1a; git clone https://github.com/vietanhdev/anylabeling.git Auto Labeling with Segment Anything Youtube Demo: https://www.youtube.com/watch?v5qVJiYNX5KkDocumentation: https://anylabeling.nrl.ai Features: Image annotation for polygon, r…

德勤:《中国AI智算产业2024年四大趋势》

2023年《数字中国建设整体布局规划》的发布&#xff0c;明确了数字中国是构建数字时代竞争优势的关键支撑&#xff0c;是继移动互联网时代以来经济增长新引擎。当我们谈论数字中国的构建&#xff0c;不仅仅是在讨论一个国家级的技术升级&#xff0c;而是关乎如何利用数字技术来…

StoryImager、Face Morph、Hash3D、DreamView、Magic-Boost、SmartControl

本文首发于公众号&#xff1a;机器感知 StoryImager、Face Morph、Hash3D、DreamView、Magic-Boost、SmartControl Eagle and Finch: RWKV with Matrix-Valued States and Dynamic Recurrence We present Eagle (RWKV-5) and Finch (RWKV-6), sequence models improving upon…

今日arXiv最热大模型论文:Dataverse,针对大模型的开源ETL工具,数据清洗不再难!

引言&#xff1a;大数据时代下的ETL挑战 随着大数据时代的到来&#xff0c;数据处理的规模和复杂性不断增加&#xff0c;尤其是在大语言模型&#xff08;LLMs&#xff09;的开发中&#xff0c;对海量数据的需求呈指数级增长。这种所谓的“规模化法则”表明&#xff0c;LLM的性…

Python爬虫之Scrapy框架基础

Scrapy爬虫框架介绍 文档 英文文档中文文档 什么是scrapy 基于twisted搭建的异步爬虫框架. scrapy爬虫框架根据组件化设计理念和丰富的中间件, 使其成为了一个兼具高性能和高扩展的框架 scrapy提供的主要功能 具有优先级功能的调度器去重功能失败后的重试机制并发限制ip使用次…

基于Spring Boot的网上商城购物系统设计与实现

基于Spring Boot的网上商城购物系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 商品信息界面&#xff0c;在商品信息页面可以查看商…

谷歌(Google)历年编程真题——生命游戏

谷歌历年面试真题——数组和字符串系列真题练习。 生命游戏 根据 百度百科 &#xff0c; 生命游戏 &#xff0c;简称为 生命 &#xff0c;是英国数学家约翰何顿康威在 1970 年发明的细胞自动机。 给定一个包含 m n 个格子的面板&#xff0c;每一个格子都可以看成是一个细胞…

Python 全栈体系【四阶】(二十五)

第五章 深度学习 三、计算机视觉基本理论 11. 图像梯度处理 11.1 什么是图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化…

蓝桥杯复习笔记

文章目录 gridflexhtml表格合并单元格 表单表单元素input类型 select h5文件上传拖拽apiweb Storage css块元素和行内元素转换positionfloat溢出显示隐藏外边距过渡和动画动画变形选择器属性选择伪类选择器 css3边框圆角边框阴影渐变text-overflow与word-wrap jsdom操作documen…

一键下载安装并自动绑定,Xinstall让您的应用推广更高效

在如今的移动互联网时代&#xff0c;应用的下载安装与绑定是用户体验的关键一环。然而&#xff0c;繁琐的操作步骤和复杂的绑定流程往往让用户望而却步&#xff0c;降低了应用的下载和使用率。为了解决这一难题&#xff0c;Xinstall应运而生&#xff0c;为用户提供了一种全新的…