利用 GraphRAG + GLM-4 构建《红楼梦》全文的中文增强检索系统
引言
检索增强生成(Retrieval-Augmented Generation, RAG)技术通过结合外部知识库与大语言模型,有效缓解了模型幻觉问题。而图检索增强生成(GraphRAG)在此基础上引入了知识图谱结构,通过实体关系网络提升了对复杂问题的理解与推理能力。
原生 GraphRAG 项目主要面向英文环境优化,在处理中文长文本时存在分块乱码、提示词不匹配及模型支持不足等问题。本文基于 graphrag-practice-chinese 开源项目,结合智谱 AI 的 GLM-4 大模型,详细演示了如何构建针对《红楼梦》全文的中文增强检索系统,涵盖环境搭建、配置优化、索引构建及查询测试全流程。
核心优势与技术选型
1. 为什么选择 GraphRAG?
传统向量检索(Vector Search)擅长语义相似度匹配,但在处理多跳推理(Multi-hop Reasoning)和全局概览(Global Overview)时表现有限。GraphRAG 通过构建实体节点和关系边,能够:
- 揭示隐藏关系:发现文本中未直接陈述但隐含的人物或事件关联。
- 全局摘要:生成社区级别的摘要,便于回答宏观主题问题。
- 上下文保持:在长文档检索中更好地维持上下文连贯性。
2. 模型选择:GLM-4
原生 GraphRAG 默认调用 OpenAI API,对中文支持较弱且成本较高。本项目选用智谱 AI 提供的 GLM-4 系列模型(如 glm-4-flash 或 glm-4-plus),原因如下:
- 中文原生能力强:对中文语境、成语及文化背景理解更精准。
- 成本可控:相比 GPT-4 系列,Token 消耗成本更低,适合大规模全文索引构建。
- API 兼容:通过适配层可无缝替换 OpenAI 接口调用逻辑。
环境搭建
1. 克隆项目
首先从 GitHub 获取项目代码:
git clone https://github.com/zhaoyingjun/graphrag-practice-chinese.git
cd ./graphrag-practice-chinese
2. 安装依赖
确保 Python 版本为 3.9 或以上,并安装项目所需依赖:
pip install -r ./requirements.txt
3. 初始化配置
运行初始化命令以创建必要的配置文件目录:
python -m graphrag.index --init --root ./
此命令将在当前目录下生成 .env 和 settings.yaml 文件。
4. 准备数据
创建输入目录用于存放待索引的文本文件:
mkdir ./input
将《红楼梦》原文保存为 UTF-8 编码的 .txt 文件放入该目录。注意 GraphRAG 仅支持 txt 或 csv 格式。
配置优化策略
1. 环境变量配置 (.env)
.env 文件用于存储敏感信息,如 API Key。需修改如下内容:
GRAPHRAG_API_KEY=your_zhipu_api_key_here
请确保使用智谱 AI 控制台生成的有效密钥。
2. 主配置文件 (settings.yaml)
settings.yaml 定义了 Pipeline 的核心参数。以下是关键部分的配置说明:
输入设置
指定数据源路径及编码格式:
input:
type: file
file_type: text
base_dir: "input/hongloumeng"
file_encoding: utf-8
file_pattern: ".*\\.txt$"
分块策略优化 (Text Splitting)
官方默认按 Token 数切分,易导致中文句子被截断。建议采用自定义中文切分器:
chunks:
size: 2500
overlap: 300
group_by_columns: [id]
splitter:
type: custom
module: splitter.chinese_text_splitter
class: ChineseTextSplitter
params:
pdf: false
sentence_size: 250
此配置使用字符数而非 Token 数进行切分,保留句子完整性,避免乱码。
模型调用配置
将默认 OpenAI 模型替换为 GLM-4。需在代码层面修改模型适配器,或在配置中指定对应的 API 端点。推荐在 settings.yaml 中明确指定模型名称:
llm:
api_base: "https://open.bigmodel.cn/api/paas/v4/"
model: "glm-4-plus"
max_tokens: 4096
temperature: 0.7
3. 提示词工程 (Prompt Engineering)
GraphRAG 包含四个核心 Prompt 文件(位于 prompts/ 目录)。原文件均为英文并要求英文输出。为提升中文效果:
- 将四个 Prompt 文件翻译为中文。
- 强制 LLM 在输出时使用中文。
- 保留原有的关键字段结构(如 JSON Schema 定义),确保解析器能正常提取结果。
索引构建流程
执行以下命令启动索引构建任务:
python -m graphrag.index --root ./
构建过程说明
- Entity Extraction: 识别文本中的实体(人物、地点、物品)。
- Community Detection: 基于实体关系聚类形成社区。
- Summary Generation: 为每个社区生成自然语言摘要。
- Index Saving: 将图谱数据保存至
output 目录,缓存数据存于 cache 目录。
注意:构建完整《红楼梦》全文索引可能消耗约 700W Tokens,耗时较长。若无 GPU 加速,建议使用 CPU 模式耐心等待进度条完成。成功标志为控制台输出 All workflows completed successfully。
查询测试与分析
索引构建完成后,可通过命令行进行查询测试。
1. 全局查询 (Global Search)
适用于宏观主题性问题,基于预计算的社区摘要进行回答。
python -m graphrag.query --root ./ --method global "故事的主旨是什么?"
典型响应:
系统会综合贾、王、史、薛四大家族的兴衰描写,分析封建社会的矛盾冲突及人性主题。由于基于社区摘要,回答通常具有较高的概括性和深度。
2. 本地查询 (Local Search)
适用于特定实体的精确查询,基于图遍历和向量搜索。
python -m graphrag.query --root ./ --method local "贾母对宝玉的态度怎么样?"
典型响应:
系统会定位到'贾母'和'宝玉'实体,遍历其关系边,总结出具体的互动细节(如探望、教育、宽容等),并提供具体的数据来源引用。
3. 两种查询模式对比
| 特征 | 本地查询 (Local Search) | 全局查询 (Global Search) |
|---|
| 查询范围 | 以特定实体为入口点 | 基于预先计算的实体社区摘要 |
| 查询方法 | 使用实体嵌入和图遍历 | 向每个社区提问并汇总答案 |
| 适用场景 | 针对特定实体的精确查询 | 广泛的主题性问题 |
| 性能 | 对简单直接任务更高效 | 适合处理复杂的多步骤查询 |
| 复杂度 | 相对较低 | 较高,需要更多计算资源 |
| 洞察深度 | 适中 | 更深入,能更全面理解上下文和关系 |
| Token 使用量 | 较低 | 较高,因多次 LLM 调用 |
常见问题与调优建议
1. 内存溢出 (OOM)
若构建过程中出现内存错误,可尝试减小 chunks.size 参数,或增加系统交换空间。对于大型数据集,建议分批处理。
2. 中文乱码
确保所有输入文件均为 UTF-8 编码。若仍出现乱码,检查 settings.yaml 中的 file_encoding 是否设置为 utf-8,并确认使用了 ChineseTextSplitter。
3. 响应质量不佳
- 调整温度 (Temperature):降低
temperature 值(如 0.1~0.3)可使回答更稳定。
- 优化 Prompt:检查中文 Prompt 是否保留了必要的指令约束,避免模型自由发挥过多。
- 模型升级:若资源允许,可尝试使用更强的 GLM-4-Plus 或 GLM-4-Flash 版本。
结语
通过上述实践,我们成功构建了基于 GraphRAG 架构的中文文学检索系统。该系统不仅实现了对《红楼梦》全文的结构化理解,还展示了图神经网络在大模型应用中的潜力。未来可进一步探索多模态数据融合、动态知识更新以及垂直领域的微调训练,以提升系统的智能化水平。
对于开发者而言,掌握 GraphRAG 的配置与优化技巧,是构建高质量企业级知识库的关键一步。建议在正式部署前充分测试不同分块策略与模型组合,以达到最佳的性能与成本平衡。