PermitRetriever
Permit 是一个访问控制平台,提供基于 RBAC、ABAC 和 ReBAC 等多种模型的细粒度、实时权限管理。它使组织能够在其应用程序中实施动态策略,确保只有授权用户才能访问特定资源。
集成细节
此笔记本说明了如何将Permit.io权限集成到LangChain检索器中。
我们提供两种自定义检索器:
-
PermitSelfQueryRetriever – 使用自查询方法解析用户的自然语言提示,从 Permit 中获取用户允许的资源 ID,并自动在向量存储搜索中应用该过滤器。
-
PermitEnsembleRetriever – 组合多个基础检索器(例如,BM25 + 向量)通过LangChain的EnsembleRetriever实现,然后使用Permit.io过滤合并后的结果。
设置
安装包,请使用以下命令:
pip install langchain-permit
如果您想要从单个查询中获取自动跟踪,您也可以通过取消注释下方代码来设置您的LangSmith API密钥:
# os.environ["LANGSMITH_API_KEY"] = getpass.getpass("Enter your LangSmith API key: ")
# os.environ["LANGSMITH_TRACING"] = "true"
安装
pip install langchain-permit
环境变量¶
PERMIT_API_KEY=your_api_key
PERMIT_PDP_URL= # or your real deployment
OPENAI_API_KEY=sk-...
- 一个运行中的许可PDP。有关设置策略和容器的详细信息,请参阅许可文档。
- 一个向量存储或多个我们可以包装的检索器。
%pip install -qU langchain-permit
Instantiation
PermitSelfQueryRetriever
基本解释
-
从Permit检索允许的文档ID。
-
使用LLM解析您的查询并构建一个“结构化过滤器”,确保仅考虑具有那些允许ID的文档。
基本用法
from langchain_openai import OpenAIEmbeddings
from langchain_community.vectorstores import FAISS
from langchain_permit.retrievers import PermitSelfQueryRetriever
# Step 1: Create / load some documents and build a vector store
docs = [...]
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(docs, embeddings)
# Step 2: Initialize the retriever
retriever = PermitSelfQueryRetriever(
api_key="...",
pdp_url="...",
user={"key": "user-123"},
resource_type="document",
action="read",
llm=..., # Typically a ChatOpenAI or other LLM
vectorstore=vectorstore,
enable_limit=True, # optional
)
# Step 3: Query
query = "Give me docs about cats"
results = retriever.get_relevant_documents(query)
for doc in results:
print(doc.metadata.get("id"), doc.page_content)
PermitEnsembleRetriever
基本解释
- 使用 LangChain 的 EnsembleRetriever 从多个子检索器(例如基于向量的、BM25 等)收集文档。
- 在检索文档后,它会调用Permit的filter_objects方法以消除用户无权查看的任何文档。
基本用法
from langchain_community.retrievers import BM25Retriever
from langchain_core.documents import Document
from langchain_permit.retrievers import PermitEnsembleRetriever
# Suppose we have two child retrievers: bm25_retriever, vector_retriever
...
ensemble_retriever = PermitEnsembleRetriever(
api_key="...",
pdp_url="...",
user="user_abc",
action="read",
resource_type="document",
retrievers=[bm25_retriever, vector_retriever],
weights=None
)
docs = ensemble_retriever.get_relevant_documents("Query about cats")
for doc in docs:
print(doc.metadata.get("id"), doc.page_content)
Demo 脚本
要查看更完整的演示,请查阅 /langchain_permit/examples/demo_scripts 文件夹:
- demo_self_query.py – 演示 PermitSelfQueryRetriever。
- demo_ensemble.py – 演示 PermitEnsembleRetriever。
每个脚本展示了如何构建或加载文档、配置Permit以及运行查询。
结论
通过这些自定义检索器,您可以在LangChain的检索工作流中无缝集成Permit.io的权限检查。您可以保持应用程序的向量搜索逻辑,同时确保仅返回授权的文档。
要了解有关设置许可策略的更多详细信息,请参见官方Permit文档。如果您希望将这些功能与其他工具(如JWT验证或更广泛的RAG管道)结合使用,请查阅examples文件夹中的docs/tools.ipynb。
from langchain_permit import PermitRetriever
retriever = PermitRetriever(
# ...
)
用法
query = "..."
retriever.invoke(query)
使用在链中
像其他检索器一样,PermitRetriever可以通过链路被整合到LLM应用程序中。
我们需要一个大语言模型或聊天模型:
pip install -qU "langchain[openai]"
import getpass
import os
if not os.environ.get("OPENAI_API_KEY"):
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter API key for OpenAI: ")
from langchain.chat_models import init_chat_model
llm = init_chat_model("gpt-4o-mini", model_provider="openai")
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
prompt = ChatPromptTemplate.from_template(
"""Answer the question based only on the context provided.
Context: {context}
Question: {question}"""
)
def format_docs(docs):
return "\n\n".join(doc.page_content for doc in docs)
chain = (
{"context": retriever | format_docs, "question": RunnablePassthrough()}
| prompt
| llm
| StrOutputParser()
)
chain.invoke("...")
API 参考
详细介绍了所有PermitRetriever功能和配置的文档,请访问Repo。