图检索增强生成(Graph RAG)是一种结合了图神经网络与信息检索技术的方法,用于提升复杂数据结构下的知识抽取和内容生成能力。
### Graph RAG 图的检索增强生成
#### 一、概览
Graph RAG(图的检索增强生成)是一种结合了大型语言模型(LLM)和图索引技术的方法,旨在解决针对私有文本语料库的问题回答。这种方法通过构建实体知识图谱并生成社区摘要,有效地解决了传统RAG方法在面对全局性问题时表现不佳的问题。
#### 二、关键技术点详解
##### 1. **索引阶段**
- **文本提取和分块**:这是Graph RAG的第一步,将源文档分割成较小的文本块。这一过程对于后续的处理至关重要,因为较小的文本块有助于提高实体和关系的识别精度。
- **元素实例化**:在这一步骤中,LLM被用于提取文本块中的实体及其关系,并生成描述。这是构建实体知识图的基础。
- **元素摘要**:为了减少冗余信息并提高处理效率,相似实体的描述会被汇总成单一的摘要。
- **社区检测**:使用Leiden算法将图分割成多个社区。Leiden算法是一种高效的聚类算法,特别适合处理大规模高维数据。它能够有效地识别出图中紧密相连的节点集合(即社区),这对于生成有意义的摘要至关重要。
- **社区摘要**:针对每个社区生成报告式的摘要。这些摘要包含了每个社区的主要信息,从而帮助用户快速理解各个社区的内容。
##### 2. **查询阶段**
- **社区回答和全局回答**:根据用户的查询,Graph RAG能够生成针对特定社区的回答,并进一步汇总这些回答以提供全局性的解答。这种分层的解答方式不仅提高了响应速度,还增强了答案的相关性和准确性。
##### 3. **循环检测实体**
在相同的收集次数下,原始文档被切分成较小的文本块时,实体检测到的引用会更多。然而,需要注意的是,在提取过程中需要找到合适的平衡点以兼顾召回率和准确度之间的关系。
##### 4. **Leiden算法**
- Leiden算法基于模块化最大化的原理,试图找到最优的分割方式,使得分割后的子图内部密度较大,而子图之间联系较小。相较于其他聚类算法,Leiden算法更加适用于处理大规模高维数据集。
#### 三、代码实现示例
##### 1. **文本切分**
```python
def split_text_on_tokens(*, text: str, tokenizer: Tokenizer) -> list[str]:
Split incoming text and return chunks using tokenizer.
splits: list[str] = []
input_ids = tokenizer.encode(text)
start_idx = 0
cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids))
chunk_ids = input_ids[start_idx:cur_idx]
while start_idx < len(input_ids):
splits.append(tokenizer.decode(chunk_ids))
# tokens_per_chunk: 每个块的最大 token 数量
# chunk_overlap: 块之间的重叠 token 数量
start_idx += tokenizer.tokens_per_chunk - tokenizer.chunk_overlap
cur_idx = min(start_idx + tokenizer.tokens_per_chunk, len(input_ids))
chunk_ids = input_ids[start_idx:cur_idx]
return splits
```
这段代码展示了如何将输入的文本分割成较小的文本块。`tokenizer`用于将文本转换成token序列,然后根据指定的块大小和重叠数量进行分割。
##### 2. **实体和关系提取**
实体和关系的提取依赖于大型语言模型。通过设计特定的prompt模板,模型可以被指导去提取文本中的实体及其关系。
```python
async def _process_document(self, document: Document, max_gleanings: int) -> Document:
Process a single document, extracting entities and relations.
Args:
- document (Document): The document to process.
- max_gleanings (int): Maximum number of gleanings per chunk.
Returns:
- Document: The processed document with extracted entities and relations.
# 实现细节省略
pass
```
这段伪代码展示了如何处理单个文档以提取实体和关系。其中`max_gleanings`表示每个文本块最多提取的关系数量,这有助于控制提取过程的复杂度。
#### 四、总结
Graph RAG是一种创新的方法,通过结合大型语言模型和图索引技术,有效地解决了针对私有文本语料库的问题回答。通过对文本进行精细处理,并利用先进的聚类算法(如Leiden算法)进行社区检测,Graph RAG能够在保持信息完整性的同时显著提高问题回答的速度与质量。此外,开源的实现让研究人员和开发者能够轻松地探索并扩展这一方法的应用场景。