如何在LangChain VectorStore中使用search_kwargs过滤?元数据相关疑问
关于LangChain VectorStore过滤文档子集的疑问
现有代码
vectorstore = Chroma.from_documents(documents=splits, embedding=OpenAIEmbeddings()) retriever = vectorstore.as_retriever()
设想的聊天流程
- 用户:我想查找X相关内容。
- 聊天机器人:这份文档的日期是哪天?
- 用户:2023-11-16
- 后端:通过过滤VectorStore获取子集,示例代码:
retriever = vectorstore.as_retriever(filters="document_name matches '2023-11-16*'") - 聊天机器人:这是相关文档:...
官方示例代码
docsearch.as_retriever( search_kwargs={'filter': {'paper_title':'GPT-4 Technical Report'}} )
疑问解答
paper_title是什么?它是元数据还是文档内的文本?
paper_title是文档的元数据,并非文档内容里的文本。LangChain的VectorStore过滤功能是基于文档的元数据字段进行匹配的,官方示例就是通过匹配元数据中paper_title字段的指定值来筛选对应文档。如果它是元数据,该如何指定?
在创建LangChain的Document对象时,给每个文档添加metadata属性,将需要的元数据(比如日期、文档名、标题等)以键值对形式传入即可。示例如下:
from langchain_core.documents import Document # 给拆分后的每个文本片段添加元数据 documents_with_metadata = [] for split in splits: doc = Document( page_content=split, metadata={"date": "2023-11-16", "document_name": "2023-11-16-report"} ) documents_with_metadata.append(doc) # 将带元数据的文档存入Chroma vectorstore = Chroma.from_documents(documents=documents_with_metadata, embedding=OpenAIEmbeddings()) # 后续可通过filter筛选元数据匹配的文档 retriever = vectorstore.as_retriever( search_kwargs={'filter': {'date': '2023-11-16'}} )
内容的提问来源于stack exchange,提问作者OlgaPp
相关产品推荐
相关产品推荐

