【知识图谱+RAG+LLM】知识图谱如何融入RAG?

1.大模型与知识图谱

当下,国内外大模型落地时面临的主要问题之一是幻觉,幻觉是指大模型提供的一些不切实际或不准确的信息。解决幻觉的策略:策略一: 技术突破,提升大模型的能力。 策略二: 通过设定边界来限制大模型的输出,防止其产生不切实际的言论。知识图谱可以通过策略二改善大模型的幻觉问题。

知识图谱是一种存储信息的方式,采用实体和关系的方法来组织数据。
实体: 可以是人、地名、公司名等现实生活中的物体。 关系: 实体之间的潜在联系,如朋友关系、工作关系等。
图谱数据来源: 权威网站、 内部员工编写的文档、企业数据库等。
知识图谱的优势直观性: 通过图谱可以直观地看到实体之间的关系。信息提取: 便于从文档中提取关键实体和关系,抓住文档的核心思想。

1.知识图谱+RAG+大模型

为什么要将知识图谱融入RAG流程?

在经典的RAG流程中,对于给定的问题,我们通常会在向量数据库中搜索与之相关的chunks信息,并将这些chunks信息放入prompt中,以便进行大模型的调用。然而,这种方法可能会出现一些问题:

1.如果用户问的问题没有明确的关键词,向量数据库可能无法找到匹配的chunks。
2.简单的关键词匹配无法抓住概念之间的相关性。

知识图谱可以帮助解决这些问题,因为它不仅包含了实体(如药物、疾病等)之间的关系,还提供了更多的语义信息。

举例说明知识图谱在RAG流程中的作用

假设用户问了一个问题:“感冒常见药物有哪些副作用?” 我们希望通过向量数据库来寻找相关信息。但是,如果问题没有出现“感冒”这个词,那么可能无法匹配到正确的chunks。如果我们的向量数据库中存在一段关于“感冒冲剂”的描述,我们希望能够搜索到这一段,即使问题里没有明确提及“感冒冲剂”。

在这里,知识图谱可以帮助我们,假如我们提前知道“感冒”与“感冒冲剂”的关系,便可以通过知识图谱将用户的问题延伸到相关的领域,找到所需的信息。

如何将知识图谱融入RAG流程

  1. 定义知识图谱:知识图谱由一系列实体和关系构成。例如:“药物1”和“药物2”可以治疗“感冒”,“感冒”有一些常见症状等等。

  2. 扩展问题:在收到用户问题后,首先利用知识图谱对问题进行扩展。例如,如果用户问到“感冒常见药物有哪些副作用?”,可以通过知识图谱找到“感冒”相关的药物,如“药物1”和“药物2”,从而扩展问题为“感冒常见的药物(药物1、药物2)有哪些副作用?”

  3. 检索子图:1.使用知识图谱检索关键实体相关的子图。例如,针对此问题,可以找到“感冒”、“药物1”、“药物2”等节点组成的子图。2.提取相关的三元组,这些三元组可以转换为自然语言文本,以便进一步处理。

  4. 合并信息:将提取出的三元组转换为文本形式,并合并成完整的上下文。这需要注意去除重复信息并保持连贯性。

  5. 处理和优化:1.考虑如何更好地抽取子图,如利用二度(k-hop)抽取方法。 2.优化结构信息与文本信息的融合,确保大模型能够理解并利用这些信息。

  6. 向量数据库检索优化:将知识图谱得到的信息再次进行向量数据库的检索,进一步丰富信息。

落地中的挑战

尽管这一流程在理论上非常有效,但在实践中还面临一些挑战:

  1. 构建和维护知识图谱的复杂性:知识图谱的构建和维护是一个耗时且复杂的过程。虽然可以利用大模型进行自动化图谱生成,但质量仍需人工审查。

  2. 信息冗余与过滤:合并信息时可能出现重复,需要有效的去重机制。

  3. 有效的子图抽取:抽取子图时,需要找到一个合适的平衡点,既能覆盖足够的信息,又不会造成冗余。

  4. 大模型对结构信息的理解:对大模型进行调优,使其更好地理解并利用结构化的信息。

根据提供的引用内容,可以得知prompt+RAG的流程如下: 1. 首先,使用Retriever部分在知识库中检索出top-k个匹配的文档zi。 2. 然后,将query和k个文档拼接起来作为QA的prompt,送入seq2seq模型。 3. seq2seq模型生成回复y。 4. 如果需要进行Re-rank,可以使用LLM来rerank,给LLM写好prompt即可。 下面是一个简单的示例代码,演示如何使用prompt+RAG: ```python from transformers import RagTokenizer, RagRetriever, RagSequenceForGeneration # 初始化tokenizer、retriever和seq2seq模型 tokenizer = RagTokenizer.from_pretrained('facebook/rag-token-base') retriever = RagRetriever.from_pretrained('facebook/rag-token-base', index_name='exact', use_dummy_dataset=True) model = RagSequenceForGeneration.from_pretrained('facebook/rag-token-base') # 设置query和context query = "What is the capital of France?" context = "France is a country located in Western Europe. Paris, the capital city of France, is known for its romantic ambiance and iconic landmarks such as the Eiffel Tower." # 使用Retriever部分检索top-k个匹配的文档 retrieved_docs = retriever(query) # 将query和k个文档拼接起来作为QA的prompt input_dict = tokenizer.prepare_seq2seq_batch(query, retrieved_docs[:2], return_tensors='pt') generated = model.generate(input_ids=input_dict['input_ids'], attention_mask=input_dict['attention_mask']) # 输出生成的回复 generated_text = tokenizer.batch_decode(generated, skip_special_tokens=True)[0] print(generated_text) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值