引言
全局搜索(Global Search)是一种通过MapReduce方式处理所有AI生成的社区报告,从而生成答案的方法。这种方法虽然资源密集,但通常能很好地回答需要理解整个数据集的问题(例如,“笔记本中提到的草药的最重要价值是什么?”)。本文将详细介绍全局搜索的工作原理、实现细节以及如何在实际项目中应用它。
前置知识
在深入了解全局搜索之前,我们需要掌握以下几个关键概念:
- MapReduce:一种分布式计算模型,用于处理和生成大数据集。它包括两个主要步骤:Map(映射)和Reduce(归约)。
- LLM(Large Language Model):大型语言模型,如GPT-4,能够理解和生成自然语言文本。
- Pandas:一个强大的数据处理库,用于数据分析和操作。
- Tiktoken:一个用于编码和解码文本的库,常用于处理语言模型的输入和输出。
全局搜索的工作原理
全局搜索的核心思想是通过MapReduce的方式处理AI生成的社区报告,从而生成答案。具体步骤如下:
- Map阶段:将社区报告分割成预定义大小的文本块,每个文本块生成一个中间响应,包含要点列表及其重要性评分。
- Reduce阶段:从中间响应中筛选出最重要的一组要点,并将其聚合作为上下文,生成最终响应。
代码示例
1. 设置LLM
首先,我们需要设置LLM模型。以下是代码示例:
import os
from graphrag.query.llm.oai.chat_openai import ChatOpenAI
from graphrag.query.llm.oai.typing import OpenaiApiType
api_key = os.environ["GRAPHRAG_API_KEY"]
llm_model = os.environ["GRAPHRAG_LLM_MODEL"]
llm = ChatOpenAI(
api_key=api_key,
model=llm_model,
api_type=OpenaiApiType.OpenAI, # 可以是OpenaiApiType.OpenAI或OpenaiApiType.AzureOpenAI
max_retries=20,
)
2. 加载社区报告
接下来,我们加载社区报告作为全局搜索的上下文数据。以下是代码示例:
import pandas as pd
from graphrag.query.indexer_adapters import read_indexer_entities