跳到主要內容
Open In ColabOpen on GitHub

PermitRetriever

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。

  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 參考:OpenAIEmbeddings | FAISS

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 | Document

示範腳本

如需更完整的示範,請查看 /langchain_permit/examples/demo_scripts 資料夾

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

每個腳本都示範如何建立或載入文件、設定 Permit 以及執行查詢。

結論

透過這些自訂檢索器,您可以將 Permit.io 的權限檢查無縫整合到 LangChain 的檢索工作流程中。您可以保留應用程式的向量搜尋邏輯,同時確保僅傳回授權文件。

有關設定 Permit 策略的更多詳細資訊,請參閱官方 Permit 文件。如果您想將這些與其他工具(如 JWT 驗證或更廣泛的 RAG 管道)結合使用,請查看範例資料夾中的 docs/tools.ipynb。

from langchain_permit import PermitRetriever

retriever = PermitRetriever(
# ...
)

用法

query = "..."

retriever.invoke(query)

在鏈中使用

與其他檢索器一樣,PermitRetriever 可以透過 併入 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


此頁面是否有幫助?