资讯动态

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

发布时间:2026/9/10 13:32:46 来源:尧图企业网站定制
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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价