AI科研助手开发总结:向量与数据权限的应用(二)
一、前言
继上篇文章:AI科研助手开发总结:向量与数据权限的应用(一)
本章根据'向量库内存储数据及权限,向量库统一维护和管理数据权限'方案讨论。
二、方案分析-基于向量Fields
2.1 思路
结合橙语AI科研助手的业务场景,提出基于向量Fields解决数据权限。
2.2 分析
根据向量数据库的特性和存储结构,存储时主要包括向量数据和属性,属性是KeyValue结构,可根据业务需求自定义设置。
在存储数据向量时,将权限抽象为标签,以标签形式设置到属性字段中,后续检索时,可根据权限属性进行过滤,达到数据权限效果。
2.3 设计
数据类型:公开数据、非公开数据(部分人可见、部分组可见、部分部门可见)

通过Fields属性,设置固定标签属性,以区别是否为公开数据;通过动态标签属性,区别数据对哪些人、部门或组可见。
1)固定标签
-
公开数据标签:isPublic,值为1.
-
非公开数据标签:isPublic,值为0. (此时,需设置动态标签)
2)动态标签
将可见标签作为动态属性,值设置为1。当向量数据的可见性发生变化时,更新动态属性。
-
个人标签格式:AT-USERID-值 ,例如:AT-USERID-989121,值为1
-
部门标签格式:AT-DEPID-值, 例如:AT-DEPID-908234,值为1
-
组标签格式:AT-GROUPID-值, 例如:AT-GROUPID-432122,值为1
3)标签属性条件过滤
isPublic=1 or AT-GROUPID-9890=1 or AT-DEPID-9899=1
三、方案实现
3.1 基础数据类型
调研了阿里DashVector、百度VectorDB、Chroma,支持的基础数据类型:int、str、boolean。本文以DashVector为例。
3.2 公开数据检索
1. 业务数据
{ "id": 1, "query": "应届生实习", "title": "实习生招聘-应届生求职网", "fileId": "7146C7155D1DD6C76671BB4F7B871BFB", "isPublic": 1 }
2. 向量化数据
ret = collection.insert( [ ('1', generate_embeddings("实习生招聘-应届生求职网"),{'title':'实习生招聘-应届生求职网', 'fileId':'7146C7155D1DD6C76671BB4F7B871BFB','isPublic': 1}), ('2', generate_embeddings("快快乐乐出门咒-豆丁网"), {'title':'快快乐乐出门咒-豆丁网', 'fileId':'9BD1E4747D1A56E26BE4B356D6439454', 'isPublic': 0, 'allowTags': 'USERID-989121 USERID-989122 USERID-989123 GROUPID-9890 DEPID-9899 ','denyTags':'USERID-989141 USERID-989142 DEPID-9891 DEPID-9892 '}), ('3', generate_embeddings("起点中文网阅文集团旗下网站"), {'title':'起点中文网阅文集团旗下网站', 'fileId':'01E01C1F5947DE63C12DA8EF19E41DF4', 'isPublic': 0, 'allowTags': 'USERID-989121 USERID-989124 GROUPID-9890 ','denyTags':'USERID-989142 DEPID-9891 '}), ('4', generate_embeddings("中方回应布林肯言论"),{'title':'中方回应布林肯言论', 'fileId':'7146C7155D1DD6C76671BB4F7B871BFB','isPublic': 1}), ('5', generate_embeddings("布林肯在上海对所谓"), {'title':'布林肯在上海对所谓', 'fileId':'9BD1E4747D1A56E26BE4B356D6439454', 'isPublic': 0, 'AT-USERID-989121':1,'AT-USERID-989122':1,'AT-USERID-989123':1,'AT-GROUPID-9890':1,'AT-DEID-9899':1,'DT-USERID-989141':2,'DT-USERID-989142':2,'DT-DEPID-9891':2,'DT-DEPID-9892':2}), ('6', generate_embeddings("全面履行世贸组织规则"), {'title':'全面履行世贸组织规则', 'fileId':'01E01C1F5947DE63C12DA8EF19E41DF4', 'isPublic': 0, 'AT-USERID-989121':1,'AT-USERID-989124':1,'AT-GROUPID-9890':1,'DT-USERID-989142':2,'DT-DEPID-9891':2}) ]
)
3. 向量检索
ret = collection.query( vector=generate_embeddings(text), topk=10, filter='isPublic=1', # 条件过滤,查询公开数据 output_fields=['title', 'fileId'], include_vector=True
)
3.3 非公开数据检索
1. 业务数据
{ "id": 2, "query": "布林肯", "title": "布林肯在上海对所谓", "fileId": "9BD1E4747D1A56E26BE4B356D6439454", "isPublic": 0, "AT-USERID-989121": 1, "AT-USERID-989122": 1, "AT-USERID-989123": 1, "AT-GROUPID-9890": 1, "AT-DEPID-9899": 1 }
{ "id": 3, "query": "世贸组织", "title": "全面履行世贸组织规则", "fileId": "01E01C1F5947DE63C12DA8EF19E41DF4", "isPublic": 0, "AT-USERID-989121": 1, "AT-USERID-989124": 1, "AT-GROUPID-9890": 1, "AT-USERID-989142": 1, "AT-DEPID-9891": 1 }
2. 向量化数据
ret = collection.insert( [ ('1', generate_embeddings("实习生招聘-应届生求职网"),{'title':'实习生招聘-应届生求职网', 'fileId':'7146C7155D1DD6C76671BB4F7B871BFB','isPublic': 1}), ('2', generate_embeddings("快快乐乐出门咒-豆丁网"), {'title':'快快乐乐出门咒-豆丁网', 'fileId':'9BD1E4747D1A56E26BE4B356D6439454', 'isPublic': 0, 'allowTags': 'USERID-989121 USERID-989122 USERID-989123 GROUPID-9890 DEPID-9899 ','denyTags':'USERID-989141 USERID-989142 DEPID-9891 DEPID-9892 '}), ('3', generate_embeddings("起点中文网阅文集团旗下网站"), {'title':'起点中文网阅文集团旗下网站', 'fileId':'01E01C1F5947DE63C12DA8EF19E41DF4', 'isPublic': 0, 'allowTags': 'USERID-989121 USERID-989124 GROUPID-9890 ','denyTags':'USERID-989142 DEPID-9891 '}), ('4', generate_embeddings("中方回应布林肯言论"),{'title':'中方回应布林肯言论', 'fileId':'7146C7155D1DD6C76671BB4F7B871BFB','isPublic': 1}), ('5', generate_embeddings("布林肯在上海对所谓"), {'title':'布林肯在上海对所谓', 'fileId':'9BD1E4747D1A56E26BE4B356D6439454', 'isPublic': 0, 'AT-USERID-989121':1,'AT-USERID-989122':1,'AT-USERID-989123':1,'AT-GROUPID-9890':1,'AT-DEID-9899':1,'DT-USERID-989141':2,'DT-USERID-989142':2,'DT-DEPID-9891':2,'DT-DEPID-9892':2}), ('6', generate_embeddings("全面履行世贸组织规则"), {'title':'全面履行世贸组织规则', 'fileId':'01E01C1F5947DE63C12DA8EF19E41DF4', 'isPublic': 0, 'AT-USERID-989121':1,'AT-USERID-989124':1,'AT-GROUPID-9890':1,'DT-USERID-989142':2,'DT-DEPID-9891':2}) ]
)
3. 向量检索
ret = collection.query( vector=generate_embeddings(text), topk=10, filter='isPublic=0 and (AT-GROUPID-9890=1 or AT-DEPID-9899=1) ', # 条件过滤,查询USERID 为989121或DEPID为9899可见的数据 output_fields=['title', 'fileId'], include_vector=True
)
3.4 联合数据检索
基于2.2、2.3节的数据,联合检索
1. 向量检索
ret = collection.query( vector=generate_embeddings(text), topk=10, filter='isPublic=1 or AT-GROUPID-9890=1 or AT-DEPID-9899=1', # 条件过滤,公开数据或USERID为989121和DEPID为9899可见的数据 output_fields=['title', 'fileId'], include_vector=True
)
四、总结
采用动态Field,可解决数据可见性问题,总结如下:
4.1 优点
-
Field为KeyValue结构,设置和扩展灵活,可支持上百个。
-
通过Key过滤,效率较高,对业务无侵入
-
兼容性好
4.2 缺点
-
可见标签为动态Field,相对于预定义的Field会占用较多内存和磁盘,检索速度也有所影响
-
目前不支持黑名单业务场景
相关文章:
AI科研助手开发总结:向量与数据权限的应用(二)
一、前言 继上篇文章:AI科研助手开发总结:向量与数据权限的应用(一) 本章根据向量库内存储数据及权限,向量库统一维护和管理数据权限方案讨论。 二、方案分析-基于向量Fields 2.1 思路 结合橙语AI科研助手的业务场…...
python爬虫----爬取视频实战
python爬虫-爬取视频 本次爬取,还是运用的是requests方法 首先进入此网站中,选取你想要爬取的视频,进入视频页面,按F12,将网络中的名称栏向上拉找到第一个并点击,可以在标头中,找到后续我们想要…...
HarmonyOS NEXT 实战之元服务:静态案例效果--航空出行
背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: import { authentication } …...
DP83848以太网移植流程,可以TCP通信
DP83848-EP 是一款高度可靠、功能丰富的强大器件,包含了增强型 ESD 保护、MII 和 RMII,从而在 MPU 选择方面实现最大的灵活性,所有这些特性都融入于 48 引脚 PQFP 封装中。 DP83848-EP 配备 集成子层以支持 10BASE-T 和 100BASE-TX 以太网协议,这些协议确保了与基于其他标…...
css 裁剪 clip-path
clip-path 是一个强大的 CSS 属性,用于裁剪元素的可视区域,支持多种形状裁剪。它可以用来创建复杂的裁剪效果,如圆形、多边形、路径等。 clip-path: none | shape | url(#clipPathId);none:不裁剪,显示完整内容。shap…...
MySQL用表组织数据
用表组织数据 文章目录 用表组织数据一.四种完整性约束二.数值类型2-1三.数值类型2-2四.字符串.日期类型五.设置1.设置主键2.设置标识列3.设置非空4.设置默认值 六.主外键建立后注意事项 一.四种完整性约束 1.域完整性 列 域完整性约束方法:限制数据类型,检查约束,外键约束,默…...
细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV
目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH (1)w25flash.h (2) w25flash.c 1)W25Q16基本操作指令 2)计算地址的辅助功能函数 3)器…...
C++-------指针
把地址当做数值 在 C 中,指针本质上就是存储内存地址的变量。每个变量在内存中都有一个唯一的地址,通过取地址运算符 & 可以获取变量的地址,这个地址本质上是一个整数(在 32 位系统中是 32 位整数,64 位系统中是 …...
Linux文件目录 --- 移动和改名命令MV、强制移动、试探性移动过、按时间移动
二、MV移动改名命令 重命名文件:mv [选项] 旧文件名 新文件名 移动文件/文件夹:mv [选项] 源文件 目标目录 选项作用-b当覆盖文件时会对被覆盖文件进行先行备份。-i交互式操作,当目标文件已经存在时,会询问是否覆盖。-n试探性覆盖…...
03.HTTPS的实现原理-HTTPS的工作流程
03.HTTPS的实现原理-HTTPS的工作流程 简介1. HTTPS的工作流程1.1. TCP的工作流程1.1.1. 三次握手的详细步骤1.1.2. 三次握手的作用 1.2. HTTPS的工作流程1.2.1. HTTPS与TCP的关系1.2.2. HTTPS的工作流程 2. 公钥和私钥的作用3. 对称密钥的生成和交换4. 对称加密和非对称加密的区…...
vue实现批量下载文件流并压缩
为了实现文件流压缩,我们可以使用 JSZip 和 FileSaver 这两个第三方库。JSZip 是一个用于创建、读取和编辑 .zip 文件的 JavaScript 库,而 FileSaver 则用于在客户端保存文件。 JSZip:用于创建和操作zip文件。可以通过 file 方法将文件添…...
前端入门之VUE--ajax、vuex、router,最后的前端总结
前言 VUE是前端用的最多的框架;这篇文章是本人大一上学习前端的笔记;欢迎点赞 收藏 关注,本人将会持续更新。本人不是学前端的,这个是大一的时候上学的和做的笔记,那个时候学的也蒙,故这里对前端做一个总…...
安装k8s涉及命令(方便放到txt离线使用)
查看操作系统信息 uname -a # 查看所有操作系统信息 uname -s # 查看内核名称 uname -r # 查看内核版本号 uname -m # 查看机器硬件名称 cat /etc/os-release # 查看所有操作系统信息 配置hosts cat >> /etc/hosts << EOF 172.171.16.147 crawler-k8s-mast…...
FLV视频封装格式详解
目录(?)[-] OverviewFile Structure The FLV headerThe FLV File BodyFLV Tag Definition FLVTAGAudio TagsVideo TagsSCRIPTDATA onMetaDatakeyframes Overview Flash Video(简称FLV),是一种流行的网络格式。目前国内外大部分视频分享网站都是采用的这种格式. File Structure…...
搭建vue3+vant项目架构
git代码仓库,直接下载压缩包使用 1、首先要安装node.js(18.3 或更高版本) 2、创建vue3项目 npm create vuelatest然后按照自己的需要进行选择就行 到此vue3项目创建完成,接下来是搭建项目架构 3、配置Vant (移动端ui) vue3项目引入vant,…...
【Linux】进程间通信 -> 匿名管道命名管道
进程间通信的目的 数据传输:一个进程许需要将它的数据发送给另外一个进程。资源共享:多个进程之间共享同样的资源。通知事件:一个进程需要向另一个或一组进程发送消息,通知它们发生了某种事件(如进程终止时要通知父进程…...
大数据开发学习路线
编程语言: Python:数据分析、数据预处理 Java:Hadoop和许多大数据工具的基础 Scala:用于Apache Spark数据库知识: SQL和NoSQL数据库的基本概念 数据库系统如MySQL、MongoDB等操作系统: Linux基础命令和脚本…...
华为云计算HCIE笔记05
第七章:其它模式 灾备组网 高可用性组网,单核心场景下,直接在两个站点中设置一个第三方仲裁站点,两个站点同时连接到仲裁,并且连接到对方。一旦出现问题,则由仲裁站点进行判断,进行业务切换 双核…...
wordpress网站用token登入开发过程
生成跳转token 示例: function generate_login_token($user_id, $secret_key) {$payload [user_id > $user_id,timestamp > time(),];$payload_json json_encode($payload);$signature hash_hmac(sha256, $payload_json, $secret_key);return base64_en…...
Python基础知识回顾
数据类型 Python可以区分整数(integers、下文简写为int)、浮点数(float)、字符串(string)和布尔值(Boolean)等数据类型。 1)int是可正可负的整数 2)float包…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
WEB3全栈开发——面试专业技能点P8DevOps / 区块链部署
一、Hardhat / Foundry 进行合约部署 概念介绍 Hardhat 和 Foundry 都是以太坊智能合约开发的工具套件,支持合约的编译、测试和部署。 它们允许开发者在本地或测试网络快速开发智能合约,并部署到链上(测试网或主网)。 部署过程…...


