基于RAG的法律条文智能助手
文章目录
- 前言
- 一、 项目背景与需求设计
- 二、 数据收集与整理
- 三、 核心实现流程
- 1. 配置与模型初始化
- 1. 配置区
- 2. 模型初始化(init_models 函数)
- 3. 数据加载与验证(load_and_validate_json_files 函数)
- 4. 节点生成(create_nodes 函数)
- 2. 向量存储与索引构建
- 1. 向量存储初始化(init_vector_store 函数)
- 2. 索引构建流程
- 3. 主程序逻辑
- 1. 主程序入口(main 函数)
- 2. 交互式查询
- 3. 运行逻辑
- 4. 代码
- 五、测试
前言
一、 项目背景与需求设计
需求场景:开发一个法律条文只能问答系统
要求:
1.需要更新最新的法律条文(更新频率>=每月)
2.支持对法律条款的精确引用.
3.处理复杂的法律条款的关联查询.
选择RAG而非微调的原因:
1.法律条文存在一定的更新频率,微调模型难以快速同步最新信息。
2.需要精确引用条款原文,避免模型生成内容失真。
3.法律知识体系庞大,微调需要海量标注数据。
4.RAG机制天然支持条款溯源,符合法律场景需求。
二、 数据收集与整理
数据来源,去官网下载

https://www.gov.cn/banshi/2005-05/25/content_905.htm

https://www.gov.cn/jrzg/2007-06/29/content_667720.htm
右键点击查看,可以看到我们所要信息都在标签p里面。

自动化解决办法
通过爬虫和正则匹配下载和更新数据,不需要人为的再去定期查看网页是否有更新,再去同步信息。
下载脚本
import json
import re
import requests
from bs4 import BeautifulSoupdef fetch_and_parse(url):# 请求网页response = requests.get(url)# 设置网页编码格式response.encoding = 'utf-8'# 解析网页内容soup = BeautifulSoup(response.text, 'html.parser')# 提取正文内容content = soup.find_all('p')# 初始化存储数据data = []# 提取文本并格式化for para in content:text = para.get_text(strip=True)if text: # 只处理非空文本# 根据需求格式化内容data.append(text)# 将data列表转换为字符串data_str = '\n'.join(data)return data_strdef extract_law_articles(data_str):# 正则表达式,匹配每个条款号及其内容pattern = re.compile(r'第([一二三四五六七八九十零百]+)条.*?(?=\n第|$)', re.DOTALL)# 初始化字典来存储条款号和内容lawarticles = {}# 搜索所有匹配项for match in pattern.finditer(data_str):articlenumber = match.group(1)articlecontent = match.group(0).replace('第' + articlenumber + '条', '').strip()lawarticles[f"中华人民共和国劳动合同法 第{articlenumber}条"] = articlecontent# 转换字典为JSON字符串jsonstr = json.dumps(lawarticles, ensure_ascii=False, indent=4)return jsonstrif __name__ == '__main__':# 请求页面url = "https://www.gov.cn/jrzg/2007-06/29/content_667720.htm"data_str = fetch_and_parse(url)jsonstr = extract_law_articles(data_str)print(jsonstr)

三、 核心实现流程
基于大语言模型(LLM)和向量检索(RAG)的法律智能助手,用于根据法律条文回答问题。以下是详细讲解:
1. 配置与模型初始化
1. 配置区
功能:定义了一个 Config 类,用于集中管理模型路径、数据目录、向量数据库目录、持久化目录、集合名称和检索结果数量(TOP_K)。
关键点:
EMBED_MODEL_PATH 和 LLM_MODEL_PATH 分别指定了用于嵌入(embedding)和生成回答的模型路径。
DATA_DIR 存放法律条文的 JSON 文件。
VECTOR_DB_DIR 和 PERSIST_DIR 分别用于存储向量数据库和持久化索引。
COLLECTION_NAME 是向量数据库中的集合名称,用于存储法律条文的嵌入向量。
2. 模型初始化(init_models 函数)
功能:初始化嵌入模型(HuggingFaceEmbedding)和语言模型(HuggingFaceLLM),并验证模型是否正常加载。
关键点:
使用 HuggingFaceEmbedding 加载嵌入模型,用于将文本转换为向量。
使用 HuggingFaceLLM 加载语言模型,用于生成回答。
通过 test_embedding 验证嵌入模型的输出维度是否正确。
将嵌入模型和语言模型设置到全局 Settings 中,供后续使用。
3. 数据加载与验证(load_and_validate_json_files 函数)
功能:加载法律条文的 JSON 文件,并验证数据结构是否符合要求。
关键点:
遍历指定目录下的所有 JSON 文件。
验证每个文件的根元素是否为列表,列表中的每个元素是否为字典,以及字典的值是否为字符串。
将验证通过的数据整合为一个列表,每个条目包含法律条文内容和来源文件名。
如果数据结构不符合要求,会抛出异常并提示错误信息。
4. 节点生成(create_nodes 函数)
功能:将法律条文数据转换为 TextNode 对象,用于后续的向量嵌入和索引构建。
关键点:
为每个法律条文生成一个唯一的 ID(node_id),格式为 文件名::法律名称。
提取法律名称、条款名称等元数据,并将其存储在节点的 metadata 中。
每个节点包含法律条文的文本内容和元数据,方便后续查询时提供上下文信息。
2. 向量存储与索引构建
1. 向量存储初始化(init_vector_store 函数)
功能:初始化向量存储,并根据需要构建或加载索引。
关键点:
使用 chromadb 创建一个持久化的向量存储客户端,指定存储路径为 VECTOR_DB_DIR。
如果向量数据库中没有数据(chroma_collection.count() == 0),则创建一个新的索引:
将节点添加到存储上下文(StorageContext)。
使用 VectorStoreIndex 构建索引,并将索引持久化到 PERSIST_DIR。
如果已有索引,则直接加载索引。
验证存储上下文中的文档数量,并打印示例节点的 ID,确保索引构建正确。
2. 索引构建流程
功能:根据输入的法律条文节点,构建向量索引。
关键点:
使用 ChromaVectorStore 将法律条文的嵌入向量存储到向量数据库中。
如果是首次构建索引,会将节点的文本内容嵌入为向量,并存储到向量数据库中。
如果索引已存在,则直接加载现有索引,避免重复嵌入和存储。
提供了双重持久化保障,确保索引数据不会丢失。
3. 主程序逻辑
1. 主程序入口(main 函数)
功能:启动法律智能助手,加载模型、数据和索引,并提供交互式查询。
关键点:
调用 init_models 初始化嵌入模型和语言模型。
如果向量数据库目录不存在,则加载法律条文数据并生成节点。
调用 init_vector_store 初始化向量存储,并构建或加载索引。
创建查询引擎,指定相似度检索的返回结果数量(TOP_K)和回答模板。
2. 交互式查询
功能:通过命令行接收用户问题,并根据法律条文生成回答。
关键点:
使用 query_engine.query 执行查询,根据用户问题检索最相关的法律条文。
生成的回答基于检索到的法律条文,确保回答的准确性和相关性。
打印回答内容和支持回答的法律条文依据,包括法律名称、条款内容、来源文件和相关度得分。
提供退出选项(输入 q),结束交互。
3. 运行逻辑
功能:通过 if name == “main”: 确保直接运行脚本时执行主程序。
关键点:
脚本被直接运行时,会调用 main 函数启动法律智能助手。
如果脚本被其他模块导入,则不会自动执行主程序。
4. 代码
# -*- coding: utf-8 -*-
import json
import time
from pathlib import Path
from typing import List, Dictimport chromadb
from llama_index.core import VectorStoreIndex, StorageContext, Settings
from llama_index.core.schema import TextNode
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.embeddings.huggingface import HuggingFaceEmbedding
from llama_index.vector_stores.chroma import ChromaVectorStore
from llama_index.core import PromptTemplateQA_TEMPLATE = ("<|im_start|>system\n""你是一个专业的法律助手,请严格根据以下法律条文回答问题:\n""相关法律条文:\n{context_str}\n<|im_end|>\n""<|im_start|>user\n{query_str}<|im_end|>\n""<|im_start|>assistant\n"
)response_template = PromptTemplate(QA_TEMPLATE)# ================== 配置区 ==================
class Config:EMBED_MODEL_PATH = r"/root/llm/bge-small-zh-v1.5"LLM_MODEL_PATH = r"/root/llm/Qwen/Qwen1.5-7B-Chat"DATA_DIR = "./data"VECTOR_DB_DIR = "./chroma_db"PERSIST_DIR = "./storage"COLLECTION_NAME = "chinese_labor_laws"TOP_K = 3# ================== 初始化模型 ==================
def init_models():"""初始化模型并验证"""# Embedding模型embed_model = HuggingFaceEmbedding(model_name=Config.EMBED_MODEL_PATH,# encode_kwargs = {# 'normalize_embeddings': True,# 'device': 'cuda' if hasattr(Settings, 'device') else 'cpu'# })# LLMllm = HuggingFaceLLM(model_name=Config.LLM_MODEL_PATH,tokenizer_name=Config.LLM_MODEL_PATH,model_kwargs={"trust_remote_code": True,# "device_map": "auto"},tokenizer_kwargs={"trust_remote_code": True},generate_kwargs={"temperature": 0.3})Settings.embed_model = embed_modelSettings.llm = llm# 验证模型test_embedding = embed_model.get_text_embedding("测试文本")print(f"Embedding维度验证:{len(test_embedding)}")return embed_model, llm# ================== 数据处理 ==================
def load_and_validate_json_files(data_dir: str) -> List[Dict]:"""加载并验证JSON法律文件"""json_files = list(Path(data_dir).glob("*.json"))assert json_files, f"未找到JSON文件于 {data_dir}"all_data = []for json_file in json_files:with open(json_file, 'r', encoding='utf-8') as f:try:data = json.load(f)# 验证数据结构if not isinstance(data, list):raise ValueError(f"文件 {json_file.name} 根元素应为列表")for item in data:if not isinstance(item, dict):raise ValueError(f"文件 {json_file.name} 包含非字典元素")for k, v in item.items():if not isinstance(v, str):raise ValueError(f"文件 {json_file.name} 中键 '{k}' 的值不是字符串")all_data.extend({"content": item,"metadata": {"source": json_file.name}} for item in data)except Exception as e:raise RuntimeError(f"加载文件 {json_file} 失败: {str(e)}")print(f"成功加载 {len(all_data)} 个法律文件条目")return all_datadef create_nodes(raw_data: List[Dict]) -> List[TextNode]:"""添加ID稳定性保障"""nodes = []for entry in raw_data:law_dict = entry["content"]source_file = entry["metadata"]["source"]for full_title, content in law_dict.items():# 生成稳定ID(避免重复)node_id = f"{source_file}::{full_title}"parts = full_title.split(" ", 1)law_name = parts[0] if len(parts) > 0 else "未知法律"article = parts[1] if len(parts) > 1 else "未知条款"node = TextNode(text=content,id_=node_id, # 显式设置稳定IDmetadata={"law_name": law_name,"article": article,"full_title": full_title,"source_file": source_file,"content_type": "legal_article"})nodes.append(node)print(f"生成 {len(nodes)} 个文本节点(ID示例:{nodes[0].id_})")return nodes# ================== 向量存储 ==================def init_vector_store(nodes: List[TextNode]) -> VectorStoreIndex:chroma_client = chromadb.PersistentClient(path=Config.VECTOR_DB_DIR)chroma_collection = chroma_client.get_or_create_collection(name=Config.COLLECTION_NAME,metadata={"hnsw:space": "cosine"})# 确保存储上下文正确初始化storage_context = StorageContext.from_defaults(vector_store=ChromaVectorStore(chroma_collection=chroma_collection))# 判断是否需要新建索引if chroma_collection.count() == 0 and nodes is not None:print(f"创建新索引({len(nodes)}个节点)...")# 显式将节点添加到存储上下文storage_context.docstore.add_documents(nodes) index = VectorStoreIndex(nodes,storage_context=storage_context,show_progress=True)# 双重持久化保障storage_context.persist(persist_dir=Config.PERSIST_DIR)index.storage_context.persist(persist_dir=Config.PERSIST_DIR) # <-- 新增else:print("加载已有索引...")storage_context = StorageContext.from_defaults(persist_dir=Config.PERSIST_DIR,vector_store=ChromaVectorStore(chroma_collection=chroma_collection))index = VectorStoreIndex.from_vector_store(storage_context.vector_store,storage_context=storage_context,embed_model=Settings.embed_model)# 安全验证print("\n存储验证结果:")doc_count = len(storage_context.docstore.docs)print(f"DocStore记录数:{doc_count}")if doc_count > 0:sample_key = next(iter(storage_context.docstore.docs.keys()))print(f"示例节点ID:{sample_key}")else:print("警告:文档存储为空,请检查节点添加逻辑!")return index# ================== 主程序 ==================
def main():embed_model, llm = init_models()# 仅当需要更新数据时执行if not Path(Config.VECTOR_DB_DIR).exists():print("\n初始化数据...")raw_data = load_and_validate_json_files(Config.DATA_DIR)nodes = create_nodes(raw_data)else:nodes = None # 已有数据时不加载print("\n初始化向量存储...")start_time = time.time()index = init_vector_store(nodes)print(f"索引加载耗时:{time.time()-start_time:.2f}s")# 创建查询引擎query_engine = index.as_query_engine(similarity_top_k=Config.TOP_K,text_qa_template=response_template,verbose=True)# 示例查询while True:question = input("\n请输入劳动法相关问题(输入q退出): ")if question.lower() == 'q':break# 执行查询response = query_engine.query(question)# 显示结果print(f"\n智能助手回答:\n{response.response}")print("\n支持依据:")for idx, node in enumerate(response.source_nodes, 1):meta = node.metadataprint(f"\n[{idx}] {meta['full_title']}")print(f" 来源文件:{meta['source_file']}")print(f" 法律名称:{meta['law_name']}")print(f" 条款内容:{node.text[:100]}...")print(f" 相关度得分:{node.score:.4f}")if __name__ == "__main__":main()
五、测试
root@autodl-container-11464f980d-e495ee5f:~/autodl-tmp# python rag_law.py
Sliding Window Attention is enabled but not implemented for `sdpa`; unexpected results may be encountered.
Embedding维度验证:512初始化数据...
成功加载 2 个法律文件条目
生成 205 个文本节点(ID示例:data1.json::中华人民共和国劳动合同法 第一条)初始化向量存储...
创建新索引(205个节点)...
Generating embeddings: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████| 205/205 [00:00<00:00, 811.13it/s]存储验证结果:
DocStore记录数:205
示例节点ID:data1.json::中华人民共和国劳动合同法 第一条
索引加载耗时:0.83s请输入劳动法相关问题(输入q退出): 裁员
Setting `pad_token_id` to `eos_token_id`:151643 for open-end generation.智能助手回答:
assistant:
</think>根据相关法律条文,以下是对裁员问题的解答:1. **用人单位濒临破产进行法定整顿期间或生产经营状况发生严重困难,确需裁减人员的,应当提前三十日向工会或者全体职工说明情况,听取工会或者职工的意见,经向劳动行政部门报告后,可以裁减人员。**2. **用人单位依据本条规定裁减人员,在六个月内录用人员的,应当优先录用被裁减的人员。**3. **有下列情形之一,需要裁减人员二十人以上或者裁减不足二十人但占企业职工总数百分之十以上的,用人单位提前三十日向工会或者全体职工说明情况,听取工会或者职工的意见后,裁减人员方案经向劳动行政部门报告,可以裁减人员:**- (一)依照企业破产法规定进行重整的;- (二)生产经营发生严重困难的;- (三)企业转产、重大技术革新或者经营方式调整,经变更劳动合同后,仍需裁减人员的;- (四)其他因劳动合同订立时所依据的客观经济情况发生重大变化,致使劳动合同无法履行的。4. **裁减人员时,支持依据:[1] 中华人民共和国劳动法 第二十七条来源文件:data1.json法律名称:中华人民共和国劳动法条款内容:用人单位濒临破产进行法定整顿期间或者生产经营状况发生严重困难,确需裁减人员的,应当提前三十日向工会或者全体职工说明情况,听取工会或者职工的意见,经向劳动行政部门报告后,可以裁减人员。
用人单位依据本条...相关度得分:0.7048[2] 中华人民共和国劳动合同法 第四十一条来源文件:data1.json法律名称:中华人民共和国劳动合同法条款内容:有下列情形之一,需要裁减人员二十人以上或者裁减不足二十人但占企业职工总数百分之十以上的,用人单位提前三十日向工会或者全体职工说明情况,听取工会或者职工的意见后,裁减人员方案经向劳动行政部门报告,可以裁...相关度得分:0.6942[3] 中华人民共和国劳动法 第七十九条来源文件:data1.json法律名称:中华人民共和国劳动法条款内容:劳动争议发生后,当事人可以向本单位劳动争议调解委员会申请调解;调解不成,当事人一方要求仲裁的,可以向劳动争议仲裁委员会申请仲裁。当事人一方也可以直接向劳动争议仲裁委员会申请仲裁。对仲裁裁决不服的,可以...相关度得分:0.6276请输入劳动法相关问题(输入q退出):
相关文章:
基于RAG的法律条文智能助手
文章目录 前言一、 项目背景与需求设计二、 数据收集与整理三、 核心实现流程1. 配置与模型初始化1. 配置区2. 模型初始化(init_models 函数)3. 数据加载与验证(load_and_validate_json_files 函数)4. 节点生成(create…...
智能对讲机:5G+AI赋能下的石油工业新“声”态
在浩瀚的能源版图上,中国正以非凡的“深度”探索着石油资源的奥秘。随着5G技术的不断成熟与普及,曾经“满山遍野找信号”的石油工人,如今已步入了一个全新的通信时代。在这个时代里,智能对讲机成为了连接指挥中心与一线工人的桥梁…...
leetcode日记(77)子集Ⅱ
不知道为什么看到这道题就很头痛…… 其实只要掌握nums不包含重复元素的情况下的代码就行了。 若nums不能包含重复元素,那么使用回溯很容易就能写出来: class Solution {void hs(vector<int> v,int x,vector<int> r,vector<vector<…...
Linux tar命令
压缩解压缩 1. tar 命令 语法: tar [主选项 辅选项] 文件或目录 参数功能-c创建新的归档文件(打包)-x从归档文件中提取文件(解包)-f <文件名>指定归档文件名-v显示操作的详细信息-z通过gzip压缩归档文件-j通…...
【nodeJS】服务端连接mysql、定义一个接口,并在前端调用
服务端连接数据库,并简单使用 服务器连接mysql后端定义接口前端调用接口封装axios(简易版)解决前端请求接口返回了一个html 定义api请求vue中调用接口 服务器连接mysql 安装mysql2:npm install mysql2启动服务:npm sta…...
驱动开发系列40 - Linux 显卡KMD驱动代码分析(一) - 设备初始化过程
目录 一:概述 二:显卡内核态驱动的主要功能 1. 设备初始化 2. 内存管理 3. 中断处理 4. 显示管理 5. 电源管理 三:Linux显卡内核态驱动的架构 四:PCI设备初始化过程 五:显卡设备初始化 一:概述 显卡内核态驱动(KMD)负责与GPU硬件直接交互,提供底层接口、管理显存…...
玩转大语言模型——Ubuntu系统环境下使用llama.cpp进行CPU与GPU混合推理deepseek
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——三分钟教你用langchain提示词工程获得猫娘女友 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型—…...
20250301在chrome中安装CRX猫抓
20250301在chrome中安装CRX猫抓 2025/3/1 18:08 百度:猫抓 CRX https://www.crx4chrome.com/crx/49597/ 猫抓 (cat-catch) Crx File 2.5.9 for Chrome (Latest Version) Get Latest Version of 猫抓 (cat-catch) from Web Store Developer Tools > cat-catch / E…...
Docker 深度解析:适合零基础用户的详解
此博客涵盖 Docker 的基本概念和作用、架构和核心组件、与传统虚拟机的对比、安装与基本操作,以及在实际开发和运维中的应用场景。 首先,详细解释了 Docker 的基本概念,包括它的诞生背景、作用及其如何解决传统应用部署中的问题。然后&#…...
LeetCode 分割回文串(回溯、dp)
131.分割回文串 给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 示例 1: 输入:s "aab" 输出:[["a","a","b"],["a…...
期权帮|股指期货入门知识:什么是股指期货基差?什么是股指期货价差?
锦鲤三三每日分享期权知识,帮助期权新手及时有效地掌握即市趋势与新资讯! 股指期货入门知识:什么是股指期货基差?什么是股指期货价差? 股指期货的基差与价差是两个重要的价格关系指标,它们反映了现货市场…...
解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析
每个游戏开发者都有一个共同的愿望,那就是能够在无需复现玩家反馈的卡顿现象时,快速且准确地定位卡顿的根本原因。为了实现这一目标,UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈,旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…...
Python:类型转换和深浅拷贝,可变与不可变对象
int():转换为一个整数,只能转换由纯数字组成的字符串 浮点型强转整型会去掉小数点及后面的数,只保留整数部分 #如果字符串中有数字和正负号以外的字符就会报错 float():整形转换为浮点型会自动添加一位小数 .0 如果字符串中有…...
Redis——缓存穿透、击穿、雪崩
缓存穿透 什么是缓存穿透 缓存穿透说简单点就是大量请求的 key 根本不存在于缓存中,导致请求直接到了数据库上,根本没有经过缓存这一层。举个例子:某个黑客故意制造我们缓存中不存在的 key 发起大量请求,导致大量请求落到数据库…...
8.1.STM32_OLED
4.STM32_OLED 跟着江协科大的视频,无法点亮OLED屏幕解决办法 每个人使用的0.96寸OLED屏幕信号不一样,存在很多兼容性问题 归根结底就是驱动的问题! 本人的OLED是SSD1306,在淘宝店铺找了驱动文件后成功点亮,示例见文末 请针对自…...
Gartner发布安全运营指标构建指南
如何为安全运营指标构建坚实的基础 安全运营经理需要报告威胁检测、调查和响应计划的有效性,但难以驾驭大量潜在的 SOC 指标。本研究提供了设计针对 SOC 的指标系统的示例和实践。 主要发现 需要清晰、一致的衡量标准来向董事会成员或服务提供商等更广泛的团队传达…...
【赵渝强老师】监控Redis
对运行状态的Redis实例进行监控是运维管理中非常重要的内容,包括:监控Redis的内存、监控Redis的吞吐量、监控Redis的运行时信息和监控Redis的延时。通过Redis提供的监控命令便能非常方便地实现对各项指标的监控。 一、监控Redis的内存 视频讲解如下 【…...
【Unity】搭建HTTP服务器并解决IP无法访问问题解决
一、核心目标与背景 在Unity中搭建本地HTTP服务器,可以用于实现Web与游戏交互、本地数据接口测试、跨设备通信等场景。但在实际部署中,开发者常遇到以下问题: 本机IP无法访问:服务绑定localhost时,局域网设备无法连…...
如何远程访问svn中的URL
简介: 主要opencascade相关知识学习 格言: 万丈高楼平地起 要远程访问 SVN(Subversion)仓库中的 URL,通常需要以下步骤和注意事项: 1. 确认远程 SVN 服务器的访问协议 SVN 支持多种协议访问远程仓库&…...
Free Auto Clicker - 在任意位置自动重复鼠标点击
“想让鼠标自己动起来,解放双手去做更有趣的事?”Free Auto Clicker 就像你的数字小助手,能在任意位置自动重复点击鼠标。从玩游戏到刷网页,这款免费工具让你告别枯燥的重复操作,效率瞬间起飞! 你有没有想…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
