实现多用户检索:如何配置检索链的运行时属性
在构建信息检索应用程序时,尤其是在支持多个用户的情况下,我们需要确保每个用户只能访问其自己的数据。本指南演示如何通过配置检索链的运行时属性,实现基于用户的文档限制。
引言
在多用户环境中构建检索应用程序时,确保用户数据的安全和隔离是至关重要的。本文将介绍如何配置检索链,使其只检索特定用户的信息。
主要内容
步骤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---