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

AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处理智能化解决方案

本篇为「AI 数据观」系列文章第二弹,在这里,我们将进一步探讨 AI 行业的数据价值。以 RAG 的智能工单应用场景为例,共同探索如何使用 Tapdata Cloud + MongoDB Atlas 实现具备实时更新能力的向量数据库,为企业工单处理的智能化和自动化需求,提供准实时的新鲜数据。完整分布教程指引,详见正文。

前篇回顾

人工智能是第四次工业革命的核心。大家都听说过“所有产品都值得用大模型重新做一遍”类似的观点,没错现在就正在发生。从去年OpenAI 的Chat GPT取得令人难以置信的成功后,AI正在加速落地各行各业,传媒游戏、机器人、办公软件、医药、自动驾驶、音乐、语音、广告、社交平台等等,呈现出百花齐放的景象。

大型语言模型(LLM)是基于大量数据预先训练的大型深度学习模型,可以生成用户查询的响应内容,例如回答用户问题或者根据文本的提示创建图像等等,在通识领域表现的很好。但大型语言模型(LLM)仍存在一些显著的局限性,特别是在处理特定领域或者高度专业化的查询时,一个常见的问题是产生错误的信息,或者称之为“幻觉”,特别是在查询超出模型的预训练数据集或者需要最新的信息时。

解决这些问题的一种比较有效且流行的方法就是检索增强(Retrieval Augmented Generation,简称RAG),它将外部数据检索整合到生成回答的过程中,这个过程不仅为后续的生成阶段提供信息,还确保基于检索到的资料生成回答,从而显著提高了模型输出回答的准确性和问题相关性。目前几乎大部分企业都在使用这一方式来整合通用大模型能力到自己的产品中,为用户提供具有AI生成能力的产品体验。

接下来我们以企业内部工单数据为例,展示使用 Tapdata Coud + MongoDB Atlas 准备实时向量数据并实现根据用户提的问题检索出最接近的工单及解决方案。
在这里插入图片描述
本篇文章我们重点关注上图中 Mongo DB Atlas 及右侧数据准备阶段的处理过程,工单的向量数据准备过程如下:

  1. 登录 Tapdata Cloud 执行以下操作
  2. 创建 Tapdata Agent
  3. 登录 MongoDB Atlas 控制台创建 MongoDB Atlas 数据库
  4. 创建源库(企业私有数据库,MySQL、Oracle或者SQLServer)连接
  5. 创建目标库(MongoDB Atlas)连接
  6. 创建 源库=>目标库 的数据同步任务并添加数据向量化处理节点
  7. 登录 MongoDB Atlas 控制台创建MongoDB Atlas Vector Index
  8. 使用 Python 执行执行向量查询,返回我们期望得到的最匹配历史工单及解决方案

准备

开始之前我们需要先准备几个账号: Tapdata Cloud 账号、MongoDB Atlas 账号、Huggingface 账号:

  • Tapdata Cloud:实时采集业务库中的增量数据,支持常用的MySQL、SQLServer、Oracle、PostgreSQL、Mongo DB等常见的20多种RDBMS 或 NoSQL 数据库,可做到秒级数据延迟。
  • Mongo DB Atlas:MongoDB是一款开发者友好的开源文档数据库,以其灵活性和易用性而闻名。在MongoDB Atlas(v6.0.11、v7.0.2)提供了向量查询,为生成式AI应用提供友好支持。
  • HuggingFace Access Token: 本示例使用 HuggingFace 提供的 Embedding Model 服务将文本向量化,您也可以使用其他平台提供的模型或者本地部署的模型。

创建 Tapdata Agent

  1. 登录 Tapdata Cloud 控制台,第一次登录控制台时根据新手指引操作即可
  2. 第一步选择你的应用场景,这里选择第一个“迁移数据到 MongoDB Atlas”,点击下一步
    在这里插入图片描述
  3. 第二步选择部署方式,这里需要根据您的数据源所在位置来判断选择全托管或者半托管:
    a. 全托管:任务运行在云端,需要使用公网连接您的数据库,如果您的数据库有开放公网访问权限,这种全托管模式更便捷。
    b. 半托管:将运行任务的Agent部署在您数据库所在局域网或者VPC内,并且提供公网访问权限使得 Agent 与Tapdata Cloud 能够正确连接。运行的任务使用局域网连接您的数据库。
    我这里使用本地私有数据库,所以选择半托管实例,然后点击下一步
    在这里插入图片描述
  4. 第三步选择实例规格,我们这里选择免费实例即可,点击下一步
    在这里插入图片描述
  5. 第四步安装部署 Agent,我们这里使用 Docker 容器部署Agent,点击“Copy”按钮复制启动命令粘贴到本地电脑执行(需要提前安装 Docker 软件,安装方式请查看:Docker Desktop)
    在这里插入图片描述
  6. 本地执行启动部署命令后,需要等几分钟,直到实例状态为“Running”状态后再继续操作
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    到这里,我们已经准备好了运行数据同步任务的Agent。如果您之前已经完成新手引导流程,再次登录时它就不会自动弹出了,这时您只需要切换到“订阅” -> “添加订阅”,然后选择您的部署方式和规格创建实例并完成部署即可。

创建 MongoDB Atlas 数据库

  1. 登录 Mongo DB Atlas 后,点击“New Project”先创建项目,根据引导直接下一步,然后创建项目即可,过程比较简单
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  2. 第二步在刚创建的项目中,点击“+Create” 创建 MongoDB Database
    在这里插入图片描述
  3. 规格选择 M0,集群名称就使用默认名称:Cluster-0,供应商选择 Google Cloud,地区选择 Taiwan,点击“Create Deployment”在这里插入图片描述
  4. 添加访问数据库账号
    在这里插入图片描述
  5. 选择使用“Drivers”连接MongoDB Database
    在这里插入图片描述
  6. 选择 使用Java,然后复制 连接字符串,并保存下来
    在这里插入图片描述
  7. 添加网络访问白名单,点击添加 IP地址
    在这里插入图片描述
  8. 我们这里演示目的,设置为任意地址都可以访问
    在这里插入图片描述
    在这里插入图片描述到这里我们已经成功的在 MongoDB Atlas 上运行起来一个Mongo DB 3节点副本集群,接下来我们回到 Tapdata Cloud 创建连接和数据同步任务。

创建源库连接

| 源库通常是指您的业务数据库

  1. 登录Tapdata Cloud 控制台,打开“Connections”连接管理界面,点击“Create” 创建数据源
    在这里插入图片描述
  2. 根据您的源库类型(通常是指您的业务系统使用的数据库软件)选择要创建的数据源,我这里选择MongoDB
    在这里插入图片描述
  3. 输入数据源名称、连接信息(不同类型的源库,需要填写的连接信息也不一样)等,点击 “Test” 测试连接配置正确,然后点击“Save”保存连接
    在这里插入图片描述
    在这里插入图片描述

创建目标库连接

  1. 打开 “Connections”,点击“Create”按钮,选择 “MongoDB Atlas”
    在这里插入图片描述
  2. 填写名称“MongoDB Atlas”,连接类型选择 “Target”即可,然后复制我们刚才在 Atlas 上创建的MongoDB Database 连接字符串,填写到 “Database URI”,点击“Test”测试连接,点击“Save”保存连接(注意:连接字符串中需要在/后面添加数据库名称,我们这边填写 test )
    在这里插入图片描述
    到这里,我们已经准备好了源库的连接、目标库的连接,下一步就该处理我们的数据了。

创建数据同步处理任务

  1. 在 Tapdata Cloud 控制台上,打开“Data Transformation”,点击“Create”,创建一个任务
    在这里插入图片描述
  2. 拖拽我们刚才创建的源库、目标库连接到画布区域,然后在添加一个 “Enhanced JS” 处理节点,并将它们连接在一起,箭头方向表示数据流方向,如下,当我们启动任务时,数据将会从 Source Database 流向 MongoDB Atlas
    在这里插入图片描述
  3. 配置源库,选择待处理工单数据表: customer_support_tickets
    在这里插入图片描述
    启动任务后,这个节点负责从源库中读取数据,如下:
{_id: ObjectId("65fd324baa464c7697ecf123"),'Ticket ID': 1,'Customer Name': 'Marisa Obrien','Customer Email': 'carrollallison@example.com','Customer Age': 32,'Customer Gender': 'Other','Product Purchased': 'GoPro Hero','Date of Purchase': '2021-03-22','Ticket Type': 'Technical issue','Ticket Subject': 'Product setup','Ticket Description': "I'm having an issue with the {product_purchased}. Please assist.\n" +'\n' +'Your billing zip code is: 71701.\n' +'\n' +'We appreciate that you have requested a website address.\n' +'\n' +"Please double check your email address. I've tried troubleshooting steps mentioned in the user manual, but the issue persists.",'Ticket Status': 'Pending Customer Response',Resolution: '','Ticket Priority': 'Critical','Ticket Channel': 'Social media','First Response Time': '2023-06-01 12:15:36','Time to Resolution': '','Customer Satisfaction Rating': ''
}
  1. 我们将在 Enhanced JS 处理器中加工处理源库读到的数据,将工单描述转为向量,然后写入到目标库,如下:
    在这里插入图片描述
    代码如下:
if (record["Ticket Description"]) {var embedding_url = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2";var headers = new HashMap();headers.put("Authorization", "Bearer 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");headers.put("Content-Type", "application/json");var data = new HashMap();data.put("inputs", record["Ticket Description"]);var result = rest.post(embedding_url, data, headers, "array");if (result.code === 200) {record["ticket_description_embedding"] = result.data;}}return record;

源库中读取到的每一行数据,经过上面JavaScript脚本,都增加了一个 ticket_description_embedding 的字段,用来存储向量化数据,后续语义查询将会基于此字段实现,此时的数据模型如下:

{_id: ObjectId("65fd324baa464c7697ecf123"),'Ticket ID': 1,'Customer Name': 'Marisa Obrien','Customer Email': 'carrollallison@example.com','Customer Age': 32,'Customer Gender': 'Other','Product Purchased': 'GoPro Hero','Date of Purchase': '2021-03-22','Ticket Type': 'Technical issue','Ticket Subject': 'Product setup','Ticket Description': "I'm having an issue with the {product_purchased}. Please assist.\n" +'\n' +'Your billing zip code is: 71701.\n' +'\n' +'We appreciate that you have requested a website address.\n' +'\n' +"Please double check your email address. I've tried troubleshooting steps mentioned in the user manual, but the issue persists.",'Ticket Status': 'Pending Customer Response',Resolution: '','Ticket Priority': 'Critical','Ticket Channel': 'Social media','First Response Time': '2023-06-01 12:15:36','Time to Resolution': '','Customer Satisfaction Rating': '''ticket_description_embedding': [-0.0897391065955162,    0.038192421197891235,    0.012088424526154995,-0.06690243631601334,   -0.013889848254621029,    0.011662089265882969,0.10687699168920517,    0.010783190838992596,  -0.0018359378445893526,-0.03207595646381378,     0.06700573861598969,     0.02220674231648445,-0.038338553160429,    -0.04949694499373436,   -0.034749969840049744,0.11390139162540436,   0.0035523029509931803,   -0.011036831885576248,...]
}

注意:我们这里使用 Huggingface 免费服务,免费服务会受到速率限制,因此我们这里需要限制一下源库中读取数据行数,操作方法如下,在源库节点添加一个过滤条件,避免频繁调用 Huggingface API,您也可以升级为付费用户来规避API调用限制。如下图,只读取id 小于等于 65fd324baa464c7697ecf12c 的工单记录
在这里插入图片描述

  1. 配置目标库写入数据表,此时目标库还不存在表,我们在这里填写一个新的表名称即可
    在这里插入图片描述
  2. 配置任务运行模式:默认为全量 +增量,行为如下:
  • 全量:任务只读取源库中的现有数据并写入目标数据库
  • 增量:任务只读取启动任务之后(或者指定开始时间)新增、修改过的数据,并写入目标数据库
  • 全量+增量:任务会先读取源库中现有的数据写入目标库,然后再读取启动任务之后新增或者修改的数据写入到目标库

我们这里默认选择全量+增量,启动任务后,会先将源库中的存量数据同步到目标库,然后自动读取并处理新增或修改的数据。
在这里插入图片描述

  1. 启动任务,并检查目标库数据是否正确
    在这里插入图片描述
    查询目标库数据,字段 ticket_description_embedding 存储的向量数据,如下:
    在这里插入图片描述

创建MongoDB Atlas Vector Index

  1. 登录 MongoDB Atlas 控制台,打开 “Database”,然后点击 “Create Index”
    在这里插入图片描述
  2. 依次点击“Create Search Index” -> “Atlas Vector Search - JSON Editor” -> “Next”
    在这里插入图片描述
    在这里插入图片描述
    选择我们的刚同步过来目标库表 test.customer_support_tickets
    , 索引名称填写 vector_index,索引配置如下
{"fields": [{"type": "vector","path": "ticket_description_embedding","numDimensions": 384,"similarity": "cosine"}]
}
  • type:vector - 创建 vector search 索引
  • path:ticket_description_embedding - 我们在 JavaScript 中增加的存储向量数据的字段名称
  • numDimensions:向量维度 1-2048,执行向量查询的维度数量
  • similarity:相似性算法,可选值:euclidean-欧氏距离算法、cosine-余弦相似性算法、dotProduct-点积算法
  1. 点击 “Next” -> “Create Index”,向量索引创建完成后,我们就可以执行语义查询了
    在这里插入图片描述

使用 Python 执行执行向量查询

  1. 我们在 Python 中实现语义查询,代码如下:
import requests
from bson import ObjectId
from pymongo.mongo_client import MongoClientif __name__ == "__main__":mongodb_atlas_connection_string = "mongodb+srv://root:mYS4tk78YE1JDtTo@cluster0.twrupie.mongodb.net/test?retryWrites=true&w=majority&appName=Cluster0"embedding_uri = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"huggingface_token = "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"question = "My computer is making strange noises and not functioning properly"headers = {"Authorization": f"Bearer {huggingface_token}"}data = {"inputs": question}response = requests.post(embedding_uri, headers=headers, json=data)if response.status_code == 200:query_vector = response.json()client = MongoClient(mongodb_atlas_connection_string)db = client["test"]result = db.customer_support_tickets.aggregate([{"$vectorSearch": {"queryVector": query_vector,"path": "ticket_description_embedding","numCandidates": 10,"limit": 2,"index": "vector_index"}}])cases = ''for doc in result:print(f"Ticket Status: {doc['Ticket Status']},\nTicket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n")cases += f"Ticket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n\n"
  1. 查询结果如下:
Ticket Description: I'm having an issue with the computer. Please assist.
The seller is not responsible for any damages arising out of the delivery of the battleground game. Please have the game in good condition and shipped to you I've noticed a sudden decrease in battery life on my computer. It used to last much longer. ,
Resolution: West decision evidence bit. Ticket Description: My computer is making strange noises and not functioning properly. I suspect there might be a hardware issue. Can you please help me with this?
} If we can, please send a "request" to dav The issue I'm facing is intermittent. Sometimes it works fine, but other times it acts up unexpectedly. 
Resolution:  Please check if the fan is clogged, if so, please clean it

查询到相关最高的结果后,我们就可以根据用户的问题和历史工单及解决方案组装为Prompt’s 提交给LLM生成回答,如下使用 Google Gemma 模型生成回答

import requests
from pymongo.mongo_client import MongoClientif __name__ == "__main__":mongodb_atlas_connection_string = "mongodb+srv://root:mYS4tk78YE1JDtTo@cluster0.twrupie.mongodb.net/test?retryWrites=true&w=majority&appName=Cluster0"embedding_uri = "https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"huggingface_token = "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"question = "My computer is making strange noises and not functioning properly"headers = {"Authorization": f"Bearer {huggingface_token}"}data = {"inputs": question}response = requests.post(embedding_uri, headers=headers, json=data)if response.status_code == 200:query_vector = response.json()client = MongoClient(mongodb_atlas_connection_string)db = client["test"]result = db.customer_support_tickets.aggregate([{"$vectorSearch": {"queryVector": query_vector,"path": "ticket_description_embedding","numCandidates": 10,"limit": 2,"index": "vector_index"}}])cases = ''for doc in result:print(f"Ticket Status: {doc['Ticket Status']},\nTicket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n")cases += f"Ticket Description: {doc['Ticket Description']} ,\nResolution: {doc['Resolution']} \n\n"# generator answer by llmprompt = f'''### Case:{cases}Please answer the questions based on the above cases: {question}'''llm_model_url = "https://api-inference.huggingface.co/pipeline/feature-extraction/google/gemma-1.1-7b-it"headers = {"Authorization": f"Bearer {huggingface_token}"}data = {"inputs": prompt}response = requests.post(llm_model_url, headers=headers, json=data)if response.status_code == 200:print(response.json()[0].get("generated_text"))

结果如下:


### Case:Ticket Description: I'm having an issue with the computer. Please assist.The seller is not responsible for any damages arising out of the delivery of the battleground game. Please have the game in good condition and shipped to you I've noticed a sudden decrease in battery life on my computer. It used to last much longer. ,Resolution: West decision evidence bit. Ticket Description: My computer is making strange noises and not functioning properly. I suspect there might be a hardware issue. Can you please help me with this?} If we can, please send a "request" to dav The issue I'm facing is intermittent. Sometimes it works fine, but other times it acts up unexpectedly. Resolution:  Please check if the fan is clogged, if so, please clean itPlease answer the questions based on the above cases: My computer is making strange noises and not functioning properly
- What is the initial request of the customer?
- What information does the customer provide about the issue?**Answer:****1. Initial request of the customer:**
The customer requests assistance with a hardware issue causing their computer to make strange noises and malfunction.**2. Information provided by the customer:**
The customer suspects a hardware issue and notes that the problem is intermittent, working fine sometimes and acting up unexpectedly at other times.

这篇文章展示了使用 Tapdata Cloud + MongoDB Atlas 实现根据用户提问问题搜索工单数据的示例,在实际构建AI应用时还有很多细节,如果您遇到任何问题,欢迎随时联系我们。

在当今数字化时代,企业内部工单处理的效率和准确性对于业务的顺畅运行至关重要。传统的人工处理方式可能会面临信息不准确、响应速度慢等问题,而借助大型语言模型(LLM)和检索增强技术的结合,企业可以实现工单处理的智能化和自动化,极大地提升了工作效率和用户体验。

通过使用 Tapdata Cloud 和 MongoDB Atlas,企业可以充分利用先进的向量化技术和实时检索功能,构建出一个强大的工单处理系统。这个系统不仅能够快速地检索出与用户问题最相关的工单和解决方案,还能够不断学习和优化,适应不断变化的业务需求。

迁移数据到 MongoDB Atlas 后,利用 Tapdata Cloud 的强大功能,我们能够轻松实现工单数据的向量化处理,并通过 MongoDB Atlas 的高效存储和检索能力,为企业提供稳定可靠的数据支持。这种结合大型语言模型(LLM)和检索增强RAG技术的创新应用,不仅提高了工单处理的效率和准确性,还为企业带来了全新的智能化解决方案。

因此,随着人工智能技术的不断发展和应用,我们有信心,借助 Tapdata Cloud 和 MongoDB Atlas 的支持,企业内部工单处理将会变得更加高效、准确,为企业的发展和用户的需求提供更加稳定可靠的支持。通过 Tapdata Cloud 和 MongoDB Atlas 的无缝集成,我们为企业提供了一体化的解决方案,以提高企业工单处理的智能化水平和业务效率,为企业发展赋能。

相关文章:

AI 数据观 | TapData Cloud + MongoDB Atlas:大模型与 RAG 技术有机结合,落地实时工单处理智能化解决方案

本篇为「AI 数据观」系列文章第二弹,在这里,我们将进一步探讨 AI 行业的数据价值。以 RAG 的智能工单应用场景为例,共同探索如何使用 Tapdata Cloud MongoDB Atlas 实现具备实时更新能力的向量数据库,为企业工单处理的智能化和自…...

Vulnhub靶机随笔-Hacksudo_Aliens

Vulnhub靶机Hacksudo_Aliens详解 攻击机Kali IP:192.168.3.44 靶机 IP:未知 系统:未知 A.信息收集 扫描靶机存活性 确定IP地址 1.命令:arp-scan -l 扫描靶机开放端口及其服务版本信息 2.命令 nmap -A -p- -sV 靶机IP地址 靶机开放三个端口,22ssh端口,80web端…...

抖店选品都怎么选品?什么样的产品更吸引人,更具有购买力?

大家好,我是电商花花。 抖店选品一直都是我们无货源商家的核心问题,不管是出单、还是爆单,店铺想要有销量的前提下都是选品。 很多人一上来就是就是选品,没有选品经验还瞎选品,结果到最后选了一堆出单的产品&#xf…...

将来会是Python、Java、Golang三足鼎立吗?

在开始前我有一些资料,是我根据网友给的问题精心整理了一份「 Java的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 软件工程里没有银弹&#xff…...

Java入门基础学习笔记16——运算符

package cn.ensource.operator;public class OperatorDemo1 {public static void main(String[] args) {// 目标:掌握基本的算术运算符的使用int a 10;int b 2;System.out.println(a b);System.out.println(a - b);System.out.println(a * b); // 20System.out.…...

golang中三种线程安全的MAP

一、map 是什么 map 是 Go 中用于存储 key-value 关系数据的数据结构,类似 C 中的 map,Python 中的 dict。Go 中 map 的使用很简单,但是对于初学者,经常会犯两个错误:没有初始化,并发读写。 1、未初始化的…...

C++笔试强训day16

目录 1.字符串替换 2.神奇数 3.DNA序列 1.字符串替换 链接 简单的遍历替换即可&#xff1a; class Solution { public:string formatString(string str, vector<char>& arg) {string ret;int k 0;for (int i 0; i < str.size(); i){if (str[i] %){ret arg…...

spsr 的恢复出错,导致 thumb 指令集的 it 条件运行指令运行异常,清晰的调试思路帮助快速解决问题

记一次调试过程 这是一个在 arm 架构上的 RTOS 上的调试过程。问题现象为使用 thumb 指令集的 libgcc 库的情况下&#xff0c;浮点运算随机出错。经过一番追踪调试&#xff0c;逐步缩小问题范围&#xff0c;最后定位问题&#xff0c;成功解决。 场景 在某款的国产 RTOS 上&a…...

mysql binlog 如何区分db

binlog不是InnoDB存储引擎特有的日志文件&#xff0c;是属于mysql server自己的日志文件。 提交事务的时候&#xff0c;同时会写入binlog 在MySQL中&#xff0c;Binary Log&#xff08;binlog&#xff09;记录了数据库更改操作的所有细节&#xff0c;对于实现数据复制、恢复以…...

ESP32 IDF linux下开发环境搭建

文章目录 介绍升级Python环境下载Python包配置编译环境及安装Python设置环境变量 ESPIDF环境搭建下载esp-idf 代码编译等待下载烧录成功查看串口打印 介绍 esp32 官方文档给的不是特别详细 参考多方资料 最后才完成开发 主要问题在于github下载的很慢本教程适用于ubuntu deban…...

光伏电站智能管理平台功能全面介绍

一、介绍 光伏电站智能管理平台专门为了光伏电站服务的融合了项目沟通、在线设计、施工管理、运维工单等多智能光伏管理系统&#xff0c;可以满足光伏电站建设前期沟通、中期建设和后续维护的一体化智能平台&#xff0c;同时通过组织架构对企业员工进行线上管理和数据同步&…...

SSL证书 购买流程

在购买SSL证书之前&#xff0c;需要知道一点相关的知识&#xff0c;通常包括以下几个环节&#xff1a; 一、确定需求 1、根据需要保护的域名数量&#xff0c;在以下三类中选择合适的证书类型&#xff1a; 单域名证书&#xff0c;只对一个域名&#xff08;例如abc.com&#x…...

C++|二叉搜索树

一、二叉搜索树的概念 二叉搜索树又称为二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根结…...

网页html版面分析-- BeauifulSoup(python 文档解析提取)

介绍 BeauifulSoup 是一个可以从HTML或XML 文件中提取数据的python库&#xff1b;它能通过转换器实现惯用的文档导航、查找、修改文档的方式。 BeauifulSoup是一个基于re开发的解析库&#xff0c;可以提供一些强大的解析功能&#xff1b;使用BeauifulSoup 能够提高提取数据的效…...

第五十八节 Java设计模式 - 适配器模式

Java设计模式 - 适配器模式 我们在现实生活中使用适配器很多。例如&#xff0c;我们使用存储卡适配器连接存储卡和计算机&#xff0c;因为计算机仅支持一种类型的存储卡&#xff0c;并且我们的卡与计算机不兼容。 适配器是两个不兼容实体之间的转换器。适配器模式是一种结构模…...

程序员的归宿。。

大家好&#xff0c;我是瑶琴呀。 相信每个进入职场的人都考虑过自己的职业生涯规划&#xff0c;在不同的年龄段可能面临不同挑战&#xff0c;这点对于 35 的人应该更为感同身受。 对于程序员来说&#xff0c;大部分人的职业道路主要是下面三种&#xff1a;第一条&#xff0c;…...

ROS服务器通信

目录 一、角色 二、流程 注意 三、例子描述 四、srv文件 编译配置文件 vscode配置 五、Server.cpp编写例子 编写CMakeList 六、观察server的效果 七、Client编写例子 编写CMakeList 八、观察Client的结果 九、Client优化&#xff08;动态输入&#xff09; 了解argc…...

双向带头循环链表(图解)

文章目录 头节点(哨兵位)双向循环结构头插尾插头删尾删在指定位置之前插入数据删除指定位置之前的数据销毁链表 全部代码结语 单链表地址 头节点(哨兵位) 什么是头节点呢?头节点也叫哨兵节点,他在链表中进行不了任何操作,只是用来放哨用的,在单链表中我们当我们尾插的时候我们…...

富文本编辑器 iOS

https://gitee.com/klkxxy/WGEditor-mobile#wgeditor-mobile 采用iOS系统浏览器做的一款富文本编辑器工具。 原理就是使用WKWebView加载一个本地的一个html文件&#xff0c;从而达到编辑器功能的效果&#xff01; 由于浏览器的一些特性等&#xff0c;富文本编辑器手机端很难做…...

【OceanBase诊断调优】—— checksum error ret=-4103 问题排查

适用版本 OceanBase 数据库所有版本。 什么是 checksum data checksum&#xff1a;一个 SSTable 中所有宏块内存二进制计算出来的 checksum 值。反映了宏块中的数据和数据分布情况。如果宏块中数据一致但是数据分布不一致&#xff0c;计算出来的 checksum 也不相等。 column…...

嵌入式学习--江协stm32day5

USART 1. 引脚与接口层 异步引脚&#xff1a; TX&#xff1a;发送数据输出&#xff1b;RX&#xff1a;接收数据输入&#xff1b;SW_RX&#xff1a;单线半双工模式的接收引脚&#xff08;替代 RX&#xff09;。 同步引脚&#xff1a;SCLK&#xff1a;同步模式下的时钟输出&…...

阿里云域名怎么绑定

阿里云服务器绑定域名全攻略&#xff1a;一步步轻松实现网站“零”障碍上线&#xff01; 域名&#xff0c;您网站在云端的“身份证”&#xff01; 在数字化浪潮中&#xff0c;拥有一个属于自己的网站或应用&#xff0c;是个人展示、企业运营不可或缺的一环。而云服务器&#x…...

java面试场景题:QPS 短链系统怎么设计

以下是对文章的润色版本&#xff1a; 这道场景设计题&#xff0c;初看似乎业务简单&#xff0c;实则覆盖的知识点极为丰富&#xff1a; 高并发与高性能分布式 ID 生成机制&#xff1b;Redis Bloom Filter——高并发、低内存损耗的过滤组件知识&#xff1b;分库、分表海量数据存…...

ps蒙版介绍

一、蒙版的类型 Photoshop中有多种蒙版类型&#xff0c;每种适用于不同的场景&#xff1a; 图层蒙版&#xff08;Layer Mask&#xff09; 作用&#xff1a;控制图层的可见性&#xff0c;黑色隐藏、白色显示、灰色半透明。特点&#xff1a;可随时编辑&#xff0c;适合精细调整。…...

WebRTC通话原理与入门难度实战指南

波煮的实习公司主要是音视频业务&#xff0c;所以最近在补习WebRTC的相关内容&#xff0c;会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商&#xff1a;彼此要了解对方支持的媒体格式网络协商&#xff1a;彼此要了解对方的网络情况&#xff0c;这样才…...

Python 函数全攻略:函数进阶(生成器、闭包、内置函数、装饰器、推导式)

一、默认参数中的易错点 问题: 当函数的默认参数是可变类型(如 list, dict)时,存在“坑”。 现象: def func(a2=[]): # a2 默认是一个空列表a2.append(2)print(a2)func() # 第一次调用,a2 默认为 [],输出 [2] func([]) # 传入新列表,输出 [2] func([1]) # 传入带元素的…...

【vLLM 学习】Cpu Offload Lmcache

vLLM 是一款专为大语言模型推理加速而设计的框架&#xff0c;实现了 KV 缓存内存几乎零浪费&#xff0c;解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ *在线运行 vLLM 入门教程&#xff1a;零基础分步指南 源码 examples/offline_inf…...

华为云Flexus+DeepSeek征文| 华为云Flexus X实例单机部署Dify-LLM应用开发平台全流程指南

华为云FlexusDeepSeek征文&#xff5c; 华为云Flexus X实例单机部署Dify-LLM应用开发平台全流程指南 前言一、相关名词介绍1.1 华为云Flexus X实例介绍1.2 Dify介绍1.3 DeepSeek介绍1.4 华为云ModelArts Studio介绍 二、部署方案介绍2.1 方案介绍2.2 方案架构2.3 需要资源2.4 本…...

内嵌式mqtt server

添加moquette依赖 <dependency><groupId>io.moquette</groupId><artifactId>moquette-broker</artifactId><version>0.17</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>…...

【Linux内核】设备模型之udev技术详解

目录 1. udev技术概述 2. 技术层次分析 2.1 内核层交互 2.2 规则引擎层 2.3 用户空间实现 3. 关键技术要点 3.1 动态设备节点管理 3.2 热插拔处理 3.3 模块化规则系统 3.3.1. 变量替换功能 3.3.2. 条件判断能力 3.3.3. 实现机制 3.3.4 应用场景 3.3.5 扩展能力 4…...