写在论文前
论文地址
该论文发表在 CCF A类会议 ACL ,来自 伊利诺伊大学香槟分校
实际上基于知识图谱增强盛模子已经有了很多方法,最经典的应该是 Microsoft 的 GraphRAG
但是该论文做了一些更加精细的图增强,比方路径+子图的证据子图, 以及基于,值得亲自阅读和学习
Motivation
Problem Now
现在LLM在天生和推理时遇到的问题:
- 不机动。预训练的LLM知识陈旧,参数更新不机动。 虽然有很多微调大模子的技术,比方LoRA,但是这些微调需要大量高质量的数据,并且训练需要耗费大量GPU,更重要的是,微调大概造成灾难性忘记,导致模子崩塌
- 幻觉。 LLM本质上是基于现有的token分布猜测下一个token的联合概率密度,因此大概会因为训练数据的问题输出错误,虚假和有害的信息。
- 黑盒。 虽然基于自注意力机制的Transformer在推理时可以根据注意力系数来大概了解模子如何进行推理,但是LLM堆叠了太多的Transformer层,导致通过注意力系数来了解大模子的推理很困难
Related Work
为了解决以上提到的LLM的三个问题,人们提出了一些方法
- prompt engineering(提示工程): 从上文提到的LLM的本质来说, 只要提供充足明确的上下文和精心设计的指令(Prompt),就可以让模子规避掉环境问题,并且这是few-shot以致是zero-shot的(只需要很少的数据,以致是不需要数据)。一般提示工程不是一次性让模子输出全部结果,而是通过 chain of thought 的方法,一步一步引导模子进行推理,终极输出正确答案
- Retrieval-augmented generation(检索增强天生,RAG): RAG的焦点思想与Prompt Engineering 雷同,但是Prompt并不全是人为设定了,而是通过从数据库(通常是向量数据库,因为查找相似度很快)检索与问题相关文档来作为上下文提供给模子,但是文档大概很长,因此不符合LLM的上下文长度限定。虽然我们可以构建长文档作为提示,但LLM通常无法在提示的中间捕捉信息并产生幻觉。
- Graph RAG: 知识图谱是信息密度极高的数据库,因此作为RAG检索的对象不会造成冗余的信息和上下文太长的问题。但是现有的Graph RAG 都是直接把检索的三元组以 plain text 的情势输入给LLM,忽略了图结构的信息。
因此,基于chain of thought ,Graph RAG 以及 Prompt Engineering, 作者提出了一个即插即用的 Graph Prompt 框架,可以实用于LLM APIs 来增强盛模子的终极答复。
![[minmap-motivation.png]]
Method
MindMap 方法的焦点思想是将外部知识图谱中的信息转化为雷同“头脑导图”的结构,引导 LLM 进行更有效、更透明的推理。 该方法重要包含三个步骤:
- 证据图谱发掘: 从知识图谱中检索与输入问题相关的子图。 这包罗实体辨认、基于路径和邻居的子图构建以及子图剪枝
- 证据图谱聚合: 将多个证据子图整合到一个同一的推理图谱中。 这通过将子图转换为自然语言描述,然后利用 LLM 将这些描述整合到一个连贯的叙述中来实现。
- 基于头脑导图的 LLM 推理: 将聚合后的推理图谱作为上下文输入 LLM,引导 LLM 进行推理并天生终极答案和表明。 LLM 会天生一个“头脑导图”来表明其推理过程,展示其如何利用知识图谱中的证据进行推理
证据图发掘
证据图发掘由实体辨认和证据子图索(大概会裁剪一些子图)构成
实体辨认: 使用LLM从问题 Q Q Q中提取一些关键实体 V q V_{q} Vq , 实际上这一步采用的Prompt Engineering来增强LLM对于实体辨认的效果,比方
- Learn to extract entities from the following medical answers: <一个构建的示例>
- Learn to extract entities from the following medical questions: <一个构建的示例>
复制代码 完整Prompt Engineering在附录中
这一步可以根据自己的任务替换Prompt,因为作者重要是在医学问答数据集上进行测试,因此提供的Prompt都是与医学相关的
证据子图探索: 根据实体辨认提取的关键实体 V q V_{q} Vq,通过两种方式天生 连接关键实体的子图:
- 基于路径的探索: 选择 N q 0 N_{q}^0 Nq0中的一个节点作为起始节点 n 1 n_1 n1。将别的节点放置在候选节点集中 N c a n d N_{cand} Ncand。从 n 1 n_{}1 n1最多探索 k k k个跃点以找到下一个节点 n 2 n_2 n2,其中 n 2 ∈ N c a n d n_2\in N_{cand} n2∈Ncand。如果在 k k k个跃点内乐成到达 n 2 n_2 n2,则将开始节点更新为 n 2 n_2 n2并从 N c a n d N_{cand} Ncand中删除 n 2 n_2 n2。如果在 k k k 个跃点中找不到 n 2 n_{}2 n2,则将迄今为止获得的路径段连接起来并存储在 G q p a t G_{q}^{pat} Gqpat中。然后从 N c a n d N_cand Ncand中选择另一个节点 n 1 ′ n_1′ n1′作为新的开始节点,并从 N c a n d N_{cand} Ncand中删除 n 1 n_1 n1和 n 2 n_2 n2。(b) 检查 N c a n d N_{cand} Ncand是否为空。如果不为空,则迭代步骤1以查找路径的下一段。如果为空,则连接所有段以构建一组子图,并将它们放入 G q p a t G^{pat}_{q} Gqpat中。
- 基于一阶邻居的探索: 基于邻居的探索通过将Nq中的每个节点 n n n扩展到其邻居1-hop,将三元组 ( n , e , n ′ ) (n,e,n′) (n,e,n′)添加到 G q n e i G_{q}^{nei} Gqnei,从而增加相关知识
有大概会出现的环境是,证据子图探索提取了太多的子图,会导致LLM无法精确辨认一些关键的子图,从而导致模子答复牛头不搭马嘴。因此需要对子图进行裁剪,详细方式为聚类: 对所有提取到的子图进行聚类,然后把取一部分作为终极天生的结果。
证据图聚合
要天生终极的附加知识子图输入,从 最少 k k k 个 基于路径的子图和基于一阶邻居的子图 中提取三元组, 比方 ( F a t i g u e , N a u s e a ) − i s S y m p o t o m O f − L i v e r P r o b l e m (Fatigue,Nausea)-isSympotomOf-LiverProblem (Fatigue,Nausea)−isSympotomOf−LiverProblem ,然后将他们构成一个序列 P 1 , P 2 , ⋯ P n , N 1 , N 2 , ⋯ N n P_{1},P_{2},\cdots P_{n},N_{1},N_{2},\cdots N_{n} P1,P2,⋯Pn,N1,N2,⋯Nn ,然后使用 提示词工程 让LLM把这些序列转换成 自然语言。
- There are some knowledge graph path. They follow entity-> relationship->entity format. \n\n {Path} \n\n Use the knowledge graph information. Try to convert them to natural language, respectively. Use single quotation marks for entity name and relation name. And name them as Path-based Evidence 1, Path-based Evidence 2,...\n\n
复制代码 这里有两个地方需要注意:
- 为什么要转换成自然语言: 个人理解: 因为LLM实际上训练的数据是自然语言,RAG,Prompt Engineering和chain of thought都是希望更好的提取LLM中已经存储的知识,因此自然语言更加符合LLM的训练数据的结构。 作者给出的表明: 它将子图简化为一种简便同等的格式,以捕捉基本信息。(b) 它利用LLM的自然语言理解和天生能力来同一语义相似的实体并解决潜伏的歧义。
- 会不会面临和Graph RAG一样的窘境: 实际上序列 P , N P,N P,N里面已经包含了图的结构信息,基于游走的 P P P 序列包含了路径的远距离图结构,而基于邻居 N N N则是直接表现包含了一阶子图的局部图结构信息。二者相互结合,可以综合增强LLM对于图结构的理解
LLM头脑导图推理
为了天生头脑导图,作者采用几个Prompt 来 引导模子天生:
- 系统指令,通用的AI Prompt,一般是指定AI扮演的角色,比方: You are an excellent AI doctor, and you can diagnose diseases and recommend medications based on the symptoms in the conversation
- 问题: 用户输入的提问
- 证据图 G m G_{m} Gm: 通过证据图聚合产生的自然语言
- 头脑图指令: 通过 LangChain 来增强推理,
- 示例: 虽然说作者论文中提到了exemplar (示例) 来增强输出,但是实际上作者在附录中提供的示例是用来增强 实体提取,但是据我所知,示例对于LLM的输出增强效果是很大的,好的示例可以直接让模子对着示例的结构进行输出,并且这种示例实际上也是一种基于 LangChain 的Prompt Engineering.
实行
作者使用的是 ChatDoctor 和 QASystemOnMedicalKG 的json 来自己构建了两个知识图谱: EMCKG 和 CMCKG。
bechmark
- GenMedGPT-5k: 这是一个包含 5000 个医学问答对的数据集,涵盖了各种医学主题和难度级别。
- CMCQA: 这是一个中文医学问答数据集,用于评估模子在中文医学范畴的性能。
- ExplainCPE: 这是一个包含临床实践考试 (CPE) 题目的数据集,需要模子进行更复杂的推理和表明。
baseline
- 仅使用 LLM (GPT-3.5 和 GPT-4): 直接使用 LLM 答复问题,不结合任何外部知识或推理方法。这是最基本的基线,用于评估 LLM 自身的推理能力。
- 头脑链 (Chain-of-Thought,CoT) 和头脑树 (Tree-of-Thought,ToT): 这两种方法通过特定的提示引导 LLM 进行多步推理。
- 检索增强型 LLM (Retrieval Augmented LLM): 这组方法起首从外部知识库中检索相关信息,然后将检索到的信息作为上下文输入 LLM。作者使用了三种差别的检索方法:
- BM25 retrieval: 基于关键词匹配的传统检索方法。
- 文本嵌入 retrieval: 基于语义相似度的检索方法。
- 知识图谱 retrieval: 直接从知识图谱中检索相关信息。
Metrics:
作者使用了 Win/Tie/Lose 的评判标准来比力差别模子的性能。 这是一个相对简朴的评判标准,用于比力两个模子在同一问题上的答复质量。 详细来说:
- Win: MindMap 模子的答案比基线模子的答案更好。
- Tie: MindMap 模子和基线模子的答案质量相称,无法区分优劣。
- Lose: MindMap 模子的答案不如基线模子的答案。
答复质量评判用的 GPT-4来确定的,实际上 GPT-4 表现性能要远高于作者采用的所有baseline,以及作者自己的方法,因此用GPT-4来评价是合理的
此外,还有一些其他的标准:
- 在 数据集ExplainCPE上的 问答准确率
- 使用bert评分GPT-4与其他模子的答复质量对比(语义相似度)
结果
win-tie-lose测试结果:
问答准确率
有个风趣的地方是,LLM-only的GPT-3.5 比 KG Retrieve 和 BM25 Retriever增强的LLM性能还好。作者给出的表明是这种差异源于不匹配的外部知识,导致对语言模子(LLM)的误导性影响。该模子通常依靠于检索到的知识,当不准确时,LLM大概会产生错误。
实际上这也是RAG的一个重大缺陷,由于引入了大量的上下文,LLM的答复基本知识基于RAG的结果,LLM本身的知识在推理时被 上下文粉饰了
与GPT-4的答复盘算bert得分
溶解实行
案例
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |