- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
这一章我们介绍GraphRAG范式,算着时间也是该到图谱了,NLP每一轮新模型出来后,往往都是先研究微调,然后各种预训练方案,接着琢磨数据,各种主动学习半监督,弱监督,无监督,再之后就到图谱和对抗学习~ 。
前一阵Graph RAG的风吹得呼呼的,经常被问你们也Graph RAG了么?但Graph RAG虽好但并非RAG的Silver Bullet,它有特定适合的问题和场景,更适合作为RAG中的一路召回,用来解决实体密集,依赖全局关系的信息召回。所以这一章我们来聊聊GraphRAG的实现和具体解决哪些问题.
- https://graphrag-demo.deepset.ai/
我们先基于Deepset提供的Graph RAG的demo来看几个效果对比。Demo基于美股的季报构建了图谱,然后横向对比同一个问题使用GPT4-O基于图谱回答和使用朴素RAG的区别。我们来看3个Graph RAG会出现显著优势的问题类型 。
问题1:Which companies bought GPUs, write one line summary for each company 。
问题2:Compare Tesla and Apple Inc, answer the question in a structure and concise way 。
问题3: What do these reports talk about?
以上3个Demo展示了Graph RAG最核心的优势和适配的场景,范围从大到小分别是 。
- https://github.com/microsoft/graphrag
- GRAPH Retrieval-Augmented Generation: A Survey
- From Local to Global: A Graph RAG Approach to Query-Focused Summarization
阿里的graph RAG综述对GRAG的流程进行了分类,Graph RAG其实就是在RAG的召回内容中加入图谱召回,来优化回答,主要包含以下三个部分:图谱构建,图数据召回,图增强回答。所以不同Graph RAG论文的差异也主要就在以上三个部分的不同实现和排列组合,下面我们看下微软GraphRAG的具体实现.
第一步是对文档进行chunking,分块的目标是因为大模型在处理太长的上文时会导致实体抽取的召回率较低,论文对比了不同的chunk大小从600-2400字,随着chunk变大,段落中能检测到的实体量级会逐渐降低.
第二步是使用大模型对分段的内容进行实体抽取,通用领域直接使用以下指令进行未指定实体类型的广义实体(entity,type,description),和实体三元组(source,target,relation)抽取,而对于垂直领域会需要依赖few-shot来提升抽取效果。这里论文会使用模型进行多轮反思“针对抽取结果是否有未识别出的实体?”如果存在则进行补充抽取,来提升对于构建图谱最关键的实体三元组抽取的召回率.
GRAPH_EXTRACTION_PROMPT = """
-Goal-
Given a text document that is potentially relevant to this activity and a list of entity types, identify all entities of those types from the text and all relationships among the identified entities.
-Steps-
1. Identify all entities. For each identified entity, extract the following information:
- entity_name: Name of the entity, capitalized
- entity_type: One of the following types: [{entity_types}]
- entity_description: Comprehensive description of the entity's attributes and activities
Format each entity as ("entity"{{tuple_delimiter}}<entity_name>{{tuple_delimiter}}<entity_type>{{tuple_delimiter}}<entity_description>)
2. From the entities identified in step 1, identify all pairs of (source_entity, target_entity) that are *clearly related* to each other.
For each pair of related entities, extract the following information:
- source_entity: name of the source entity, as identified in step 1
- target_entity: name of the target entity, as identified in step 1
- relationship_description: explanation as to why you think the source entity and the target entity are related to each other
- relationship_strength: an integer score between 1 to 10, indicating strength of the relationship between the source entity and target entity
Format each relationship as ("relationship"{{tuple_delimiter}}<source_entity>{{tuple_delimiter}}<target_entity>{{tuple_delimiter}}<relationship_description>{{tuple_delimiter}}<relationship_strength>)
3. Return output in {language} as a single list of all the entities and relationships identified in steps 1 and 2. Use **{{record_delimiter}}** as the list delimiter.
4. If you have to translate into {language}, just translate the descriptions, nothing else!
5. When finished, output {{completion_delimiter}}.
-Examples-
######################
{examples}
-Real Data-
######################
entity_types: [{entity_types}]
text: {{input_text}}
######################
output:"""
使用以上Promtp抽取出的实体结果如下 。
有了实体三元组,就可以直接进行图谱构建了,这里graphrag直接使用NetworkX构建无向图.
有了图,下一步就是如何描述图谱信息,在大模型之前我们更多是采用模版,来把实体和实体关系信息转化成文本,而在LLM时代有了更多可能。这里微软的特色是多了一步对图谱进行划分和描述.
图谱划分,也叫社群发现,之所以要做社群发现,其实就来自GraphRag要解决全局主体,汇总类,关联类的问题,而这种问题就是通过先对全局进行层次划分,对所有局部主题(社群)都预先进行信息汇总实现的,这部分信息既包含了局部结构信息例如主营业务为GPU的有几家公司,也包含了局部语义例如抽象主题和概念.
社群发现有很多种算法, 有基于modularity,有基于层次聚类,还有基于随机游走的各种算法,这里论文选用了Leiden,是对Louvain算法的优化,也属于modularity类型的算法,会生成互斥的多个子图.
针对每个子图,会使用以下Prompt指令让模型生成社群的相关总结,这里一个子图其实就对应一个topic,可以是一个事件,一个主体相关的所有信息,一类话题等等。以下prompt除了生成summary,还会生成finding,也就对应前面提到的抽象,主题,话题类型的信息抽象.
COMMUNITY_REPORT_SUMMARIZATION_PROMPT = """
{persona}
# Goal
Write a comprehensive assessment report of a community taking on the role of a {role}. The content of this report includes an overview of the community's key entities and relationships.
# Report Structure
The report should include the following sections:
- TITLE: community's name that represents its key entities - title should be short but specific. When possible, include representative named entities in the title.
- SUMMARY: An executive summary of the community's overall structure, how its entities are related to each other, and significant points associated with its entities.
- REPORT RATING: {report_rating_description}
- RATING EXPLANATION: Give a single sentence explanation of the rating.
- DETAILED FINDINGS: A list of 5-10 key insights about the community. Each insight should have a short summary followed by multiple paragraphs of explanatory text grounded according to the grounding rules below. Be comprehensive.
.....此处省略输出格式和few-shot
"""
得到的针对每个社群的结构化总结如下,后面会把title+summary+findings['summary']+findings['explanation']整体拼接的文本作为该局部信息的总结。这里其实是整个流程中最消耗模型的部分,并且虽然论文并未提及,但是当图谱有新增节点信息时,这里的report也需要进行增量更新,需要识别到出现变更的子图,并对应去更新子图的report 。
最后就是如何使用以上信息,当用户的query进来,微软的论文中采用了针对以上生成的report,全部用于回答,再对回答进行筛选的逻辑。但其实也可以先加入召回逻辑,基于用户query去召回相关的子图report,虽然肯定会有一些损失,但是可以大幅降低耗时和成本。微软的实现是 。
效果上论文对比了在podcast和news article数据集上,分别使用不同level的子图生成的report作为context(C0-C3),以及直接使用图节点信息(TS)来对比naive RAG(SS)的效果。以下是使用大模型分别评估回答的全面性,多样性,有用性和直接性,在以上4个评估角度上,两两对比的胜率。使用图信息的所有方案均超越naive rag~ 。
- https://github.com/HKUDS/LightRAG
- LightRAG: Simple and Fast Retrieval-Augmented Generation
LightRAG是港大刚出的新RAG框架,对比微软的graph rag实现,它更多在信息召回层面做了优化。这里我们只看下lightrag和graph rag的核心差异点:对图索引的构建和图信息召回 。
在图谱构建的环节二者基本是一致的,差异在于LightRAG为了构建召回索引,在graphRAG抽取实体和关系的Prompt指令中加入了high-level关键词抽取的指令,用于抽取可以描述图局部抽象信息的关键词,该关键词作为索引可以直接用于主题,概念等问题的信息召回。对比微软使用子图report来描述局部信息,lightrag在抽取时使用关键词来描述局部信息,更加轻量级,但对于范围更大的子图信息描述会有不足.
GRAPH_EXTRACTION_PROMPT = """
...同上
- relationship_keywords: one or more high-level key words that summarize the overarching nature of the relationship, focusing on concepts or themes rather than specific details
Format each relationship as ("relationship"{tuple_delimiter}<source_entity>{tuple_delimiter}<target_entity>{tuple_delimiter}<relationship_description>{tuple_delimiter}<relationship_keywords>{tuple_delimiter}<relationship_strength>)
...同上
"""
而在检索阶段,lightrag加入了两路图信息召回 。
针对以上两个角度,lightrag会使用指令让大模型分别生成两类检索关键词,一类针对具体实体进行检索,一类针对主题概念进行检索,对应上面实体抽取过程中生成的high level keywords,prompt和few-shot如下 。
使用以上两类关键词会分别进行两路召回,再对信息进行合并 。
拼接上文和大模型回答之类的都大差不差就不细说了,感兴趣的同学可以去扒拉扒拉代码~ 。
想看更全的大模型论文·微调预训练数据·开源框架·AIGC应用 >> DecryPrompt 。
最后此篇关于解密prompt系列41.GraphRAG真的是SilverBullet?的文章就讲到这里了,如果你想了解更多关于解密prompt系列41.GraphRAG真的是SilverBullet?的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个 C# 应用程序调用 Java 网络服务来验证用户密码。我想让 C# 应用程序加密密码,然后让 Java Web 服务解密密码。我已经完成了 Java 端的代码(解密代码),但我无法找出 C#
我正在使用以下代码在使用 openssl 的 Windows 中使用 C 加密和解密二进制数据。如您所见,在这两个函数中,我都知道纯文本的大小。有什么方法可以在不知道纯文本大小的情况下解密消息? #i
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个非常恼人的问题,Java中使用RSA算法对字符串进行不可靠的加密和解密。它似乎只能在大约 35% 的时间内工作,而且我不明白为什么它有时能工作,有时却不能。这是我写的一些测试代码,试图验证加密
我已经设法编写了用于文件加密/解密的函数。但它非常慢,尤其是随着文件大小的增加。例如几MB长的音频/视频文件 我几乎浏览了所有帖子来改进它,并尝试更改算法。如果有任何更改可以帮助我提高性能,请帮助我。
我正在尝试让我的转置密码发挥作用。 每当我将加密方法得到的密文输入解密方法时,我应该得到原始的明文......但事实并非如此...... 我做错了什么? 感谢您的帮助! public String E
我正在使用密码来加密和解密消息: public String encrypt(String string) throws InvalidKeyException, IllegalBlockSizeEx
我有一个在 MySQL 中存储数据的 spring-mvc 堆栈。其中一些数据需要保护,所以我想我应该加密它。由于我以后可能需要使用这些数据(信用卡、SSN 等),所以我需要对其进行解密。我认为这排除
作为一名SEOER,都想了解百度算法,通过算法原理来找到捷径的优化方案,那么今天我把研究多年的百度算法原理解密给大家,可能不是最好的,但是我可以给大家保证,这些都是非常实际的。希望给SEOER带来一
我试图找到一种技术来加密和解密程序中的文件,而无需将密码硬编码到程序中,也无需向用户询问密码。 如果我也可以从我正在编写的另一个程序中解密文件,那就太好了。 到目前为止,我还没有多少运气找到一种看起来
有没有一种方法可以使用作为字符串参数传递给程序的私钥而不是使用存储在机器上的证书来解密 PowerShell 中的 RSA?欢迎任何帮助,我的代码如下。 Function Decrypt-Asymme
通过问题Is it possible to use the Grails Jasypt plugin outside the GORM layer for simple String encrypti
我需要解密/加密我的域类中的几列,并且正在寻找有关如何做的信息。我已经找到了jasypt加密插件,但不幸的是它似乎与Grails 2.4不兼容。 我可能可以将一些东西拼凑在一起,但是想要确保Im遵循最
我需要有关声音文件加密/解密的帮助。我想在存储这个声音文件时加密一个声音文件,并在播放这个文件时解密它。我阅读了有关 java 中的加密/解密以及 java 中可用于此的大量示例代码。但这些程序不适用
我很感兴趣是否可以使用 Excel Visual Basic 和某些加密服务提供程序进行字符串加密/解密。 我找到了一个演练 Encrypting and Decrypting Strings in
我们正在使用加密/解密和UIIMAGE。如果我们在不保存到iphone画廊的情况下进行加密和解密以及UIIMAge,则可以正常工作,但是,如果我们进行加密,保存到画廊,将(加密的图像)加载到应用程序中
我正在做一个像这样的简单程序: package rsaexample; import java.io.*; import java.math.BigInteger; import java.secur
我发现这段代码返回给定字符串的校验和。 public static String getChecksum(String md5) { int counter = 0; while (c
我在 Java SE 和 Android 项目上使用相同的代码。在 Java 和 Android 中运行的应用程序连接到相同的 MQTT 代理并交换消息。消息使用 AES 进行加密/解密。我对 Jav
我想在 openssl/libcrypto 中使用 RSA 加密/解密一个长文件(我知道 AES 更好,但这只是为了比较)。我将输入文件分成大小为 numBlocks = inputFileLengt
我是一名优秀的程序员,十分优秀!