《Learning Langchain》阅读笔记8-RAG(4)在vector store中存储embbdings
什么是 vector store?
与专门用于存储结构化数据(如 JSON 文档或符合关系型数据库模式的数据)的传统数据库不同,vector stores处理的是非结构化数据,包括文本和图像。像传统数据库一样,vector stores也能执行创建、读取、更新、删除(CRUD)以及搜索操作。
Vector stores解锁了各种各样的用例,包括可扩展的应用程序,这些应用程序利用AI来回答有关大型文档的问题,如图2-4所示。
目前,有大量的向量存储提供商可供选择,每一家都擅长不同的功能。你应根据应用程序的关键需求来进行选择,这些需求包括多租户支持、元数据筛选能力、性能、成本以及可扩展性。
尽管 vector store是专门用于管理向量数据的细分数据库,但使用它们仍存在一些缺点:
-
大多数 vector store相对较新,可能无法经受时间的考验。
-
管理和优化 vector store可能存在相对陡峭的学习曲线。
-
管理一个独立的数据库会增加应用程序的复杂性,并可能消耗宝贵的资源。
幸运的是,向量存储的能力最近已经通过 pgvector 扩展,被扩展到 PostgreSQL(一个流行的开源关系型数据库)。这使你可以使用已经熟悉的同一个数据库,来同时支持事务表(例如用户表)和向量搜索表。
使用 PGVector
要使用 Postgres 和 PGVector,你需要按照以下步骤进行设置:
-
确保在您的计算机上安装了 Docker
-
在终端中运行以下命令; 它将在您的计算机上启动一个在端口 6024 运行的 Postgres 实例:
docker run \ --name pgvector-container \ -e POSTGRES_USER=langchain \ -e POSTGRES_PASSWORD=langchain \ -e POSTGRES_DB=langchain \ -p 6024:5432 \ -d pgvector/pgvector:pg16
-
打开您的 Docker 仪表板容器,您应该在 pgvector-container 旁边看到一个绿色的运行状态。
-
将连接字符串保存到代码中以供以后使用;我们以后需要使用它:
postgresql+psycopg://langchain:langchain@localhost:6024/langchain
如果你是刚开始接触向量数据库或 LangChain,强烈建议先用 Docker,后期再考虑更复杂的本地部署或云服务集成(如 AWS RDS + pgvector)。Docker 是一个“容器”工具,它可以把应用程序和它运行所需要的一切(比如操作系统、依赖、库等)打包在一个“箱子”里运行。
假设你要运行一个 PostgreSQL + PGVector 的数据库,你需要:
-
安装 PostgreSQL
-
配置好数据库用户和端口
-
安装 pgvector 插件
-
保证版本兼容
这些都很麻烦,对吧?
但用了 Docker,只需要一条命令,它就帮你:
-
自动下载带 pgvector 的 PostgreSQL
-
自动配置好用户密码端口
-
独立运行在它自己的“容器”里,不影响你电脑上其他软件
现在我们从第一步安装Docker开始,
1. 安装 Docker
去官网下载并安装:Docker官网
2. 运行 Docker 容器
```bash
docker run \
--name pgvector-container \
-e POSTGRES_USER=langchain \
-e POSTGRES_PASSWORD=langchain \
-e POSTGRES_DB=langchain \
-p 6024:5432 \
-d pgvector/pgvector:pg16
```
这会创建一个名为 pgvector-container 的容器,在本地的 6024 端口 启动 PostgreSQL 数据库,数据库名和账户密码均为 langchain。
3. 确认数据库是否运行正常
打开 Docker 桌面,确认容器 pgvector-container 显示为绿色状态(Running)。
4. LangChain 中连接 pgvector
确保你已经安装了必要的包:
pip install langchain psycopg2-binary sqlalchemy
上面的步骤全都配置结束,大约花费50分钟。
现在我们来在langchain中连接pgvector
记得首先pip install langchain-postgres
from langchain_community.document_loaders import TextLoader
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_postgres.vectorstores import PGVector
from langchain_core.documents import Document
import uuid# Load the document, split it into chunks
loader = TextLoader("./test.txt", encoding="utf-8")
raw_documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
documents = text_splitter.split_documents(raw_documents)# embed each chunk and insert it into the vector store
model_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}embeddings_model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)connection = 'postgresql+psycopg://langchain:langchain@localhost:6024/langchain'db = PGVector.from_documents(documents, embeddings_model, connection=connection)
报错:ModuleNotFoundError: No module named ‘psycopg’
你这个错误信息非常明确,是因为 psycopg 无法正确加载 libpq 库(PostgreSQL 的底层通信库),所以在导入 PGVector 时报错。
你使用的是新版的 psycopg(也叫 psycopg3),它和旧版 psycopg2 不一样,需要本地系统有 PostgreSQL 的 C 库支持(libpq)。
改写为以下用法:
-
确保你安装了官方 vectorstore 依赖
pip install langchain psycopg2-binary sqlalchemy
-
修改你的 import 语句
换成官方推荐的 PGVector 接入方式:
from langchain.vectorstores.pgvector import PGVector
from langchain_community.document_loaders import TextLoader
from langchain_huggingface import HuggingFaceEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.vectorstores.pgvector import PGVector
from langchain_core.documents import Document
import uuid# Load the document, split it into chunks
loader = TextLoader("./test.txt", encoding="utf-8")
raw_documents = loader.load()text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
documents = text_splitter.split_documents(raw_documents)# embed each chunk and insert it into the vector store
model_name = "sentence-transformers/all-mpnet-base-v2"
model_kwargs = {'device': 'cpu'}
encode_kwargs = {'normalize_embeddings': False}embeddings_model = HuggingFaceEmbeddings(model_name=model_name,model_kwargs=model_kwargs,encode_kwargs=encode_kwargs
)connection = 'postgresql+psycopg2://langchain:langchain@localhost:6024/langchain'db = PGVector.from_documents(documents=documents,embedding=embeddings_model,connection_string=connection, # ✅ 这里改成 connection_stringcollection_name="my_collection", # 可选,但推荐加
)
这个查询会在你之前加载的文档中,返回与“为什么会有“上下文窗口”(context window)”这个问题最相似的段落,如果它能正常返回结果,就说明数据确实已经存入 pgvector 并可用啦。
# 查询一下看看有没有数据,k表示打印几条结果
results = db.similarity_search("为什么会有“上下文窗口”(context window)", k=2)for i, doc in enumerate(results, 1):print(f"【第{i}条结果】", doc.page_content)
【第1条结果】 > [!NOTE] **为什么会有“上下文窗口”(context window)这个限制?**
>
>1. 资源限制:计算成本高> 每次你和大语言模型对话,它其实是在处理一个非常复杂的数学计算过程,背后是巨大的矩阵运算。 > 输入越长,占用的 显存(GPU memory) 和 计算时间 就越多。
>输入+输出的长度太长,会让显卡扛不住,或者处理速度变得非常慢。
>所以模型必须设置一个“上限”——这就是 context window,也叫“上下文窗口”。>
>
>2. 模型设计:Transformer 架构的限制> 大语言模型(如 GPT)基于 Transformer 架构。> Transformer 是靠“注意力机制”处理每一个 token 的。> 每加一个 token,就要考虑它和之前所有 token 的关系,所以计算量是平方级别增长的(O(n²))。> 这意味着:> 上下文越长,注意力机制越慢,成本越高,效果也可能下降。
>3. 训练方式决定了这个限制> 模型训练时,是在固定长度的上下文窗口中学习的,比如 2048、4096 或 8192 个 token。> 如果你测试时突然给它一个比训练时长得多的输入,模型可能根本不知道怎么处理。> 所以训练时设置了窗口,使用时就要遵守这个规则。
>
> ---------------------
>一个简单类比:
>
>想象你在读一本书,但你只能记住最近的一页内容(上下文窗口),太久以前的内容就记不清了。
>
>模型也是这样,它记得的“最近内容”数量是有限的。
【第2条结果】 > [!NOTE] **为什么会有“上下文窗口”(context window)这个限制?**
>
>1. 资源限制:计算成本高> 每次你和大语言模型对话,它其实是在处理一个非常复杂的数学计算过程,背后是巨大的矩阵运算。 > 输入越长,占用的 显存(GPU memory) 和 计算时间 就越多。
>输入+输出的长度太长,会让显卡扛不住,或者处理速度变得非常慢。
>所以模型必须设置一个“上限”——这就是 context window,也叫“上下文窗口”。>
>
>2. 模型设计:Transformer 架构的限制> 大语言模型(如 GPT)基于 Transformer 架构。> Transformer 是靠“注意力机制”处理每一个 token 的。> 每加一个 token,就要考虑它和之前所有 token 的关系,所以计算量是平方级别增长的(O(n²))。> 这意味着:> 上下文越长,注意力机制越慢,成本越高,效果也可能下降。
>3. 训练方式决定了这个限制> 模型训练时,是在固定长度的上下文窗口中学习的,比如 2048、4096 或 8192 个 token。> 如果你测试时突然给它一个比训练时长得多的输入,模型可能根本不知道怎么处理。> 所以训练时设置了窗口,使用时就要遵守这个规则。
>
> ---------------------
>一个简单类比:
>
>想象你在读一本书,但你只能记住最近的一页内容(上下文窗口),太久以前的内容就记不清了。
>
>模型也是这样,它记得的“最近内容”数量是有限的。
db.similarity_search() 这个方法将通过以下过程找到最相关的文档(之前已对其进行索引):
-
搜索查询(在这种情况下是一个词或短语)将被发送到嵌入模型以生成其向量表示。
-
接着,系统会在 Postgres 数据库中运行查询,找出与该向量最相似的 N 个已存储的嵌入(本例中为2个)。
-
最后,它会提取每个相似嵌入所对应的原始文本内容和元数据。
-
模型将返回一个文档列表,并按照它们与查询向量的相似度高低进行排序——最相似的排在前面,依此类推。
[!NOTE] 如何找出与该向量最相似的 N 个已存储的嵌入?
你现在已经进入了「向量数据库的核心机制」——**相似度搜索(vector similarity search)**的本质。
简要回答:是通过 向量之间的相似度计算公式 + pgvector 插件中的索引与比较操作符 实现的。
步骤拆解如下:
① 查询向量的生成(embedding)
你输入一段查询(query,比如“向量数据库的作用是什么?”),LangChain 会:
query_embedding = embeddings_model.embed_query("向量数据库的作用是什么?")
这个 query_embedding 是一个 高维向量数组,比如:
[0.123, -0.341, ..., 0.442] # 维度可能是 384、768、1024...
② 和数据库中所有嵌入进行相似度对比
PostgreSQL + pgvector 使用 SQL 语句执行相似度计算,例如:
SELECT *, embedding <#> '[0.123, 0.341, ..., 0.442]' FROM langchain_pg_embedding_my_collection ORDER BY embedding <#> '[...]' LIMIT 2;
<#>
是 pgvector 提供的 “余弦距离”操作符。值越小,表示越相似。相似度通常用 余弦相似度(cosine) 或 欧氏距离(L2)
③ 查找最相似的 Top-N 条
执行 SQL 时用 ORDER BY + LIMIT N,就能找出最相似的 N 条记录。
可视化向量数据库中的数据:使用pgAdmin
假如我们想可视化向量数据库中的数据,可以下载单独的可视化软件,比如:
-
pgAdmin
-
dbeaver
这里我选择第一个免费开源软件的windows版。
下载安装好后,连接到server。
随后我想要查看一下向量数据库存储的是什么数据,接下来手把手带你操作如何查看:
方法一:图形化方式(适合浏览数据)
步骤:
1.左侧树状结构中,点击展开:
-
langchain → Databases → langchain
-
然后继续展开:Schemas → public → Tables
2.找到你插入文档时自动创建的表,名称通常是类似于你设定的 collection_name,例如:
langchain_pg_embedding
3.右键点击这个表 → 选择 View/Edit Data → All Rows
然后你就可以看到你之前插入的向量、文本内容、metadata 等字段了!
一共有16条数据:
方法二:用 SQL 查询(适合精准操作)
步骤:
在 pgAdmin 顶部点击:🧾 SQL(或按快捷键 F5快速执行)
输入并执行下面这句 SQL:
SELECT * FROM langchain_pg_embedding LIMIT 10;
可以看到已经显示前10条记录了。
接下来介绍几条常用的SQL语句(以表名langchain_pg_embedding为例):
1.查询(Read)
-- 查询所有数据
SELECT * FROM langchain_pg_embedding;-- 查询包含关键词 “向量” 的记录(全文内容)
SELECT * FROM langchain_pg_embedding
WHERE document LIKE '%向量%';-- 查询某个 ID 的向量内容
SELECT * FROM langchain_pg_embedding
WHERE id = 'your-vector-id';
- 插入(Insert)
一般不建议手写插入向量(除非你很熟),但可以这样手动插入一个文档:
INSERT INTO langchain_pg_embedding (document, metadata, embedding)
VALUES ('这是一段测试文本','{"source": "manual"}','[0.1, 0.2, 0.3, ...]' -- 注意这里向量必须是 float[],长度必须匹配模型维度
);
- 删除(Delete)
-- 根据 ID 删除
DELETE FROM langchain_pg_embedding
WHERE id = 'your-vector-id';-- 删除所有数据(⚠️危险操作)
DELETE FROM langchain_pg_embedding;
- 修改(Update)
-- 修改 metadata
UPDATE langchain_pg_embedding
SET metadata = '{"source": "updated"}'
WHERE id = 'your-vector-id';-- 修改文档内容
UPDATE langchain_pg_embedding
SET document = '这是新的文档内容'
WHERE id = 'your-vector-id';
我们的数据库中有这些字段名:
还可以使用langchain语句向现有数据库添加更多文档。在这个例子中,我们使用可选的 ids 参数为每个文档分配标识符,这使我们可以在以后更新或删除它们。
让我们看这个例子:
# 生成两个唯一的 UUID 作为向量的主键(id)
# ids 是可选的,如果你不传,LangChain 会自动生成 UUID
# 但传 ids 的好处是后面可以用:db.delete(ids=["your-id"]) # 删除指定向量
# 这样你能精确管理向量库中的内容
ids = [str(uuid.uuid4()), str(uuid.uuid4())]# 将新的文本片段(两个句子)嵌入,并插入到你已经连接的 pgvector 数据表中
db.add_documents([Document(page_content="there are cats in the pond",metadata={"location": "pond", "topic": "animals"},),Document(page_content="ducks are also found in the pond",metadata={"location": "pond", "topic": "animals"},),],ids=ids,
)
['0cdf295d-5e3c-4757-bc8c-457c05927eb7','a7a67123-a7bf-4b16-990b-56d430a78f67']
我们的table中的embedding数量从16增加到了18。
我们在这里使用的db.add_documents() 方法将遵循与PGVector.from_documents() 类似的过程:
- 为传递的每个文档创建嵌入,使用选择的模型。
- 将嵌入、文档元数据和文档文本内容存储在 Postgres 中,以便进行搜索。
删除操作的例子:
db.delete(ids=['0cdf295d-5e3c-4757-bc8c-457c05927eb7'])
db.delete(ids=['a7a67123-a7bf-4b16-990b-56d430a78f67'])
这样就从向量数据库中删除指定 ID 的嵌入向量记录,就是我们刚刚插入的那两条。
总结
本小节我们学习了如何在vector store中存储embeddings,并且使用了PostgreSQL数据库。
通过docker连接数据库,还通过插件PGVector这个为 PostgreSQL 数据库设计的向量(embedding)存储与相似度搜索插件,使得你可以在 PostgreSQL 中直接存储向量,并进行高效的相似度检索(vector similarity search)。
最后还使用了免费的可视化PostgreSQL数据库的软件pgAdmin对数据库的tables中的数据进行查看。
收获满满的一章。感谢阅读!下一节我们来讲讲如何跟踪文档的更改。
相关文章:
《Learning Langchain》阅读笔记8-RAG(4)在vector store中存储embbdings
什么是 vector store? 与专门用于存储结构化数据(如 JSON 文档或符合关系型数据库模式的数据)的传统数据库不同,vector stores处理的是非结构化数据,包括文本和图像。像传统数据库一样,vector stores也能执…...
【C/C++】深入理解指针(五)
文章目录 深入理解指针(五)1.回调函数是什么?2.qsort使用举例2.1 使用qsort函数排序整型数据强调 2.2 使用qsort排序结构数据 3.qsort函数的模拟实现 深入理解指针(五) 1.回调函数是什么? 回调函数就是⼀个通过函数指针调⽤的函数。 如果你把函数的指…...
【vue】【element-plus】 el-date-picker使用cell-class-name进行标记,type=year不生效解决方法
typedete,自定义cell-class-name打标记效果如下: 相关代码: <el-date-pickerv-model"date":clearable"false":editable"false":cell-class-name"cellClassName"type"date"format&quo…...
RocketMQ 主题与队列的协同作用解析(既然队列存储在不同的集群中,那要主题有什么用呢?)---管理命令、配置安装
学习之前呢需要会使用linux的基础命令 一.RocketMQ 主题与队列的协同作用解析 在 RocketMQ 中,主题(Topic)与队列(Queue)的协同设计实现了消息系统的逻辑抽象与物理存储分离。虽然队列实际存储在不同集群的 B…...
解决视频处理中的 HEVC 解码错误:Could not find ref with POC xxx【已解决】
问题描述 今天在使用 Python 处理视频时遇到了以下错误: [hevc 0x7f8a1d02b7c0] Could not find ref with POC 33之前没接触过视频处理,查了一下,这个错误通常发生在处理 HEVC(H.265)编码 的视频时,原因…...
NEGATIVE LABEL GUIDED OOD DETECTION WITH PRETRAINED VISION-LANGUAGE MODELS
1. 介绍: 这篇论文也是基于CLIP通过后处理的方法实现的OOD的检测,但是设计点在于,之前的方法是使用的ID的类别,这篇工作是通过添加一些在语义上非常不同于ID的类别的外分布类来做的OOD检测。 CLIP做OOD检测的这个系列里面我看的以及记录的第一篇就是MCM的方法,这也是确实是…...
Appium自动化 -- 环境安装
1.安装Appium-Python-Clientpip install Appium-Python-Client 2.AndroidSdk安装和环境配置 AndroidSdk下载地址:https://www.androiddevtools.cn/# 下载后解压 SDK Manager.exe 安装sdk tools、sdk plaform-tools、sdk build-tools AndroidSDK 环境变量配…...
Zeppelin在spark环境导出dataframe
1.Zeppelin无法直接访问本地路径 如果zeppelin无法直接访问本地路径,可先将dataframe写到s3,在通过读取s3路径下载文件 %pyspark # 示例:用 PySpark 处理数据 df spark.createDataFrame([(1, "Alice"), (2, "Bob")], …...
Vue3 上传后的文件智能预览(实战体会)
目录 前言1. Demo12. Demo2 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 爬虫神器,无代码爬取,就来:bright.cn 此处的基本知识涉及较少,主要以Demo的形式供大…...
面试常问问题:Java基础篇
一、面向对象编程(OOP) 四大特性 封装、继承、多态、抽象的具体实现与区别? 抽象类与接口的区别?何时选择抽象类或接口? 重写(Override)和重载(Overload)的规则与区别&…...
测试流程?
需求分析 组织需求评审会议,邀请开发团队和测试团队参与。产品经理详细讲解需求,确保开发和测试人员对需求理解一致。 测试计划 分配测试人员:根据项目需求和测试人员的技能,分配测试任务和范围。确定测试策略:包括测…...
Python命名参数的使用
Python脚本传递参数的方式有: 使用sys.argv按照先后的顺序传入对应的参数使用argparse包加载和解析传递的命名参数 下面代码是第2中使用的实例: parser argparse.ArgumentParser(description参数使用说明) parser.add_argument(--time, -t, typestr,…...
赛灵思 XCKU115-2FLVB2104I Xilinx Kintex UltraScale FPGA
XCKU115-2FLVB2104I 是 AMD Xilinx Kintex UltraScale FPGA,基于 20 nm 先进工艺,提供高达 1 451 100 个逻辑单元(Logic Cells),77 721 600 bit 的片上 RAM 资源,以及 5 520 个 DSP 切片(DSP48E…...
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
文章目录 下载Traeuv 工具教程参考我的这篇文章创建 uv 项目main.pyCherry Studio 添加 MCP 服务DeepSeek API配置 DeepSeek API调用 MCP 服务 Trae 添加 MCP 服务添加 MCP创建智能体 使用智能体调用 MCP 创建 demo 表查询 demo 表结构信息demo 表插入 2 条测试数据查询 demo 表…...
Docker容器持久化
引言 Docker 容器作为一种轻量级、可移植的虚拟化技术,广泛应用于开发、测试和生产环境中。然而,容器天生是短暂的,意味着它们在生命周期结束后会被销毁,而其中的数据也会随之丢失。为了确保容器中的数据能够持久化,我…...
【信息系统项目管理师】高分论文:论成本管理与采购管理(信用管理系统)
更多内容请见: 备考信息系统项目管理师-专栏介绍和目录 文章目录 论文1、规划成本管理2、成本估算3、成本预算4、成本控制论文 2019年1月,我作为项目经理参与了 XX基金管理有限公司信用管理系统项目。该项目成 本1000万,建设期为1年。通过该项目,XX基金管理有限公司在信用…...
WINDOWS 下Maven 安装及配置教程
Maven 安装及配置教程(Windows)【安装】_windows 安装maven-CSDN博客...
Pycharm(十六)面向对象进阶
一、继承 概述: 实际开发中,我们发现很多类中的步分内容是相似的,或者相同的,每次写很麻烦,针对这种情况, 我们可以把这些相似(相同的)部分抽取出来,单独地放到1个类中&…...
实时数据驱动未来:谷云科技CDC实时数据集成平台新版本发布
数据流动的“零延迟时代”已来 在数字化转型的浪潮中,数据已成为企业核心资产,而数据的实时流动能力正成为业务竞争力的关键。谷云科技深耕数据集成领域多年,基于对行业痛点的深刻洞察,正式推出CDC实时数据集成平台****全新版本。…...
来自 3D 世界的 JPEG。什么是 glTF?什么是 glb?
定义和简史 GLTF(GL 传输格式)是一种用于存储 3D 场景和模型的文件格式,它非常易于理解(结构是用 JSON 标准编写的),可扩展并易于与现代 Web 技术交互。这种格式可以很好地压缩 3D 场景,并最大限…...
同一页面下动态加载内容的两种方式:AJAX与iframe
iframe iframe能够嵌入另一个 HTML 文档到当前页面。 iframe可以加载任何类型的内容,包括完整的HTML页面。 AJAX 使用 JavaScript 发起 HTTP 请求,通常通过 XMLHttpRequest 或现代浏览器中的 fetch API。 可以异步更新页面内容,而不必刷…...
蓝桥杯 6. 冰雹数
冰雹数 原题目链接 题目描述 任意给定一个正整数 N: 如果是偶数,执行:N / 2;如果是奇数,执行:N 3 1。 生成的新数字继续执行同样的动作,循环往复。 观察发现,这个数字会一会…...
常见网络安全攻击类型深度剖析(三):DDoS攻击——分类、攻击机制及企业级防御策略
常见网络安全攻击类型深度剖析(三):DDoS攻击——分类、攻击机制及企业级防御策略 在网络安全威胁中,分布式拒绝服务攻击(Distributed Denial of Service, DDoS)堪称“网络流量炸弹”。攻击者通过控制成百上…...
AI与思维模型【76】——SWOT思维模型
一、定义 SWOT思维模型是一种用于分析事物内部和外部因素的战略规划工具。其中,S代表优势(Strengths),是指事物自身所具备的独特能力、资源或特点,这些因素有助于其在竞争中取得优势;W代表劣势(…...
安全测试之SQL注入深度解析
引言 在当今数字化的浪潮中,Web 应用程序如同璀璨星辰般闪耀,承载着海量的信息交互与数据处理。然而,网络安全的阴影也如影随形,SQL 注入攻击便是其中极具威胁的一把利刃。它就像一个隐藏在暗处的黑客,一旦找到应用程序的漏洞,便能肆意篡改、窃取甚至破坏数据库中的重要…...
<论文>(谷歌)用于时序链接预测的迁移学习
一、摘要 本文介绍谷歌在2025年4月牵头发表的新论文《Transfer Learning for Temporal Link Prediction》。论文主要探讨了动态图中的时间链路预测(TLP)任务,以及如何让模型在不同图之间进行迁移学习。 译文: 基于图的链接预测应用…...
高效DCDC电源芯片在运动控制器中的应用:设计考量、性能评估与可靠性分析
摘要 随着工业自动化的深入推进,运动控制器作为自动化系统的核心组件,对电源芯片的性能提出了极高要求。高效率DCDC电源芯片凭借其卓越的电能转换效率、优异的负载响应特性和高功率密度,在运动控制器领域得以广泛应用。本文以国科安芯的ASP3…...
AI编程:[体验]从 0 到 1 开发一个项目的初体验
一、开发信息 开发时间:1.5-2天工具使用: 不熟练,开发本项目前1天,才简单使用了Cursor的功能 功能复杂度: 开发的功能相对简单。页面:2个,登录页面,个人中心页面功能:5个…...
重读《人件》Peopleware -(9-1)Ⅱ办公环境Ⅱ“你在这儿从早上9点到下午5点之间什么都做不成.“(上)
在我们经济的各个领域中,有一个广为流传的观点:“加班是生活的一部分。”这意味着工作量永远无法仅靠正常工作时间来完成。对我们来说,这似乎是一个值得怀疑的说法。确实,在软件行业里,加班是一种常见现象,…...
10前端项目----商品详情页/滚轮行为
商品详情页面 商品详情组件发送请求获取相应商品详情信息组件展示数据 优化一下路由配置代码滚轮自动置顶 商品详情组件 路由配置 点击商品进行跳转—将Detail组件变成路由组件 从商品到详情,肯定需要传参(产品ID)告诉Detail是哪个商品,需要展示哪个商品…...
8. 深入Spring AI:自定义Advisor
1、前言 前面大篇幅介绍了关于Spring AI Advisor机制,并介绍了一些常见的内置的advisor。今天我们来自定义有一个Advisor。 2、快速开始 要自定义一个属于自己的Advisor,其实很自定义一个AOP一样简单。只需遵循以下步骤: 创建一个Advisor类,实现CallAroundAdvisor或Stre…...
常见网络安全攻击类型深度剖析(一):恶意软件攻击——病毒、蠕虫、木马的原理与防范
常见网络安全攻击类型深度剖析一:恶意软件攻击——病毒、蠕虫、木马的原理与防范 在网络安全的威胁体系中,恶意软件(Malware)是最古老、最常见的攻击形式之一。从早期的计算机病毒到如今的高级木马程序,恶意软件始终是…...
知识知多少——Matplotlib 库
文章目录 Matplotlib 库详解(新版)一、Matplotlib 核心概念1. 基本架构2. 两种编程接口 二、新版 Matplotlib 安装与配置安装配置中文显示(新版推荐方式) 三、基本绘图示例1. 折线图2. 柱状图(新版样式) 四…...
Linux实验课
一.ln指令使用 ln是link的缩写,在Linux中 ln 命令的功能是为某一个文件在另外一个位置建立一个同步的链接,当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的…...
MQTT学习资源
MQTT入门:强烈推荐...
linux centos7 python3安装
pyhton下载地址 https://www.python.org/downloads/ pycharm下载地址 https://www.jetbrains.com/pycharm/download/?section=mac 安装步骤 下载python3的包之前,要先安装相关的依赖包,用于下载编译python3: yum -y install zlib-devel bzip2-devel openssl-devel nc…...
【EDA】Multi-Net Routing(多网布线)
第六章:Multi-Net Routing(多网布线) 在VLSI物理设计中,多网布线(Multi-Net Routing)的目标是同时为多个网络(Nets)规划路径,避免布线资源冲突(如导线重叠、…...
1块智能电表=12路三相监测!ADW600自由拼装,适配多场景,即插即用,改造周期缩短50%!
在这个电力数字化浪潮汹涌的时代,如何高效、精准地管理电能,成为了众多企业关注的焦点。今天,我们要为大家介绍的,正是一款能够引领电能管理新风尚的产品——ADW600智能电表。 ADW600主模块: ADW600从模块:…...
Redis ⑥-string | hash | list
string类型基本介绍 Redis 中的字符串,是直接按照二进制的方式进行存储的。也就是说,在存取的过程中,是不会做任何编码转换的。存的是啥,取的时候就是啥。 Redis 的这个机制,就使得 Redis 非常适合用来存储各种各样的…...
动态规划(1)(java)(面试题)三步问题
题目: 三步问题。有个小孩正在上楼梯,楼梯有 n 阶台阶,小孩一次可以上 1 阶、2 阶或 3 阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模 1000000007。 示例 1: 输入:n 3 输…...
实时交互式AIGC系统开发:打造多模态数字人全栈解决方案
一、实时AIGC系统技术挑战 1.1 核心性能指标 指标 要求 实现难点 端到端延迟 <500ms 多模块流水线优化 多模态同步误差 <100ms 时间戳对齐机制 并发处理能力 100 QPS 分布式推理架构 生成内容一致性 跨模态对齐 联合embedding空间 1.2 系统架构设计 [语音输入] → [ASR]…...
tcp 和http 网络知识
1. 请简述TCP和HTTP的定义与基本概念 TCP:即传输控制协议(Transmission Control Protocol),是一种面向连接的、可靠的、基于字节流的传输层通信协议。它为互联网中的数据通信提供稳定的传输机制,在不可靠的IP层之上&a…...
伟世通与火山引擎深度合作 前沿AI智能座舱解决方案亮相上海车展
2025年4月24日,上海 —— 全球领先的汽车电子技术供应商伟世通与字节跳动旗下云服务平台火山引擎在2025上海车展联合举办新闻发布会,正式发布基于AI大模型的下一代智能座舱解决方案。该方案深度融合伟世通高性能域控平台与火山引擎豆包大模型的AI能力&am…...
中国250米土壤质地类型数据
土壤质地指土壤中砂粒、粉粒和黏粒的相对含量和组成。根据土壤质地的不同,可以将土壤分为砂土、壤土、黏土等类型。土壤质地对土壤的物理性质(如渗透性、保水性)和化学性质(如养分含量)有重要影响。 本数据集是以250米…...
springboot2.x升级到3.x 惨痛经验总结
一、前言(废话) 升级的缘由 都是因为:Spring 目录遍历漏洞(CVE-2024-38816) 可参考文章:springboot 修复 Spring Framework 特定条件下目录遍历漏洞(CVE-2024-38816) 然后就趁着工…...
【Python】保持Selenium稳定爬取的方法(防检测策略)
selenium 防检测策略的方法汇总: 合理设置延迟:请求间添加随机延迟 (2-10秒) 限制爬取频率:控制每小时/每天的请求量 轮换用户代理:准备至少10个不同的User-Agent 使用住宅代理:优先选择高质量的住宅代理IP 处理验…...
【Linux】进程优先级和进程切换
📝前言: 这篇文章我们来讲讲进程优先级和进程切换: 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记,C语言入…...
基于 Python(selenium) 的今日头条定向爬虫:根据输入的关键词在今日头条上进行搜索,并爬取新闻详情页的内容
该项目能够根据输入的关键词在今日头条上进行搜索,并爬取新闻详情页的内容。 一、项目准备 1. 开发环境配置 操作系统:支持 Windows、macOS、Linux 等主流操作系统,本文以 Windows 为例进行说明。Python 版本:建议使用 Python 3.8 及以上版本,以确保代码的兼容性和性能。…...
AIDL进程间通信
一、项目开启AIDL 在使用AIDL的模块下build.gradle 文件中添加以下代码 android {...buildFeatures {aidl true} }操作完需要rebuild 二、创建aidl服务接口 假设当前所需要的包名为com.jingluo.test_aidl ,那么aidl就需要处于同样的路径下,即如下目录…...
线程同步与互斥
系统11. 线程同步与互斥 1. 线程互斥 1-1 进程线程间的互斥相关背景概念 临界资源:多线程执⾏流共享的资源就叫做临界资源临界区:每个线程内部,访问临界资源的代码,就叫做临界区互斥:任何时刻,互斥保证有…...