使用知识图谱进行相似度搜索
与使用向量空间来查找相似文章不同,我们可以依赖文章所关联的标签来实现相似度搜索。有许多使用标签计算相似度的方法,但在此示例中,我将使用常见的方法:Jaccard 相似度。我们将再次使用牙龈文章来比较不同的方法。
结果如下。由于我们再次查询的是牙龈文章,因此它是最相似的文章,这是我们所期望的。其他结果包括:
•文章 7:“股外侧肌的钙化性肌腱炎。三例报告。” 这篇文章讲的是股外侧肌(大腿肌肉)中的钙化性肌腱炎(钙沉积在肌腱中)。这与口腔肿瘤无关。 重叠术语:断层扫描、老年、男性、人类、X 光计算•文章 8:“前列腺癌患者在前列腺特异性抗原水平变化时,雄激素剥夺治疗的最佳时长。” 这篇文章讨论的是前列腺癌患者应接受雄激素剥夺治疗的时长。虽然这是关于癌症治疗(放疗),但与口腔癌无关。 重叠术语:放疗、老年、男性、人类、辅助治疗•文章 9:“脑半球不对称的 CT 扫描:失语症恢复的预测因子。” 这篇文章讲的是左右脑半球差异(脑半球不对称)如何预测中风后失语症的恢复情况。 重叠术语:断层扫描、老年、男性、人类、X 光计算
这个方法最好的地方是,由于我们计算相似度的方式,我们可以看到为什么其他文章是相似的 —— 我们清楚地看到每篇文章与牙龈文章比较时,重叠的术语,即哪些术语在牙龈文章和其他比较文章中是共同的。
可解释性的缺点是:我们可以看到,这些文章似乎并不是最相似的,考虑到之前的结果。它们都共享三个术语(老年、男性和人类),这些术语可能不像治疗方案或口腔肿瘤那么相关。你可以通过使用基于术语在语料库中出现频率的加权方法——如术语频率-逆文档频率(TF-IDF),来重新计算,这可能会改善结果。你也可以在进行相似度计算时选择最相关的标记术语,以便对结果进行更多的控制。
使用知识图谱计算术语相似度的最大缺点是计算量 —— 这次计算大约花了 30 分钟。
使用知识图谱进行 RAG
我们还可以仅使用知识图谱来进行 RAG 的检索部分。我们已经从上面的语义搜索中保存了一些关于口腔肿瘤的文章列表。为了实现 RAG,我们只需将这些文章发送给 LLM,并要求它总结结果。
首先,我们将每篇文章的标题和摘要合并成一个大的文本块,称为 :
然后我们设置一个客户端,这样就可以将这个文本直接发送给 LLM:
接下来,我们给 LLM 提供上下文和提示:
结果如下:
这些结果看起来不错,即它是对从语义搜索返回的三篇文章的一个很好的总结。 使用仅基于知识图谱(KG)的 RAG 应用程序的响应质量,取决于你的 KG 检索相关文档的能力。 如本例所示,如果提示足够简单,比如“总结这里的关键信息”,那么困难的部分是检索(为 LLM 提供正确的文章作为上下文),而生成响应并不难。
现在我们要将两者结合起来。我们将在数据库中的每篇文章中添加 URI,然后在 Weaviate 中创建一个新集合,将文章的标题、摘要、关联的 MeSH 术语以及 URI 进行向量化。URI 是文章的唯一标识符,并且是我们与知识图谱连接的方式。
首先,我们在数据中为 URI 添加一个新列:
接下来,我们为新集合创建一个新 schema,包含附加字段:
将该 schema 推送到向量数据库中:
现在我们将数据向量化到新的集合中:
使用向量化的知识图谱进行语义搜索
现在我们可以像之前一样,在向量数据库上进行语义搜索,但这次有更多的可解释性和对结果的控制。
返回的结果如下:
•文章 1:“牙龈转移作为上皮型恶性间皮瘤多器官扩散的首个征兆。”•文章 10:“血管中心性中面部淋巴瘤:一名老年男子的诊断挑战。” 这篇文章讲述的是如何诊断一名男子的鼻癌。•文章 11:“下颌伪癌性增生。” 这篇文章对我来说很难理解,但我认为它讨论的是伪癌性增生如何看起来像癌症(因此名字中有‘伪’),但它实际上是非癌性的。虽然它确实是关于下颌的,但它被标记为“口腔肿瘤”MeSH 术语。
这些结果是否比知识图谱(KG)或仅使用向量数据库的结果要好,还是更差,很难判断。从理论上讲,结果应该更好,因为现在每篇文章的 MeSH 术语也与文章一起向量化了。然而,我们并没有真正地向量化知识图谱。例如,MeSH 术语之间的关系并没有包含在向量数据库中。
有一个好处是,MeSH 术语向量化后,我们可以立即获得一些可解释性 —— 例如,文章 11 也被标记为口腔肿瘤。 但将向量数据库与知识图谱连接的真正好处是,我们可以应用任何我们想要的来自知识图谱的过滤器。记得之前我们在数据中添加了“发布日期”作为字段吗?现在我们可以基于这个字段进行筛选。假设我们想找出2020年5月1日之后发布的口腔肿瘤相关的文章:
最初的查询返回了 10 个结果(我们设置了最大值为 10),但这些文章中只有 6 篇是在 2023年1月1日之后发布的。以下是结果:
使用向量化的知识图谱进行相似度搜索
我们可以像之前对牙龈文章(文章 1)进行的搜索一样,在这个新集合中进行相似度搜索:
返回结果如下:
•文章 3:“下颌转移性神经母细胞瘤。病例报告。”•文章 4:“针对烟草使用者的口腔恶性病变筛查可行性研究。”•文章 12:“弥漫性肺内恶性间皮瘤伪装为间质性肺病:一种独特的间皮瘤变种。” 这篇文章讲的是五名男性患者患有一种看起来很像其他肺病——间质性肺病的间皮瘤。
由于我们已经向量化了 MeSH 标记的术语,我们可以看到每篇文章相关的标签。虽然它们在某些方面可能相似,但并不是关于口腔肿瘤的文章。假设我们想找到与牙龈文章相似的文章,但特别是关于口腔肿瘤的文章。现在,我们可以结合之前在这些结果中使用知识图谱进行的 SPARQL 过滤。
“口腔肿瘤”的同义词和下位概念的 MeSH URI 已经保存,但我们需要为从向量搜索中返回的 50 篇文章获取 URI:
现在我们可以像之前使用知识图谱进行语义搜索时一样,基于标签对结果进行排序。
在向量数据库最初返回的 50 篇文章中,只有 5 篇被标记为“口腔肿瘤”或相关概念。
•文章 2:“起源于小唾液腺的肌上皮瘤。光学和电子显微镜研究。” 标记为:牙龈肿瘤、唾液腺肿瘤•文章 4:“针对烟草使用者的口腔恶性病变筛查可行性研究。” 标记为:口腔肿瘤•文章 13:“起源于牙龈沟的表皮样癌。” 这篇文章描述了一个牙龈癌(牙龈肿瘤)的案例。 标记为:牙龈肿瘤•文章 1:“牙龈转移作为上皮型恶性间皮瘤多器官扩散的首个征兆。” 标记为:牙龈肿瘤•文章 14:“转移至耳下腺淋巴结:CT 和 MR 成像结果。” 这篇文章讲的是耳下腺(主要唾液腺)中的肿瘤。 标记为:耳下腺肿瘤
最后,假设我们要将这些相似的文章推荐给用户,但我们只想推荐该用户有权限访问的文章。假设我们知道该用户只能访问标记为访问等级 3、5 和 7 的文章。我们可以在知识图谱中使用类似的 SPARQL 查询来应用过滤器:
有一篇文章用户无法访问。其余四篇文章如下:
•文章 2:“起源于小唾液腺的肌上皮瘤。光学和电子显微镜研究。” 标记为:牙龈肿瘤、唾液腺肿瘤。访问级别:5•文章 4:“针对烟草使用者的口腔恶性病变筛查可行性研究。” 标记为:口腔肿瘤。访问级别:7•文章 1:“牙龈转移作为上皮型恶性间皮瘤多器官扩散的首个征兆。” 标记为:牙龈肿瘤。访问级别:3•文章 14:“转移至耳下腺淋巴结:CT 和 MR 成像结果。” 这篇文章讲的是耳下腺(主要唾液腺)中的肿瘤。 标记为:耳下腺肿瘤。访问级别:3
使用向量化的知识图谱进行 RAG
最后,让我们看看当我们将向量数据库与知识图谱结合使用时,RAG(检索增强生成)是如何工作的。提醒一下,你可以直接对向gpt 教程量数据库运行 RAG,并将其发送给 LLM 以生成响应:
在这个示例中,我使用了搜索词 ‘therapies for mouth neoplasms’,并且与之前一样使用了提示:
“Summarize the key information here in bullet points. Make it understandable to someone without a medical degree.” 我们只返回了排名前三的文章来生成此响应。以下是结果:
作为一个测试,我们可以准确地查看选择了哪三篇文章:
有趣的是,第一篇文章是关于牙龈肿瘤的,这是口腔肿瘤的一个子集,但第二篇文章是关于直肠癌的,第三篇是关于鼻咽癌的。它们讨论的是癌症的治疗方法,只是不是我搜索的那种癌症。令人担忧的是,提示词是“口腔肿瘤的治疗方法”,但是结果中包含了其他类型癌症的治疗信息。这有时被称为“上下文污染”(context poisoning)——无关或误导性的信息被注入到提示词中,从而导致 LLM 返回误导性的回答。
我们可以使用知识图谱(KG)来解决这个上下文污染问题。以下是一个图示,展示了向量数据库和知识图谱如何协同工作,以实现更好的 RAG 实现:
首先,我们在向量数据库上使用相同的提示词进行语义搜索:口腔癌的治疗方法。这次我将限制条目数增加到 20 篇,因为我们会筛选掉一些不相关的文章。
接下来,我们使用之前相同的排序技术,基于与“口腔肿瘤”相关的概念进行排序:
只有三篇文章被标记为“口腔肿瘤”相关术语:
•文章 4:“针对烟草使用者的口腔恶性病变筛查可行性研究。” 标记为:口腔肿瘤•文章 15:“光动力治疗实验性研究:化学诱导的口腭粘膜癌前病变和鳞状细胞癌的治疗。” 这篇文章讨论了在大鼠中测试的一种癌症治疗方法(光动力治疗)。 标记为:口腭肿瘤•文章 1:“牙龈转移作为上皮型恶性间皮瘤多器官扩散的首个征兆。” 标记为:牙龈肿瘤
我们将这些文章发送到 LLM,看看结果是否有所改善:
结果如下:
我们可以明显看到改进 —— 这些结果不再是关于直肠癌或鼻咽肿瘤的。看起来这确实是三篇被选中的文章的相对准确的总结,都是关于口腔肿瘤的治疗方法。
1. 向量数据库的优势
向量数据库非常适合快速启动搜索、相似度(推荐)和 RAG 应用程序,并且几乎不需要额外的开销。它在处理带有无结构数据的结构化数据时表现尤为出色。例如,在这个期刊文章的例子中,如果我们有文章摘要,它能够很好地帮助我们获取相关信息。
注意:如果没有文章摘要作为数据集的一部分,效果可能就会大打折扣。
2. 知识图谱的优势
知识图谱在提高准确性和控制方面非常有用。如果你希望确保输入到搜索应用程序中的数据是“正确的”(这里的“正确”指的是符合你需求的标准),那么知识图谱将是不可或缺的。知识图谱对于搜索和相似度非常有效,但它满足需求的程度取决于:
•元数据的丰富度•标签的质量
标签质量的好坏也因使用场景的不同而有所区别 —— 例如,构建推荐引擎和搜索引擎时,分类法的构建与应用方式可能不同。
3. 向量数据库 + 知识图谱的最佳组合
将知识图谱用于过滤向量数据库中的结果,是取得最佳效果的做法。这一点并不令人惊讶 —— 因为我在使用知识图谱来过滤掉我认为无关或误导性的结果,从而使结果更加符合我的需求。
重点:并不是说知识图谱本身会直接改善结果,而是它提供了控制输出的能力,使得结果能够得到优化。
总结:
•向量数据库适合快速启动应用程序,处理无结构数据时表现优越。•知识图谱通过确保数据的准确性和提供更高的控制力,帮助提高搜索结果的质量。•向量数据库和知识图谱的结合,能够过滤无关信息,从而得到更加精准的搜索结果。
山行AI希望本文对你有所帮助,更多信息请查看:https://medium.com/data-science/how-to-implement-graph-rag-using-knowledge-graphs-and-vector-databases-60bb69a22759,感谢点赞、转发!
References
这里:https://github.com/SteveHedden/kg_llm Graph RAG:https://www.ontotext.com/knowledgehub/fundamentals/what-is-graph-rag/ GraphRAG:https://microsoft.github.io/graphrag/ GRAG:https://arxiv.org/abs/2405.16506 语义 RAG:https://www.poolparty.biz/graph-retrieval-augmented-generation 越来越多:https://arxiv.org/pdf/2311.07509 PubMed 仓库:https://www.kaggle.com/datasets/owaiskhan9654/pubmed-multilabel-text-classification CC0 公共领域:https://creativecommons.org/publicdomain/zero/1.0/ Weaviate 的官方快速入门教程:https://weaviate.io/developers/weaviate/current/getting-started/quickstart.html 文章: https://towardsdatascience.com/semantic-search-with-weaviate-b4fa8a982e5d
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/277028.html原文链接:https://javaforall.net
