利用PebbloRetrievalQA实现身份感知的RAG

在当今的数据驱动时代,提供安全、精确的信息检索至关重要。PebbloRetrievalQA代表了这种提升安全性和准确性的尝试,它是一个结合身份和语义约束的检索链,用于从向量数据库中进行问答。本次分享将深入探讨如何利用PebbloRetrievalQA实现对文档的身份和语义强制检索,并提供可直接运行的代码示例。

技术背景介绍

PebbloRetrievalQA是一种检索链,通过在问答过程中对身份和语义进行约束,确保信息的请求和返回是安全且符合授权的。这一功能特别适用于需要高等级数据保密和合规性的应用场景,如金融报告、员工记录等。

核心原理解析

Pebblo提供身份和语义约束的功能:

  • 身份约束: 通过身份验证确保只有被授权的用户能够访问特定信息。
  • 语义约束: 限制那些与特定主题或实体无关的内容,从而保持信息的相关性和保密性。

代码实现演示

我们将使用PebbloRetrievalQA加载文档并实现身份和语义执行。

1. 加载文档并进行身份验证

首先,我们需要将文档加载到内存中的Qdrant向量数据库中,该数据库将作为PebbloRetrievalQA的检索工具。

from langchain_community.vectorstores.qdrant import Qdrant
from langchain_core.documents import Document
from langchain_openai.embeddings import OpenAIEmbeddings
from langchain_openai.llms import OpenAI

# 初始化语言模型和嵌入
llm = OpenAI()
embeddings = OpenAIEmbeddings()
collection_name = "pebblo-identity-and-semantic-rag"

page_content = """
... (省略的报告内容)
"""

documents = [
    Document(
        **{
            "page_content": page_content,
            "metadata": {
                "pebblo_semantic_topics": ["financial-report"],
                "pebblo_semantic_entities": ["us-bank-account-number"],
                "authorized_identities": ["finance-team", "exec-leadership"],
                "page": 0,
                "source": "https://drive.google.com/file/d/xxxxxxxxxxxxx/view",
                "title": "ACME Corp Financial Report.pdf",
            },
        }
    )
]

# 加载文档到Qdrant
vectordb = Qdrant.from_documents(
    documents,
    embeddings,
    location=":memory:",
    collection_name=collection_name,
)

print("Vectordb loaded.")

2. 实现身份检索

接下来,我们使用PebbloRetrievalQA来实现身份约束。

from langchain_community.chains import PebbloRetrievalQA
from langchain_community.chains.pebblo_retrieval.models import AuthContext, ChainInput

# 初始化PebbloRetrievalQA链
qa_chain = PebbloRetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(),
    app_name="pebblo-identity-rag",
    description="Identity Enforcement app using PebbloRetrievalQA",
    owner="ACME Corp",
)

def ask(question: str, auth_context: dict):
    """
    询问PebbloRetrievalQA链问题
    """
    auth_context_obj = AuthContext(**auth_context) if auth_context else None
    chain_input_obj = ChainInput(query=question, auth_context=auth_context_obj)
    return qa_chain.invoke(chain_input_obj.dict())

# 授权用户提问
auth = {
    "user_id": "finance-user@acme.org",
    "user_auth": [
        "finance-team",
    ],
}
question = "Share the financial performance of ACME Corp for the year 2020"
resp = ask(question, auth)
print(f"Question: {question}\n\nAnswer: {resp['result']}")

3. 实现语义检索

除了身份验证外,我们还可以使用语义约束机制。

from typing import List, Optional
from langchain_community.chains import PebbloRetrievalQA
from langchain_community.chains.pebblo_retrieval.models import ChainInput, SemanticContext

# 初始化语义PebbloRetrievalQA链
qa_chain = PebbloRetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(),
    app_name="pebblo-semantic-rag",
    description="Semantic Enforcement app using PebbloRetrievalQA",
    owner="ACME Corp",
)

def ask(question: str, topics_to_deny: Optional[List[str]] = None, entities_to_deny: Optional[List[str]] = None):
    """
    询问PebbloRetrievalQA链问题
    """
    semantic_context = dict()
    if topics_to_deny:
        semantic_context["pebblo_semantic_topics"] = {"deny": topics_to_deny}
    if entities_to_deny:
        semantic_context["pebblo_semantic_entities"] = {"deny": entities_to_deny}

    semantic_context_obj = SemanticContext(**semantic_context) if semantic_context else None
    chain_input_obj = ChainInput(query=question, semantic_context=semantic_context_obj)
    return qa_chain.invoke(chain_input_obj.dict())

# 测试语义约束
topic_to_deny = ["financial-report"]
entities_to_deny = []
question = "Share the financial performance of ACME Corp for the year 2020"
resp = ask(question, topics_to_deny=topic_to_deny, entities_to_deny=entities_to_deny)
print(f"Topics to deny: {topic_to_deny}\nEntities to deny: {entities_to_deny}\nQuestion: {question}\nAnswer: {resp['result']}")

应用场景分析

PebbloRetrievalQA的身份和语义约束功能适用于以下场景:

  • 企业内部报告的安全访问
  • 法务文件中敏感信息的过滤
  • 行业或市场报告的安全共享

实践建议

  • 确保在数据加载阶段加入准确的身份和语义元数据。
  • 根据应用的不同,灵活配置身份和语义约束参数。
  • 定期更新授权信息以保持数据的安全性和合规性。

如果遇到问题欢迎在评论区交流。

—END—

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值