{"id":22107679,"url":"https://github.com/airmomo/graphrag-practice-chinese","last_synced_at":"2025-04-06T03:05:19.040Z","repository":{"id":256420980,"uuid":"855222357","full_name":"Airmomo/graphrag-practice-chinese","owner":"Airmomo","description":"GraphRAG的应用实例，项目特点在于提供了替换OpenAI模型的方法，并通过修改原有提示和切分文档的方法，提高了GraphRAG处理中文内容的能力。","archived":false,"fork":false,"pushed_at":"2024-11-02T11:11:46.000Z","size":76,"stargazers_count":131,"open_issues_count":3,"forks_count":15,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T02:03:37.933Z","etag":null,"topics":["chinese","graphrag","rag"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Airmomo.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-10T14:20:06.000Z","updated_at":"2025-03-24T06:47:41.000Z","dependencies_parsed_at":"2025-01-09T10:13:23.271Z","dependency_job_id":"d9ef205f-8dee-4816-afb5-e69e2de344fe","html_url":"https://github.com/Airmomo/graphrag-practice-chinese","commit_stats":null,"previous_names":["airmomo/graphrag-practice","airmomo/graphrag-practice-chinese"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Airmomo%2Fgraphrag-practice-chinese","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Airmomo%2Fgraphrag-practice-chinese/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Airmomo%2Fgraphrag-practice-chinese/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Airmomo%2Fgraphrag-practice-chinese/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Airmomo","download_url":"https://codeload.github.com/Airmomo/graphrag-practice-chinese/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247427005,"owners_count":20937200,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chinese","graphrag","rag"],"created_at":"2024-12-01T08:18:49.344Z","updated_at":"2025-04-06T03:05:19.011Z","avatar_url":"https://github.com/Airmomo.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# graphrag-practice-chinese\n\n`graphrag-practice-chinese`是一个 GraphRAG 的应用实例，项目特点在于提供了替换 OpenAI 模型的方法，并通过修改原有提示和切分文档的方法，提高了 GraphRAG 处理中文内容的能力。\n\n# 搭建环境(非常关键！)\n\n```bash\ngit clone https://github.com/zhaoyingjun/graphrag-practice-chinese.git\n\ncd ./graphrag-practice-chinese\n\n# 安装项目运行所需的依赖\npip install -r ./requirements.txt\n\n# 创建 input 目录，用于构建索引的文本文件默认存放于该目录下，可以按需修改 settings.yaml 文件中的 input 部分来指定路径\nmkdir ./input\n\n# 这一命令将在 graphrag-practice-chinese 目录中创建两个文件：.env 和 settings.yaml\npython -m graphrag.index --init --root ./\n```\n\n# 修改配置文件\n\nGraphRAG 主要的配置文件有两个：`.env` 和 `settings.yaml`：\n\n- `.env` 包含运行 GraphRAG pipeline 所需的环境变量。该文件默认只定义了一个环境变量 `GRAPHRAG_API_KEY=\u003cAPI_KEY\u003e` 。\n\n- `settings.yaml` 包含 pipeline 相关的设置。\n\n**在项目根目录你可以找到作为参考的配置文件 [demo.env](./demo.env) 和 [settings.demo.yaml](./settings.demo.yaml)。**\n\n你可以参考配置进行修改，也可以通过重命名覆盖初始化的配置文件。对于更多 settings.yaml 的配置选项，你可以参考官方文档：[Default Configuration Mode (using JSON/YAML)](https://microsoft.github.io/graphrag/config/json_yaml/)和[Fully Custom Config](https://microsoft.github.io/graphrag/config/custom/)\n\n```\n这里推荐使用大语言模型 glm-4-flash（首个免费调用的模型），因为在推理和总结阶段需要消耗大量的 Tokens。\n我尝试对完整的《红楼梦》原文构建索引，最终消耗了大约 700W 个 Tokens，个人学习用的话尽力而为吧。\n```\n\n# 优化策略 — 使模型侧重中文\n\n## 优化 1: 替换文档切分策略\n\n官方分块把文档按照 token 数进行切分，对于中文来说容易在 chunk 之间出现乱码，这里参考 `Langchain-ChatChat` 开源项目，用中文字符数对文本进行切分。\n\n复制文件 [splitter/tokens.py](./splitter/tokens.py) 替换掉 python 依赖库中的 `graphrag/index/verbs/text/chunk/strategies/tokens.py` 即可。\n\n## 优化 2: 使用中文提示词(chinese-prompt)\n\n初始化后，在 `prompts` 目录中可以看到 GraphRAG 的四个 prompt 文件的内容都由英文书写，并要求 LLM 使用英文输出。\n\n为了更好地处理中文内容，这里我使用 `gpt-4o` 模型，将 [prompts/](./prompts/) 中的四个 prompt 文件都翻译成中文，并要求 LLM 用中文输出结果。\n\n**如果你有更好的想法，想要自定义提示词，同样可以通过修改这四个 prompt 文件来实现，但注意不要修改提示词的文件名，以及不要修改和遗漏了在原提示词中有关输出的关键字段和格式，以免 GraphRAG 无法正常获取它们。**\n\n## 优化 3: 模型调用\n\nGraphRAG 默认使用 openai 进行模型调用，该模型为国外模型，对中文支持并不友好。为更好地支持中文，这里选择 `bigmodel` 进行模型调用，该模型为国内大模型厂商智谱 AI 提供。\n\n## 优化 4: 模型选择\n\nGraphRAG 默认使用 gpt-4o 模型，该模型为国外模型，对中文支持并不友好。为更好地支持中文，这里选择 `glm-4-plus` 模型，该模型为国内大模型厂商智谱 AI 提供。\n\n# 构建索引\n\n1. 通过运行如下命令， Graphrag 会在指定的文件路径下加载配置文件`.env`和`setting.yaml`，并按照你的配置开始构建索引。\n\n```bash\npython -m graphrag.index --root ./graphrag-practice-chinese\n```\n\n- 假设你当前的文件路径已经在`graphrag-practice-chinese`下的话，命令指定的构建路径应该为当前目录，则构建索引的命令应该是：\n\n```bash\npython -m graphrag.index --root ./\n```\n\n**你需要确保指定的文件路径下存在配置文件`.env`和`setting.yaml`，且配置了正确的`api_key`。**\n\n**自定义样本数据**\n\nGraphRAG 会默认为 `input` 路径下的 `txt` 文件构建索引，**如果需要指定文件的路径或类型，可以修改`settings.yaml`中的`input`部分**。\n\n```\n注意！GraphRAG 仅支持 `txt 或 csv` 类型的文件，编码格式必须为 `utf-8`。\n```\n\n在本项目中，我将红楼梦原文文本作为样本，所以在配置文件`setting.yaml`中将文件路径`base_dir`修改为`input/hongloumeng`，如下:\n\n```yaml\n# ... 其他设置保持不变 ...\ninput:\n  type: file # or blob\n  file_type: text # or csv\n  base_dir: \"input/hongloumeng\"\n  file_encoding: utf-8\n  file_pattern: \".*\\\\.txt$\"\n# ... 其他设置保持不变 ...\n```\n\n**如果你也想要把红楼梦原文文本作为样本，可以通过我的另一个项目 [hongloumeng-txt](https://github.com/Airmomo/hongloumeng-txt) 获取到符合 GraphRAG 格式要求的文件，获取完成后将文件放在`input/hongloumeng`目录下即可。**\n\n2. 在构建过程中会自动创建两个目录：\n\n- `output` 目录，用于存放查询结果。\n- `cache` 目录，用于存放缓存数据。\n\n3. 索引构建完成后会提示：`All workflows completed successfully` ，说明即可构建完成，随时可以进行查询。（如果没有 GPU 加持的话，构建的过程还是比较久的，可以在控制台你看到每一个步骤的进度条。）\n\n# 查询测试\n\n## global 全局查询\n\n```bash\npython -m graphrag.query --root ./graphrag-practice-chinese --method global \"故事的主旨是什么？\"\n```\n\n查询结果示例：\n\n```markdown\nSUCCESS: Global Search Response:\n《红楼梦》的主旨在于通过对贾、王、史、薛四大家族的兴衰描写，展现了封建社会的各种矛盾和冲突，揭示了封建社会的腐朽和衰落。故事中的人物关系错综复杂，反映了当时社会的风俗习惯和道德观念。小说通过对宝玉、黛玉、宝钗等主要人物的爱情悲剧，探讨了人性、命运、社会关系等主题，反映了作者对封建礼教和封建制度的批判。\n\n此外，小说还探讨了人生、命运、爱情、婚姻等主题，反映了作者对人生和社会的深刻思考。通过对贾宝玉、林黛玉、薛宝钗等主要人物的塑造，展现了封建社会中人性的复杂性和悲剧性，反映了人性的光辉与阴暗面。故事中的人物命运和家族兴衰反映了当时社会的现实，同时也表达了作者对美好人性的追求和对理想社会的向往。\n\n综上所述，《红楼梦》的主旨不仅揭示了封建社会的腐朽和衰落，还探讨了人性、命运、社会关系等主题，具有深刻的思想内涵和艺术价值。\n```\n\n## local 本地查询\n\n```bash\npython -m graphrag.query --root ./graphrag-practice-chinese --method local \"贾母对宝玉的态度怎么样？\"\n```\n\n查询结果示例：\n\n```markdown\nSUCCESS: Local Search Response:\n贾母对宝玉的态度可以从多个方面进行总结：\n\n1. 溺爱与关心：贾母对宝玉有着深厚的溺爱。在《红楼梦》中，贾母多次探望宝玉，甚至亲自到园中看望他，表现出对宝玉的关心和爱护。例如，在贾母探视宝玉的情况中，贾母和王夫人一同探望宝玉，并询问他的病情，显示出贾母对宝玉的关心（Data: Entities (4704, 2929, 3895, 5470, 5868)）。\n\n2. 宠爱与宽容：贾母对宝玉的宠爱还体现在对宝玉行为的宽容上。宝玉性格顽劣，有时甚至有些荒唐，但贾母却总是以宽容的态度对待他。例如，贾母对宝玉的干妈“老东西”的指责，显示出贾母对宝玉的宠爱（Data: Relationships (528, 2124)）。\n\n3. 期望与教育：尽管贾母对宝玉宠爱有加，但她也关心宝玉的教育。在贾母房中，贾母关注宝玉的教育，并关心他的成长（Data: Entities (2702, 5524, 5868)）。\n\n4. 情感交流：贾母与宝玉之间有着深厚的情感交流。在贾母与宝玉的互动中，贾母不仅关心宝玉的身体健康，还关心他的心理状态，体现出两人之间深厚的感情（Data: Sources (607, 314, 481)）。\n\n综上所述，贾母对宝玉的态度是溺爱、关心、宠爱、宽容，同时也有期望和教育。这种复杂的情感关系，体现了贾母对宝玉的深厚感情。\n```\n\n## Tip：全局查询和本地查询的区别\n\n| 特征         | 本地查询 (Local Search)    | 全局查询 (Global Search)         |\n| ------------ | -------------------------- | -------------------------------- |\n| 查询范围     | 以特定实体为入口点         | 基于预先计算的实体社区摘要       |\n| **查询方法** | **使用实体嵌入和图遍历**   | **向每个社区提问并汇总答案**     |\n| **适用场景** | **针对特定实体的精确查询** | **广泛的主题性问题**             |\n| 性能         | 对简单直接任务更高效       | 适合处理复杂的多步骤查询         |\n| 复杂度       | 相对较低                   | 较高，需要更多计算资源           |\n| 响应速度     | 通常更快                   | 可能较慢，取决于查询复杂度       |\n| 洞察深度     | 适中                       | 更深入，能更全面理解上下文和关系 |\n| Token 使用量 | 较低                       | 较高，due to 多次 LLM 调用       |\n| 实现依赖     | 向量搜索和图遍历           | 预计算的社区摘要和多次 LLM 调用  |\n| 最佳使用场景 | 需要快速直接答案的情况     | 需要深入洞察和复杂推理的场景     |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fairmomo%2Fgraphrag-practice-chinese","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fairmomo%2Fgraphrag-practice-chinese","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fairmomo%2Fgraphrag-practice-chinese/lists"}