RAG进阶 多用户多文档

我在LlamaIndex和LangChain框架学习中,都有玩过RAG。最近准备开个RAG进阶系统,一起学习AI, 一起成长。欢迎点赞,留言交流。

Advanced RAG 系列:

RAG 进阶 LlamaIndex多文档

RAG 进阶 多模态图片检索

RAG 进阶 LlamaIndex多文档

前言

Advanced RAG 系列学习了先是单个文档的半结构数据抽取table 、图片,再是多文档Object Index关联。本文最后一篇, 聊聊多用户。在基于AI构建产品时,我们要考虑多用户,比如不同的权限。我们一起来学习下多用户多文档这一较复杂的RAG知识库。

Per-User Retrieval

LangChain官方有一篇Per-User Retrieval,我们可以理解为每个用户的检索或基于用户的检索。当RAG检索前面加了用户这个产品维度最重要的参数时,有什么约束?

上图是Naive RAG,也就是最简单的RAG工作流。Naive RAG,相对于Advanced RAG,前者简单,但是性能不好。后者虽然复杂,但性能和准确度更佳。这得益于Advanced RAG 抽离了table 、image 等半结构数据、多文档关联索引等。

我们先基于上图,来回忆一下某个文档要被索引需要做以下工作:

  • 文档的读取 Document
  • 数据的拆分 Chunk
  • 文档的嵌入 Embedding
  • 向量存储 Vector Store
  • 检索器 Retriever

当我们打理过很多次RAG应用后,对上面的流程已经很熟悉。   当我们再考虑多用户的情况时,文档和向量数据,可能仅对有权限的用户可见,而对其它用户不可见,我们一般是在Vector Store中对用户的数据进行隔离。比如提供namespace,就能解决。   我们以Pincone向量数据库为例,看看如何为多用户构建向量数据库和索引,实现多用户检索。

实战

  • 安装依赖
css 复制代码
!pip install langchain openai pinecone-client pypdf tiktoken -q -U

pypdf,我们会对pdf文件做索引。tiktoken做分词。

  • pinecone 准备

创建了一个multi-users索引数据库。维度和模型相关,OpenAI是1536。其它使用默认的就好,点击确认创建。

我们还可以在API KEYS 找到Pinecone api_key,等下会用到。

  • pinecone 和 openai 环境变量设置
ini 复制代码
from google.colab import userdata PINECONE_API_KEY=userdata.get('PINECONE_API_KEY') 
PINECONE_ENVIRONMENT="us-west4-gcp" 
PINECONE_INDEX="multi-users" 
OPENAI_API_KEY=userdata.get('OPENAI_API_KEY') 
import os 
os.environ['OPENAI_API_KEY'] = OPENAI_API_KEY

  我们将pinecone的一些数据存放在colab的secret里。

  • 引入需要的库
python 复制代码
import pinecone  #向量数据库
# embedding
from langchain.embeddings.openai import OpenAIEmbeddings 
# langchain 的pinecone
from langchain.vectorstores import Pinecone
  • 实例化向量数据库
ini 复制代码
# 初始化pinecone
pinecone.init(api_key=PINECONE_API_KEY, environment=PINECONE_ENVIRONMENT) 
# 索引
index = pinecone.Index(PINECONE_INDEX) 
# 嵌入
embeddings = OpenAIEmbeddings(api_key=OPENAI_API_KEY) 
# 生成向量数据库实例
vectorstore = Pinecone(index, embeddings, "text")
  • 下载两份pdf文件,指定不同的命名空间
ini 复制代码
!wget -O uniswap-v3.pdf https://uniswap.org/whitepaper-v3.pdf
!wget -O electronic-health-records.pdf https://med.stanford.edu/content/dam/sm/ehr/documents/SM-EHR-White-Papers_v12.pdf
USER_1 = "Alex" 
USER_2 = "Lucy"

uniswap白皮书属于Lucy的专家知识库chatbot;electronic-health-records属于Alex。

  • 将文档放入向量数据库,指定namespace
ini 复制代码
# PyPDFLoader
from langchain.document_loaders import PyPDFLoader 
# 加载白皮书
loader = PyPDFLoader("uniswap-v3.pdf")
# 使用默认的分割
documents = loader.load_and_split() 
# 放入向量数据库,指定命名空间为USER_2 目标达到了
vectorstore.add_documents(documents, namespace=USER_2)
ini 复制代码
loader = PyPDFLoader("electronic-health-records.pdf") 

documents = loader.load_and_split() 

vectorstore.add_documents(documents, namespace=USER_1)
  • 提问, 这个问题只有Lucy问才能回答
ini 复制代码
question = "What is uniswap?"
python 复制代码
# 检索器
from langchain.schema.vectorstore import VectorStoreRetriever 

from langchain.llms import OpenAI
# Memory
from langchain.memory import ConversationBufferMemory 
# QAPrompt
from langchain.chains.conversational_retrieval.prompts import QA_PROMPT
# QA chain
from langchain.chains.question_answering import load_qa_chain 

from langchain.chains import ConversationalRetrievalChain
  • 检索
ini 复制代码
retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"namespace": USER_1, "score_threshold": .9}) 
relevant_documents = retriever.get_relevant_documents(question) 

relevant_documents

这里查不出内容,因为USER_1是Alex,没有uniswap的权限。

ini 复制代码
retriever = vectorstore.as_retriever(search_type="similarity_score_threshold", search_kwargs={"namespace": USER_2, "score_threshold": .9}) 
relevant_documents = retriever.get_relevant_documents(question) 

relevant_documents

换成USER_2,结果就有了, 多用户权限检索我们实现了。

总结

  • pinecone向量数据库支持namespace, 用于多用户权限隔离

参考资料

  • LangChain文档

  • 【有腔调的RAG】04 支持多用户多文档的向量存储与检索

  • 代码\]([Advanced-RAG/04_langchain_per_user_retrieval.ipynb at main · sugarforever/Advanced-RAG (github.com)](https://link.juejin.cn?target=https%3A%2F%2Fgithub.com%2Fsugarforever%2FAdvanced-RAG%2Fblob%2Fmain%2F04_langchain_per_user_retrieval.ipynb "https://github.com/sugarforever/Advanced-RAG/blob/main/04_langchain_per_user_retrieval.ipynb"))

相关推荐
hakuii1 分钟前
SVD分解后的各个矩阵的深层理解
人工智能·机器学习·矩阵
这张生成的图像能检测吗20 分钟前
(论文速读)基于图像堆栈的低频超宽带SAR叶簇隐蔽目标变化检测
图像处理·人工智能·深度学习·机器学习·信号处理·雷达·变化检测
leijiwen33 分钟前
城市本地生活实体零售可信数据空间 RWA 平台方案
人工智能·生活·零售
L-ololois36 分钟前
【AI产品】一键比较GPT-5、Claude 4、Gemini 2.5、Deepseek多chatbot
人工智能·gpt
2401_8414956436 分钟前
【自然语言处理】生成式语言模型GPT复现详细技术方案
人工智能·python·gpt·深度学习·语言模型·自然语言处理·transformer
Elastic 中国社区官方博客37 分钟前
如何使用 Ollama 在本地设置和运行 GPT-OSS
人工智能·gpt·elasticsearch·搜索引擎·ai·语言模型
FreeBuf_42 分钟前
PortGPT:研究人员如何教会AI自动回移植安全补丁
人工智能
不说别的就是很菜1 小时前
【AI助手】从零构建文章抓取器 MCP(Node.js 版)
人工智能·node.js
GIS数据转换器1 小时前
2025无人机在电力交通中的应用实践
运维·人工智能·物联网·安全·无人机·1024程序员节
Blossom.1181 小时前
大模型在边缘计算中的部署挑战与优化策略
人工智能·python·算法·机器学习·边缘计算·pygame·tornado