agno 多租户知识库怎么开启 isolate_vector_search 隔离各租户的向量数据?

发布时间:2026/9/10 13:32:47

agno 多租户知识库怎么开启 isolate_vector_search 隔离各租户的向量数据? agno 多租户知识库怎么开启 isolate_vector_search 隔离各租户的向量数据【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno在多租户应用里不同用户或部门往往共享同一个向量数据库集合但彼此只能检索自己的文档。agno 的Knowledge提供isolate_vector_search参数来完成这件事多个Knowledge实例共用同一个向量库时开启该参数后每个实例只检索带有自己name标记的向量避免租户 A 检索到租户 B 的内容。本文以仓库中的 03_multi_tenant.py 为例给出完整配置、运行和验证方式。适用前提本地已安装 agno 的 Python 环境能启动一个 Qdrant 实例默认http://localhost:6333并有 OpenAI API Key示例中同时用于OpenAIEmbedder和OpenAIResponses模型。isolate_vector_search 的行为根据 knowledge.py 中isolate_vector_search字段旁的注释与实现该参数的行为如下isolate_vector_searchFalse默认检索该向量库中的全部向量。isolate_vector_searchTrue只检索带有本实例name标记的向量。实现机制分两步写入时agno 会在插入文档的 metadata 中写入linked_to字段值为该Knowledge实例的name见 knowledge.py 中_prepare_documents_for_insertdocument.meta_data[linked_to] self.name or 检索时agno 自动把{linked_to: self.name}合并进搜索过滤器_inject_instance_scope_filter并且会与你传入的 dict 过滤器或FilterExpr列表合并而不是覆盖。两点必须注意name是生效前提。_inject_instance_scope_filter的判空逻辑是if not (self.isolate_vector_search and self.name): return search_filters即实例没有设置name时即使开启了isolate_vector_search也不会注入过滤条件隔离不生效。单元测试test_search_without_name_no_filter明确验证了这一点。存量数据必须重新索引。开启隔离后没有linked_to元数据的旧数据检索不到需要重新插入以补上该元数据。这是 knowledge.py 注释和 cookbook 文档字符串都明确写出的限制默认值保持False也是出于对存量数据的向后兼容。准备环境按 cookbook/07_knowledge/README.md 的说明先启动 Qdrant./cookbook/scripts/run_qdrant.sh再设置示例用到的 OpenAI Key示例中的 embedder 为text-embedding-3-small模型为OpenAIResponses两者都依赖这个 Keyexport OPENAI_API_KEYyour-key配置两个租户共享同一向量集合下面是最短可行主路径代码来自 03_multi_tenant.py。两个Knowledge实例共享同一个Qdrant集合multi_tenant各自设置不同的name并开启isolate_vector_searchTruefrom agno.knowledge.embedder.openai import OpenAIEmbedder from agno.knowledge.knowledge import Knowledge from agno.vectordb.qdrant import Qdrant from agno.vectordb.search import SearchType qdrant_url http://localhost:6333 # 两个 Knowledge 实例共享同一个向量集合 vector_db Qdrant( collectionmulti_tenant, urlqdrant_url, search_typeSearchType.hybrid, embedderOpenAIEmbedder(idtext-embedding-3-small), ) # 租户 A只能检索到自己的数据 tenant_a_knowledge Knowledge( nameTenant A, vector_dbvector_db, isolate_vector_searchTrue, ) # 租户 B只能检索到自己的数据 tenant_b_knowledge Knowledge( nameTenant B, vector_dbvector_db, isolate_vector_searchTrue, )配置要点name必须为每个租户设置且互相不同它是linked_to元数据的取值也是检索过滤的键值vector_db传同一个对象同一集合、同一 embedder隔离完全靠linked_to元数据区分如果你的业务里已经传了 dict 或FilterExpr过滤器linked_to过滤会自动合并进去不需要手动拼接。再为每个租户挂上独立的Agent开启search_knowledgeTrue让 Agent 通过工具检索该租户的Knowledgefrom agno.agent import Agent from agno.models.openai import OpenAIResponses agent_a Agent( modelOpenAIResponses(idgpt-5.2), knowledgetenant_a_knowledge, search_knowledgeTrue, markdownTrue, ) agent_b Agent( modelOpenAIResponses(idgpt-5.2), knowledgetenant_b_knowledge, search_knowledgeTrue, markdownTrue, )运行并验证隔离效果cookbook 的验证方式是向两个租户各插入一条互不相同的内容然后分别提问确认每个 Agent 只依据自己那份内容作答。插入与提问部分如下同样来自 03_multi_tenant.pyimport asyncio async def main(): # 各租户插入不同内容 await tenant_a_knowledge.ainsert( nameTenant A Docs, text_contentTenant A uses PostgreSQL for their primary database., ) await tenant_b_knowledge.ainsert( nameTenant B Docs, text_contentTenant B runs their workloads on AWS with DynamoDB., ) print(\n * 60) print(TENANT A: Only sees its own data) print( * 60 \n) agent_a.print_response(What database do we use?, streamTrue) print(\n * 60) print(TENANT B: Only sees its own data) print( * 60 \n) agent_b.print_response(What cloud provider do we use?, streamTrue) asyncio.run(main())完整脚本可直接运行以 README 给出的 demo 虚拟环境为例.venvs/demo/bin/python cookbook/07_knowledge/03_production/03_multi_tenant.py判断隔离是否生效的标准agent_a的回答只反映 PostgreSQL 这一份内容agent_b的回答只反映 AWS / DynamoDB 这一份内容——即各自检索时linked_to过滤器把另一租户的向量排除在结果之外。如果想直接确认过滤器也可以脱离 Agent 调用tenant_a_knowledge.search(What database do we use?)单元测试 显示此时传给向量库的过滤器为{linked_to: Test KB}Test KB为实例名未开启隔离时过滤器为None。边界与限制存量数据不受保护开启isolate_vector_searchTrue后此前插入、没有linked_to元数据的向量检索不到必须重新索引。若你的集合已有数据先完成重索引再切换否则该租户会查不到旧文档。未设置name时隔离静默失效不会报错只是不注入linked_to过滤等于回到全量检索。为每个租户显式设置name是必做步骤。同租户多实例linked_to取的是实例name。同一租户下的多个Knowledge实例若共享数据应使用相同name不同租户必须使用不同name。除linked_to外的普通元数据检索dict 过滤器与FilterExpr不受影响参考 04_filtering.py可与isolate_vector_search叠加使用。如果后续还需要按用户维度进一步收窄检索范围例如同一租户内的user_id隔离agno 的search/asearch支持单独的user_id参数转发给向量库可与本场景的租户级隔离配合使用。【免费下载链接】agnoBuild, run, and manage agent platforms.项目地址: https://gitcode.com/GitHub_Trending/ag/agno创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/10 13:32:47

TVBoxOSC无线投屏教程:5步把手机内容送上电视大屏

TVBoxOSC无线投屏教程:5步把手机内容送上电视大屏 【免费下载链接】TVBoxOSC TVBoxOSC - 一个基于第三方项目的代码库,用于电视盒子的控制和管理。 项目地址: https://gitcode.com/GitHub_Trending/tv/TVBoxOSC 家庭聚会上想用手机给全家展示旅行…

2026/9/10 13:27:47

SEO内容优化与关键词研究实战指南

1. 内容优化与SEO效果提升的核心逻辑内容优化是SEO工作中最具长期价值的环节。我从业八年发现一个规律:那些靠技术手段快速提升排名的网站,往往在算法更新后迅速跌落;而持续产出优质内容的站点,排名却能稳定上升。这背后的本质是搜…

2026/9/10 13:27:47

海面石油泄漏检测:1800张双格式小目标数据集实战指南

简介:本资源是面向计算机视觉初学者与环境监测领域研究者的海面石油泄漏目标检测专用数据集,聚焦于海上溢油事故的自动化识别任务,可支撑YOLO、Faster R-CNN等主流检测模型的训练与验证。压缩包共2000个文件,含1817张JPG图像、181…

2026/9/10 14:33:17

2026年9月最新公告:万国保养店售后养护服务声明,关于机芯检测、防水性能测试及外观翻新的官方说明

​  2026年9月最新公告:万国保养店售后养护服务声明,关于机芯检测、防水性能测试及外观翻新的官方说明。本次公告旨在明确万国腕表售后服务的核心标准,重点阐述机芯精密检测、专业防水性能复测以及合规外观翻新工艺的执行规范。万国官方售后…

2026/9/10 14:33:17

Grasscutter 资源包配置指南:从零部署到故障排查

Grasscutter 资源包配置指南:从零部署到故障排查 【免费下载链接】Grasscutter A server software reimplementation for a certain anime game. 项目地址: https://gitcode.com/GitHub_Trending/gr/Grasscutter 跑 Grasscutter 这类开源游戏服务器&#xff…

2026/9/10 14:28:11

STM32 HAL库UART2中断接收全解析:从回调机制到空闲中断

简介:基于STM32F103的HAL库UART2中断收发完整工程包,面向需要借助STM32CubeMX与HAL库实现串口通信的嵌入式工程师与学生。工程内以STM32CubeMX生成的.ioc配置为核心,包含339个C源码、108个头文件及43个汇编文件,并附有IAR链接脚本…

2026/9/9 13:11:35

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 0:00:55

目录对比去重实战:用哈希算法精准清理重复文件

我电脑里现在还有一块换了三次机的“数据墓地”硬盘,里面存着2016年以前所有旧笔记本的完整备份。平时不觉得有什么,直到前阵子想把它整理归档,发现同一个安装包、同一批照片、同一份论文草稿,在几个不同的备份目录里反复出现。更…

2026/9/10 0:00:55

Leaflet离线地图完整Demo合集:内网部署与坐标纠偏实战

简介:这是一份面向Web GIS开发者的LeafLet离线地图示例合集,帮助开发者快速掌握离线地图从搭建到交互的完整流程。压缩包共723个文件,大小14.06MB,以319个js脚本、175个html页面和29个css样式文件为主体,配合png/svg图…

2026/9/10 0:00:55

MATLAB读取Rinex 3.02观测文件:多系统GNSS数据解析实战

简介:基于MATLAB开发的Rinex3.02版观测文件(o文件)读取代码包,面向卫星定位导航方向的学习者与研究人员,用于解决新版观测文件的数据解析、历元提取与时间转换问题。压缩包共4个文件,包含两个m脚本、一个19…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/7 22:46:00

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/9 10:21:54

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码