Milvus向量数据库04-Pipelines搭建RAG应用

Milvus向量数据库04-Pipelines搭建RAG应用

Zilliz Cloud Pipelines 可以将文档、文本片段和图像等非结构化数据转换成可搜索的向量并存储在 Collection 中。本文将介绍 Zilliz Cloud Pipelines 的三种主要类型并提供示例代码,展示如何使用 Pipelines 搭建 RAG 应用。

pipeline-overview-cn

1-了解 Pipelines

  • 了解 Pipelines链接

当今,语义搜索广泛运用于众多服务和应用中,包括搜索和查询语义上相匹配的文本快、相似的图片等。通常此类检索系统都会处理数据,将数据转化为 Embedding 向量。换言之,检索系统会将文本或图像以多维空间中的向量来表示。构建此类检索系统需要深厚的专业知识和工程技术。但是,使用 Zilliz Cloud Pipelines,您可以通过简单易用的界面构建检索系统。当前,Zilliz Cloud Pipelines 支持对文本文档进行语义搜索——这也是检索增强生成(RAG)应用的基石。后续 Zilliz Cloud Pipelines 将推出更多类型的 Pipelines,从而满足更多的语义搜索场景,例如图片搜索、视频搜索、多模态搜索等。

Ingestion pipeline

  • Ingestion pipeline链接

Ingestion pipeline 能够将非结构化数据转化为可搜索的 Embedding 向量,并将向量存储在 Zilliz Cloud 向量数据库中。

1 个 Ingestion pipeline 中可创建多个 Function,用于将输入字段通过转换器处理,生成输出字段。例如,您可以将文档作为输入,Function 会将这些文档自动切块并转换为 Embedding 向量或保留文档的一些元数据信息,以便后续进行向量搜索时过滤搜索结果。

📘说明

在Zilliz Cloud 中,1 个 Ingestion pipeline 只对应 1 个向量数据库 Collection

Search pipeline

  • Search pipeline链接

Search pipeline 将查询转化为 Embedding 向量,并在向量数据库中进行向量相似性搜索,从而获取Top-k 相似向量和对应元数据。您可以使用 Search pipeline 实现语义搜索。1 个 Search pipeline 中仅可添加 1 种 Function。

Deletion pipeline

  • Deletion pipeline链接

Deletion pipeline 从 Collection 中删除指定文档的所有文档块。1 个 Deletion pipeline 中仅可添加 1 种 Function。

2-示例:使用 Pipelines 搭建 RAG 应用

  • 使用 Pipelines 搭建 RAG 应用链接

本教程将展示如何使用 Zilliz Cloud Pipelines 轻松搭建可扩展的 RAG 应用。本教程中使用的编程语言为 Python。下图展示了 RAG 应用的基础组件。

rag-application

前提条件

  • 前提条件链接

  • 您已创建部署在阿里云(杭州)的 Zilliz Cloud 集群。

设置 Zilliz Cloud Pipelines

  • 设置 Zilliz Cloud Pipelines链接
获取集群信息
  • 获取集群信息链接

获取集群 ID、集群地域、API 密钥、项目 ID 等相关信息。

import osCLOUD_REGION = 'ali-cn-hangzhou'
CLUSTER_ID = 'your CLUSTER_ID'
API_KEY = 'your API_KEY'
PROJECT_ID = 'your PROJECT_ID'
创建 Ingestion Pipeline
  • 创建 Ingestion Pipeline链接

Ingestion Pipeline 可以将非结构化数据转换为可搜索的 Embedding 向量并将其存储在 Zilliz Cloud 向量数据库中。在 Ingestion Pipeline 中,您可以通过选择 Function 来定义需要处理的非结构化数据类型。

目前,Ingestion pipeline 中支持添加以下几种 Function:

  • INDEX_TEXT: 可用于将文本转换为 Embedding 向量。该 Function 会将输入字段 text_list 映射为输出字段 textembedding

  • INDEX_DOC: 可用于将文档切分为切片并将切片转换为 Embedding 向量。该 Function 会将输入字段 doc_url 映射为输出字段 doc_namechunk_idchunk_textembedding

  • INDEX_IMAGE: 可用于将图像转换为 Embedding 向量。该 Function 会将输入字段 image_urlimage_id 映射为输出字段 image_idembedding

  • PRESERVE: 可用于将额外的元数据信息(例如文档发布信息、标签、出版日期等)存储为标量字段。

本教程中,我们将创建 1 个 Ingestion Pipeline 并在其中添加 1 个 INDEX_TEXT Function 和 1 个 PRESERVE Function。在创建 Ingestion Pipeline 时将一同自动创建 1 个名称为 my_text_collection 的 Collection。该 Collection 的 Schema 中将包含 5 个字段:

  • id:自动生成的主键

  • textembeddingINDEX_TEXT Function 中定义的输出字段。

  • titlePRESERVE Function 中定义的输出字段。

import requestsheaders = {"Content-Type": "application/json","Accept": "application/json","Authorization": f"Bearer {API_KEY}"
}create_pipeline_url = f"https://controller.api.{CLOUD_REGION}.cloud.zilliz.com.cn/v1/pipelines"collection_name = 'my_text_collection'
embedding_service = "zilliz/bge-base-en-v1.5"data = {"name": "my_ingestion_pipeline","description": "A pipeline that generates text embeddings and stores title information.","type": "INGESTION","projectId": PROJECT_ID,"clusterId": CLUSTER_ID,"collectionName": collection_name,"functions": [{"name": "index_my_text","action": "INDEX_TEXT","language": "ENGLISH","embedding": embedding_service},{"name": "title_info","action": "PRESERVE","inputField": "title","outputField": "title","fieldType": "VarChar"}]
}response = requests.post(create_pipeline_url, headers=headers, json=data)
print(response.json())
ingestion_pipe_id = response.json()["data"]["pipelineId"]

Ingestion Pipeline 创建成功后将返回 Pipeline ID。在后续运行时,我们将使用到 Pipeline ID 信息。

创建 Search Pipeline
  • 创建 Search Pipeline链接

Search Pipeline 可将查询文本转化为 Embedding 向量并在数据库中检索 Top-K 个最相似向量,从而实现语义搜索。

目前,Search Pipeline 支持添加以下几种类型的 Function:

  • SEARCH_DOC_CHUNK: 将用户查询转换为 Embedding 向量,搜索并返回知识库中与之最相关的文档切片 Entities。

  • SEARCH_TEXT: 将用户查询转换为 Embedding 向量,搜索并返回知识库中与之最相似的文本 Entities。

  • SEARCH_IMAGE: 将查询图像 URL 转换为 Embedding 向量,并返回知识库中与之最相似的图像 Entities。

本教程中,我们将添加 SEARCH_TEXT Function,用于检索文本数据。

data = {"projectId": PROJECT_ID,"name": "my_search_pipeline","description": "A pipeline that receives text and search for semantically similar texts.","type": "SEARCH","functions": [{"name": "search_text_and_title","action": "SEARCH_TEXT","embedding": embedding_service,"reranker": "zilliz/bge-reranker-base", # optional, this will rerank search results by the reranker service"clusterId": CLUSTER_ID,"collectionName": collection_name,}]
}response = requests.post(create_pipeline_url, headers=headers, json=data)print(response.json())
search_pipe_id = response.json()["data"]["pipelineId"]

同样,在 Search Pipeline 创建成功会会返回 Pipeline ID。 后续运行时,将使用该 Pipeline ID 信息。

运行 Ingestion Pipeline
  • 运行 Ingestion Pipeline链接

本教程中,我们将以博客文章《What Milvus version to start with》为例。现在,我们需要摄取这篇博客文章的内容。

run_pipeline_url = f"https://controller.api.{CLOUD_REGION}.cloud.zilliz.com.cn/v1/pipelines/{ingestion_pipe_id}/run"milvus_lite_data = {"data":{"text_list": ["As the name suggests, Milvus Lite is a lightweight version that integrates seamlessly with Google Colab and Jupyter Notebook. It is packaged as a single binary with no additional dependencies, making it easy to install and run on your machine or embed in Python applications. Additionally, Milvus Lite includes a CLI-based Milvus standalone server, providing flexibility for running it directly on your machine. Whether you embed it within your Python code or utilize it as a standalone server is entirely up to your preference and specific application requirements.","Milvus Lite is ideal for rapid prototyping and local development, offering support for quick setup and experimentation with small-scale datasets on your machine. However, its limitations become apparent when transitioning to production environments with larger datasets and more demanding infrastructure requirements. As such, while Milvus Lite is an excellent tool for initial exploration and testing, it may not be suitable for deploying applications in high-volume or production-ready settings.","Milvus Lite is perfect for prototyping on your laptop."],"title": 'Milvus Lite'}
}milvus_standalone_data = {"data":{"text_list": ["Milvus Standalone is a mode of operation for the Milvus vector database system where it operates independently as a single instance without any clustering or distributed setup. Milvus runs on a single server or machine in this mode, providing functionalities such as indexing and searching for vectors. It is suitable for situations where the data and traffic volume scale is relatively small and does not require the distributed capabilities provided by a clustered setup.","Milvus Standalone offers high performance and flexibility for conducting vector searches on your datasets, making it suitable for smaller-scale deployments, CI/CD, and offline deployments when you have no Kubernetes support."],"title": 'Milvus Standalone'}
}milvus_cluster_data = {"data":{"text_list": ["Milvus Cluster is a mode of operation for the Milvus vector database system where it operates and is distributed across multiple nodes or servers. In this mode, Milvus instances are clustered together to form a unified system that can handle larger volumes of data and higher traffic loads compared to a standalone setup. Milvus Cluster offers scalability, fault tolerance, and load balancing features, making it suitable for scenarios that need to handle big data and serve many concurrent queries efficiently.","Milvus Cluster provides unparalleled availability, scalability, and cost optimization for enterprise-grade workloads, making it the preferred choice for large-scale, highly available production environments."],"title": 'Milvus Cluster'}
}for data in [milvus_lite_data, milvus_standalone_data, milvus_cluster_data]:response = requests.post(run_pipeline_url, headers=headers, json=data)print(response.json())

现在我们已经成功将文本片段和对应标题、Embedding 向量摄取到向量数据库中了。您可以通过 Zilliz Cloud web 控制台预览该 Collection (my_text_collection)下的数据。

搭建 RAG 应用

  • 搭建 RAG 应用链接
运行 Search Pipeline
  • 运行 Search Pipeline链接
import pprintdef retrieval_with_pipeline(question, search_pipe_id, top_k=2, verbose=False):run_pipeline_url = f"https://controller.api.{CLOUD_REGION}.cloud.zilliz.com.cn/v1/pipelines/{search_pipe_id}/run"data = {"data": {"query_text": question},"params": {"limit": top_k,"offset": 0,"outputFields": ["text","title"],,"filter": 'title == "Milvus Lite"'}}response = requests.post(run_pipeline_url, headers=headers, json=data)if verbose:pprint.pprint(response.json())results = response.json()["data"]["result"]retrieved_texts = [{'text': result['text'], 'title': result['title']} for result in results]return retrieved_textsquestion = 'Which Milvus should I choose if I want to use in the jupyter notebook with a small scale of data?'
retrieval_with_pipeline(question, search_pipe_id, top_k=2, verbose=True)

params 中,我们指定返回 top K 个结果,并过滤出文章标题为 “Milvus Lite” 的结果。输出结果需要包含 texttitle 字段。如需详细了解运行 Search Pipeline 时的参数,请参考这里。

以下为输出结果。

{'code': 200,'data': {'result': [{'distance': 0.8722565174102783,'id': 449431798276845977,'text': 'As the name suggests, Milvus Lite is a ''lightweight version that integrates seamlessly ''with Google Colab and Jupyter Notebook. It is ''packaged as a single binary with no additional ''dependencies, making it easy to install and run ''on your machine or embed in Python ''applications. Additionally, Milvus Lite ''includes a CLI-based Milvus standalone server, ''providing flexibility for running it directly ''on your machine. Whether you embed it within ''your Python code or utilize it as a standalone ''server is entirely up to your preference and ''specific application requirements.','title': 'Milvus Lite'},{'distance': 0.3541138172149658,'id': 449431798276845978,'text': 'Milvus Lite is ideal for rapid prototyping and ''local development, offering support for quick ''setup and experimentation with small-scale ''datasets on your machine. However, its ''limitations become apparent when transitioning ''to production environments with larger datasets ''and more demanding infrastructure requirements. ''As such, while Milvus Lite is an excellent tool ''for initial exploration and testing, it may not ''be suitable for deploying applications in ''high-volume or production-ready settings.','title': 'Milvus Lite'}],'token_usage': 34}}
Out[7]:
[{'text': 'As the name suggests, Milvus Lite is a lightweight version that integrates seamlessly with Google Colab and Jupyter Notebook. It is packaged as a single binary with no additional dependencies, making it easy to install and run on your machine or embed in Python applications. Additionally, Milvus Lite includes a CLI-based Milvus standalone server, providing flexibility for running it directly on your machine. Whether you embed it within your Python code or utilize it as a standalone server is entirely up to your preference and specific application requirements.','title': 'Milvus Lite'},{'text': 'Milvus Lite is ideal for rapid prototyping and local development, offering support for quick setup and experimentation with small-scale datasets on your machine. However, its limitations become apparent when transitioning to production environments with larger datasets and more demanding infrastructure requirements. As such, while Milvus Lite is an excellent tool for initial exploration and testing, it may not be suitable for deploying applications in high-volume or production-ready settings.','title': 'Milvus Lite'}]

向问答机器人提问并运行 Search Pipeline 后,可以获得 top-K 个最相似的文本切片,这些内容将构成我们 RAG 应用的基础知识库。

搭建 RAG 问答机器人
  • 搭建 RAG 问答机器人链接

通过 retrieval_with_pipeline Function,我们可以检索向量数据库中的内容,并以此为基础搭建我们的 RAG 问答机器人。本教程中,我们将使用 OpenAI 的 gpt-3.5-turb 大语言模型。请在以下示例代码中使用您自己的 OpenAI API 密钥。

import os
from openai import OpenAIclient = OpenAI()
client.api_key = os.getenv('OPENAI_API_KEY')  # your OpenAI API keyclass Chatbot:def __init__(self, search_pipe_id):self._search_pipe_id = search_pipe_iddef retrieve(self, query: str) -> list:"""Retrieve relevant text with Zilliz Cloud Pipelines."""results = retrieval_with_pipeline(query, self._search_pipe_id, top_k=2)return resultsdef generate_answer(self, query: str, context_str: list) -> str:"""Generate answer based on context, which is from the result of Search pipeline run."""completion = client.chat.completions.create(model="gpt-3.5-turbo",temperature=0,messages=[{"role": "user","content":f"We have provided context information below. \n"f"---------------------\n"f"{context_str}"f"\n---------------------\n"f"Given this information, please answer the question: {query}"}]).choices[0].message.contentreturn completiondef chat_with_rag(self, query: str) -> str:context_str = self.retrieve(query)completion = self.generate_answer(query, context_str)return completiondef chat_without_rag(self, query: str) -> str:return client.chat.completions.create(model="gpt-3.5-turbo",temperature=0,messages=[{"role": "user","content": query}]).choices[0].message.contentchatbot = Chatbot(search_pipe_id)

现在,我们已经成功搭建了 1 个 RAG 问答机器人。

向问答机器人提问
  • 向问答机器人提问链接

向问答机器人提问:“如果数据量较小,应该在 Jupyter Notebook 中使用哪个版本的 Milvus?”

question = 'Which Milvus should I choose if I want to use in the jupyter notebook with a small scale of data?'chatbot.chat_with_rag(question)

答案如下:

Based on the context provided, you should choose Milvus Lite if you want to use it in a Jupyter Notebook with a small scale of data. Milvus Lite is specifically designed for rapid prototyping and local development, offering support for quick setup and experimentation with small-scale datasets on your machine. It is lightweight, easy to install, and integrates seamlessly with Google Colab and Jupyter Notebook.

知识库中的原文如下:

As the name suggests, Milvus Lite is a lightweight version that integrates seamlessly with Google Colab and Jupyter Notebook. It is packaged as a single binary with no additional dependencies, making it easy to install and run on your machine or embed in Python applications. Additionally, Milvus Lite includes a CLI-based Milvus standalone server, providing flexibility for running it directly on your machine. Whether you embed it within your Python code or utilize it as a standalone server is entirely up to your preference and specific application requirements.

对比答案和原文,可以发现 RAG 问答机器人提供了十分准确的回答。

让我们再次提出同一个问题,但此次不使用 RAG 能力。

chatbot.chat_without_rag(question)

答案如下:

If you are working with a small scale of data in a Jupyter notebook, you may want to consider using Milvus CE (Community Edition). Milvus CE is a free and open-source vector database that is suitable for small-scale projects and experimentation. It is easy to set up and use in a Jupyter notebook environment, making it a good choice for beginners or those working with limited data. Additionally, Milvus CE offers a range of features and functionalities that can help you efficiently store and query your data in a vectorized format.

通过答案不难发现,如果不使用 RAG 能力,问答机器人旧会产生幻觉。

总结

  • 总结链接

我们在本教程示例中成功搭建了一个 RAG 问答机器人。我们通过使用 Pipelines 为问答机器人注入了领域知识(domain knowledge),最终生成了准确的回答。


3-知识总结

以下是文章内容要点的思维导图:

graph TDA[Milvus向量数据库Pipelines搭建RAG应用] --> B[了解Pipelines]A --> C[示例:使用Pipelines搭建RAG应用]A --> D[总结]B --> B1[Pipelines定义]B --> B2[Ingestion pipeline]B --> B3[Search pipeline]B --> B4[Deletion pipeline]C --> C1[前提条件]C --> C2[设置Zilliz Cloud Pipelines]C3[运行Ingestion Pipeline] --> C3_1[获取集群信息]C3 --> C3_2[创建Ingestion Pipeline]C3 --> C3_3[运行Ingestion Pipeline]C4[搭建RAG应用] --> C4_1[运行Search Pipeline]C4 --> C4_2[搭建RAG问答机器人]C4 --> C4_3[向问答机器人提问]D --> D1[RAG问答机器人]D --> D2[领域知识注入]D --> D3[生成准确回答]

详细知识点如下:

了解Pipelines

  • Pipelines定义:将非结构化数据转换成可搜索的向量并存储在Collection中。
  • Ingestion pipeline:将非结构化数据转化为Embedding向量并存储。
  • Search pipeline:将查询转化为Embedding向量并进行相似性搜索。
  • Deletion pipeline:从Collection中删除指定文档的所有文档块。

示例:使用Pipelines搭建RAG应用

  • 前提条件:创建部署在阿里云(杭州)的Zilliz Cloud集群。
  • 设置Zilliz Cloud Pipelines:获取集群信息,创建Ingestion和Search Pipeline。
  • 运行Ingestion Pipeline
    • 获取集群信息:获取集群ID、地域、API密钥、项目ID。
    • 创建Ingestion Pipeline:定义处理非结构化数据的Function。
    • 运行Ingestion Pipeline:摄取文本片段和对应标题、Embedding向量到数据库。
  • 搭建RAG应用
    • 运行Search Pipeline:转化查询文本为Embedding向量并检索Top-K相似向量。
    • 搭建RAG问答机器人:使用OpenAI的大语言模型生成回答。
    • 向问答机器人提问:获取基于知识库内容的准确回答。

总结

  • RAG问答机器人:成功搭建,提供准确的回答。
  • 领域知识注入:通过Pipelines为问答机器人注入领域知识。
  • 生成准确回答:对比不使用RAG能力,展示RAG问答机器人的优势。

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

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

相关文章

离线写博客(失败) - 用Markdown来离线写博客

因为想控制一下用网,但是又有写博客的需求,所以想研究一下离线写博客。 我看CSDN上面好像有很多介绍,Windows Live Writer 啦,Markdown啦,还有一些其他的,我看了一下,好像 Markdown还有点儿靠谱…

【洛谷】B3844 [GESP样题 二级] 画正方形(详细注释)

#include <iostream> using namespace std; int main() {//声明一个整型变量n&#xff0c;用于接收输入的数值&#xff0c;该数值将决定后续输出图案的行数和列数int n; cin >> n;//声明两个整型变量i和j&#xff0c;分别用作外层循环和内层循环的计数器int i, j;/…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

番茄社区双端视频APP源码_内附安装教程

新版视频源码|类似番茄APP视频付费软件APP源码教程 番茄社区双端视频APP源码&#xff0c;带安装教程&#xff0c;源码非组件&#xff0c;短视频、图片、交流、讨论、电影、电视剧。 没有什么问题宝塔就可以搭建&#xff0c;采集方面是火车头可以自己写规则&#xff01;

Onchain 正在蚕食 Offchain

目录 未来在链上 价值创造 技术加速 机构采用 小队&#xff1a;加速链上经济 我们正在进入一个代码就是货币、信任被编程、全球接入打破传统经济界限的时代。这种新兴模式就是我们所说的链上经济。 在此领域&#xff0c;Solana 因其在基础设施和应用程序方面的持续创新而脱颖而…

【LeetCode】80.删除有序数组中的重复项II

题目链接&#xff1a; 80.删除有序数组中的重复项II 题目描述&#xff1a; 解题思路&#xff1a; 按照题目中要求&#xff0c;必须在原来数组中进行修改&#xff0c;并且在O(1)额外空间条件下完成。因此我们可以使用双指针算法&#xff0c;算法具体流程如下&#xff1a; 如…

ORB-SLAM2 ---- 词袋模型BOW

文章目录 一、回环检测的重要性二、回环检测的方法三、词袋模型四、词典五、实例展示1. 计算评分2. 找出有相同单词的关键帧3. 用词袋进行快速匹配 六、总结 一、回环检测的重要性 在前面的学习我们知道&#xff0c;噪声的影响是不可消除的&#xff0c;而上一帧的误差不可避免的…

Android APP自学笔记

摘抄于大学期间记录在QQ空间的一篇自学笔记&#xff0c;当前清理空间&#xff0c;本来想直接删除掉的&#xff0c;但是感觉有些舍不得&#xff0c;因此先搬移过来。 Android导入已有外部数据库 2015.06.26在QQ空间记录&#xff1a;在Android中不能直接打开res aw目录中的数据…

php项目的sdk封装成composer包的创建与发版

将一个 PHP 项目的 SDK 封装成 Composer 包并发布的过程大致可以分为以下几个步骤。这个过程涉及到创建一个符合 Composer 规范的包&#xff0c;配置相关信息&#xff0c;并将其发布到 Packagist 或其他 Composer 仓库。以下是详细的步骤&#xff1a; ### 1. 准备 PHP SDK 项目…

STM32F103单片机使用STM32CubeMX新建IAR工程步骤

打开STM32CubeMX软件&#xff0c;选择File 选择新建工程 在打开的窗口输入单片机型号 在右下角选择单片机型号&#xff0c;然后点右上角 start project&#xff0c;开始新建工程。 接下来设置调试接口&#xff0c;在左边System Core中选择 SYS&#xff0c;然后在右右边debu…

轻量化特征融合 | YOLOv11 引入一种基于增强层间特征相关性的轻量级特征融合网络 | 北理工新作

本改进已同步到Magic框架 摘要—无人机图像中的小目标检测由于分辨率低和背景融合等因素具有挑战性,导致特征信息有限。多尺度特征融合可以通过捕获不同尺度的信息来增强检测,但传统策略效果不佳。简单的连接或加法操作无法充分利用多尺度融合的优势,导致特征之间的相关性不…

Tomcat项目本地部署

今天分享一下如何在本地&#xff0c;不依赖于idea部署聚合项目&#xff0c;以我做过的哈米音乐项目为例&#xff0c;项目结构如下&#xff1a; ham-core模块为公共模块&#xff0c;我们只需将另外三个模块&#xff1a;前台、后台、文件服务器打包&#xff0c;将打好的jar、war包…

进入保护模式

Intel CPU启动的时候是16位(实模式), 但是我们要工作在32位模式下 实模式下没有任何保护措施, 别人可能通过给数据段寄存器赋值上代码段地址, 然后来改变代码段的内容, 保护模式访问内容会检查权限之类的, 也会检查程序访问的内存范围是不是超了, 我们这个操作系统不会利用保…

MVC基础——市场管理系统(一)

文章目录 项目地址一、创建项目结构1.1 创建程序以及Controller1.2 创建View1.3 创建Models层,并且在Edit页面显示1.4 创建Layou模板页面1.5 创建静态文件css中间件二、Categories的CRUD2.1 使用静态仓库存储数据2.2 将Categorie的列表显示在页面中(List)2.3 创建_ViewImport.…

C#开发-集合使用和技巧(十)Union用法-并集

在 C# 中&#xff0c;IEnumerable 的 Union 方法用于返回两个序列的并集。Union 方法会去除重复的元素&#xff0c;确保结果集中每个元素都是唯一的。以下是 Union 方法的基本用法&#xff1a; 基本语法 public static IEnumerable<TSource> Union<TSource>(this…

高效查找的秘密武器二:布隆过滤器

最近学了这个布隆过滤器&#xff0c;所以小编来分享下这个神奇的数据结构 引入&#xff1a; 在我们日常生活中&#xff0c;当然这里特指是编程中时&#xff0c;经常遇到要判断一个元素是否在集合中&#xff0c;比如判断一个单词/词语&#xff0c;是否在已知的字典中&#xff1…

C++入门终

目录 一、引用 二、内联函数 三、auto关键字 四、指针空值nullptr 一、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间 类型&引用变量名(对象名)…

C++实现排序算法:冒泡排序

目录 前言 冒泡排序性质 C代码实现冒泡排序 冒泡图解 第一趟排序 第二趟排序 第三趟排序 排序结果 结语 前言 冒泡排序的基本思想是通过从前往后&#xff08;从后往前&#xff09;两两比较&#xff0c;若为逆序&#xff08;即arr[i] < arr[i 1]&#xff09;则交换…

selenium+python实现12306自动化抢火车票(二)

往期回顾&#xff1a; seleniumpython实现12306自动化抢火车票&#xff08;一&#xff09; 1、根据乘车人姓名匹配&#xff0c;支持1人或多人选择 定位出所有乘车人的元素集&#xff0c;根据姓名集合去元素集里循环迭代匹配&#xff0c;匹配上了操作选中 ele_alldriver.find_e…

基于openzeppelin插件的智能合约升级

一、作用以及优点 部署可升级合约&#xff0c;插件自动部署proxy和proxyAdmin合约&#xff0c;帮助管理合约升级和交互&#xff1b;升级已部署合约&#xff0c;通过插件快速升级合约&#xff0c;脚本开发方便快捷&#xff1b;管理代理管理员的权限&#xff0c;只有proxyAdmin的…