【AI 大模型】RAG 检索增强生成 ⑤ ( 向量数据库 | 向量数据库 索引结构和搜索算法 | 常见 向量数据库 对比 | 安装并使用 向量数据库 chromadb 案例 )

news2025/3/18 14:14:41

文章目录

  • 一、向量数据库
    • 1、向量数据库引入
    • 2、向量数据库简介
    • 3、向量数据库 索引结构和搜索算法
    • 4、向量数据库 应用场景
    • 5、传统数据库 与 向量数据库 对比
  • 二、常见 向量数据库 对比
  • 三、向量数据库 案例
    • 1、安装 向量数据库 chromadb
    • 2、核心要点 解析
      • ① 创建数据库实例
      • ② 创建数据库表
      • ③ 向 向量数据库表 中 插入文本向量
      • ④ 从 向量数据库表 中查询 相似数据
    • 3、完整代码示例


在这里插入图片描述

上一篇博客 【AI 大模型】RAG 检索增强生成 ④ ( 向量相似度计算 | 余弦距离 | 欧式距离 | OpenAI 文本向量模型 | 手动实现的 余弦相似度 和 欧氏距离 函数计算 ) 中 , 讲解了 向量相似度 的计算方式 , 使用 OpenAI 的 text-embedding-ada-002 文本向量模型 生成了 一组文字的 文本向量 , 分别使用 余弦距离欧式距离 计算了 文本向量 之间的相似度 ;





一、向量数据库




1、向量数据库引入


在上一篇博客 【AI 大模型】RAG 检索增强生成 ④ ( 向量相似度计算 | 余弦距离 | 欧式距离 | OpenAI 文本向量模型 | 手动实现的 余弦相似度 和 欧氏距离 函数计算 ) 中 , 使用 向量模型 将文本转为 向量 , 如 : OpenAI 的 text-embedding-ada-002 文本向量模型 , 可以将文本转为 1536 维的浮点数向量值 ;

OpenAI 的 text-embedding-ada-002 文本向量模型 可以 跨语言进行相似度计算 , 如 : 计算 英文 和 中文 的相似度 ;

然后 , 通过 循环遍历 对比 目标文本向量 和 每个文本向量 的 余弦距离 和 欧式距离 , 得到一个距离最短的文本 , 这样对比计算量非常大 ;

如何快速检索出某个 文本 含义相似的 目标文本 , 这里引入一个新的工具 " 向量数据库 " ;


2、向量数据库简介


向量数据库 ( Vector Database ) 是专门用于 存储、检索 和 管理 高维向量数据的 数据库系统 , 其核心能力是 快速 执行 向量相似性搜索 ;

向量数据库 可以 快速搜索到 与 目标文本 相似的 文本内容 ;


向量数据库 存储 :

  • 向量存储 : 将 将 文本、图片、音视频 等数据 通过 机器学习模型 转换为 高维向量 , 然后 存储到 " 向量数据库 " 中 ;
  • 向量压缩 : 向量数据库 中 使用了 向量压缩技术 , 可 节省 向量 存储空间 ;

向量相似度计算 : 在 向量数据库 中的 向量 , 通过 计算向量距离 衡量相似性 , 如 : 欧氏距离、余弦距离 ;


向量数据库查询 : 使用 ANN 近似最近邻搜索 算法 在 高维向量空间 中快速查找与给定 向量点 最接近的 向量 , 该算法可以 在 保证一定检索精度的前提下 , 显著 提高了搜索效率 , 特别适用于处理大规模、高维数据集 ;


3、向量数据库 索引结构和搜索算法


技术类型代表算法/结构特点算法原理时间复杂度优缺点适用场景
树结构KD-Tree, Ball-Tree基于空间划分,结构直观,支持精确搜索递归划分空间(KD-Tree按坐标轴划分,Ball-Tree按超球体划分)O(N log N)✅ 低维精确搜索快
❌ 高维性能急剧下降(维度灾难)
维度<20的结构化数据检索
哈希方法LSH (局部敏感哈希)牺牲精度换速度,哈希碰撞可控设计哈希函数使相似向量映射到相同桶的概率更高O(N)✅ 速度快、内存低
❌ 精度与哈希函数设计强相关
快速去重、近似搜索初筛
图索引HNSW, NSG小世界网络优化,层级化搜索路径构建多层概率图结构,通过邻居跳转实现高效近邻搜索O(log N)✅ 高召回率、支持动态更新
❌ 内存消耗较大
大规模高维数据(图像/文本)
量化方法PQ (乘积量化), SQ (标量量化)有损压缩,向量维度解耦计算将高维向量分解为子空间并分别量化,降低存储和计算复杂度O(N)✅ 内存占用降低80%+
❌ 量化误差导致精度损失
十亿级向量内存优化场景
倒排索引IVF (倒排文件系统)粗粒度筛选+细粒度比较先聚类(如K-means),搜索时仅扫描最近簇的向量O(√N)✅ 搜索速度提升显著
❌ 需预训练聚类中心
配合PQ量化加速搜索
混合结构DiskANN磁盘-内存分级存储,减少IO瓶颈基于SSD优化存储,结合图索引与量化技术O(log N)✅ 支持TB级数据
❌ 需要SSD硬件配合
超大规模磁盘存储场景
深度学习驱动Learned Index数据分布自适应性,端到端优化使用神经网络预测向量分布,优化索引构建训练后O(1)✅ 自适应数据分布
❌ 需要大量训练数据
数据分布规律的专用场景

4、向量数据库 应用场景


向量数据库应用场景 :

  • 推荐系统 : 根据用户行为向量 匹配相似商品 ;
  • 图像检索 : 输入一张图片 , 快速找到相似图片 ;
  • 语义搜索 : 将文本转换为向量 , 实现 语义级搜索 ;
  • 生物信息学 : 对 基因序列、蛋白质结构 进行 相似性匹配 ;

5、传统数据库 与 向量数据库 对比


对比维度传统数据库向量数据库
核心数据类型结构化数据(表格、字段)非结构化数据的向量化表示(高维数值)
主要查询方式精确匹配(SQL条件查询)相似性搜索(Top-K最近邻,ANN算法)
索引结构B树、哈希索引HNSW图、IVF倒排索引、LSH哈希等
性能瓶颈复杂JOIN、事务锁竞争高维向量计算效率与内存占用
典型应用场景金融交易、用户管理等结构化业务图像/文本检索、推荐系统、语义搜索
扩展性垂直扩展(硬件升级)为主分布式架构,天然支持水平扩展
处理规模百万~十亿级结构化记录十亿~万亿级高维向量
查询延迟毫秒~秒级(依赖索引优化)亚毫秒~百毫秒级(ANN加速)
数据一致性强一致性(ACID)最终一致性为主(分布式场景)
代表系统MySQL, PostgreSQL, OracleMilvus, Pinecone, Faiss, Qdrant




二、常见 向量数据库 对比



名称开源云服务主要特点优点缺点使用场景
FAISS专注高性能向量检索,需搭配其他存储使用速度快,支持大规模高维数据,适合研究场景无持久化存储,需自行处理数据管理研究项目、离线大规模相似性搜索(如推荐系统原型)
Pinecone全托管云服务,开箱即用简单易用,自动扩展,低运维成本价格高,灵活性低,仅支持云服务商业应用快速部署(如实时推荐、语义搜索)
Milvus分布式架构,支持海量数据,多索引类型扩展性强,功能全面,社区活跃自托管部署复杂,资源消耗较高企业级生产环境(如十亿级向量搜索、AI平台后端)
Weaviate内置模型向量化,支持混合搜索(向量+关键词)自带数据向量化,GraphQL接口灵活模型依赖性强,自定义向量需额外配置语义增强搜索(如知识图谱、结合文本和向量的多模态检索)
Qdrant高性能Rust实现,支持过滤查询低延迟,内存效率高,适合实时场景社区较小,文档相对较少高并发低延迟场景(如实时推荐、流式数据处理)
PGVectorPostgreSQL扩展,支持SQL操作向量无缝兼容PostgreSQL,事务支持,混合查询性能低于专用库,大规模数据需优化已有PostgreSQL的项目添加向量搜索(如结合关系数据的推荐系统)
RediSearch基于Redis的向量检索,内存优先超低延迟,支持实时更新内存成本高,不适合超大数据集实时性要求极高的场景(如实时个性化广告、会话式AI)
ElasticSearch结合全文检索与向量搜索,成熟生态系统混合搜索能力强,社区资源丰富向量检索性能较弱,高维数据效率低文本+向量混合搜索(如搜索引擎增强、日志分析结合语义)




三、向量数据库 案例




1、安装 向量数据库 chromadb


执行 pip install chromadb 命令 , 安装 向量数据库 chromadb ;

在这里插入图片描述


使用 Python 语言 开发 chromadb 向量数据库 流程如下 :

  • 首先 , 需要 导入 chromadb 库 ;
import chromadb  # ChromaDB 向量数据库
  • 然后 , 创建 持久化的 Chroma 向量数据库 客户端 实例 ;
# 初始化 ChromaDB 客户端 (持久化到本地目录)
chroma_client = chromadb.PersistentClient(path="chroma_db")
  • 再后 , 获取集合 , 相当于 向量数据库 表 ;
# 创建或获取集合 (相当于数据库表)
collection = chroma_client.get_or_create_collection(
    name="news_articles",  # 集合名称
    metadata={"hnsw:space": "cosine"}  # 使用余弦相似度
)
  • 再后 , 将 文本向量 插入数据库 ;
# 将文档插入数据库
collection.add(
    ids=document_ids,               # 唯一ID列表
    embeddings=document_embeddings, # 文本向量列表
    documents=documents             # 原始文本列表
)
  • 最后 , 查询 向量数据库 ;
# 执行相似性查询
results = collection.query(
    query_embeddings=[query_embedding],  # 查询向量
    n_results=2                          # 返回前2个最相似结果
)

2、核心要点 解析



① 创建数据库实例


调用 PersistentClient 构造函数 , 创建 持久化的 Chroma 向量数据库 客户端 实例 , 返回 ClientAPI 实例 ;

def PersistentClient(
    path: str = "./chroma",  # 路径参数,指定Chroma数据保存的目录,默认为"./chroma"
    settings: Optional[Settings] = None,  # 设置参数,可选,默认为None
    tenant: str = DEFAULT_TENANT,  # 租户参数,指定此客户端要使用的租户,默认为默认租户
    database: str = DEFAULT_DATABASE,  # 数据库参数,指定此客户端要使用的数据库,默认为默认数据库
) -> ClientAPI:
    """
    创建一个持久化的Chroma实例,并将其数据保存到磁盘。这对于测试和开发很有用,
    但不建议在生产环境中使用。

    参数:
        path: 保存Chroma数据的目录。默认值为"./chroma"。
        settings: 客户端的设置配置,如果为None,则使用默认设置。
        tenant: 此客户端要使用的租户。默认使用默认租户。
        database: 此客户端要使用的数据库。默认使用默认数据库。
    """
    if settings is None:
        settings = Settings()  # 如果设置参数为None,则创建一个默认的设置实例
    settings.persist_directory = path  # 设置持久化目录
    settings.is_persistent = True  # 标记设置为持久化

    # 确保参数是正确的类型 -- 用户可以传递任何类型的数据
    tenant = str(tenant)  # 将租户参数转换为字符串
    database = str(database)  # 将数据库参数转换为字符串

    return ClientCreator(tenant=tenant, database=database, settings=settings)  # 返回创建的客户端实例

② 创建数据库表


ClientAPI#get_collection 函数 的 作用是 获取具有给定名称的集合 , 相当于 创建 向量数据库 的 数据库表 , 得到 Collection 实例对象 ;

class ClientAPI(BaseAPI, ABC):
    tenant: str
    database: str

@abstractmethod
    def get_collection(
        self,
        name: str,  # 集合的名称
        embedding_function: Optional[
            EmbeddingFunction[Embeddable]
        ] = ef.DefaultEmbeddingFunction(),  # 嵌入函数,可选,用于将文档嵌入向量空间,默认为默认嵌入函数
        data_loader: Optional[DataLoader[Loadable]] = None,  # 数据加载器,可选,用于加载记录(文档、图像等)
    ) -> Collection:
        """获取具有给定名称的集合。
        
        参数:
            name: 要获取的集合的名称
            embedding_function: 可选的嵌入函数,用于将文档嵌入向量空间。
                                如果未提供,则使用默认的嵌入函数。
            data_loader: 可选的数据加载器函数,用于加载记录(文档、图像等)。

        返回:
            Collection: 请求的集合

        引发:
            ValueError: 如果集合不存在

        示例:
            ```python
            client.get_collection("my_collection")
            # 返回一个集合,名称为"my_collection",元数据为空
            ```
        """
        pass

③ 向 向量数据库表 中 插入文本向量


将 文本向量 插入到 数据库表中 ;

class Collection(CollectionCommon["ServerAPI"]):
def add(
        self,
        ids: OneOrMany[ID],  # 要添加的嵌入的ID
        embeddings: Optional[
            Union[
                OneOrMany[Embedding],
                OneOrMany[PyEmbedding],
            ]
        ] = None,  # 要添加的嵌入向量,可选。如果为None,将根据集合中设置的嵌入函数基于文档或图像计算嵌入。
        metadatas: Optional[OneOrMany[Metadata]] = None,  # 与嵌入相关联的元数据,可选。在查询时,可以根据此元数据进行过滤。
        documents: Optional[OneOrMany[Document]] = None,  # 与嵌入相关联的文档,可选。
        images: Optional[OneOrMany[Image]] = None,  # 与嵌入相关联的图像,可选。
        uris: Optional[OneOrMany[URI]] = None,  # 与嵌入相关联的图像的URI,可选。
    ) -> None:
        """将嵌入添加到数据存储中。
        
        参数:
            ids: 您希望添加的嵌入的ID
            embeddings: 要添加的嵌入向量。如果为None,则将根据集合中设置的嵌入函数基于文档或图像计算嵌入。可选。
            metadatas: 与嵌入相关联的元数据。在查询时,您可以根据此元数据进行过滤。可选。
            documents: 与嵌入相关联的文档。可选。
            images: 与嵌入相关联的图像。可选。
            uris: 与嵌入相关联的图像的URI。可选。

        返回:
            None

        引发:
            ValueError: 如果您既没有提供嵌入也没有提供文档
            ValueError: 如果ids、embeddings、metadatas或documents的长度不匹配
            ValueError: 如果您没有提供嵌入函数且没有提供嵌入
            ValueError: 如果您同时提供了嵌入和文档
            ValueError: 如果您提供了一个已经存在的ID
        """

        # 验证并准备添加请求
        add_request = self._validate_and_prepare_add_request(
            ids=ids,
            embeddings=embeddings,
            metadatas=metadatas,
            documents=documents,
            images=images,
            uris=uris,
        )

        # 调用客户端的添加方法
        self._client._add(
            collection_id=self.id,  # 集合ID
            ids=add_request["ids"],  # 添加请求中的ID
            embeddings=add_request["embeddings"],  # 添加请求中的嵌入
            metadatas=add_request["metadatas"],  # 添加请求中的元数据
            documents=add_request["documents"],  # 添加请求中的文档
            uris=add_request["uris"],  # 添加请求中的URI
            tenant=self.tenant,  # 租户信息
            database=self.database,  # 数据库信息
        )

④ 从 向量数据库表 中查询 相似数据


通过调用 Collection#query 函数 , 可以从 向量数据库表 中查询 相似数据 , 可设置查询指定个数的相似结果 ;

class Collection(CollectionCommon["ServerAPI"]):
def query(
        self,
        query_embeddings: Optional[
            Union[
                OneOrMany[Embedding],
                OneOrMany[PyEmbedding],
            ]
        ] = None,  # 要查询的嵌入向量,可选
        query_texts: Optional[OneOrMany[Document]] = None,  # 要查询的文档文本,可选
        query_images: Optional[OneOrMany[Image]] = None,  # 要查询的图像,可选
        query_uris: Optional[OneOrMany[URI]] = None,  # 用于数据加载器的URI,可选
        n_results: int = 10,  # 每个查询嵌入或文本要返回的邻居数量,可选,默认为10
        where: Optional[Where] = None,  # 用于过滤结果的Where类型字典,例如:`{"$and": [{"color" : "red"}, {"price": {"$gte": 4.20}}]}`,可选
        where_document: Optional[WhereDocument] = None,  # 用于通过文档过滤的WhereDocument类型字典,例如:`{$contains: {"text": "hello"}}`,可选
        include: Include = [
            IncludeEnum.metadatas,
            IncludeEnum.documents,
            IncludeEnum.distances,
        ],  # 要包含在结果中的内容列表,可以包含`"embeddings"`、`"metadatas"`、`"documents"`、`"distances"`。ID始终包括在内。默认为`["metadatas", "documents", "distances"]`,可选
    ) -> QueryResult:
        """获取提供的query_embeddings或query_texts的n_results个最近邻嵌入。

        参数:
            query_embeddings: 要获取最近邻的嵌入向量,可选。
            query_texts: 要获取最近邻的文档文本,可选。
            query_images: 要获取最近邻的图像,可选。
            query_uris: 用于数据加载器的URI,可选。
            n_results: 每个查询嵌入或文本要返回的邻居数量,可选,默认为10。
            where: 用于过滤结果的Where类型字典,例如:`{"$and": [{"color" : "red"}, {"price": {"$gte": 4.20}}]}`,可选。
            where_document: 用于通过文档过滤的WhereDocument类型字典,例如:`{$contains: {"text": "hello"}}`,可选。
            include: 要包含在结果中的内容列表,可以包含`"embeddings"`、`"metadatas"`、`"documents"`、`"distances"`。ID始终包括在内。默认为`["metadatas", "documents", "distances"]`,可选。

        返回:
            QueryResult: 包含结果的QueryResult对象。

        引发:
            ValueError: 如果您既没有提供query_embeddings,也没有提供query_texts,也没有提供query_images
            ValueError: 如果您同时提供了query_embeddings和query_texts
            ValueError: 如果您同时提供了query_embeddings和query_images
            ValueError: 如果您同时提供了query_texts和query_images
        """

        # 验证并准备查询请求
        query_request = self._validate_and_prepare_query_request(
            query_embeddings=query_embeddings,
            query_texts=query_texts,
            query_images=query_images,
            query_uris=query_uris,
            n_results=n_results,
            where=where,
            where_document=where_document,
            include=include,
        )

        # 调用客户端的查询方法
        query_results = self._client._query(
            collection_id=self.id,  # 集合ID
            query_embeddings=query_request["embeddings"],  # 查询请求中的嵌入
            n_results=query_request["n_results"],  # 查询请求中的邻居数量
            where=query_request["where"],  # 查询请求中的过滤条件
            where_document=query_request["where_document"],  # 查询请求中的文档过滤条件
            include=query_request["include"],  # 查询请求中要包含的内容
            tenant=self.tenant,  # 租户信息
            database=self.database,  # 数据库信息
        )

        # 转换查询响应
        return self._transform_query_response(
            response=query_results, include=query_request["include"]
        )

3、完整代码示例


下面的代码是 在 博客 【AI 大模型】RAG 检索增强生成 ④ ( 向量相似度计算 | 余弦距离 | 欧式距离 | OpenAI 文本向量模型 | 手动实现的 余弦相似度 和 欧氏距离 函数计算 ) 的 代码基础上 , 将 若干文本 计算出来的 文本向量 存储到 chromadb 向量数据库中 , 然后再从 向量数据库 中查询 相似的文本数据 ;


完整代码示例 :

# 导入所需库
import chromadb  # ChromaDB 向量数据库
from openai import OpenAI  # OpenAI 客户端

# 初始化 OpenAI 客户端 (替换成自己的 API 信息)
client = OpenAI(
    api_key="sk-i3dHqZygi7757aF6",  # 替换为你的 OpenAI API Key , 这里我把自己的 API-KEY 隐藏了
    base_url="https://api.xiaoai.plus/v1"  # 替换为你的 API 端点
)

def get_embeddings(texts, model="text-embedding-ada-002"):
    """使用 OpenAI 的嵌入模型将文本转换为向量"""
    # 调用 OpenAI API 获取嵌入向量
    response = client.embeddings.create(
        input=texts,
        model=model
    )
    # 从响应中提取向量数据
    return [item.embedding for item in response.data]

# 初始化 ChromaDB 客户端 (持久化到本地目录)
chroma_client = chromadb.PersistentClient(path="chroma_db")

# 创建或获取集合 (相当于数据库表)
collection = chroma_client.get_or_create_collection(
    name="news_articles",  # 集合名称
    metadata={"hnsw:space": "cosine"}  # 使用余弦相似度
)

# 原始文本数据
documents = [
    "李彦宏称大模型成本每年降低90%",
    "乌军大批直升机击落多架俄无人机",
    "王力宏回应是否想找新伴侣",
    "饺子不知道观众怎么想出的藕饼cp",
    "加沙停火协议关键时刻生变",
]

# 生成文档向量
document_embeddings = get_embeddings(documents)

# 准备文档 ID (需要唯一标识符)
document_ids = [str(i) for i in range(len(documents))]  # 生成 ["0", "1", ..., "4"]

# 将文档插入数据库
collection.add(
    ids=document_ids,               # 唯一ID列表
    embeddings=document_embeddings, # 文本向量列表
    documents=documents             # 原始文本列表
)

# 查询文本
query_text = "国际争端新闻"

# 生成查询向量
query_embedding = get_embeddings([query_text])[0]

# 执行相似性查询
results = collection.query(
    query_embeddings=[query_embedding],  # 查询向量
    n_results=2                          # 返回前2个最相似结果
)

# 打印查询结果
print("查询内容:", query_text)
print("最相似结果:")
for doc, score in zip(results['documents'][0], results['distances'][0]):
    print(f"相似度 {score:.4f}: {doc}")

执行结果 :

查询内容: 国际争端新闻
最相似结果:
相似度 0.1806: 加沙停火协议关键时刻生变
相似度 0.1922: 乌军大批直升机击落多架俄无人机

在这里插入图片描述

下图是在本地生成 的 向量数据库 文件内容 ;

在这里插入图片描述

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

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

相关文章

解决single cell portal点击下载但跳转的是网页

Single cell RNA-seq of Tmem100-lineage cells in a mouse model of osseointegration - Single Cell Portal 想下载个小鼠数据集&#xff1a; 点击下载跳转为网页&#xff1a; 复制bulk download给的链接无法下载 bulk download给的原链接&#xff1a; curl.exe "http…

基于 Prometheus + Grafana 监控微服务和数据库

以下是基于 Prometheus Grafana 监控微服务和数据库的详细指南&#xff0c;包含架构设计、安装配置及验证步骤&#xff1a; 一、整体架构设计 二、监控微服务 1. 微服务指标暴露 Spring Boot 应用&#xff1a; xml <!-- 添加 Micrometer 依赖 --> <dependency>…

CAN总线的CC帧和FD帧之间如何仲裁

为满足CAN总线日益提高的带宽需求&#xff0c;博世公司于2012年推出CAN FD&#xff08;具有灵活数据速率的CAN&#xff09;标准&#xff0c;国际标准化组织&#xff08;ISO&#xff09;2015年通过ISO 11898-1:2015标准&#xff0c;正式将CAN FD纳入国际标准&#xff0c;以示区别…

SpringBoot 第一课(Ⅲ) 配置类注解

目录 一、PropertySource 二、ImportResource ①SpringConfig &#xff08;Spring框架全注解&#xff09; ②ImportResource注解实现 三、Bean 四、多配置文件 多Profile文件的使用 文件命名约定&#xff1a; 激活Profile&#xff1a; YAML文件支持多文档块&#xff…

Excel(函数篇):COUNTIF与CONUTIFS函数、SUMIF与SUMIFS函数、ROUND函数、MATCH与INDEX函数、混合引用与条件格式

目录 COUNTIF和COUNTIFS函数COUNTIF函数COUNTIFS函数SUMIF和SUMIFS函数SUMIF函数SUMIFS函数SUMIFS函数与控件实现动态年月汇总ROUND、ROUNDUP、ROUNDDOWN函数单元格混合引用条件格式与公式,标记整行数据MATCH和INDEX函数COUNTIF和COUNTIFS函数 COUNTIF函数 统计下“苏州”出现…

虚拟定位 1.2.0.2 | 虚拟定位,上班打卡,校园跑步模拟

Fake Location是一款运行于安卓平台上的功能强大、简单实用的虚拟定位软件。它能够帮助用户自定义位置到地图上的任意地方&#xff0c;以ROOT环境运行不易被检测&#xff0c;同时也支持免ROOT运行。提供路线模拟、步频模拟、WIFI模拟等方式&#xff0c;支持反检测。 大小&…

【最大异或和——可持久化Trie】

题目 代码 #include <bits/stdc.h> using namespace std;const int N 6e510; //注意这里起始有3e5&#xff0c;又可能插入3e5 const int M N * 25;int rt[N], tr[M][2]; //根&#xff0c;trie int idx, cnt, br[M]; //根分配器&#xff0c;点分配器&#xff0c;点的相…

C# WPF编程-启动新窗口

C# WPF编程-启动新窗口 新建窗口&#xff1a; 工程》添加》窗口 命名并添加新的窗口 这里窗口名称为Window1.xaml 启动新窗口 Window1 win1 new Window1(); win1.Show(); // 非模态启动窗口win1.ShowDialog(); // 模态启动窗口 模态窗口&#xff1a;当一个模态窗口被打开时&a…

Python 实现大文件的高并发下载

项目背景 基于一个 scrapy-redis 搭建的分布式系统&#xff0c;所有item都通过重写 pipeline 存储到 redis 的 list 中。这里我通过代码演示如何基于线程池 协程实现对 item 的中文件下载。 Item 结构 目的是为了下载 item 中 attachments 保存的附件内容。 {"crawl_tim…

【最新】 ubuntu24安装 1panel 保姆级教程

系统&#xff1a;ubuntu24.04.1 安装软件 &#xff1a;1panel 第一步&#xff1a;更新系统 sudo apt update sudo apt upgrade 如下图 第二步&#xff1a;安装1panel&#xff0c;运行如下命令 curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o …

c++图论(二)之图的存储图解

在 C 中实现图的存储时&#xff0c;常用的方法包括 邻接矩阵&#xff08;Adjacency Matrix&#xff09;、邻接表&#xff08;Adjacency List&#xff09; 和 边列表&#xff08;Edge List&#xff09;。以下是具体实现方法、优缺点分析及代码示例&#xff1a; 1. 邻接矩阵&…

c++图论(一)之图论的起源和图的概念

C 图论之图论的起源和图的概念 图论&#xff08;Graph Theory&#xff09;是数学和计算机科学中的一个重要分支&#xff0c;其起源可以追溯到 18 世纪 的经典问题。以下是图论的历史背景、核心起源问题及其与基本概念和用途&#xff1a; 借用一下CSDN的图片哈 一、图论的起源&…

ChatGPT and Claude国内使用站点

RawChat kelaode chatgptplus chatopens&#xff08;4.o mini免费&#xff0c;plus收费&#xff09; 网页&#xff1a; 定价&#xff1a; wildcard 网页&#xff1a; 虚拟卡定价&#xff1a; 2233.ai 网页&#xff1a; 定价&#xff1a; MaynorAPI chatgpt cla…

进行性核上性麻痹:精心护理,点亮希望之光

进行性核上性麻痹是一种罕见的神经退行性疾病&#xff0c;严重影响患者的生活质量。有效的健康护理能够在一定程度上缓解症状、延缓病情发展&#xff0c;给患者带来更好的生活体验。 在日常生活护理方面&#xff0c;由于患者平衡能力逐渐下降&#xff0c;行动不便&#xff0c;居…

ZED X系列双目3D相机的耐用性与创新设计解析

在工业自动化和学术研究领域&#xff0c;高精度的视觉设备正成为提升效率和质量的关键。ZED X系列AI立体相机&#xff0c;凭借其先进的技术和耐用的设计&#xff0c;为这一领域带来了新的可能。 核心技术&#xff1a;深度感知与精准追踪 ZED X系列的核心技术之一是Neural Dept…

HarmonyOS三层架构实战

目录&#xff1a; 1、三层架构项目结构1.0、三层架构简介1.1、 common层&#xff08;主要放一些公共的资源等&#xff09;1.2、 features层&#xff08;主要模块定义的组件以及图片等静态资源&#xff09;1.3、 products层&#xff08;主要放主页面层和一些主要的资源&#xff…

计算机四级 - 数据库原理 - 第4章 「关系数据库标准语言SQL」

4.1 SQL概述 4.1.1 结构化查询语言SQL SQL(Structured Query Language)称为结构化查询语言&#xff0c;它是由1974年由Boyce和Chamberi提出的&#xff0c;1975年至1979年IBM公司的San Jose Research Laboratory研制了关系数据库管理系统的原型系统System R,并实现了这种语198…

基于PMU的14节点、30节点电力系统状态估计MATLAB程序

“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 程序简介&#xff1a; 程序采用三种方法对14节点和30节点电力系统状态进行评估&#xff1a; ①PMU同步向量测量单元结合加权最小二乘法&#xff08;WLS&#xff09;分析电力系统的电压幅值和相角状态&#xff1b; …

Deepseek API+Python测试用例一键生成与导出-V1.0.2【实现需求文档图片识别与用例生成自动化】

在测试工作中&#xff0c;需求文档中的图片&#xff08;如界面设计图、流程图&#xff09;往往是测试用例生成的重要参考。然而&#xff0c;手动提取图片并识别内容不仅耗时&#xff0c;还容易出错。本文将通过一个自研小工具&#xff0c;结合 PaddleOCR 和大模型&#xff0c;自…

整形在内存中的存储(例题逐个解析)

目录 一.相关知识点 1.截断&#xff1a; 2.整形提升&#xff1a; 3.如何 截断&#xff0c;整型提升&#xff1f; &#xff08;1&#xff09;负数 &#xff08;2&#xff09;正数 &#xff08;3&#xff09;无符号整型&#xff0c;高位补0 注意&#xff1a;提升后得到的…