MindMap:大模型结合知识图谱,提供透明的推理路径

 


提出背景

论文:https://arxiv.org/pdf/2308.09729

代码:https://github.com/wyl-willing/MindMap

MindMap 通过结合知识图谱提供实时知识更新和透明的推理路径,相比传统LLM在处理复杂查询时显著提升了准确性、透明度和解释能力。

1. 知识更新与整合

  • 传统LLM:通常依赖于固定的预训练数据,难以实时更新或整合新知识。
  • MindMap:通过动态接入知识图谱(KG),能够实时更新和引入新的、结构化的知识,提高模型的时效性和相关性。

2. 信息准确性与幻觉问题

  • 传统LLM:可能会生成不准确的信息或“幻觉”,特别是在数据稀疏或模型训练不足的领域。
  • MindMap:利用知识图谱作为验证工具,减少错误信息的生成,增加输出的可靠性。

3. 推理透明度与解释性

  • 传统LLM:作为“黑盒”模型,其决策和推理过程往往缺乏透明度和易于理解的解释。
  • MindMap:通过构建可视化的思维图,显著提高模型的透明度,使推理过程可追踪,易于理解。

4. 处理复杂查询的能力

  • 传统LLM:在处理需要多实体关联和多步骤逻辑推理的复杂查询时可能表现不足。
  • MindMap:结合LLM的自然语言处理能力和KG的结构化数据,强化了模型处理复杂、多变量查询的能力。

5. 系统灵活性和扩展性

  • 传统LLM:对于新领域或特定类型的任务需要重新训练或微调,这可能是资源密集和时间消耗大的。
  • MindMap:通过模块化的知识图谱集成,可以更灵活地添加或修改知识领域,快速适应新的应用场景。

MindMap通过创新性地融合知识图谱和大型语言模型,克服了单纯依赖LLM处理复杂查询时的多种限制,为用户提供了更精确、可靠、透明和解释性强的解决方案。

MindMap = 基于邻居的证据探索 + 基于路径的证据探索 + 证据整合 + 推理与生成

在这里插入图片描述
这张图展示了MindMap方法的整体架构,分为两个主要部分:证据图挖掘和证据图聚合,以及基于思维导图(树思维链)的LLM推理。

左侧部分:证据图挖掘(Evidence Graph Mining)

  1. 问题(Question)
    • 示例问题:“医生,我最近感觉非常疲倦,腹部肿胀和触痛,并且眼睛有黄疸。这可能是肝脏问题吗?”
  2. 关键词(Keywords)
    • 从问题中提取的关键词包括:肝脏问题(Liver problem)、疲劳(Fatigue)、腹部肿胀(Abdominal swelling)、腹部触痛(Abdominal tenderness)、黄疸(Jaundice)。
  3. 实体识别(Entity Recognition)
    • 通过BERT相似度匹配,从提取的关键词和外部知识图谱中找到相关实体,形成Vq。
  4. 基于路径的证据图探索(Path-based Evidence Graph Exploration)
    • 详细展示了如何通过多跳路径探索找到相关实体和路径的过程。
  5. 基于邻居的证据图探索(Neighbor-based Evidence Graph Exploration)
    • 通过一跳邻居探索找到相关实体和证据图的过程。

右侧部分:证据图聚合(Evidence Graph Aggregation)

  1. 证据图聚合(Evidence Graph Aggregation)
    • 将路径证据图和邻居证据图整合,形成推理图(Reasoning graph)。
  2. 推理图(Reasoning graph)
    • 示例推理过程:疲劳可能是肝硬化的症状,肝硬化可能导致胃胀,胃胀也可能是肝癌的症状等。
  3. 输出(Outputs)
    • Output1:总结(Summary):基于症状描述,患者可能患有肝硬化,需要进行血液测试,推荐使用抗病毒药物。
    • Output2:推理过程(Inference process):详细描述了推理的每一步,包括从症状到可能疾病的路径。
    • Output3:决策树(Decision tree):展示了患者症状到最终诊断结果的思维导图,清晰地展示了推理过程。

这张图提供了MindMap方法的概览,左侧部分展示了证据图挖掘的各个组件,右侧部分展示了证据图聚合和基于思维导图的LLM推理。

通过结合基于邻居和路径的证据探索,MindMap能够生成准确且有理由的答案,并通过图形化的推理过程提供透明的解释。

MindMap = 基于邻居 (关键实体识别+邻居节点扩展+相关节点筛选) + 基于路径 (关键路径识别+路径证据图构建+多跳信息整合)

邻居证据探索
  • 特点:专注于邻近节点的探索,通过扩展每个节点到其直接邻居节点,来发现与查询相关的知识。
  • 优势:在提高事实准确性方面表现较好,因为它能够通过邻近的相关节点快速找到准确的知识。
  • 缺点:在处理需要跨越多个节点(多跳)的复杂答案(如药物和测试推荐)时,表现不佳。
路径证据探索
  • 特点:通过探索从一个节点到另一个节点的路径,发现中介路径来连接查询中的重要实体。
  • 优势:在查找相关外部信息方面表现较好,特别是在需要综合多个相关节点的信息时。
  • 缺点:在处理需要精准的单步答案时,可能会因为路径过长而降低准确性。
证据整合
  • 特点:将邻居和路径证据图整合为一个统一的综合证据图。
  • 优势:能够将多种来源的证据整合,形成更全面的知识图谱,提高推理的全面性和准确性。
  • 缺点:需要处理和消除冗余信息,可能增加计算复杂性。
推理与生成
  • 特点:基于综合证据图进行推理,生成准确且带有理由的答案。
  • 优势:生成的答案更加可信,因为推理过程透明且可追溯。
  • 缺点:需要较强的计算能力来处理复杂的推理过程。

MindMap通过结合这两种方法,能够充分利用它们各自的优势,达到更好的性能和鲁棒性:

  • 减少幻觉:结合路径和邻居的证据探索方法,能够有效减少生成答案中的幻觉。
  • 提高准确性:利用邻居证据探索的高准确性,确保回答的基本正确性。
  • 增强多跳推理能力:利用路径证据探索的多跳推理能力,处理复杂的查询任务,如药物和测试推荐。

基于邻居的方法,在提高事实准确性方面比基于路径的方法更有效。

对于涉及医学查询的任务,基于路径的方法在查找相关外部信息方面更好,但在处理诸如药物和测试推荐等多跳答案时表现不佳。

  • 基于邻居的方法适合处理直接相关和单步答案的查询(简单症状查询、单一测试推荐)
  • 基于路径的方法更适合处理复杂、多因素相关的查询(复杂疾病诊断、药物推荐)。

MindMap的优越表现主要来自于它能够灵活结合邻居和路径两种证据探索方法,从而在不同类型的任务中都能表现出色。

这种综合方法确保了系统在处理简单和复杂查询时都能提供准确且合理的答案。

 

假设有一个用户查询:“患者最近一直感到疲劳,并且腹部肿胀,可能是什么问题?”

邻居证据探索

  • 回答:"疲劳"和"腹部肿胀"可能与"肝硬化"相关。
  • 过程:模型扩展到直接邻居节点,找到"疲劳"和"腹部肿胀"与"肝硬化"的直接关联。

路径证据探索

  • 回答:"疲劳"和"腹部肿胀"可能与"肝硬化"或"肝癌"相关。
  • 过程:模型探索从"疲劳"和"腹部肿胀"到"肝硬化"和"肝癌"的中介路径,发现多个可能的关联。

MindMap(结合邻居和路径)

  • 回答:"疲劳"和"腹部肿胀"可能与"肝硬化"相关,需要进行"血液测试"以确认,且可能需要"抗病毒药物"治疗。
  • 过程
    1. 邻居证据探索:模型找到"疲劳"和"腹部肿胀"与"肝硬化"的直接关联。
    2. 路径证据探索:模型发现从"疲劳"和"腹部肿胀"到"肝硬化"和"肝癌"的中介路径。
    3. 证据整合:整合邻居和路径信息,确定最相关的疾病。
    4. 推理与生成:基于综合证据图,生成详细的诊断建议,包括"血液测试"和"抗病毒药物"。

推理过程

在这里插入图片描述

这张图片详细展示了MindMap框架在处理用户健康查询时的具体工作流程和推理过程。

1. 用户查询 (Question Query)
  • 用户输入一个问题,描述了自己的症状:“疲劳、腹胀、触痛、黄疸等”,并询问是否可能是肝脏问题。
2. 首次LLM处理(实体识别和初步推理)
  • 提取关键症状和潜在疾病:LLM识别用户输入中的关键症状(如疲劳、腹胀、触痛、黄疸)和可能的相关疾病(如肝脏问题、肝癌等)。
  • 初步推理和证据图构建:系统生成路径证据图(path evidence graph)和邻居证据图(neighbor evidence graph),显示症状与潜在疾病之间的关联。
3. 证据图聚合 (Merged Reasoning Graph)
  • 路径证据图:展示了从疲劳到肝硬化、肝癌的可能路径,包括相关症状和需要的医疗测试。
  • 邻居证据图:展示了其他相关的症状和疾病之间的关系,例如黄疸与胆结石之间的关系。
  • 合并推理图:结合路径证据图和邻居证据图,形成一个综合推理图,显示所有相关信息和推理路径。
4. 第二次LLM处理(生成输出)
  • Output 1:摘要:基于描述的症状,生成一个摘要,指出患者可能患有肝硬化,并需要进行血液测试等推荐的医疗措施。
  • Output 2:推理过程:详细说明推理步骤,例如从“疲劳”推导出可能是“肝硬化”的症状,并进一步推导出需要的测试和医疗措施。
  • Output 3:思维导图:生成一个思维导图,显示推理过程中的各个步骤和逻辑关系,例如患者感觉到疲劳,这可能是肝硬化的症状,进一步需要进行血液测试等。

在这里插入图片描述

 
MindMap分为三个主要部分。

3.1 步骤I:证据图挖掘

在这一阶段,我们需要从外部知识图谱(KG)中发现与问题相关的证据子图。具体步骤如下:

3.1.1 实体识别
  • 目标:从用户输入的问题查询(Q)中识别关键实体。
  • 过程
    1. 构建提示:提示包含三个部分:待分析的问题、模板短语“The extra entities are”和两个示例。详见附录D的表9。
    2. 使用LLM识别实体:应用BERT相似度匹配实体和关键词。具体步骤如下:
      • 将LLM提取的所有关键词实体(M)和外部知识图谱中的所有实体(G)编码为稠密嵌入(HM和HG)。
      • 计算它们之间的余弦相似度矩阵。
      • 对于每个关键词,找到相似度最高的实体集(Vq),以便在下一步中构建证据子图。
3.1.2 证据子图探索
  • 目标:基于识别出的实体(Vq)从知识图谱中构建证据子图(Gq)。
  • 过程
    1. 定义源知识图谱:G = {⟨u, r, o⟩ |u ∈ ψ, r ∈ φ, o ∈ L },其中ψ、φ和L分别代表实体集、关系集和文本集。
    2. 构建证据子图:使用两种方法:
      • 基于路径的探索:追踪知识图谱中的中介路径以连接查询中的重要实体。
        • 从Vq中的某个节点出发,探索最多k跳的连接节点,直到所有路径段连接在一起,形成子图集Gpath q。
      • 基于邻居的探索:通过扩展每个节点到其邻居节点来添加相关知识。
        • 添加三元组{(n, e, n′)}到Gnei q中。
    3. 更新和修剪子图
      • 新增中间节点更新Vq。
      • 通过聚类和采样对Gpath q和Gnei q进行修剪,以管理信息过载并保持多样性。
    4. 结果:生成最终的证据图Gq,优化信息同时保持多样性。

3.2 步骤II:证据图聚合

在此阶段,LLM需要将不同的证据子图(Gq)整合为一个统一的推理图(Gm)。

3.2.1 整合步骤
  • 目标:将多样的证据子图整合为统一的推理图(Gm)。
  • 过程
    1. 提取子图:从前一步中提取至少k个基于路径和k个基于邻居的证据子图。
    2. 格式化子图:将每个子图格式化为实体链(例如“(Fatigue, Nausea) - IsSymptomOf - LiverProblem”),并分配序列号(如P1、P2、N1、N2)。
    3. 提示LLM转换实体链:使用附录D表10中的模板,将每个实体链转换为自然语言描述,并定义为推理图Gm。
    4. 优势:简化子图为捕捉关键信息的简洁一致格式,并利用LLM的自然语言理解和生成能力统一语义相似的实体,解决潜在歧义。

3.3 步骤III:LLM结合思维导图进行推理

在此步骤中,我们使用推理图(Gpath m和Gnei m)提示LLM生成最终输出。

3.3.1 图推理提示
  • 目标:生成思维导图并找到最终结果。
  • 过程
    1. 提示组件:包含五个部分:系统指令、问题、证据图Gm、思维图指令和示例。
    2. 构建思维导图:使用Langchain技术指导LLM理解和增强输入,构建自己的推理思维导图,并索引思维导图的知识来源。提示模板详见图3。
    3. 生成最终答案:包括摘要答案、推理过程和显示图推理路径的思维导图。
3.3.2 LLM与KG知识的协同推理
  • 目标:利用LLM和知识图谱(KG)的知识进行协同推理。
  • 过程
    1. 语言理解:LLM能够理解并提取Gm和自然语言查询中的知识。
    2. 知识推理:LLM能够进行实体消歧,并基于由Gm构建的思维导图生成最终答案。
    3. 知识增强:LLM能够利用其隐含知识扩展、连接和改进与查询相关的信息。

逻辑关系拆解:

  • 目的:生成思维导图并进行推理。
  • 解法拆解
    • 子解法1:识别关键实体
      • 之所以用实体识别子解法,是因为它能确定查询中的重要信息。
    • 子解法2:构建证据子图
      • 之所以用证据子图子解法,是因为它能提供与查询相关的背景知识。
    • 子解法3:整合证据图
      • 之所以用证据图整合子解法,是因为它能统一信息,简化推理过程。
    • 子解法4:提示LLM生成思维导图
      • 之所以用思维导图子解法,是因为它能直观展示推理过程并生成最终答案。

 

举个例子。

步骤一:证据图挖掘

  • 场景:如果用户询问“糖尿病的常见并发症有哪些?”
  • 操作:系统首先识别出“糖尿病”作为关键实体,并通过路径探索和邻居探索在知识图谱中查找与糖尿病直接相关的并发症实体,如“视网膜病变”、“肾病”和“神经病变”。
  • 结果:这一步生成多个证据子图,展示糖尿病与各种并发症之间的直接联系和潜在路径。

步骤二:证据图聚合

  • 场景:整合从第一步得到的所有相关证据子图。
  • 操作:将不同的证据子图聚合成一个统一的推理图(Gm),这个图将详细展示糖尿病及其并发症之间的关系。
  • 结果:推理图帮助LLM全面理解糖尿病及其并发症的复杂关系,提供一个结构化的知识框架以支持更精确的输出。

步骤三:LLM在思维图上的推理

  • 场景:利用构建的推理图进行深入推理,回答用户的原始问题。
  • 操作:LLM结合推理图和自身的隐含知识,通过语言理解、知识推理和知识增强,生成关于糖尿病并发症的详细解答。
  • 结果:生成的答案不仅列出了糖尿病的常见并发症,还可能包括预防和治疗这些并发症的建议,提供了准确而深入的医疗信息。

应用可能的问题

思想实验,在实际场景可能遇到的问题:

  • 节点堆积
  • 大量无用文本和推理速度变慢
  • 大量相似度节点
  • 提示词写死无法适配环境

    我们将具体问题按逻辑关系进行拆解,并逐步提出详细的解决方案。

主要问题

  1. 节点堆积
  2. 大量无用文本
  3. 推理速度变慢
  4. 大量相似度节点
  5. 提示词写死,无法适配环境
  6. 可靠性问题,没有机制,去复验生成结果的
解决节点堆积问题
  • 子解法1:优化节点选择算法
    • 原因:确保仅选择最相关的节点,减少不必要的节点堆积。
    • 步骤
      1. 使用基于重要度评分的过滤器。
      2. 实现节点权重动态调整算法,确保关键节点优先处理。
  • 子解法2:引入节点压缩技术
    • 原因:通过合并相似节点,减少节点数量。
    • 步骤
      1. 使用聚类算法合并相似节点。
      2. 定期清理冗余节点,保持节点集合精简。
减少无用文本
  • 子解法1:改进文本生成规则
    • 原因:确保生成的文本与查询密切相关。
    • 步骤
      1. 在生成过程中加入上下文相关性检测。
      2. 设定生成文本的质量门槛,过滤低质量文本。
  • 子解法2:增强文本过滤机制
    • 原因:有效过滤掉无关或低质量的文本。
    • 步骤
      1. 使用自然语言处理(NLP)技术对生成文本进行语义分析。
      2. 实现自动过滤无关内容的算法。
提高推理速度
  • 子解法1:优化推理算法
    • 原因:加速推理过程,减少处理时间。
    • 步骤
      1. 实现并行处理机制,分段推理。
      2. 使用缓存机制存储常用推理路径,减少重复计算。
  • 子解法2:精简推理路径
    • 原因:减少推理路径中的冗余步骤。
    • 步骤
      1. 使用优化算法精简推理路径。
      2. 定期评估和更新推理路径,保持路径高效。
减少相似度节点
  • 子解法1:改进相似度计算方法
    • 原因:确保相似度计算更加精准,减少相似度节点的生成。
    • 步骤
      1. 使用更高级的相似度计算算法(如BERT)。
      2. 实现动态相似度阈值调整,确保相似度节点的准确性。
  • 子解法2:引入相似节点合并机制
    • 原因:通过合并相似节点,减少重复信息。
    • 步骤
      1. 使用聚类算法合并相似节点。
      2. 实现节点合并后的信息整合算法。
优化提示词设计
  • 子解法1:使用动态提示词生成
    • 原因:确保提示词能够适应不同查询环境。
    • 步骤
      1. 实现基于上下文的提示词动态生成算法。
      2. 使用机器学习模型预测最优提示词组合。
  • 子解法2:定期更新提示词库
    • 原因:保持提示词库的最新和适应性。
    • 步骤
      1. 定期收集和分析用户查询,更新提示词库。
      2. 实现自动化提示词测试和验证机制。
优化节点选择算法
  • 目的:解决节点堆积问题
    • 子解法1:优化节点选择算法
      • 原因:确保仅选择最相关的节点,减少不必要的节点堆积。
      • 步骤
        1. 使用基于重要度评分的过滤器:通过为每个节点分配重要度评分,过滤掉低重要度节点。
        2. 实现节点权重动态调整算法,确保关键节点优先处理:根据上下文动态调整节点的权重,优先处理最关键的节点。
可靠性问题,没有机制,去复验生成结果的

少了评估校准,这个工作流是很理想化。

到了真正工作的过程中,需要一个机制,去复验生成结果的。

目前想法是,树RAG + 树TOT 交叉验证。

最近更新

  1. TCP协议是安全的吗?

    2024-06-13 06:16:03       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-13 06:16:03       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-13 06:16:03       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-13 06:16:03       18 阅读

热门阅读

  1. Mysql union语句

    2024-06-13 06:16:03       4 阅读
  2. 苹果宣布iOS18开始深度集成AI

    2024-06-13 06:16:03       8 阅读
  3. Axios 二次封装详解

    2024-06-13 06:16:03       7 阅读
  4. vscode不能进行go跳转

    2024-06-13 06:16:03       8 阅读
  5. 全角半角以及Normalizer

    2024-06-13 06:16:03       8 阅读