实现多用户检索:如何配置检索链的运行时属性

58 阅读3分钟

实现多用户检索:如何配置检索链的运行时属性

在构建信息检索应用程序时,尤其是在支持多个用户的情况下,我们需要确保每个用户只能访问其自己的数据。本指南演示如何通过配置检索链的运行时属性,实现基于用户的文档限制。

引言

在多用户环境中构建检索应用程序时,确保用户数据的安全和隔离是至关重要的。本文将介绍如何配置检索链,使其只检索特定用户的信息。

主要内容

步骤1:确保检索器支持多用户

当前,LangChain中不存在统一的标志或过滤器来支持多用户。每个向量存储和检索器可能有不同的实现(可能称为命名空间、多租户等)。通常,这通过在similarity_search中传递关键字参数实现。您需要查阅文档或源代码,以确认所使用的检索器如何支持多用户。

步骤2:将该参数添加为链的可配置字段

这将使您可以在运行时轻松调用链并配置任何相关的标志。请参阅LangChain的文档以获取更多配置信息。

代码示例

以下是使用Pinecone作为示例进行代码实现的具体示例。

首先,设置Pinecone的环境变量:

# 设置Pinecone API密钥
export PINECONE_API_KEY=Your_Pinecone_API_key

然后,创建向量存储并添加文本:

from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore

embeddings = OpenAIEmbeddings()
# 使用API代理服务提高访问稳定性
vectorstore = PineconeVectorStore(index_name="test-example", embedding=embeddings)

vectorstore.add_texts(["i worked at kensho"], namespace="harrison")
vectorstore.add_texts(["i worked at facebook"], namespace="ankush")

使用namespace参数来区分文档:

# 仅获取Ankush的文档
result_ankush = vectorstore.as_retriever(search_kwargs={"namespace": "ankush"}).get_relevant_documents(
    "where did i work?"
)
print(result_ankush)  # [Document(page_content='i worked at facebook')]

# 仅获取Harrison的文档
result_harrison = vectorstore.as_retriever(
    search_kwargs={"namespace": "harrison"}
).get_relevant_documents("where did i work?")
print(result_harrison)  # [Document(page_content='i worked at kensho')]

接下来,我们创建用于问答的链:

from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import (
    ConfigurableField,
    RunnablePassthrough,
)

template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)

retriever = vectorstore.as_retriever()

configurable_retriever = retriever.configurable_fields(
    search_kwargs=ConfigurableField(
        id="search_kwargs",
        name="Search Kwargs",
        description="The search kwargs to use",
    )
)

chain = (
    {"context": configurable_retriever, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

调用链以获取特定用户的信息:

result_harrison_chain = chain.invoke(
    "where did the user work?",
    config={"configurable": {"search_kwargs": {"namespace": "harrison"}}},
)
print(result_harrison_chain)  # 'The user worked at Kensho.'

result_ankush_chain = chain.invoke(
    "where did the user work?",
    config={"configurable": {"search_kwargs": {"namespace": "ankush"}}},
)
print(result_ankush_chain)  # 'The user worked at Facebook.'

常见问题和解决方案

  • API访问问题:由于某些地区的网络限制,开发者可能需要考虑使用API代理服务来提高访问稳定性。
  • 文档隔离问题:确保您了解向量存储特定的多用户支持实现,以避免数据混合。

总结和进一步学习资源

多用户支持在构建支持多用户的检索应用时至关重要。通过本文所述步骤,您可以实现对不同用户的数据进行隔离检索。进一步学习可以参考LangChain和各大向量存储服务的官方文档。

参考资料

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---