父子检索器
别名
- 父文档检索器
所需图结构
背景
文本嵌入表示文本的语义。一段更窄的文本会产生更有意义的向量表示,因为来自多个主题的噪音更少。然而,如果LLM只收到一小段信息用于答案生成,这些信息可能会缺少上下文。检索找到信息所在的更广泛的周边文本可以解决这个问题。
描述
用户问题使用之前用于创建块嵌入的相同嵌入器进行嵌入。在子块嵌入上执行向量相似性搜索,以找到 k 个(由开发者/用户预先配置的数量)最相似的块。然后检索找到的子块的父块,并返回父块的附加元数据。对于相同父块的块可以进行聚合,并对其分数进行平均或选择最大值。
用法
此模式是基本检索器的一个有益演进。当一个块中包含多个主题,从而对嵌入产生负面影响时,此模式特别有用,而较小的块将具有更有意义的向量表示,这可以带来更好的相似性搜索结果。只需有限的额外工作,即可获得更好的结果。
所需预处理
将文档分割成(更大的)块(父块),然后将这些块进一步分割成更小的块(子块)。使用嵌入模型来嵌入子块的文本内容。请注意,不需要嵌入父块,因为它们仅用于答案生成,而不用于相似性搜索。
检索查询
MATCH (node)<-[:HAS_CHILD]-(parent)WITH parent, collect(node.text) as chunks, max(score) AS score // deduplicate parentsRETURN parent.title + reduce(r="", c in chunks | r + "\n\n" + c.text) AS text, score, {source:parent.url} AS metadata
延伸阅读
- 改进 RAG 的高级检索技术 (Damian Gil, 2024 年 4 月)
- 使用 Neo4j 实现高级 RAG 策略 (2023年11月)
现有实现
示例实现
类似模式
类似模式可以在具有同级结构的词汇图或具有分层结构的词汇图上实现,其中附加上下文不是仅从检索父文档而来,而是从同级文档或先前设置的结构深度而来。例如,具有同级结构的词汇图目前已在 Neo4j 的 LLM 知识图谱构建器中实现。
请注意,在具有分层结构的词汇图上可以有两种检索器:
- 自下而上:在叶节点上执行检索,并检索树中更高级别的其他块(参见Going Meta — 第 24 集:KG+LLMs:本体驱动的 RAG 模式)
- 自上而下:使用顶级节点来确定要考虑检索的子树。重复此方法,直到相似性搜索的节点集被合理地缩小(参见RAG 策略 — 分层索引检索)。