引言
在构建信息检索应用时,常常需要考虑多用户环境。这意味着你可能需要存储多个用户的数据,并确保他们之间的数据互不干扰。这篇文章将展示如何配置检索链的运行时属性,确保每个用户只能检索到他们自己的数据。
主要内容
第一步:确保你的检索器支持多用户
在当前,LangChain并没有一个统一的标志或过滤器,来表明检索器是否支持多用户。每个向量存储和检索器可能有不同的方法和参数(如命名空间、多租户等)。通常,这些方法会在similarity_search中以关键词参数的形式暴露出来。通过阅读相关文档或源代码,你可以找到你使用的检索器是否支持多用户,以及如何使用它。
注意:为那些不支持或没有文档说明支持多用户的检索器添加相关文档和功能,是一个很好的为LangChain做贡献的方式。
第二步:将该参数添加为链的可配置字段
这样你就可以在运行时调用链,并配置任何相关的参数。更详细的信息可以参考文档。
现在,在运行时你可以调用这个链,并使用可配置的字段。
代码示例
让我们来看一个具体的代码示例,使用Pinecone作为向量存储。
# 配置Pinecone环境变量
# PINECONE_API_KEY: 你的Pinecone API密钥
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代理服务提高访问稳定性
# 仅获取Ankush的文档
retriever = vectorstore.as_retriever(search_kwargs={"namespace": "ankush"})
documents = retriever.get_relevant_documents("where did i work?")
print(documents) # 输出:[Document(page_content='i worked at facebook')]
# 仅获取Harrison的文档
retriever = vectorstore.as_retriever(search_kwargs={"namespace": "harrison"})
documents = retriever.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.'
常见问题和解决方案
-
检索器不支持多用户?
- 如果检索器不支持多用户,需要查看文档或源代码,尝试为其添加多用户支持功能。
-
配置参数未生效?
- 确保配置参数是检索器支持的,并在调用链时正确传递。
总结和进一步学习资源
通过这篇文章,你应该了解了如何配置检索链的运行时属性,实现每用户检索功能。更多详细信息可以参考以下资源:
参考资料
结束语:'如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!'
---END---