用以查询嵌入到向量数据库中的数据
- MultiQueryRetriever请求拆分多索引:将问题拆分出不同的问答
- Contextual compression上下文压缩:对每个文件块进行摘要,方便于定位
- self-querying元数据过滤器:将请求过滤成请求+过滤器,进行查询
- 时间加权向量存储检索器:加上时间因素
请求拆分多索引MultiQueryRetriever
通过请求拆分多索,生成多维度的查询输入,其本身是一种增强了的检索器,可以被RetrievalQAWithSourcesChain所引用
1 | # MultiQueryRetriever请求拆分多索引 |
上下文压缩compress
传统的retriever查询时,会将相关块全部返回,但是一个文件块往往有几百的chunk_size大小,内容非常多,导致查询不精准
上下文压缩索引器本身也是利用LLM,给每个文件块生成摘要
1 | from langchain.text_splitter import CharacterTextSplitter |
元数据过滤器self-querying(需要openai
自查询检索器是一种利用llm链编写自我查询的检索器,比如”我想看一部昆汀导演的电影”,检索器会将我的问题分解为一个查询和一个过滤器,查询”电影”,过滤”导演是昆汀”
需要使用langchain.retrievers.self_query.base.SelfQueryRetriever类,这个类支持openai+chroma,但是我因为使用的是HuggingFace免费的嵌入式模型,需要使用Weaviate+HuggingFace
官方文档:https://docs.weaviate.io/weaviate/quickstart?import=vectorization#create-a-collection
本例是失败了,因为weaviate最新的4.x的用法与langchain的Weaviate不兼容,运行到后面就报错了
1 | pip install weaviate-client[agent] |
时间加权向量存储检索器
TimeWeightedVectorStoreRetriever不仅考虑语义相似度,还考虑时间因素。最近访问过的文档会被优先返回。
语义越接近,衰减率越低,过去的小时数越小,越先检索到
1 | import faiss |