假设问题检索器
所需图结构
背景
问题的嵌入与适当答案或文本源的文本嵌入之间的向量相似度可能相当低。如果我们有可用的问题-块对,我们可以对问题嵌入执行向量相似度搜索,这可能会比对原始文本块执行向量相似度搜索提供更好的结果。
描述
用户问题使用之前用于创建问题嵌入的相同嵌入器进行嵌入。对之前生成的问题执行向量相似度搜索。k
(由开发者/用户预先配置的数量)个最相似的问题被找到,并检索其相关的块。
用法
与例如基本检索器或父子检索器中使用的“问题-到-块”相似度搜索相比,这种模式可以在向量相似度搜索中产生更好的结果。然而,它也需要更多的预处理工作和LLM调用来生成问题。
所需预处理
使用LLM生成块内回答的假设性问题。使用嵌入模型嵌入问题。记录问题与包含其答案的块之间的关系。
检索查询
MATCH (node)<-[:HAS_QUESTION]-(chunk)WITH chunk, max(score) AS score // deduplicate chunksRETURN chunk.text AS text, score, {} AS metadata
资源
- 使用 Neo4j 实现高级 RAG 策略 (2023年11月)
现有实现
示例实现
说明
“假设性问题检索器”在某种程度上与假设性文档嵌入(HyDE)检索器非常相似(参见使用LangChain的RAG:第5部分——假设性文档嵌入)。它们背后的主要思想是通过将用户问题和可用文本移动到向量空间的相似区域来增加它们之间的相似度。在假设性问题检索器中,我们生成假设性问题,并将其与用户问题进行匹配,而在HyDE检索器中,LLM生成对用户问题的假设性答案(不使用基础数据库),然后将假设性答案与数据库中的实际块进行匹配以找到最佳匹配。我们不会详细讨论HyDE检索器,因为它属于RAG的预处理阶段,而不是检索阶段,并且也不需要特定类型的底层图模式。