《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
基于RAG向量数据库的知识库AI问答助手设计与实现
引言
随着大语言模型(LLM)技术的快速发展,构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手,该系统能够整合两部分知识语料:网站博客(存储在SQLite数据库中)和后台配置的知识博客URL链接内容(通过爬虫获取)。系统采用RAG(检索增强生成)技术,在用户提问时能够从两部分知识库中检索相关信息并生成高质量回答。
RAG技术概述
RAG(检索增强生成)是一种结合了检索系统和生成模型的技术,它首先从大型文档集合中检索相关信息,然后使用这些信息来生成最终答案。RAG的核心思想是"检索+生成":前者主要利用向量数据库的高效存储和检索能力,召回目标知识;后者则是利用大模型和Prompt工程,将召回的知识合理利用,生成目标答案[1]。
RAG架构通常使用转换器实现,包含编码器和解码器两部分。当用户提出问题时,输入文本被"编码"为捕获单词含义的向量,而向量被"解码"到我们的文档内容中[2]。
系统架构设计
整体架构
基于用户需求,我们设计了一个完整的AI问答助手系统架构,主要包含以下几个部分:
- 前端Web应用:基于FLASK开发,提供用户交互界面
- 向量数据库:使用Milvus存储和检索向量表示的知识
- 大模型底座:使用本地OLLAMA运行大模型
- 知识处理组件:处理SQLite数据库中的博客和URL链接内容
- RAG组件:实现检索和生成功能
整体技术细节为: - 嵌入模型使用Sentence Transformers
- 本地使用OLLAMA部署大模型
- 使用Milvus作为向量数据库
- 使用LangChain作为框架集成各组件
技术选型
Milvus向量数据库
Milvus是一个专为处理和搜索大量向量数据而设计的强大向量数据库。它以高性能和可扩展性著称,非常适合机器学习、深度学习、相似性搜索任务和推荐系统[5]。Milvus的主要功能包括:
- 高性能向量检索能力,支持百亿级别的向量索引
- 多种搜索方式(top-K & Range ANN搜索、稀疏和稠密向量搜索、多向量搜索、Grouping搜索)
- 提供元数据过滤功能
- 支持多租户架构
- 支持数据分区分片、数据持久化、增量数据摄取
- 支持标量向量混合查询和time travel功能
Milvus被广泛应用于智能客服、推荐系统、NLP服务、计算机视觉等领域,能够为大模型提供强大的知识库支持[6]。
Ollama本地大模型
Ollama是一个开源平台,可简化大型语言模型(LLM)的本地运行和定制。它提供了用户友好的无云体验,无需高级技术技能即可轻松实现模型部署[10]。Ollama的主要特点包括:
- 本地部署:不依赖云端服务,用户可以在自己的设备上运行模型
- 简化模型管理:提供便捷的模型管理功能
- 丰富的预建模型库:支持多种主流模型
- 跨平台支持:可在不同操作系统上运行
- 灵活的自定义选项:允许用户根据需求调整模型
Ollama通过提供便捷的模型管理、丰富的预建模型库、跨平台支持以及灵活的自定义选项,使得开发者和研究人员能够轻松使用大型语言模型[15]。
LangChain框架
LangChain是一个专门为LLM应用设计的框架,它允许开发人员将不同的组件像链一样串在一起,以围绕LLM创建更高级的应用。LangChain提供了一系列模块,这些模块是任何LLM应用的基础[49]。
LangChain的核心思想是开发人员可以将不同的组件像链一样串在一起,以围绕LLM创建更高级的示例。LangChain提供了一系列模块,这些模块是作为任何LLM应用的基础[49]。
系统流程设计
系统的主要流程包括:
- 知识库构建:
- 从SQLite数据库中读取博客内容
- 爬取后台配置的URL链接内容
- 使用文档加载器和拆分器处理文本内容
- 使用嵌入模型生成向量表示
- 将向量和元数据存储到Milvus数据库中
- 用户提问处理:
- 接收用户提问
- 使用相同的嵌入模型生成提问向量
- 从Milvus中检索相关知识
- 使用大模型和检索到的知识生成回答
- 大模型推理:
- 使用OLLAMA运行大模型
- 通过LangChain的ChatModel接口与大模型交互
- 生成最终回答
系统组件实现
知识库构建
1. 从SQLite数据库读取博客内容
首先需要从SQLite数据库中读取博客内容。可以使用Python的sqlite3模块来实现:
import sqlite3
from typing import List, Dict
def fetch_blog_content(db_path: str) -> List[Dict[str, str]]:"""从SQLite数据库中读取博客内容"""conn = sqlite3.connect(db_path)cursor = conn.cursor()# 假设博客表名为blogs,包含id、title、content等字段cursor.execute("SELECT id, title, content FROM blogs")rows = cursor.fetchall()blogs = []for row in rows:blog = {"id": row[0],"title": row[1],"content": row[2]}blogs.append(blog)conn.close()return blogs
2. 爬取后台配置的URL链接内容
需要爬取后台配置的URL链接内容。可以使用Python的requests和BeautifulSoup库来实现:
import requests
from bs4 import BeautifulSoup
from typing import List, Dict
def crawl_url_content(urls: List[str]) -> List[Dict[str, str]]:"""爬取指定URL的内容"""crawled_content = []for url in urls:try:response = requests.get(url)response.raise_for_status()soup = BeautifulSoup(response.text, 'html.parser')# 假设我们只关心正文内容content = soup.get_text()crawled_content.append({"url": url,"content": content})except Exception as e:print(f"Error crawling {url}: {e}")return crawled_content
3. 文档加载和拆分
使用LangChain的文档加载器和拆分器来处理文本内容。对于结构化数据(如博客),可以使用Pydantic
加载器;对于非结构化数据(如网页内容),可以使用Text
加载器。然后使用RecursiveCharacterTextSplitter
将文本拆分为适当的块大小:
from langchain.document_loaders import Pydantic, Text
from langchain.text_splitter import RecursiveCharacterTextSplitter
from typing import List, Dict, Any
def process_documents(documents: List[Dict[str, str]]) -> List[Dict[str, Any]]:"""处理文档内容,包括加载和拆分"""processed_docs = []for doc in documents:# 根据文档类型选择合适的加载器if "blog" in doc: # 假设我们用"blog"标记博客内容loader = Pydantic(BlogDocument)else:loader = Text()# 加载文档loaded_doc = loader.load(doc)# 使用递归字符拆分器拆分文本text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000,chunk_overlap=200)splits = text_splitter.split_documents([loaded_doc])for split in splits:processed_docs.append({"content": split.page_content,"metadata": split.metadata})return processed_docs
4. 向量化和存储到Milvus
使用嵌入模型(如Sentence Transformers)将文本内容转换为向量,并存储到Milvus数据库中:
from sentence_transformers import SentenceTransformer
import numpy as np
from milvus import Milvus
def embed_and_store_to_milvus(documents: List[Dict[str, str]], milvus_host: str, milvus_port: int, collection_name: str):"""将文档内容嵌入向量并存储到Milvus"""# 加载嵌入模型model = SentenceTransformer('all-MiniLM-L6-v2')# 连接到Milvusmilvus = Milvus(host=milvus_host, port=milvus_port)# 检查集合是否存在,如果不存在则创建if collection_name not in milvus.list_collections():milvus.create_collection(collection_name, dim=model.get_sentence_embedding_dimension(),index_params={'index_type': 'IVF_FLAT','params': {'nlist': 100},'metric_type': 'L2'})# 准备向量和元数据embeddings = []metadatas = []for doc in documents:# 生成嵌入向量embedding = model.encode(doc["content"]).astype(np.float32).tolist()embeddings.append(embedding)# 准备元数据metadata = {"source": doc["source"], "chunk": doc["chunk"]}metadatas.append(metadata)# 插入到Milvusstatus, ids = milvus.insert(collection_name=collection_name,records=embeddings,metadatas=metadatas)if status.OK():print(f"Successfully inserted {len(ids)} documents into Milvus collection {collection_name}")else:print(f"Error inserting documents into Milvus: {status}")
用户提问处理
1. 提问向量化
使用相同的嵌入模型将用户提问转换为向量:
from sentence_transformers import SentenceTransformer
import numpy as np
def vectorize_query(query: str, model: SentenceTransformer) -> List[float]:"""将用户提问向量化"""query_vector = model.encode(query).astype(np.float32).tolist()return query_vector
2. 从Milvus中检索相关知识
使用Milvus从向量数据库中检索最相关的知识:
from milvus import Milvus
def retrieve_from_milvus(query_vector: List[float],milvus_host: str,milvus_port: int,collection_name: str,top_k: int = 5) -> List[Dict[str, Any]]:"""从Milvus中检索相关知识"""# 连接到Milvusmilvus = Milvus(host=milvus_host, port=milvus_port)# 检索status, results = milvus.search(collection_name=collection_name,query_records=[query_vector],top_k=top_k,params={'nprobe': 10})if status.OK():# 解析结果retrieved_docs = []for result in results[0]:doc = {"content": result.id, # 假设id存储了内容"score": result.distance,"metadata": result.metadata}retrieved_docs.append(doc)return retrieved_docselse:print(f"Error retrieving from Milvus: {status}")return []
3. 使用大模型生成回答
使用OLLAMA运行大模型,并使用检索到的知识生成回答:
import requests
from typing import Dict, Any
def query_ollama_model(query: str,context: str,model_name: str,ollama_host: str,ollama_port: int) -> str:"""使用OLLAMA查询大模型"""prompt = f"根据以下上下文回答问题:\n\n{context}\n\n问题:{query}\n\n回答:"endpoint = f"http://{ollama_host}:{ollama_port}/api/generate"payload = {"model": model_name,"prompt": prompt,"stream": False}response = requests.post(endpoint, json=payload)if response.status_code == 200:return response.json()["response"]else:print(f"Error querying Ollama model: {response.status_code} {response.text}")return "无法生成回答,请稍后再试。"
系统集成
将各个组件集成到一个完整的FLASK应用中:
from flask import Flask, request, jsonify
import sqlite3
import requests
from bs4 import BeautifulSoup
from sentence_transformers import SentenceTransformer
import numpy as np
from milvus import Milvus
app = Flask(__name__)
# 配置参数
SQLITE_DB_PATH = "path/to/blog.db"
MILVUS_HOST = "localhost"
MILVUS_PORT = 19530
MILVUS_COLLECTION_NAME = "knowledge_base"
OLLAMA_HOST = "localhost"
OLLAMA_PORT = 11434
MODEL_NAME = "deepseek"
# 初始化Milvus连接
milvus = Milvus(host=MILVUS_HOST, port=MILVUS_PORT)
# 初始化嵌入模型
model = SentenceTransformer('all-MiniLM-L6-v2')
@app.route("/build-kb", methods=["POST"])
def build_knowledge_base():"""构建知识库"""# 从SQLite中读取博客内容blogs = fetch_blog_content(SQLITE_DB_PATH)# 爬取URL内容urls = request.json.get("urls", [])url_content = crawl_url_content(urls)# 处理文档documents = process_documents(blogs + url_content)# 向量化并存储到Milvusembed_and_store_to_milvus(documents, MILVUS_HOST, MILVUS_PORT, MILVUS_COLLECTION_NAME)return jsonify({"status": "success", "message": "知识库构建完成"}), 200
@app.route("/query", methods=["POST"])
def query_knowledge_base():"""查询知识库"""query = request.json.get("query", "")if not query:return jsonify({"status": "error", "message": "查询不能为空"}), 400# 向量化查询query_vector = vectorize_query(query, model)# 从Milvus中检索retrieved_docs = retrieve_from_milvus(query_vector,MILVUS_HOST,MILVUS_PORT,MILVUS_COLLECTION_NAME,top_k=5)if not retrieved_docs:return jsonify({"status": "error", "message": "未找到相关知识"}), 404# 组合上下文context = "\n".join([doc["content"] for doc in retrieved_docs])# 使用大模型生成回答answer = query_ollama_model(query, context, MODEL_NAME, OLLAMA_HOST, OLLAMA_PORT)return jsonify({"status": "success","answer": answer,"sources": [doc["metadata"] for doc in retrieved_docs]}), 200
if __name__ == "__main__":app.run(debug=True)
系统部署方案
环境要求
- 硬件要求:
- CPU:支持AVX2指令集
- 内存:至少16GB RAM
- 存储:足够存储知识库和模型参数
- GPU:可选,用于加速大模型推理
- 软件要求:
- 操作系统:Linux/Windows/macOS(推荐Linux)
- Python:3.8或更高版本
- 依赖库:Milvus、OLLAMA、LangChain等
安装步骤
- 安装Milvus:
- 下载并安装Milvus:
curl -L https://github.com/milvus-io/milvus/releases/download/v2.5.1/milvus-2.5.1-linux-amd64.tar.gz | tar xz
- 启动Milvus:
bin/milvus_server start
- 下载并安装Milvus:
- 安装OLLAMA:
- 下载并安装OLLAMA:
curl -L https://github.com/ollama/ollama/releases/download/v1.3.0/ollama_1.3.0_Linux_x86_64.tar.gz | tar xz
- 启动OLLAMA:
./ollama serve
- 下载并安装OLLAMA:
- 安装Python依赖:
pip install flask requests beautifulsoup4 sentence-transformers numpy milvus-langchain-connector
配置步骤
- 配置Milvus:
- 确保Milvus服务已启动并监听在默认端口(19530)
- 创建知识库集合(如果尚不存在)
- 配置OLLAMA:
- 确保OLLAMA服务已启动并监听在默认端口(11434)
- 下载并加载所需模型:
ollama pull deepseek
- 配置FLASK应用:
- 设置SQLite数据库路径
- 设置Milvus连接参数
- 设置OLLAMA连接参数
- 设置默认模型名称
运行和测试
- 构建知识库:
- 从SQLite数据库中读取博客内容
- 爬取后台配置的URL链接内容
- 处理文档并存储到Milvus
- 进行问答测试:
- 发送用户提问
- 系统从Milvus中检索相关知识
- 使用大模型生成回答
系统优化与扩展
性能优化
- 向量索引优化:
- 调整IVF_FLAT索引的nlist参数
- 考虑使用更高效的索引类型,如HNSW
- 为不同类型的文档使用不同的索引策略
- 模型优化:
- 选择合适的嵌入模型(如all-MiniLM-L6-v2或更大模型)
- 调整大模型的参数(如temperature、top_p等)
- 考虑使用量化技术减少模型大小和推理时间
- 文档处理优化:
- 调整文本拆分的chunk_size和chunk_overlap
- 使用更智能的文档重要性评估方法
- 考虑使用多语言处理技术
功能扩展
- 支持更多知识源:
- 添加PDF、PPT、DOCX等文件格式的支持
- 集成企业内部知识管理系统
- 支持实时数据源的自动更新
- 增强用户体验:
- 提供更友好的Web界面
- 添加语音交互功能
- 实现多轮对话上下文记忆
- 监控和分析:
- 添加API调用日志记录
- 实现性能监控和分析
- 提供知识库使用统计报告
结论
本报告详细介绍了如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手。该系统通过RAG技术整合了两部分知识语料:网站博客(存储在SQLite数据库中)和后台配置的知识博客URL链接内容(通过爬虫获取)。系统主要由前端Web应用、向量数据库Milvus、本地大模型OLLAMA和知识处理组件组成,使用LangChain作为框架集成各组件。
通过本设计方案,企业可以构建一个高效、安全、可定制的AI问答系统,能够快速响应用户问题并提供基于本地知识库的支持。随着技术的不断发展,该系统可以通过多种方式进行优化和扩展,以满足更复杂的应用需求。
参考资料
[1] 一文读懂:大模型RAG(检索增强生成)含高级方法 - 知乎专栏. https://zhuanlan.zhihu.com/p/675509396.
[2] 15-检索增强生成(RAG) 和向量数据库 - 飞书文档. https://docs.feishu.cn/article/wiki/OinzwWLXGi2cQUkiNYjceAVunVg.
[5] 高性能向量数据库,为规模而构建 - Milvus. https://milvus.io/zh.
[6] 向量数据库Milvus_功能优势 - 金山云. https://www.ksyun.com/nv/product/Milvus.html.
[10] 使用Milvus 和Ollama 构建RAG. https://milvus.io/docs/zh/build_RAG_with_milvus_and_ollama.md.
[15] Ollama本地部署大模型及应用原创 - CSDN博客. https://blog.csdn.net/qq_43548590/article/details/142546580.
[49] 使用OpenAI、LangChain 和LlamaIndex 构建Knowledge. https://developer.aliyun.com/article/1394419.
相关文章:
《AI大模型趣味实战》基于RAG向量数据库的知识库AI问答助手设计与实现
基于RAG向量数据库的知识库AI问答助手设计与实现 引言 随着大语言模型(LLM)技术的快速发展,构建本地知识库AI问答助手已成为许多企业级应用的需求。本研究报告将详细介绍如何基于FLASK开发一个使用本地OLLAMA大模型底座的知识库AI问答助手&…...
netcore8.0项目发布到centos,利用nginx反向代理(宝塔面板篇)
1、发布netcore项目 在program.cs中配置nginx代理 // 添加Nginx反向代理支持 builder.Services.Configure<ForwardedHeadersOptions>(options > {options.ForwardedHeaders ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;options.KnownNetwo…...
项目笔记1:通用 Service的常见方法
通用 Service 通常封装了常见的业务逻辑操作,以提高代码的复用性和可维护性。不同的框架和业务场景下,通用 Service 的方法会有所差异,但一般都会包含一些基本的增删改查(CRUD)操作,以下为你详细介绍&#…...
VUE3父子组件defineModel动态值获取及处理
需求:子组件获取父组件value值时需处理,子组件加载时用onMounted,value变化时用watch 父组件: <template><div><p>父组件的值: {{ parentValue }}</p><button click"changeValue">改变…...
CUDA编程之Grid、Block、Thread线程模型
一、线程模型:Grid、Block、Thread概念 1. 层级定义 Thread(线程) CUDA中最基本的执行单元,对应GPU的单个CUDA核心(SP)。每个线程独立执行核函数指令,拥有独立的寄存器和局部内存空间。 Block(线程块) 由多个线程组成(通常为32的倍数),是逻辑上的并…...
BT151-ASEMI无人机专用功率器件BT151
编辑:ll BT151-ASEMI无人机专用功率器件BT151 型号:BT151 品牌:ASEMI 封装:TO-220F 批号:最新 引脚数量:3 特性:单向可控硅 工作温度:-40℃~150℃ BT151单向可控硅产品解…...
无人机环境适应性与稳定性技术要点!
1. 环境感知与传感器融合 多传感器集成:结合IMU(惯性测量单元)、GPS、气压计、激光雷达(LiDAR)、视觉传感器(RGB/深度相机)、超声波等,实现冗余数据采集。 实时环境建模࿱…...
BiliNote:开源的AI视频笔记生成工具,让知识提取与分享更高效——跨平台自动生成结构化笔记,实现从视频到Markdown的智能转化
引言:视频学习的痛点与BiliNote的解决方案 随着知识视频化趋势的加速,B站、YouTube等平台成为学习与信息获取的重要渠道,但手动记录笔记耗时低效、信息碎片化等问题依然突出。BiliNote的出现,通过AI驱动的自动化流程,将视频内容转化为结构清晰的Markdown笔记,支持截图插…...
HTMLcss实现网站抽奖
代码由 HTML、CSS 和 JavaScript 三部分组成,HTML 负责页面的结构搭建,CSS 负责页面的样式设计,JavaScript 负责实现抽奖的交互逻辑。 HTML 部分 <!DOCTYPE html> <html lang"en"><head><meta charset"…...
字节:视频一致性生成论文速读
一、引言 Phantom: Subject-Consistent Video Generation via Cross-Modal Alignment 是北京字节跳动智能创作团队提出的一种新型视频生成方法,旨在解决主体一致性视频生成的难题。该方法通过平衡文本和图像的双重模态提示,实现文本和视觉内容的深度对齐…...
JAVA常用分布式锁Redisson
1. 加锁过程 底层命令与数据结构 Redis 数据结构:使用 Hash 结构存储锁信息,Key 为锁名称,Field 为客户端唯一标识(如 UUID 线程ID),Value 为锁的重入次数。 Lua 脚本原子性:通过 Lua 脚本在…...
9.ArkUI List的介绍和使用
ArkUI List 组件详解与使用指南 List 是 ArkUI(HarmonyOS 开发框架)中用于展示长列表数据的高性能滚动容器组件。以下是 List 的详细介绍和使用方法。 基本介绍 List 组件特点: 支持垂直/水平滚动高性能渲染(仅渲染可视区域内…...
深度解析:从12306看混合云架构下的高并发系统设计
作为曾参与12306余票查询系统高并发升级的技术从业者,笔者注意到公众对于12306底层技术常存在认知盲区。为破解这一迷思,特此分享十年前的架构解密文献(该技术之前名叫 gemfire 现已晋升为Apache顶级项目Geode,代码库详见…...
解决 EasyExcel 填充图片占满单元格问题
本篇主要记录解决使用EasyExcel 填充图片的两个问题: 1. 如何根据标识填充 2.如果完全占满要显示的单元格 import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.metadata.data.ImageData; import com.alibaba.e…...
汽车售后 D - PDU 和 J2543 详细介绍
D - PDU(Diagnostic Protocol Data Unit) 定义与标准1:D - PDU 是指诊断协议数据单元,ISO 22900 - 2 - 2017 D - PDU - API 是针对道路车辆的模块化车辆通信接口(MVCI)中诊断协议数据单元的编程接口标准。…...
【linux】Chrony服务器
简介 1.1 时间的重要性 由于 IT 系统中,准确的计时非常重要,有很多种原因需要准确计时: 在网络传输中,数据包括和日志需要准确的时间戳 各种应用程序中,如订单信息,交易信息等 都需要准确的时间戳 1.2 时区…...
深度剖析!GPT-image-1 API 开放对 AI 绘画技术生态的冲击!
4月24日凌晨,OpenAI正式发布了全新的图像生成模型“gpt-image-1”,并通过API向全球开发者开放使用,这意味着其GPT-4o的图像生成能力正式向开发者开放! 在这之前,GPT-4o的图像生成功能于今年3月25日由 OpenAI 创始人兼 …...
天能资管(SkyAi):精准投资匹配,定制资产配置新体验
在资产配置领域,随着市场环境的日益复杂和投资者需求的日益多样化,个性化和精准化已成为投资者最为关注的核心诉求。天能资管(SkyAi)作为新加坡BEAVER TOKEN基金会旗下的科技先锋,凭借其强大的AI技术和丰富的市场经验,创新性地推出了精准投资匹配服务,为投资者带来了前所未有的…...
volatile缓存可见性实现原理
1.缓存一致性问题 在多核处理器架构中,每个核心都有自己的缓存(Cache),而主内存是所有核心共享的。当一个线程在某个核心上修改了一个共享变量时,这个修改可能只会更新到该核心的缓存中,并不会立刻写回到主…...
【计算机视觉】CV实战- 深入解析基于HOG+SVM的行人检测系统:Pedestrian Detection
深入解析基于HOGSVM的行人检测系统:从理论到实践 技术核心:HOGSVM检测框架HOG特征原理SVM分类器 项目架构与数据准备INRIA Person数据集目录结构 实战指南:从零构建检测系统环境配置完整训练流程检测应用 关键技术问题与解决方案1. 难例挖掘不…...
HDRnet——双边滤波和仿射变换的摇身一变
主页:Deep Bilateral Learning paper:https://groups.csail.mit.edu/graphics/hdrnet/data/hdrnet.pdf coeffs 这部分的处理对象是低分辨率图,利用CNN进行特征提取(局部和全局),最后fuse得到gridÿ…...
Spring的xxxAware接口工作原理-笔记
1.Aware 接口的工作原理 Spring 提供了多个 XXXAware 接口(如 ApplicationEventPublisherAware、ApplicationContextAware、BeanFactoryAware 等),这些接口的核心作用是让 Bean 在初始化过程中自动获取特定的依赖。 实现 Aware 接口的 Bean…...
flume整合Kafka和spark-streaming核心编程
flume整合Kafka 需求1:利用flume监控某目录中新生成的文件,将监控到的变更数据发送给kafka,kafka将收到的数据打印到控制台: 1.查看topic 2.编辑flume-Kafka.conf,并启动flume 3.启动Kafka消费者 4.新增测试数据 5.查…...
第十四届蓝桥杯刷题——day20
第十四届蓝桥杯刷题——day20 引言题目一:工作时长题目二:与或异或题目三:翻转题目四:阶乘的和题目五:公因数匹配附录:源码gitee仓库 引言 蓝桥杯C研究生组(河北赛区)快要开赛了&…...
Python MCP客户端SDK实现
以下是一个用于与大模型MCP协议交互的Python客户端SDK实现: ```python import json import requests import uuid from typing import Dict, List, Any, Optional, Union from enum import Enum from datetime import datetime class MCPTaskType(Enum): TEXT_GENERATION…...
使用el-table表格动态渲染表头数据之后,导致设置fixed的列渲染出现问题
问题如下: 解决方法: 使用$nextTick和v-if,让el-table在页面渲染完成之后再显示 <el-table v-if"visile"></el-table> 获取数据的方法 getdata(){ //这里处理数据 this.visilefalse //不显示table组件 this.$nex…...
Vue 3 父子组件通信案例详解:Props 与 Emits 实战
前言 在 Vue 3 开发中,组件通信是最基础也是最重要的技能之一。本文将用实际案例演示 Vue 3 中最常用的两种父子通信方式:Props(父传子)和 Emits(子传父),帮助大家快速掌握 Composition API 下…...
kotlin与MVVM结合使用总结(三)
1. MVVM 架构详细介绍及源码层面理解 整体架构 MVVM(Model - View - ViewModel)架构是为了解决视图和数据模型之间的耦合问题而设计的。它通过引入 ViewModel 作为中间层,实现了视图和数据的分离,提高了代码的可维护性和可测试性…...
前端基础之《Vue(11)—自定义指令》
一、自定义指令 1、自己封装指令 什么是指令?指令本质上就是DOM功能的一种抽象封装。 如果有一些DOM功能经常用,但是Vue没有提供相关指令,建议自己封装。 2、自定义全局指令 使用Vue.directive(指令名, function() {})定义全局指令。 3、…...
第3.2节 Android应用调用链路分析
3.2.1 Android调用链路简介 在Android应用程序中,调用链路涉及应用程序中不同组件(如Activity、Service、BroadcastReceiver、ContentProvider)之间的调用关系,以及应用程序与系统服务之间的交互。了解和分析这些调用链路对于调试…...
Codeforces Round 1019 (Div. 2) ABC
A 模拟 思路 数组y是不同的,且所以xi * yi 相同,只有x数组全不同才可以满足要求 代码 LL n,m,k;void solve() {map<LL,LL> mp;cin >> n;for (int i 1;i < n;i ){LL x;cin >> x;mp[x] ;}cout << mp.size() << endl;…...
Babylon.js 材质统一转换指南:将 AssetContainer 中的所有材质转换为 PBRMetallicRoughnessMaterial
在现代 3D 开发中,基于物理的渲染(PBR)已成为行业标准。本文将详细介绍如何在 Babylon.js 中将 AssetContainer 加载的各种材质统一转换为 PBRMetallicRoughnessMaterial,实现项目材质的标准化。 为什么需要材质转换? PBRMetallicRoughness…...
Linux Platform驱动模型全解析:从入门到精通
Linux Platform驱动模型全解析:从入门到精通 1. Platform驱动模型概述 1.1 什么是Platform驱动模型 Platform驱动模型是Linux内核为处理非热插拔设备(通常是SoC集成外设)而设计的一套驱动框架。它通过虚拟的"platform总线"将硬件…...
7.Excel:单元格格式
一 案例 1.案例1 2.案例2 3.案例3 二 三种基本数据类型 补充:在没有任何格式的情况下是这样对齐的。 1.文本 默认左对齐,文本不可参与计算。 2.数值 默认右对齐,数值计算精度是15位。 若超出15位,超出部分显示为0。 3.逻辑值 …...
文件传输过滤器绕过:Exe2Hex
Exe2hex是****g0tmilk开发的一款工具,您可以**在这里找到它。该工具将 EXE 文件转录为一系列十六进制字符串**,DEBUG.exe或Powershell可以将其还原为原始 EXE 文件。之后,该脚本会在受害者机器上运行,重建并执行 EXE 文件。这在系统管理员阻止EXE 文件传输或上传的****高级…...
从多类缺陷到高良率跃升|公差分析技术重构动力电池装配精度体系
在新能源汽车产业升级关键期,动力电池装配精度和因装配引起的安全问题已成为制约产能提升的核心瓶颈。某头部电池企业通过 CETOL 6σ 公差分析技术,成功构建了复杂电池系统的精度控制体系。生产实践表明,微观尺度的公差偏差可能引发系统性质量…...
QT开发技术【QT实现桌面右下角消息】
一、效果 ![ 二、弹窗主体部分 noticewidget /* ** File name: NoticeWidget.h ** Author: ** Date: 2025-04-25 ** Brief: 通知栏控件 ** Copyright (C) 1392019713qq.com All rights reserved. */#include "../Include/NoticeWidget.h"…...
【使用层次序列构建二叉树(数据结构C)】
使用层次序列构建二叉树(C语言实现) 在数据结构学习过程中,二叉树的构建方式通常有递归建树(前序/中序)和层次建树(广度优先)两种。本文将介绍一种基于辅助队列实现的层次建树方法,并…...
【基于Qt的QQ音乐播放器开发实战:从0到1打造全功能音乐播放应用】
🌹 作者: 云小逸 🤟 个人主页: 云小逸的主页 🤟 motto: 要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前,其次就是现在&…...
蓝桥杯 3. 密码脱落
密码脱落 原题目链接 题目描述 X 星球的考古学家发现了一批古代留下来的密码。 这些密码是由 A、B、C、D 四种植物的种子串成的序列。 仔细分析发现,这些密码串当初应该是前后对称的(即镜像串)。 由于年代久远,其中许多种子…...
数学基础 -- 欧拉恒等式的魅力:让复数旋转起来!
公式推导: e i π − 1 e^{i\pi} -1 eiπ−1 被誉为数学中最美的公式之一,它连接了五个数学中最重要的常数: e i π 1 0 (欧拉恒等式) e^{i\pi} 1 0 \tag{欧拉恒等式} eiπ10(欧拉恒等式) 这不仅是巧合,而是复数与三角函数…...
keil修改字体无效,修改字体为“微软雅黑”方法
在网上下载了微软雅黑字体,微软雅黑参考下载链接 结果在Edit->Configuration中找不到这个字体 这个时候可以在keil的安装目录中找到UV4/global.prop文件 用记事本打开它进行编辑,把字体名字改成微软雅黑 重新打开keil就发现字体成功修改了。 这个…...
LeetCode 每日一题 2845. 统计趣味子数组的数目
2845. 统计趣味子数组的数目 给你一个下标从 0 开始的整数数组 nums ,以及整数 modulo 和整数 k 。 请你找出并统计数组中 趣味子数组 的数目。 如果 子数组 nums[l…r] 满足下述条件,则称其为 趣味子数组 : 在范围 [l, r] 内,设 …...
二进制兼容性分析方法
I. 引言 在软件工程领域,二进制兼容性(Binary Compatibility)是一个核心概念,它指的是一个计算系统能够运行为另一个系统编译的可执行代码(通常是机器码)的能力,而无需重新编译 。这与源代码兼…...
在 WSL 安装 OpenFOAM-12
在 WSL 安装 OpenFOAM-12 参考链接安装教程问题整理1、安装完成后运行测试算例 Alllrun 脚本报错 参考链接 OpenFOAM OpenFoam-v12 OpenFOAM-v12-Ubuntu 安装教程 直接在 OpenFOAM 官网找到 Down -> OpenFOAM v12 选择 DownLoad v12 | Ubuntu -> Read More 具体安装过…...
Linux-06 ubuntu 系统截图软件使用简单记录
文章目录 原委一、Shutter二、Flameshot三、Ksnip 原委 原先使用的 Flameshot 截图软件,在ubuntu 18.04下可以正常使用。 系统升级到22.04 后,安装后的只能截图,不能标注,想着修复下。 以下是个人备忘录记录,如何使用…...
基于python代码的通过爬虫方式实现快手发布视频(2025年4月)
1、将真实的快手创作服务平台的cookie贴到代码目录中kuaishou_cookie.txt文件里,运行python脚本即可; 2、运行之前根据import提示安装一些常见依赖,比如requests等; 3、__NS_sig3.js的源码见快手NS sig3签名算法(2025年1月)_快手sig3算法源码-CSDN博客 4、2025年4月份…...
人工智能与机器学习:Python从零实现逻辑回归模型
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
大模型助力嘉兴妇幼:数据分类分级的智能化飞跃
在医疗行业数字化转型进程中,数据已成为驱动服务升级与业务创新的核心要素。作为医疗行业数字化的探索者,嘉兴市妇幼保健院携手美创打造的智能化数据分类分级项目,数据识别率和分类分级率高达99%,分类分级准确率达90%,…...
MyBatisPlus文档
一、MyBatis框架回顾 使用springboot整合Mybatis,实现Mybatis框架的搭建 1、创建示例项目 (1)、创建工程 新建工程 创建空工程 创建模块 创建springboot模块 选择SpringBoot版本 (2)、引入依赖 <dependencies><dependency><groupId>org.springframework.…...