2024年最全实现RAG 使用LangChain实现图检索查询(3),2024年最新学习Golang开发的步骤

img
img
img

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

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

如果你需要这些资料,可以戳这里获取

	WITH answer
	ORDER BY answer.is_accepted DESC, answer.score DESC
	WITH collect(answer)[..2] as answers
	RETURN reduce(str='', answer IN answers | str + 
		'\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语句以包含这些语句。


### 总结


![img](https://img-blog.csdnimg.cn/img_convert/f4f568dc18e401fcd9f90884cd047ba6.png)
![img](https://img-blog.csdnimg.cn/img_convert/64c10b1ef8718ac82d339c9f873f16cb.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**


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

topics/618658159)**


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

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值