以编程方式使用文档

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

集成详情

本笔记本演示了如何集成 Permit.io 权限到 LangChain 检索器中。

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

  • - PermitSelfQueryRetriever – 使用自查询方法解析用户的自然语言提示,从 Permit 获取用户允许的资源 ID,并在向量存储搜索中自动应用该过滤器。
  • - PermitEnsembleRetriever – 通过 LangChain 的 EnsembleRetriever 组合多个底层检索器(例如 BM25 + 向量),然后使用 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-...
  • - 运行中的 Permit PDP。参见 Permit 文档 获取有关设置策略和容器的详细信息。
  • - 一个向量存储或多个可包装的检索器。
pip install -qU langchain-permit

实例化

PermitSelfQueryRetriever

基础说明

  1. 从 Permit 获取允许的文档 ID。
  1. 使用 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

基础说明

  1. 使用 LangChain 的 EnsembleRetriever 从多个子检索器(例如基于向量的、BM25 等)收集文档。
  2. 检索文档后,它调用 filter_Permit 上的对象来消除用户无权查看的任何文档。

基本用法

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)

演示脚本

有关完整演示,请查看 /langchain_permit/examples/demo_scripts folder:

  1. 演示_self_query.py – 演示 PermitSelfQueryRetriever。
  2. 演示_ensemble.py – 演示 PermitEnsembleRetriever。

每个脚本展示了如何构建或加载文档、配置 Permit 以及运行查询。

总结

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

For more details on setting up Permit policies, see the official Permit docs. If you want to combine these with other tools (like JWT validation or a broader RAG pipeline), check out our docs/tools.ipynb in the examples folder.

from langchain_permit import PermitRetriever

retriever = PermitRetriever(
    # ...
)

用法

query = "..."

retriever.invoke(query)

在链中使用

与其他检索器一样,PermitRetriever 可以通过以下方式集成到 LLM 应用程序中 .

我们需要 LLM 或聊天模型:

# | output: false
# | echo: false

from langchain_openai import ChatOpenAI

llm = ChatOpenAI(model="gpt-3.5-turbo-0125", temperature=0)
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 功能和配置,请访问 仓库.