实现RAG 使用LangChain实现图检索查询(1),PDF超过6000页,

'\n### Answer (Accepted: '+ answer.is_accepted +
’ Score: ’ + answer.score+ '): '+ answer.body + ‘\n’) as answerTexts
}
RETURN '##Question: ’ + question.title + ‘\n’ + question.body + ‘\n’

  • answerTexts AS text, similarity as score, {source: question.link} AS metadata
    ORDER BY similarity ASC // so that best answers are the last
    “”"

现在,请注意,这些查询看起来并不完整。我们不会用可选的MATCH或with子句启动Cypher查询。这是因为检索查询被添加到向量搜索查询的末尾。

read_query = (
"CALL db.index.vector.queryNodes($index, $k, $embedding) "
"YIELD node, score "
) + retrieval_query

因此,LangChain首先调用db.index.vector.queryNodes()(更多信息见文档)来查找最相似的节点,并传递(YIELD)相似节点和相似度分数,然后将检索查询添加到向量搜索查询的末尾,以提取额外的上下文。了解这一点非常有帮助,特别是当我们构造检索查询时,以及当我们开始测试结果时!

第二件要注意的事情是,这两个查询都返回相同的三个变量:文本、分数和元数据。这是LangChain所期望的,所以如果没有返回,您将得到错误。文本变量包含相关文本,分数是块与搜索文本的相似度分数,元数据可以包含我们想要的上下文的任何其他信息。

构造检索查询

让我们构建检索查询!我们知道相似性搜索查询将返回节点和分数变量,因此我们可以将这些变量传递到检索查询中,以提取这些相似节点的连接数据。我们还必须返回文本、分数和元数据变量。

retrieval_query = “”"
WITH node AS doc, score as similarity

some more query here

RETURN as text, similarity as score,
{: } AS metadata
“”"

好了,这就是我们的骨架。现在我们想要中间的是什么?我们知道我们的数据模型将在相似性搜索中提取CHUNK节点(这些将是上面WITH子句中的节点AS文档值)。文本块不能提供大量上下文,因此我们想要拉入连接到CHUNK节点的Form、Person、Company、Manager和Industry节点。我们还在NEXT关系中包含一系列文本块,因此我们可以将下一个和上一个文本块拉到相似的文本块周围。我们还将提取所有具有相似分数的块,我们希望缩小范围。

retrieval_query = “”"
WITH node AS doc, score as similarity
ORDER BY similarity DESC LIMIT 5
CALL { WITH doc
OPTIONAL MATCH (prevDoc:Chunk)-[:NEXT]->(doc)
OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Chunk)
RETURN prevDoc, doc AS result, nextDoc
}

some more query here

RETURN coalesce(prevDoc.text,‘’) + coalesce(document.text,‘’) + coalesce(nextDoc.text,‘’) as text,
similarity as score,
{: } AS metadata
“”"

现在我们保留5个最相似的块,然后在CALL{}子查询中提取前一个和下一个文本块。我们还更改了RETURN,将前一个、当前和下一个块的文本都连接到文本变量中。coalesce()函数用于处理空值,因此如果没有前一个块或下一个块,它将只返回一个空字符串。

让我们添加更多的上下文来拉入图中的其他相关实体。

retrieval_query = “”"
WITH node AS doc, score as similarity
ORDER BY similarity DESC LIMIT 5
CALL { WITH doc
OPTIONAL MATCH (prevDoc:Chunk)-[:NEXT]->(doc)
OPTIONAL MATCH (doc)-[:NEXT]->(nextDoc:Chunk)
RETURN prevDoc, doc AS result, nextDoc
}
WITH result, prevDoc, nextDoc, similarity
CALL {
WITH result
OPTIONAL MATCH (result)-[:PART_OF]->(:Form)<-[:FILED]-(company:Company), (company)<-[:OWNS_STOCK_IN]-(manager:Manager)
WITH result, company.name as companyName, apoc.text.join(collect(manager.managerName),‘;’) as managers
WHERE companyName IS NOT NULL OR managers > “”
WITH result, companyName, managers
ORDER BY result.score DESC
RETURN result as document, result.score as popularity, companyName, managers
}
RETURN coalesce(prevDoc.text,‘’) + coalesce(document.text,‘’) + coalesce(nextDoc.text,‘’) as text,
similarity as score,
{documentId: coalesce(document.chunkId,‘’), company: coalesce(companyName,‘’), managers: coalesce(managers,‘’), source: document.source} AS metadata
“”"

第二个CALL{}子查询拉入任何相关的Form、Company和Manager节点(如果存在,则为OPTIONAL MATCH)。我们将经理收集到一个列表中,并确保公司名称和经理列表不为空或空。然后我们按分数对结果排序(目前不提供价值,但可以跟踪文档被检索了多少次)。

由于只返回文本、分数和元数据属性,因此我们需要在元数据字典字段中映射这些额外的值(documentId、company和managers)。这意味着要更新最终的RETURN语句以包含这些语句。

总结

本文中,我们了解了RAG是什么,以及在LangChain中检索查询是如何工作的。我们还查看了一些用于Neo4j的Cypher检索查询示例,并构建了我们自己的示例。我们在查询中使用了SEC文件数据集,并了解了如何提取额外的上下文并将其映射到LangChain期望的三个属性。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Go语言工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Go语言全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Golang知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

M-1713027159989)]

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值