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
基本說明
-
從 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)
示範腳本
如需更完整的示範,請查看 /langchain_permit/examples/demo_scripts
資料夾
- demo_self_query.py – 示範 PermitSelfQueryRetriever。
- 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。