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

RAG (Retrieval Augmented Generation) 检索增强和生成

1 RAG技术简介

1.1 RAG技术概述

RAG(Retrieval Augmented Generation) 是一种结合了检索(Retrieval)和生成(Generation)的技术,旨在通过利用外部知识库来增强大型语言模型(LLMs)的性能。它通过检索与用户输入相关的信息片段,并结合这些信息来生成更准确、更丰富的回答。

在这里插入图片描述

正式介绍检索增强生成(Retrieval Augmented Generation,RAG)技术以前,大家不妨想想为什么会出现这样一个技术。 给模型注入新知识的方式,可以简单分为两种方式,一种是内部的,即更新模型的权重,另一个就是外部的方式,给模型注入格外的上下文或者说外部信息,不改变它的的权重。
第一种方式,改变了模型的权重即进行模型训练,这是一件代价比较大的事情,大语言模型具体的训练过程,可以参考InternLM2技术报告。
第二种方式,并不改变模型的权重,只是给模型引入格外的信息。类比人类编程的过程,第一种方式相当于你记住了某个函数的用法,第二种方式相当于你阅读函数文档然后短暂的记住了某个函数的用法。

在这里插入图片描述
对比两种注入知识方式,第二种更容易实现。RAG正是这种方式。它能够让基础模型实现非参数知识更新,无需训练就可以掌握新领域的知识。本次课程选用了LlamaIndex框架。LlamaIndex 是一个上下文增强的 LLM 框架,旨在通过将其与特定上下文数据集集成,增强大型语言模型(LLMs)的能力。它允许您构建应用程序,既利用 LLMs 的优势,又融入您的私有或领域特定信息。

1.2 向量数据库 Vector-DB

向量数据库 Vector-DB用于将文本及其他数据通过其他预训练的模型转换为固定长度的向量表示,这些向量能够捕捉文本的语义信息。
在这里插入图片描述

1.3 RAG发展进程

RAG的概念最早是由Meta(Facebook)的Lewis等人在2020《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》 中提出的。
在这里插入图片描述

1.4 RAG常见优化方法

  • 索引优化
  • 查询优化
  • 嵌入优化
  • 上下文管理
  • LLM微调
  • 选代检索
  • 递归检索
  • 自适应检索
    在这里插入图片描述

1.5 RAG vs.微调(Fine-tuning )

(1) RAG

  • 非参数记忆,利用外部知识库提供实时更新的信息。
  • 能够处理知识密集型任务,提供准确的事实性回答。
  • 通过检索增强,可以生成更多样化的内容。

适用场景

  • 适用于需要结合最新信息和实时数据的任务:开放域问答、实时新闻摘等。

优势:动态知识更新,处理长尾知识问题。

局限:依赖于外部知识库的质量和覆盖范围(Garbage in, garbage out)。

(2) Fine-tuning

  • 参数记忆,通过在特定任务数据上训练,模型可以更好地适应该任务。
  • 通常需要大量标注数据来进行有效微调。
  • 微调后的模型可能过拟合,导致泛化能力下降。

适用场景
适用于数据可用且需要模型高度专业化的任务,如特定领域的文本分类、情感分析、文本生成等。

优势:模型性能针对特定任务优化。
局限:需要大量的标注数据,且对新任务的适应
性较差。

模型优化方法Prompt Engineering、RAG、Fine-tuning比较:

在这里插入图片描述

1.6 评估框架和基准测试

经典评估指标

  • 准确率(Accuracy)
  • 召回率(Recall)
  • F1分数(F1Score)
  • BLEU分数(用于机器翻译和文本生成)
  • ROUGE分数(用于文本生成的评估)

RAG评测框架

  • 基准测试-RGB、RECALL、CRUD
  • 评测工具-RAGAS、ARES、TruLens

1.7 相关论文

更多详细信息可见2024一篇RAG综述 《Retrieval-Augmented Generation for Large Language Models: A Survey》。

2 LlamaIndex框架

LlamaIndex是一个开源的索引和搜索库,提供高效、可扩展的文本索引和检索功能。

在这里插入图片描述

2.1 LlamaIndex 特点

数据索引和检索

  • 对大规模数据进行索引,支持多种数据源(文件、数据库、网络等)
  • 提供高效的检索机制,快速找到相关信息

支持多种生成模型

  • 除Llama系列外,还支持GPT系列、OpenAIAPI、和InternLM系列等多种大模型
    在这里插入图片描述

2.2 LlamaIndex RAG 应用

Llamalndex提供了RAG一般应用的全过程模块化,拓展方便

  • 数据加载(Loading)
    从多种数据源加载数据:无论是文本文件、PDF、网站、数据库还是API,Llamalndex通过LlamaHub提供了数百个连接器(connectors or Reader),使数据加载过程高效且多样化。
  • 数据索引(Indexing)
    创建数据结构:LlamaIndex通过创建向量嵌入vectorembeddings(数据含义的数值表示)和其他元数据策略来索引数据。这些结构使得查询数据变得简单且精确,能够快速找到上下文相关的信息。
  • 数据存储(Storing)
    索引和元数据存储:一旦数据被索引,LlamaIndex会将索引和其他元数据存储起来,避免重复索引过程。这种方法提高了系统的效率和响应速度。
  • 数据查询(Querying)
    多样化的查询策略:对于任何给定的索引策略,LamaIndex提供了多种查询方式,包括子查询、多步骤查询和混合策略。这些方法利用LLM和LlamaIndex数据结构,确保能够准确且有效地获取所需信息。
  • 效果评估(Evaluating)
    评估和优化:在任何管道中,评估是关键步骤。LlamaIndex提供客观的评估方法,衡量查询响应的准确性、忠实性和速度。通过评估,用户可以比较不同策略的效果,并在进行更改时确保系统性能的稳定和优化。

在这里插入图片描述

3 Llamaindex RAG 实践

基于Llamalndex构建自己的RAG知识库,寻找一个问题 A 在使用Llamalndex之前InternLM2-Chat-1.8B模型不会回答,借助Llamalndex后InternLM2-Chat-1.8B模型具备回答A的能力。

示例:如图所示,由于xtuner是一款比较新的框架, 浦语 API 训练数据库中并没有收录到它的相关信息。左图中问答均未给出准确的答案。右图未对 浦语 API 进行任何增训的情况下,通过 RAG 技术实现的新增知识问答。

在这里插入图片描述

3.1 环境、模型准备

3.1.1 配置基础环境

创建新的conda环境,命名为 llamaindex,在命令行模式下运行:

 conda create -n llamaindex python=3.10

创建完成后,在本地查看环境。

conda env list

结果如下所示。

# conda environments:
#
base                  *  /root/.conda
llamaindex               /root/.conda/envs/llamaindex

运行 conda 命令,激活 llamaindex 然后安装相关基础依赖 python 虚拟环境:

conda activate llamaindex

安装python 依赖包

pip install einops==0.7.0 protobuf==5.26.1

3.1.2 安装 Llamaindex

以下安装根据需要取其一。

  1. 浦语 API+LlamaIndex,安装 Llamaindex和相关的包,需要安装较长的时间。
conda activate llamaindex
pip install llama-index==0.11.20
pip install llama-index-llms-replicate==0.3.0
pip install llama-index-llms-openai-like==0.2.0
pip install llama-index-embeddings-huggingface==0.3.1
pip install llama-index-embeddings-instructor==0.2.1
pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cu121
  1. 如果使用 LlamaIndex+本地部署InternLM,则安装下列相关包,不需要安装上述包。
  • 安装 Llamaindex 和相关的包:
conda activate llamaindex
pip install llama-index==0.10.38 llama-index-llms-huggingface==0.2.0 "transformers[torch]==4.41.1" "huggingface_hub[inference]==0.23.1" huggingface_hub==0.23.1 sentence-transformers==2.7.0 sentencepiece==0.2.0
  • 安装 LlamaIndex 词嵌入向量依赖:
conda activate llamaindex
pip install llama-index-embeddings-huggingface==0.2.0 llama-index-embeddings-instructor==0.1.3

安装 pytorch

pip install torch==2.5.0 torchvision==0.20.0 torchaudio==2.5.0 --index-url https://download.pytorch.org/whl/cu121

3.1.3 下载 Sentence Transformer 模型

源词向量模型 Sentence Transformer:(我们也可以选用别的开源词向量模型来进行 Embedding,目前选用这个模型是相对轻量、支持中文且效果较好的,同学们可以自由尝试别的开源词向量模型) 运行以下指令,新建一个python文件。

cd ~
mkdir llamaindex_demo
mkdir model
cd ~/llamaindex_demo
touch download_hf.py

打开download_hf.py 贴入以下代码:

import os# 设置环境变量
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'# 下载模型
os.system('huggingface-cli download --resume-download sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2 --local-dir /root/model/sentence-transformer')

然后,在…/llamaindex_demo 目录下执行该脚本即可自动开始下载:

conda activate llamaindex
python download_hf.py

3.1.4 下载 NLTK 相关资源

我们在使用开源词向量模型构建开源词向量的时候,需要用到第三方库 nltk 的一些资源。正常情况下,其会自动从互联网上下载,但可能由于网络原因会导致下载中断,此处我们可以从国内仓库镜像地址下载相关资源,保存到服务器上。 我们用以下命令下载 nltk 资源并解压到服务器上:

cd /root
git clone https://gitee.com/yzy0612/nltk_data.git  --branch gh-pages
cd nltk_data
mv packages/*  ./
cd tokenizers
unzip punkt.zip
cd ../taggers
unzip averaged_perceptron_tagger.zip

之后使用时服务器即会自动使用已有资源,无需再次下载。

3.2 是否使用 LlamaIndex 前后对比

3.2.1 不使用 LlamaIndex RAG(仅API)

浦语官网和硅基流动都提供了InternLM的类OpenAI接口格式的免费的 API,可以访问以下两个了解两个 API 的使用方法和 Key。

浦语官方 API:https://internlm.intern-ai.org.cn/api/document
硅基流动:https://cloud.siliconflow.cn/models?mfs=internlm

方法1:运行以下指令,新建一个python文件

cd ~/llamaindex_demo
touch test_internlm.py

打开test_internlm.py 输入以下代码:

from openai import OpenAIbase_url = "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
api_key = "填写自己的token!"
model="internlm2.5-latest"# base_url = "https://api.siliconflow.cn/v1"
# api_key = "sk-请填写准确的 token!"
# model="internlm/internlm2_5-7b-chat"client = OpenAI(api_key=api_key , base_url=base_url,
)chat_rsp = client.chat.completions.create(model=model,messages=[{"role": "user", "content": "xtuner是什么?"}],
)for choice in chat_rsp.choices:print(choice.message.content)

运行:

python test_internlm.py

结果为:
在这里插入图片描述

方法2 LlamaIndex+本地部署InternLM

如果本地已下载了InternLM2 1.8B,只需设计一个软链接:

cd ~/model
ln -s /root/share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b/ ./

然后新建文件:

cd ~/llamaindex_demo
touch llamaindex_internlm.py

代码:

from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.llms import ChatMessage
llm = HuggingFaceLLM(model_name="/root/model/internlm2-chat-1_8b",tokenizer_name="/root/model/internlm2-chat-1_8b",model_kwargs={"trust_remote_code":True},tokenizer_kwargs={"trust_remote_code":True}
)rsp = llm.chat(messages=[ChatMessage(content="xtuner是什么?")])
print(rsp)

运行:

python llamaindex_internlm.py

结果为:
在这里插入图片描述

回答的效果并不好,并不是我们想要的xtuner。

3.2.2 使用 API+LlamaIndex

运行以下命令,获取知识库

cd ~/llamaindex_demo
mkdir data
cd data
git clone https://github.com/InternLM/xtuner.git
mv xtuner/README_zh-CN.md ./

运行以下指令,新建一个python文件

cd ~/llamaindex_demo
touch llamaindex_RAG.py

打开llamaindex_RAG.py贴入以下代码

import os 
os.environ['NLTK_DATA'] = '/root/nltk_data'from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
from llama_index.core.settings import Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.legacy.callbacks import CallbackManager
from llama_index.llms.openai_like import OpenAILike# Create an instance of CallbackManager
callback_manager = CallbackManager()api_base_url =  "https://internlm-chat.intern-ai.org.cn/puyu/api/v1/"
model = "internlm2.5-latest"
api_key = "请填写 API Key"# api_base_url =  "https://api.siliconflow.cn/v1"
# model = "internlm/internlm2_5-7b-chat"
# api_key = "请填写 API Key"llm =OpenAILike(model=model, api_base=api_base_url, api_key=api_key, is_chat_model=True,callback_manager=callback_manager)#初始化一个HuggingFaceEmbedding对象,用于将文本转换为向量表示
embed_model = HuggingFaceEmbedding(
#指定了一个预训练的sentence-transformer模型的路径model_name="/root/model/sentence-transformer"
)
#将创建的嵌入模型赋值给全局设置的embed_model属性,
#这样在后续的索引构建过程中就会使用这个模型。
Settings.embed_model = embed_model#初始化llm
Settings.llm = llm#从指定目录读取所有文档,并加载数据到内存中
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
#创建一个VectorStoreIndex,并使用之前加载的文档来构建索引。
# 此索引将文档转换为向量,并存储这些向量以便于快速检索。
index = VectorStoreIndex.from_documents(documents)
# 创建一个查询引擎,这个引擎可以接收查询并返回相关文档的响应。
query_engine = index.as_query_engine()
response = query_engine.query("xtuner是什么?")print(response)

运行:

python llamaindex_RAG.py

注意:第一次运行会下载相关数据需要一段时间,请耐心等待,如中断可能导致第二次运行因为文件损坏报错!!!

结果为:
在这里插入图片描述
很明显,借助RAG技术后,我们得到了想要的答案。

方法2 LlamaIndex+本地部署InternLM:
如果本地有模型文件,代码如下:


from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settingsfrom llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLM#初始化一个HuggingFaceEmbedding对象,用于将文本转换为向量表示
embed_model = HuggingFaceEmbedding(
#指定了一个预训练的sentence-transformer模型的路径model_name="/root/model/sentence-transformer"
)
#将创建的嵌入模型赋值给全局设置的embed_model属性,
#这样在后续的索引构建过程中就会使用这个模型。
Settings.embed_model = embed_modelllm = HuggingFaceLLM(model_name="/root/model/internlm2-chat-1_8b",tokenizer_name="/root/model/internlm2-chat-1_8b",model_kwargs={"trust_remote_code":True},tokenizer_kwargs={"trust_remote_code":True}
)
#设置全局的llm属性,这样在索引查询时会使用这个模型。
Settings.llm = llm#从指定目录读取所有文档,并加载数据到内存中
documents = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()
#创建一个VectorStoreIndex,并使用之前加载的文档来构建索引。
# 此索引将文档转换为向量,并存储这些向量以便于快速检索。
index = VectorStoreIndex.from_documents(documents)
# 创建一个查询引擎,这个引擎可以接收查询并返回相关文档的响应。
query_engine = index.as_query_engine()
response = query_engine.query("xtuner是什么?")print(response)

运行:

python llamaindex_RAG.py

结果为:在这里插入图片描述

3.3 LlamaIndex web

运行之前首先安装依赖

pip install streamlit==1.36.0

运行以下指令,新建一个 python 文件

cd ~/llamaindex_demo
touch app.py

打开app.py写入以下代码

import streamlit as st
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.llms.huggingface import HuggingFaceLLMst.set_page_config(page_title="llama_index_demo", page_icon="🦜🔗")
st.title("llama_index_demo")# 初始化模型
@st.cache_resource
def init_models():embed_model = HuggingFaceEmbedding(model_name="/root/model/sentence-transformer")Settings.embed_model = embed_modelllm = HuggingFaceLLM(model_name="/root/model/internlm2-chat-1_8b",tokenizer_name="/root/model/internlm2-chat-1_8b",model_kwargs={"trust_remote_code": True},tokenizer_kwargs={"trust_remote_code": True})Settings.llm = llmdocuments = SimpleDirectoryReader("/root/llamaindex_demo/data").load_data()index = VectorStoreIndex.from_documents(documents)query_engine = index.as_query_engine()return query_engine# 检查是否需要初始化模型
if 'query_engine' not in st.session_state:st.session_state['query_engine'] = init_models()def greet2(question):response = st.session_state['query_engine'].query(question)return response# Store LLM generated responses
if "messages" not in st.session_state.keys():st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]# Display or clear chat messages
for message in st.session_state.messages:with st.chat_message(message["role"]):st.write(message["content"])def clear_chat_history():st.session_state.messages = [{"role": "assistant", "content": "你好,我是你的助手,有什么我可以帮助你的吗?"}]st.sidebar.button('Clear Chat History', on_click=clear_chat_history)# Function for generating LLaMA2 response
def generate_llama_index_response(prompt_input):return greet2(prompt_input)# User-provided prompt
if prompt := st.chat_input():st.session_state.messages.append({"role": "user", "content": prompt})with st.chat_message("user"):st.write(prompt)# Gegenerate_llama_index_response last message is not from assistant
if st.session_state.messages[-1]["role"] != "assistant":with st.chat_message("assistant"):with st.spinner("Thinking..."):response = generate_llama_index_response(prompt)placeholder = st.empty()placeholder.markdown(response)message = {"role": "assistant", "content": response}st.session_state.messages.append(message)

之后运行

streamlit run app.py

打开的 url
在这里插入图片描述

即可进入以下网页,然后就可以开始尝试问问题了
在这里插入图片描述

询问结果为:

在这里插入图片描述

相关文章:

RAG (Retrieval Augmented Generation) 检索增强和生成

1 RAG技术简介 1.1 RAG技术概述 RAG(Retrieval Augmented Generation) 是一种结合了检索(Retrieval)和生成(Generation)的技术,旨在通过利用外部知识库来增强大型语言模型(LLMs&am…...

Figma入门-约束与对齐

Figma入门-约束与对齐 前言 在之前的工作中,大家的原型图都是使用 Axure 制作的,印象中 Figma 一直是个专业设计软件。 最近,很多产品朋友告诉我,很多原型图都开始用Figma制作了,并且很多组件都是内置的&#xff0c…...

039集——渐变色之:CAD中画彩虹()(CAD—C#二次开发入门)

(来左边儿 跟我一起画个龙,在你右边儿 画一道彩虹 ~~~~~~~~~~~ ) 效果如下: namespace AcTools {public class Class1{public Wform.Timer timer;//定时器需建在类下面public static DateTime startTime;[CommandM…...

MTK主板_小型联发科安卓主板_行业智能终端主板基于联发科方案

MTK安卓主板是一款小巧而高效的科技产品,其尺寸仅为43.4mm x 57.6mm。采用了先进的联发科12nm制程工艺,这款主板搭载四核或八核64位A53架构的CPU,主频高达2.0GHz,不但保证了出色的计算能力,还实现了超低功耗的特点。系…...

Arrays.copyOfRange(),System.arraycopy() 数组复制,数组扩容

Arrays.copyOfRange() 当需要将数组中的 长度扩容时, 数组复制 使用 需要用到Arrays 类提供的的 参数解析 * param original the array from which a range is to be copied * param from the initial index of the range to be copied, inclusive * param to the final ind…...

Docker for Everyone Plus——No Enough Privilege

直接告诉我们flag在/flag中,访问第一小题: sudo -l查看允许提权执行的命令: 发现有image load命令 题目指明了有rz命令,可以用ZMODEM接收文件,看到一些write up说可以用XShell、MobaXterm、Tabby Terminal等软件连接上…...

ElasticSearch学习笔记把:Springboot整合ES(二)

一、前言 上一篇文章中我们学习了ES中的Term级别的查询&#xff0c;包括 term、terms、terms_set、rang等&#xff0c;今天我们使用Java代码实现一遍上述的查询。 二、项目依赖 POM <?xml version"1.0" encoding"UTF-8"?> <project xmlns&q…...

Linux系统之iotop命令的基本使用

Linux系统之iotop命令的基本使用 一、iotop命令介绍二、iotop命令的使用帮助2.1 安装iotop2.2 iotop命令help帮助信息2.3 iotop命令选项解释 三、 iotop命令的基本使用四、iotop使用注意事项 一、iotop命令介绍 iotop 是一个类似于 top 的命令行工具&#xff0c;但它专注于显示…...

根据合约地址判断合约协议的方法

判断合约协议之前&#xff0c;需要了解一下什么是ERC165协议&#xff1a; ERC165 是以太坊中用于标准化接口检测的协议&#xff0c;由 Fabian Vogelsteller 在 2018 年创建 &#xff0c;其核心内容主要包括以下方面&#xff1a; 接口定义 单一函数接口&#xff1a;ERC165 协议…...

什么是sfp,onu,​为什么PON(​俗称“光猫”​)模块使用SC光纤接口

在现代网络设备中&#xff0c;我们经常会看到SFP或SFP接口的身影&#xff0c;这些接口有时被简称为光口&#xff0c;但这个称呼并不严谨。有些厂商则称之为多功能口或多用途口&#xff0c;然而这对于不了解的人来说可能还是一头雾水。SFP&#xff0c;即Small Form-Factor Plugg…...

链表?->?(以尾插法说明,附头插法)

这篇文章做一些关于初学链表的一些问题的解答。 我知道有些朋友只是需要一份完整的关于链表的代码&#xff0c;我会附在后面&#xff0c;大家直接划到最后就好。 一、创建链表 (1 相信所有搜索过链表创建的朋友都看过这样一行&#xff1a; struct Line* head (struct Line…...

11.29周五F34-Day10打卡

文章目录 1. 问问他能不能来。解析答案:【解析答案分析】【对比分析】【拓展内容】2. 问题是他能不能做。解析答案:【解析答案分析】3. 问题是我们能否联系得上她。(什么关系?动作 or 描述?)解析答案:【解析答案分析】【对比分析】4. 我们在讨论是否要开一个会。解析答案:…...

【项目日记】仿mudou的高并发服务器 --- 实现HTTP服务器

对于生命&#xff0c;你不妨大胆一点&#xff0c; 因为我们始终要失去它。 --- 尼采 --- ✨✨✨项目地址在这里 ✨✨✨ ✨✨✨https://gitee.com/penggli_2_0/TcpServer✨✨✨ 仿mudou的高并发服务器 1 前言2 Util工具类3 HTTP协议3.1 HTTP请求3.2 HTTP应答 4 上下文解析模块…...

【SpringBoot问题】IDEA中用Service窗口展示所有服务及端口的办法

1、调出Service窗口 打开View→Tool Windows→Service&#xff0c;即可显示。 2、正常情况应该已经出现SpringBoot&#xff0c;如下图请继续第三步 3、配置Service窗口的项目启动类型。微服务一般是Springboot类型。所以这里需要选择一下。 点击最后一个号&#xff0c;点击Ru…...

Ubuntu20.04运行LARVIO

文章目录 1.运行 Toyish 示例程序2.运行 ROS Nodelet参考 1.运行 Toyish 示例程序 LARVIO 提供了一个简化的toyish示例程序&#xff0c;适合快速验证和测试。 编译项目 进入 build 文件夹并通过 CMake 编译项目&#xff1a; mkdir build cd build cmake -D CMAKE_BUILD_TYPER…...

数字化转型背景下,高职院校计算机网络应用的革新策略

在当今信息化时代&#xff0c;计算机网络已经成为高职院校教育不可或缺的一部分&#xff0c;它不仅极大地丰富了教育资源&#xff0c;提高了交流的便捷性&#xff0c;还催生了多样化的教学模式。对于高职院校来说&#xff0c;加强计算机网络应用的建设不仅是顺应时代潮流的必然…...

mysql 里面的主表和子表是什么?如何创建主表和子表的关系

在MySQL数据库中&#xff0c;主表和子表的概念是基于表间关系的。它们通常通过外键约束来建立联系&#xff0c;这种关系有助于维护数据的完整性和一致性。以下是对MySQL中主表和子表的详细解释&#xff1a; 主表&#xff08;父表&#xff09; 定义&#xff1a;主表&#xff0c…...

工程企业的成本管理系统软件应该有哪些特点?

工程企业的成本管理系统软件需要兼顾工程项目的复杂性和动态性&#xff0c;其功能特点应服务于成本核算、监控、优化与分析全生命周期管理&#xff0c;以下是关键特点&#xff1a; 一、核心功能特点 1. 全生命周期成本管理 覆盖范围&#xff1a; 从项目立项、投标、预算编制&…...

【前端开发】实战:课表安排(HTML + JavaScript + Vue3 + Vant)

后端开发 主要定义了三个核心部分&#xff1a;每周周期&#xff08;WeekDays&#xff09;、每天节次&#xff08;TimeLessons&#xff09; 和 每天节次详情&#xff08;Details&#xff09; 每周周期&#xff08;WeekDays&#xff09; 存储了每周的七天&#xff08;通常是从周一…...

nodejs建立TCP服务器端和TCP客户端之间的连接

TCP服务器端&#xff0c;看名字也知道是建立在服务器上面的 //获取模块 const net require(net); //创建server服务器 const servernet.createServer(); //与客户端建立连接 server.on(connection,function(socket){console.log(客户端与服务器连接已经建立);//socket是客户端…...

Pytorch使用手册-What is torch.nn really?(专题九)

我们建议将本教程作为 notebook 而不是脚本运行。要下载 notebook(.ipynb)文件,请点击页面顶部的链接。 PyTorch 提供了精心设计的模块和类,如 torch.nn、torch.optim、Dataset 和 DataLoader,帮助你创建和训练神经网络。为了充分利用这些工具的强大功能并根据你的问题进…...

ADAM优化算法与学习率调度器:深度学习中的关键工具

深度学习模型的训练效果离不开优化算法和学习率的选择。ADAM&#xff08;Adaptive Moment Estimation&#xff09;作为深度学习领域中广泛应用的优化算法之一&#xff0c;以其高效性和鲁棒性成为许多任务的默认选择。而学习率调度器则是优化算法的“助推器”&#xff0c;帮助训…...

黑马2024AI+JavaWeb开发入门Day03-Maven-单元测试飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;飞书 作业比较简单&#xff0c;随便写了写 package org.example;import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.ju…...

TouchGFX设计模式代码实例说明

一)Model - View - Presenter (MVP) 模式在 TouchGFX 中的应用 1)Model&#xff08;模型&#xff09;&#xff1a; 模型代表应用程序的数据和业务逻辑。例如&#xff0c;在一个简单的计数器应用中&#xff0c;模型可以是一个包含计数器当前值的类。 class CounterModel { pri…...

Docker扩容操作(docker总是空间不足)

Docker扩容操作(docker总是空间不足) 1、df二连&#xff0c;一共也就70g&#xff0c;总是占满93%以上。所以需要移动到其他目录上 查看docker镜像和容器存储目录的空间大小 du -sh /var/lib/docker/2、停止docker服务 systemctl stop docker3、首先创建目录并迁移 # 首先创…...

ELK Fleet JAVA LOG收集与展示教程

目录 elastic-fleet架构 Elastic Agent的优势 Fleet JAVA日志收集流程 1.注册Fleet Sever 2.创建JAVA代理收集策略Agent Policy 3.添加集成 integration 4.调整Java log输出格式 5.添加Elastic Agent 6.添加Ingest 7.创建数据视图 8.其他Policy nginx-policy syst…...

【Python网络爬虫笔记】2-HTTP协议中网络爬虫需要的请求头和响应头内容

1 HTTP 协议整理 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;即超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW&#xff09;服务器传输超文本到本地浏览器的传送协议&#xff0c;直白点儿&#xff0c;就是浏览器和服务器之间的数据交互就是通过 HTT…...

TiDB 调度概述

PD 是 TiDB 集群的管理模块&#xff0c;同时也负责集群数据的实时调度。本文档介绍一下 PD 的设计思想和关键概念。 场景描述 TiKV 集群是 TiDB 数据库的分布式 KV 存储引擎&#xff0c;数据以 Region 为单位进行复制和管理&#xff0c;每个 Region 会有多个 Replica&#xf…...

MySQL的Json类型数据操作方法

前言 MySQL在5.7增加了json类型数据&#xff0c;项目中最近有在使用。直接使用JSONObject或者JSONArray类型的时候会报以下的异常。发现需要将Java实体字段设置为String类型&#xff0c;然后需要的时候自己转换为JSONObject或者JSONArray。使用很不方便&#xff0c;经研究发现…...

论文笔记(五十九)A survey of robot manipulation in contact

A survey of robot manipulation in contact 文章概括摘要1. 引言解释柔顺性控制的概念&#xff1a;应用实例&#xff1a; 2. 需要接触操控的任务2.1 环境塑造2.2 工件对齐2.3 关节运动2.4 双臂接触操控 3. 接触操控中的控制3.1 力控制3.2 阻抗控制3.3 顺应控制 4. 接触操控中的…...

基础原型链污染

<aside> &#x1f4a1; 引用类型皆为对象 </aside> 原型和原型链都是来源于对象而服务于对象的概念&#xff0c;所以我们要先明确一点&#xff1a; JavaScript中一切引用类型都是对象&#xff0c;对象就是属性的集合。 Array类型、Function类型、Object类型、…...

nginx 升级http 到 http2

同步发布于我的网站 &#x1f680; 背景介绍准备工作配置过程遇到的问题及解决方法验证升级总结参考资料 背景介绍 HTTP/2 是 HTTP 协议的最新版本&#xff0c;相比 HTTP/1.1&#xff0c;它带来了多项重要的改进&#xff0c;包括多路复用、头部压缩和服务端推送。这些特性可…...

XPath表达式详解及其在Web开发中的应用

XPath&#xff08;XML Path Language&#xff09;是一种强大的查询语言&#xff0c;用于在XML文档中选择节点。由于HTML可以被视为一种特殊的XML&#xff0c;因此XPath同样适用于HTML文档。XPath允许开发者通过元素的层级结构和属性来选择节点或节点集合&#xff0c;这使得它成…...

云服务器进行安全防护的必要性

在当今这个数字化时代&#xff0c;云计算已成为企业运营不可或缺的一部分&#xff0c;而云服务器作为云计算的核心基础设施&#xff0c;承载着数据存储、应用部署、业务运行等多重关键任务。随着企业数字化转型的深入&#xff0c;云服务器上的数据量激增&#xff0c;业务逻辑日…...

win10系统安装docker-desktop

1、开启Hyper-v ———————————————— Hyper-V 是微软提供的一种虚拟化技术&#xff0c;它允许你在同一台物理计算机上运行多个独立的操作系统实例。这种技术主要用于开发、测试、以及服务器虚拟化等领域。 —————————————————————— &#…...

video.js 禁用单击暂停

video.js 默认效果是单击播放区域暂停/播放 需求&#xff1a;要实现单击播放区禁止暂停/播放功能 有其他的点击效果需要实现 会导致俩功能有冲突 作者给出答案:如下 .vjs-tech {pointer-events: none; } 确实管用,想了很多阻止的办法,都没这个来的快...

【二维动态规划:交错字符串】

介绍 编程语言&#xff1a;Java 本篇介绍一道比较经典的二维动态规划题。 交错字符串 主要说明几点&#xff1a; 为什么双指针解不了&#xff1f;为什么是二维动态规划&#xff1f;根据题意分析处转移方程。严格位置依赖和空间压缩优化。 题目介绍 题意有点抽象&#xff0c…...

如何在CentOS 7上安全地设置Apache网站目录权限

一、概述 在CentOS 7上运行Apache Web服务器时&#xff0c;正确设置文件和目录的权限对于确保网站的安全性和正常运行至关重要。本文将介绍如何为Apache网站目录&#xff08;例如/var/www/html/&#xff09;设置合适的权限&#xff0c;以平衡安全性和功能性需求。 二、所有权 …...

Makefile 入门指南:构建自动化编译流程

个人主页&#xff1a;chian-ocean 文章专栏 前言 make 和 Makefile 是编译和构建软件项目时非常常用的工具和文件&#xff0c;它们通常配合使用来自动化项目的编译过程。 make 定义&#xff1a;make 是一个构建自动化工具&#xff0c;用于根据项目文件的依赖关系自动完成编译…...

TransVG 代码配置及一些小细节

TransVG代码配置 File “/home/wyq/TransVG/utils/misc.py”, line 22, in <module> from torchvision.ops import _new_empty_tensor ImportError: cannot import name ‘_new_empty_tensor’ if float(torchvision.__version__[:3]) < 0.7: # torchvision.__version…...

DIY-Tomcat part 3 实现对动态资源的请求

实现ServletRequest package connector;import javax.servlet.RequestDispatcher; import javax.servlet.ServletInputStream; import javax.servlet.ServletRequest; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.i…...

在鲲鹏麒麟服务器上部署MySQL主从集群

因项目需求需要部署主从MySQL集群&#xff0c;继续采用上次的部署的MySQL镜像arm64v8/mysql:latest&#xff0c;版本信息为v8.1.0。计划部署服务器192.168.31.100和192.168.31.101 部署MySQL主节点 在192.168.31.100上先创建好/data/docker/mysql/data和/data/docker/mysql/l…...

K8S版本和istio版本的对照关系

版本对照关系 下载地址1 下载地址2...

省级新质生产力数据(蔡湘杰版本)2012-2022年

测算方式&#xff1a;参考《当代经济管理》蔡湘杰&#xff08;2024&#xff09;老师研究的做法&#xff0c;本文以劳动者、劳动对象和劳动资料为准则层&#xff0c;从新质生产力“量的积累、质的提升、新的拓展”三维目标出发&#xff0c;构建新质生产力综合评价指标体系&#…...

速盾:介绍一下高防cdn的缓存响应事什么功能?

高防CDN&#xff08;Content Delivery Network&#xff09;是一种基于分布式缓存技术的网络加速服务&#xff0c;能够提供强大的缓存响应功能。它的缓存响应功能主要包括缓存加速和智能缓存两个方面。 首先&#xff0c;高防CDN的缓存加速功能是指通过在全球范围内部署大量的缓…...

如何解决服务器扫描出的ASP木马问题

随着互联网的发展&#xff0c;网站安全问题日益凸显。其中&#xff0c;ASP&#xff08;Active Server Pages&#xff09;木马因其隐蔽性和危害性成为攻击者常用的手段之一。本文将详细介绍如何检测和清除服务器上的ASP木马&#xff0c;以保障网站的安全。 1. ASP木马概述 ASP…...

CTF之WEB(sqlmap tamper 参数)

apostropheask.py 作用&#xff1a;将单引号替换为UTF-8&#xff0c;用于过滤单引号。 base64encode.py 作用&#xff1a;替换为base64编码。 multiplespaces.py 作用&#xff1a;绕过SQL关键字添加多个空格。 space2plus.py 作用&#xff1a;用号替换…...

小程序-基于java+SpringBoot+Vue的乡村研学旅行平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…...

力扣81:搜索旋转排序数组II

已知存在一个按非降序排列的整数数组 nums &#xff0c;数组中的值不必互不相同。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转 &#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], n…...

力扣题库Day4(持续更新中...)

2024/11/29 回文数&#xff1a; 给你一个整数x&#xff0c;如果x是一个回文整数&#xff0c;返回true&#xff1b;否则&#xff0c;返回false。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 class Solution {public boolean isPalindrome(int x) {if(x &l…...