最佳实践!使用 GraphRAG + GLM-4 对《红楼梦》全文构建中文增强检索

本文涉及的产品
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
NLP自然语言处理_基础版,每接口每天50万次
简介: 特别介绍`graphrag-practice-chinese`项目,这是一个针对中文优化的GraphRAG应用实例,通过改进文本切分策略、使用中文提示词及选择更适合中文的模型等手段,显著提升了处理中文内容的能力。项目不仅包括详细的搭建指南,还提供了《红楼梦》全文的索引构建与查询测试示例,非常适合个人学习和研究。

❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦!

🥦 微信公众号|搜一搜:蚝油菜花 🥦

GraphRag-BlogHeroFeature-1400x788-1.png

🚀 快速阅读

  1. GraphRAG 是一种结合图神经网络和检索增强生成技术的先进模型,旨在通过图结构信息和外部知识检索提升文本生成的质量和相关性。

  2. graphrag-practice-chinese是一个 GraphRAG 的应用实例,项目特点在于提供了替换 OpenAI 模型的方法,并通过修改原有提示和切分文档的方法,提高了 GraphRAG 处理中文内容的能力。

  3. 通过 graphrag-practice-chinese结合 LLM 对完整的《红楼梦》原文构建索引和查询测试。

开始实践!

graphrag-practice-chinese是一个 GraphRAG 的应用实例,项目特点在于提供了替换 OpenAI 模型的方法,并通过修改原有提示和切分文档的方法,提高了 GraphRAG 处理中文内容的能力。

搭建环境(非常关键!)

git clone https://github.com/zhaoyingjun/graphrag-practice-chinese.git

cd ./graphrag-practice-chinese

# 安装项目运行所需的依赖
pip install -r ./requirements.txt

# 创建 input 目录,用于构建索引的文本文件默认存放于该目录下,可以按需修改 settings.yaml 文件中的 input 部分来指定路径
mkdir ./input

# 这一命令将在 graphrag-practice-chinese 目录中创建两个文件:.env 和 settings.yaml
python -m graphrag.index --init --root ./

修改配置文件

GraphRAG 主要的配置文件有两个:.envsettings.yaml

.env 包含运行 GraphRAG pipeline 所需的环境变量。该文件默认只定义了一个环境变量 GRAPHRAG_API_KEY=<API_KEY>

settings.yaml 包含 pipeline 相关的设置。

在项目根目录你可以找到作为参考的配置文件demo.envsettings.demo.yaml
你可以参考配置进行修改,也可以通过重命名覆盖初始化的配置文件。

这里推荐使用大语言模型 glm-4-flash(首个免费调用的模型),因为在推理和总结阶段需要消耗大量的 Tokens。
我尝试对完整的《红楼梦》原文构建索引,最终消耗了大约 700W 个 Tokens,个人学习用的话尽力而为吧。

优化策略 — 使模型侧重中文

优化 1: 文本切分

官方分块把文档按照 token 数进行切分,对于中文来说容易在 chunk 之间出现乱码,这里参考 Langchain-ChatChat 开源项目,用中文字符数对文本进行切分。

  1. 方法 1:

使用splitter/tokens.py替换掉 python 依赖库中的 graphrag/index/verbs/text/chunk/strategies/tokens.py 即可。

  1. 方法 2:

使用 splitter/chinese_text_splitter 中的 ChineseTextSplitter 作为文档分割方法,你需要在 settings.yaml 文件中添加一个新的 splitter 部分。以下是修改后的相关部分:

# ... 其他设置保持不变 ...
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
# ... 其他设置保持不变 ...

方法 2 的修改说明:

  1. 保留原有的 chunks 部分,因为它可能仍被用于其他目的。

  2. 添加新的 splitter 部分:

  • type: custom 表示我们使用自定义的分割器。

  • module: splitter.chinese_text_splitter 指定了包含 ChineseTextSplitter 类的 Python 模块路径。请确保这个路径正确反映了 chinese_text_splitter.py 文件在你项目中的位置。

  • class: ChineseTextSplitter 指定了要使用的类名。

  • params: 部分包含了传递给 ChineseTextSplitter 的参数。这里设置了 pdf: falsesentence_size: 250,你可以根据需要调整这些值。

请注意:

  1. 确保 chinese_text_splitter.py 文件位于正确的位置,使得 GraphRAG 能够找到并导入它。 2.修改完成后,保存 settings.yaml 文件,然后重新运行 GraphRAG 的索引构建命令,就会使用 ChineseTextSplitter 来分割你的文档。

优化 2: 使用中文提示词(chinese-prompt)

初始化后,在 prompts 目录中可以看到 GraphRAG 的四个 prompt 文件的内容都由英文书写,并要求 LLM 使用英文输出。

为了更好地处理中文内容,这里我使用 gpt-4o 模型,将prompts/中的四个 prompt 文件都翻译成中文,并要求 LLM 用中文输出结果。

如果你有更好的想法,想要自定义提示词,同样可以通过修改这四个 prompt 文件来实现,但注意不要修改提示词的文件名,以及不要修改和遗漏了在原提示词中有关输出的关键字段和格式,以免 GraphRAG 无法正常获取它们。

优化 3: 模型调用

GraphRAG 默认使用 openai 进行模型调用,该模型为国外模型,对中文支持并不友好。为更好地支持中文,这里选择 bigmodel 进行模型调用,该模型为国内大模型厂商智谱 AI 提供。

优化 4: 模型选择

GraphRAG 默认使用 gpt-4o 模型,该模型为国外模型,对中文支持并不友好。为更好地支持中文,这里选择 glm-4-plus 模型,该模型为国内大模型厂商智谱 AI 提供。

构建索引

  1. 通过运行如下命令, Graphrag 会在指定的文件路径下加载配置文件.envsetting.yaml,并按照你的配置开始构建索引。
python -m graphrag.index --root ./graphrag-practice-chinese

假设你当前的文件路径已经在graphrag-practice-chinese下的话,命令指定的构建路径应该为当前目录,则构建索引的命令应该是:

python -m graphrag.index --root ./

你需要确保指定的文件路径下存在配置文件.envsetting.yaml,且配置了正确的api_key

自定义样本数据

GraphRAG 会默认为 input 路径下的 txt 文件构建索引,如果需要指定文件的路径或类型,可以修改settings.yaml中的input部分。

注意!GraphRAG 仅支持 `txt 或 csv` 类型的文件,编码格式必须为 `utf-8`。

在本项目中,我将红楼梦原文文本作为样本,所以在配置文件setting.yaml中将文件路径base_dir修改为input/hongloumeng,如下:

# ... 其他设置保持不变 ...
input:
  type: file # or blob
  file_type: text # or csv
  base_dir: "input/hongloumeng"
  file_encoding: utf-8
  file_pattern: ".*\\.txt$"
# ... 其他设置保持不变 ...

如果你也想要把红楼梦原文文本作为样本,可以通过我的另一个项目 hongloumeng-txt 获取到符合 GraphRAG 格式要求的文件,获取完成后将文件放在input/hongloumeng目录下即可。

  1. 在构建过程中会自动创建两个目录:

output 目录,用于存放查询结果。
cache 目录,用于存放缓存数据。

  1. 索引构建完成后会提示:All workflows completed successfully ,说明即可构建完成,随时可以进行查询。(如果没有 GPU 加持的话,构建的过程还是比较久的,可以在控制台你看到每一个步骤的进度条。)

查询测试

全局查询

执行命令:

python -m graphrag.query --root ./graphrag-practice-chinese --method global "故事的主旨是什么?"

查询结果示例:

SUCCESS: Global Search Response:
《红楼梦》的主旨在于通过对贾、王、史、薛四大家族的兴衰描写,展现了封建社会的各种矛盾和冲突,揭示了封建社会的腐朽和衰落。故事中的人物关系错综复杂,反映了当时社会的风俗习惯和道德观念。小说通过对宝玉、黛玉、宝钗等主要人物的爱情悲剧,探讨了人性、命运、社会关系等主题,反映了作者对封建礼教和封建制度的批判。

此外,小说还探讨了人生、命运、爱情、婚姻等主题,反映了作者对人生和社会的深刻思考。通过对贾宝玉、林黛玉、薛宝钗等主要人物的塑造,展现了封建社会中人性的复杂性和悲剧性,反映了人性的光辉与阴暗面。故事中的人物命运和家族兴衰反映了当时社会的现实,同时也表达了作者对美好人性的追求和对理想社会的向往。

综上所述,《红楼梦》的主旨不仅揭示了封建社会的腐朽和衰落,还探讨了人性、命运、社会关系等主题,具有深刻的思想内涵和艺术价值。

本地查询

执行命令:

python -m graphrag.query --root ./graphrag-practice-chinese --method local "贾母对宝玉的态度怎么样?"

查询结果示例:

SUCCESS: Local Search Response:
贾母对宝玉的态度可以从多个方面进行总结:

1. 溺爱与关心:贾母对宝玉有着深厚的溺爱。在《红楼梦》中,贾母多次探望宝玉,甚至亲自到园中看望他,表现出对宝玉的关心和爱护。例如,在贾母探视宝玉的情况中,贾母和王夫人一同探望宝玉,并询问他的病情,显示出贾母对宝玉的关心(Data: Entities (4704, 2929, 3895, 5470, 5868))。

2. 宠爱与宽容:贾母对宝玉的宠爱还体现在对宝玉行为的宽容上。宝玉性格顽劣,有时甚至有些荒唐,但贾母却总是以宽容的态度对待他。例如,贾母对宝玉的干妈“老东西”的指责,显示出贾母对宝玉的宠爱(Data: Relationships (528, 2124))。

3. 期望与教育:尽管贾母对宝玉宠爱有加,但她也关心宝玉的教育。在贾母房中,贾母关注宝玉的教育,并关心他的成长(Data: Entities (2702, 5524, 5868))。

4. 情感交流:贾母与宝玉之间有着深厚的情感交流。在贾母与宝玉的互动中,贾母不仅关心宝玉的身体健康,还关心他的心理状态,体现出两人之间深厚的感情(Data: Sources (607, 314, 481))。

综上所述,贾母对宝玉的态度是溺爱、关心、宠爱、宽容,同时也有期望和教育。这种复杂的情感关系,体现了贾母对宝玉的深厚感情。

全局查询和本地查询的区别

特征 本地查询 (Local Search) 全局查询 (Global Search)
查询范围 以特定实体为入口点 基于预先计算的实体社区摘要
查询方法 使用实体嵌入和图遍历 向每个社区提问并汇总答案
适用场景 针对特定实体的精确查询 广泛的主题性问题
性能 对简单直接任务更高效 适合处理复杂的多步骤查询
复杂度 相对较低 较高,需要更多计算资源
响应速度 通常更快 可能较慢,取决于查询复杂度
洞察深度 适中 更深入,能更全面理解上下文和关系
Token 使用量 较低 较高,due to 多次 LLM 调用
实现依赖 向量搜索和图遍历 预计算的社区摘要和多次 LLM 调用
最佳使用场景 需要快速直接答案的情况 需要深入洞察和复杂推理的场景

资源

graphrag-practice-chinese:https://github.com/Airmomo/graphrag-practice-chinese

hongloumeng-txt:https://github.com/Airmomo/hongloumeng-txt


❤️ 如果你也关注大模型与 AI 的发展现状,且对大模型应用开发非常感兴趣,我会快速跟你分享最新的感兴趣的 AI 应用和热点信息,也会不定期分享自己的想法和开源实例,欢迎关注我哦!

🥦 微信公众号|搜一搜:蚝油菜花 🥦

相关文章
|
6月前
|
存储 自然语言处理 搜索推荐
ChatGPT 文本Embedding融合Qdrant向量数据库:构建智能问答系统的技术探索
向量数据库结合ChatGPT带来了什么 1. **语义搜索:** 使用向量数据库进行语义搜索,可以更准确地找到与查询相关的信息。ChatGPT可以理解用户的自然语言查询,而向量数据库可以根据语义相似性返回匹配的向量数据。 2. **智能推荐:** 结合ChatGPT的智能理解和向量数据库的相似性搜索,可以实现更智能的推荐系统。系统可以根据用户的历史行为和语境,向用户推荐相似的向量数据,如文章、产品或其他内容。 3. **自然语言处理与向量表示结合:** ChatGPT可以将自然语言转换为向量表示,这样就可以在向量数据库中进行更高效的查询。这种集成使得自然语言处理和向量数据库可以相互补充等
541 0
|
3月前
|
数据采集 自然语言处理
ARTIST的中文文图生成模型问题之核心代码实现的问题如何解决
ARTIST的中文文图生成模型问题之核心代码实现的问题如何解决
|
4天前
|
人工智能 自然语言处理 数据挖掘
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
RAG 系统高效检索提升秘籍:如何精准选择 BGE 智源、GTE 阿里与 Jina 等的嵌入与精排模型的完美搭配
|
22天前
|
数据采集 自然语言处理 算法
实战RAG:构建基于检索增强的问答系统
【10月更文挑战第21天】在当今大数据时代,如何高效地从海量信息中获取所需知识,成为一个亟待解决的问题。检索增强的生成模型(Retrieval-Augmented Generation, RAG)应运而生,它结合了检索技术和生成模型的优点,旨在提高生成模型的回答质量和准确性。作为一名热衷于自然语言处理(NLP)领域的开发者,我有幸在多个项目中应用了RAG技术,并取得了不错的成效。本文将从我个人的实际经验出发,详细介绍如何使用RAG技术来构建一个问答系统,希望能够帮助那些已经对RAG有一定了解并希望将其应用于实际项目中的开发者们。
75 1
|
22天前
|
自然语言处理 索引
RAG入门:理解检索增强生成模型的基本原理
【10月更文挑战第21天】作为一名长期从事自然语言处理(NLP)研究的技术人员,我一直在关注各种新兴技术的发展趋势。其中,检索增强生成(Retrieval-Augmented Generation, RAG)模型引起了我的特别兴趣。RAG技术结合了检索系统和生成模型的优点,旨在解决传统生成模型在处理长文本理解和生成时所面临的挑战。本文将从个人的角度出发,介绍RAG的基本概念、工作原理及其相对于传统生成模型的优势,并探讨一些基本的实现方法。
46 1
|
1月前
|
自然语言处理 数据可视化 数据挖掘
闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨
本文探讨了自然语言处理中嵌入技术的应用,重点在于语义搜索及聚类方法。通过对比不同规模的开源与闭源模型,文章展示了如何利用聚类技术过滤无关结果,提高搜索精度。实验结果显示,较小模型如mxbai在某些任务上表现优异,提示我们在追求高性能的同时不应忽视计算效率与成本效益。最后,文章还介绍了重新排序技术,进一步优化检索结果的相关性。
88 6
闭源与开源嵌入模型比较以及提升语义搜索效果的技术探讨
|
29天前
|
自然语言处理 达摩院 数据挖掘
[大语言模型-论文精读] 阿里巴巴-通过多阶段对比学习实现通用文本嵌入
[大语言模型-论文精读] 阿里巴巴-通过多阶段对比学习实现通用文本嵌入
37 1
|
1月前
|
机器学习/深度学习 自然语言处理 算法
超越传统搜索:探索基于GraphRAG的信息检索新范式
【10月更文挑战第10天】随着信息爆炸时代的到来,如何从海量的数据中快速准确地找到所需的信息成为了一个亟待解决的问题。传统的信息检索系统主要依赖于关键词匹配和文档排名算法来提供结果,但这种方法往往无法捕捉到数据间的复杂关系,也无法很好地理解用户的查询意图。近年来,一种新的信息检索方法——基于图的检索增强生成(Graph-based Retrieval-Augmented Generation, GraphRAG)应运而生,它通过结合知识图谱与机器学习技术,为信息检索带来了全新的视角。
61 1
|
数据采集 机器学习/深度学习 存储
从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简单语义搜索、基于 REfO 的简单KBQA
从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简单语义搜索、基于 REfO 的简单KBQA
从零开始的知识图谱生活,构建一个百科知识图谱,完成基于Deepdive的知识抽取、基于ES的简单语义搜索、基于 REfO 的简单KBQA
|
29天前
|
机器学习/深度学习 自然语言处理 算法
[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
[大语言模型-工程实践] 手把手教你-基于BERT模型提取商品标题关键词及优化改进
85 0

热门文章

最新文章