Skip to main content
Open In Colab在 GitHub 上打开

许可检索器

Permit 是一个访问控制平台,它使用 RBAC、ABAC 和 ReBAC 等各种模型提供精细、实时的权限管理。它使组织能够在其应用程序中实施动态策略,确保只有授权用户才能访问特定资源。

集成详细信息

此笔记本说明了如何将 Permit.io 权限集成到 LangChain 检索器中。

我们提供两种自定义检索器:

  • PermitSelfQueryRetriever – 使用自查询方法解析用户的自然语言提示,从 Permit 中获取用户允许的资源 ID,并在矢量存储搜索中自动应用该筛选条件。

  • PermitEnsembleRetriever – 通过 LangChain 的 EnsembleRetriever 组合多个底层检索器(例如 BM25 + Vector),然后使用 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。有关设置策略和容器的详细信息,请参阅 允许文档
  • 我们可以包装的 vector store 或多个检索器。
%pip install -qU langchain-permit

实例

PermitSelfQueryRetriever

基本说明

  1. 从 Permit 中检索允许的文档 ID。

  2. 使用 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)
API 参考:OpenAI 嵌入 | 费斯

PermitEnsembleRetriever

基本说明

  1. 使用 LangChain 的 EnsembleRetriever 从多个子检索器(例如,基于向量、BM25 等)收集文档。
  2. 检索文档后,它会在 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)
API 参考:BM25Retriever | 公文

演示脚本

有关更完整的演示,请查看/langchain_permit/examples/demo_scripts文件夹:

  1. demo_self_query.py – 演示 PermitSelfQueryRetriever。
  2. demo_ensemble.py – 演示 PermitEnsembleRetriever。

每个脚本都显示如何构建或加载文档、配置 Allow 和运行查询。

结论

使用这些自定义检索器,您可以将 Permit.io 的权限检查无缝集成到 LangChain 的检索工作流程中。您可以保留应用程序的向量搜索逻辑,同时确保仅返回授权文档。

有关设置 Permit 策略的更多详细信息,请参阅官方 Permit 文档。如果您想将这些工具与其他工具(如 JWT 验证或更广泛的 RAG 管道)结合使用,请查看 examples 文件夹中的 docs/tools.ipynb。

from langchain_permit import PermitRetriever

retriever = PermitRetriever(
# ...
)

用法

query = "..."

retriever.invoke(query)

在链内使用

与其他检索器一样,PermitRetriever 可以通过Chains合并到 LLM 应用程序中。

我们需要一个 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