原文链接:【RAG探索第4讲】KG+RAG丨基于生物医学知识图谱优化的大型语言模型提示生成方法
一、现有问题:
LLMs在处理特定领域或高度专业化查询时缺乏专业知识,导致回答不够准确和可靠。
LLMs可能会产生事实错误(即幻觉)和过时的知识。
如何在减少与LLMs的交互次数的同时,将用户输入与高质量的结构化知识对齐,并过滤掉检索到的信息中的噪声。
PS:针对上述问题,一般有两种解决方向
一是采用预训练和领域特定微调的解决方案,即利用特定领域的数据集对预训练好的模型进行微调。
二是采用将相关知识构建prompt提示工程,将用户提问涉及到的相关知识进行组合连同问题一起输入到大模型中,这种方式相较于预训练微调的方法而言计算量更小,而且泛化性更强。
二、论文成果:
这篇论文的作者提出了一种KG-RAG框架,这个KG-RAG框架涉及从用户提示中识别实体,从知识图谱中提取生物医学概念,提示感知上下文生成,转换成自然语言,提示组装和答案检索,并且作者对这种方法的性能在不同的场景下进行了广泛测试。实验结果表明KG-RAG框架将生物医学知识图谱SPOKE与大型语言模型相结合,有效的提升了LLM在医疗领域的问答效果。
三、KG-RAG框架工作原理:
KG-RAG框架的工作原理包括以下步骤:
1实体识别:从用户输入的query中识别出疾病实体,然后在SPOKE知识图谱中找到相应的节点。
2上下文提取:从SPOKE知识图谱中提取与疾病节点相关的上下文信息,并将其转换为自然语言。
3提示组装:将提取的上下文与原始prompt结合。
4文本生成:使用LLM(如Llama-2-13b、GPT-3.5-Turbo或GPT-4)生成有意义的生物医学文本。
3.1实体识别:
传统的命名实体识别都是用专门的小模型去做NER(如BI-LSTM-CRF),KG-RAG是使用LLM识别实体。
实体抽取
在KG-RAG框架中,实体抽取是通过零样本提示(zero-shot prompting)实现的。研究人员设计了一个高效的抽取prompt,引导大型语言模型(如GPT-3.5-Turbo)从输入文本中提取疾病实体,并将结果以JSON格式返回。
bash
DISEASE_ENTITY_EXTRACTION如下:
You are an expert disease entity extractor from a sentence and report it as JSON in the following format:
Diseases: <List of extracted entities>
Please report only Diseases. Do not report any other entities like Genes, Proteins, Enzymes etc.
实体链接
疾病实体抽取出来后,下一步就是将这些实体与SPOKE知识图谱中的疾病实体进行匹配,也就是传统NLP任务中的实体链接,KG-RAG这个框架中采用的方法是用语义相似度的方式来做。
(1)实体embedding计算:首先,使用Embedding模型(作者使用的是'all-MiniLM-L6-v2')为SPOKE知识图谱中的所有疾病概念节点计算embedding向量
(2)将计算出的疾病embedding存储在向量数据库(作者使用的是'Chroma')中,以便快速检索。
(3)语义搜索匹配:将LLM提取的疾病实体与向量数据库中的疾病实体进行比较,选择最相似的(向量相似度计算)
PS:实体识别时零样本方法未能识别出疾病实体,采取的办法是直接拿原始query去匹配,取top 5。
最终,实体匹配过程会输出与输入文本提示中的疾病实体最相关的SPOKE知识图谱节点。这些节点及其相关信息将用于后续的上下文提取和文本生成步骤。通过这种方法,KG-RAG框架能够有效地从专业文本中提取和识别疾病实体,并将其与丰富的生物医学知识库相连接,从而生成准确、可靠的生物医学相关信息。
上下文提取
子图查询
在得到具体的实体后,紧接着就是从KG中去查询这个实体关联的子图,这些信息通常以三元组(Subject, Predicate, Object)的形式存在,表示不同的生物医学关系。通常情况下,可以查询1~3跳内的三元组信息,这里借助图数据库可以比较容易的实现。
得到的三元组信息,LLM可能不太能比较好的理解,这里就需要将三元组(主体、谓词、客体)转换成自然语言(英语),以便与输入提示结合并用于后续的文本生成。如:
(Disease hypertension, ASSOCIATES_DaG, Gene VHL) → Disease hypertension associates Gene VHL
PS:这里作者预先定义了三元组转成自然语言的转换规则。
上下文剪枝
在KG-RAG框架中,Context Pruning(上下文剪枝)是一个关键步骤(这里的剪枝就是减少给LLM的信息,减少token数量)可以过滤掉一些无用信息,提升LLM回答的精确性。
作者使用的剪枝方法是使用embedding模型计算三元组和query的cos相似度,然后根据下面的规则进行选择:
条件一:上下文关联的余弦相似度必须大于包含所有与所选疾病节点相关的上下文的相似度分布的75%分位(相似度75%以上)
条件二:余弦相似度的最小值必须达到0.5
通过这个0.5 和 75%,可以有效减少给LLM的无效信息,有助于提高后续文本生成的准确性和相关性。
提示组装
将用户提问和提取到的上下文信息组合为propmt,再加上SYSTEM_PROMPT,送给LLM回答:
SYSTEM_PROMPT如下:
bash
# One-Hop Validation
SINGLE_DISEASE_ENTITY_VALIDATION: |
You are an expert biomedical researcher. For answering the Question at the end, you need to first read the Context provided.
Then give your final answer by considering the context and your inherent knowledge on the topic. Give your answer in the following JSON format:
{Compounds: <list of compounds>, Diseases: <list of diseases>}
# Two-Hop Validation
TWO_DISEASE_ENTITY_VALIDATION: |
You are an expert biomedical researcher. For answering the Question at the end, you need to first read the Context provided.
Then give your final answer by considering the context and your inherent knowledge on the topic. Give your answer in the following JSON format:
{Nodes: <list of nodes>}
问答生成:
作者使用了三个预训练的聊天模型:Llama-2-13b,GPT-3.5-Turbo和GPT-4。具有130亿参数和4096个标记大小的Llama模型被下载并部署在Amazon Elastic Compute Cloud(EC2)GPU P3实例中。通过OpenAI API访问GPT模型。由于GPT模型的参数数量比Llama更高,提供了比较KG-RAG性能作为LLM大小函数的机会,以其参数数量为准。在这项研究中,对于所有LLM,设置了控制LLM输出中随机性水平的"温度"参数为0。
HyKGE: A Hypothesis Knowledge Graph Enhanced Framework for Accurate and Reliable Medical LLMs Responses
HyKGE整体模型
HyKGE框架的核心思想是在检索前阶段利用LLMs的零样本(zero-shot)能力和丰富知识来扩展KGs中的探索方向,并通过精心设计的提示(prompt)增强LLMs回答的密度和效率。具体来说,HyKGE包含以下几部分:
- 假设输出模块(HOM):利用LLMs生成假设输出,补偿用户查询的不完整性。
- 命名实体识别模块(NER Module):从假设输出和用户查询中提取医疗实体。
- 知识图谱检索模块:使用提取的实体作为锚点,搜索知识图谱中的推理链。
- HO片段粒度感知重排模块:在检索后阶段,通过使用假设输出的片段和用户查询来重排和过滤检索到的知识,以保持多样性和相关性的平衡。(过滤噪声知识)
假设输出模块:
利用LLMs的零次学习(zero-shot)能力,生成与查询相关的假设输出,这些假设输出可以作为在知识图谱中探索新知识的起点。此模块设计了细致的提示(Prompt)格式,引导LLMs逐步深入思考问题,以弥补用户查询可能存在的信息不全。例如,提示会要求模型"作为医疗专家,缓慢思考,逐步理解并回答问题,不跳过关键步骤,全面分析问题"。通过这种方式,模型能够根据问题要求,发挥其强大的推理能力,探索与问题相关的医学知识,从而生成高质量的假设输出。这个本身要求LLM对医疗知识就有着比较强的推理能力,这里可以通过fine-tune 做知识迁移到医疗领域。
命名实体识别模块(NER模块):
作者这里是直接引入了一个专门针对医疗领域的命名实体识别模型,这个模型是利用CMEEE数据集训练的。
知识图谱检索模块:
利用匹配的实体在知识图谱中检索相关的知识路径,作者是使用密集检索方法将潜在实体链接到KG,使用GTE嵌入模型(作者说这事目前检索领域表现最好的文本向量嵌入模型)。
HOFragment粒度感知重排模块:
通过检索模块后,可以获得大量的推理链(知识图谱中的路径),然后再进行去噪(和上一篇论文的剪枝相似),这个是作者的一大创新点,这个模块主要是根据知识的相关性和多样性对检索结果进行重排,以过滤掉噪声信息,同时保持知识的多样性和相关性之间的平衡。HyKGE采用HO片段(假设性回答)重排名机制,通过分片假设性回答和用户问句,去除低密度文本,然后进行知识重排名,过滤噪声知识,保留相关且多样的检索知识。根据每条推理连的相关性,一致性和信息性进行排序。最终得到topK个推理链。作者是使用bge_reranker_large模型,通过非对称指令调优的大规模文本对进行训练,将文本映射到低维密集向量以重新排序,作者的创新在于重排时不仅考虑推理链和Q(用户查询)的相关性,同时考虑推理链和HO(假设性回答)的相关性。
总结
- 基于生物医学知识图谱的提示生成优化方法研究 本文提出了一种名为KG-RAG的框架,以解决大型语言模型(LLMs)在处理专业领域查询时缺乏准确性和可靠性的问题。KG-RAG框架通过识别用户提示中的实体,从知识图谱中提取相关上下文信息,并将其转换为自然语言提示供LLMs生成回答。实验表明,结合SPOKE知识图谱与LLMs(如Llama-2-13b、GPT-3.5-Turbo、GPT-4)可以有效提升医疗领域的问答效果,减少事实错误和过时信息的产生。该方法在计算开销和模型泛化能力上表现优异,为专业领域问答提供了高效、可靠的解决方案。
- HyKGE: 提升医疗LLM响应准确性与可靠性的假设知识图谱增强框架 HyKGE框架通过整合大型语言模型(LLMs)的零样本能力和知识图谱(KGs),在检索前扩展知识探索方向,显著提升了医疗领域问答系统的响应质量。该框架包括假设输出模块(HOM),通过精心设计的提示生成高质量的假设输出;命名实体识别模块(NER),从假设输出和用户查询中提取医疗实体;知识图谱检索模块,通过匹配实体搜索知识图谱中的推理链;以及HO片段粒度感知重排模块,过滤噪声知识并保持相关性与多样性的平衡。实验结果表明,HyKGE框架在提升医疗问答系统的准确性和可靠性方面具有显著优势。
相关阅读
【RAG探索第4讲】KG+RAG丨基于生物医学知识图谱优化的大型语言模型提示生成方法
【RAG探索第3讲】LlamaIndex的API调用与本地部署实战
【RAG探索第2讲】大模型与知识图谱的融合之路:优势互补与协同发展
【RAG探索第1讲】通过大模型读取外部文档的创新探索与自适应策略
大模型名词扫盲贴
RAG实战-QAnything
提升大型语言模型性能的新方法:Query Rewriting技术解析
一文带你学会关键词提取算法---TextRank 和 FastTextRank实践