操作流程
可以参照官网这个流程 https://microsoft.github.io/graphrag/posts/get_started/
也可以参照这个流程,但是我失败了。graphrag-accelerator Quickstart
提前准备 llm 和 embedding 账号
这里推荐 LLM 使用 deepseek,超省钱,主要是这个 graph RAG 太费 token 了。如果使用 deepseek 的话记得 max_tokens 设置 4096,因为官方最大支持 4096。
Embedding 可以使用openai 或者 Azure 的 text-embedding-3-small 模型。
初始化项目
在你工作目录内执行初始化命令
poetry run poe index --init --root .
他会自动生成 input 、output、prompts、cache目录,以及.env、settings.yaml文件
配置参数和索引文件
我们只需要修改这两个文件以及放入我们想要索引的文件即可。
现在你需要配置 settings.yaml文件内 llm 下的配置,以及embeddings下 llm 的配置。
我这边使用了一篇俄国作家契诃夫1884年创作的一篇短篇小说《变色龙》作为 demo。
将想要索引的文件放入input文件夹下。
《变色龙》契科夫 小说原文
构建索引
接着执行如下命令
python -m graphrag.index --root ./ragtest
进入漫长的等待,经过以下过程才能完成索引建立,耗时非常长,可能会耗费非常多的时间。所以第一次测试一定要使用小文件来测试,不然跑了很多 token又失败了会很难受。
下面是执行过程的一些截图
Query
python -m graphrag.query \
--root ./ragtest \
--method global \
"奥楚蔑洛夫是一个什么样的人?"
我们使用 langchain写了一个普通的 RAG 代码附在下面,进行简单对比问题的回答情况
langchain rag 脚本
问题对比
奥楚蔑洛夫是一个什么样的人?
Graph RAG 300chunk size 100 overlap
奥楚蔑洛夫是一位警官,他在处理赫留金被狗咬伤的事件中扮演了关键角色。最初,他对狗的归属和伤害表示严厉态度,并打算采取行动惩罚放出狗的人。然而,当得知狗属于将军哥哥后,他的态度发生了显著变化,显示出他对权力的敏感和对法律执行的灵活性[Data: Reports (0, 2)].
此外,奥楚蔑洛夫在市集广场上执行巡回任务,与巡警一起巡逻,这表明他在社区中的执法地位和活动范围。他的行为不仅影响了他个人的形象,也反映了当时社会中权力结构和法律执行的复杂性[Data: Reports (1)].
总的来说,奥楚蔑洛夫是一个对权力敏感、执法态度灵活的警官,他的行为在一定程度上揭示了当时社会中权力与法律的关系。
Graph RAG 600 chunk size 50 overlap
奥楚蔑洛夫是一位执法官员,他在处理赫留金被狗咬的事件中扮演了关键角色。他的行为和决策显示了他在社区中的权力和影响力。以下是对奥楚蔑洛夫的几个关键观察:
1. **对民众的态度**:奥楚蔑洛夫最初对赫留金被狗咬的事件表示怀疑,并质疑其受伤的真实性。他对赫留金进行威胁,这表明了官方对民众的态度可能存在一定的怀疑和不信任[Data: Reports (2)]。
2. **权力对执法态度的影响**:在得知狗可能属于日加洛夫将军后,奥楚蔑洛夫的态度有所转变。这显示了权力对执法态度的影响,表明他在面对更高权力时可能会调整自己的立场和决策[Data: Reports (2)]。
3. **决策的变化**:奥楚蔑洛夫在处理将军家的狗事件中展现了决策的变化。他最初决定狗是野狗并应被处理,但后来得知狗是将军哥哥的后改变了决定。这一变化可能反映了在处理公共事件时的复Data: Reports (3)]。
综上所述,奥楚蔑洛夫是一个在执法过程中表现出权力和影响力的人物,他的态度和决策受到外部因素(如权力关系)的影响,显示出在处理公共事件时的复杂性和不确定性。
RAG
奥楚蔑洛夫是一个市集的巡警,他在处理事件时表现出对上级(如乌拉吉米尔•伊凡尼奇)的尊敬和讨好,同时对普通民众(如赫留金)则显得傲慢和威胁。他的行为显示出他是一个趋炎附势、对权力敏感的人。
叶尔德林是一个什么样的人?
Graph RAG 300chunk size 100 overlap
叶尔德林是一名巡警,他在一次事件中被指派去调查狗的归属并准备相关报告。他的角色在确认狗的归属和处理事件中至关重要。叶尔德林被指示脱下奥楚洛夫的大衣,并可能被指派将狗送到将军家。这些行动显示他在事件处理中的重要性和责任。[Data: Reports (0)]
Graph RAG 600 chunk size 50 overlap
叶尔德林作为巡警,在处理将军家的狗事件中扮演了关键角色。他被奥楚蔑洛夫命令调查狗的来源并准备报告,同时也被指派去将军家确认狗的归属,显示了他在将军家的狗有所了解,并提供关于狗品种的信息,巡警的角色在事件的调查和处理中起到关键作用[Data: Reports (2)]。
综上所述,叶尔德林是一个在事件处理中具有重要责任和作用的巡警,他不仅负责调查和报告,还提供关键信息和法律观点,对事件的解决起到了重要作用。
RAG
叶尔德林是奥楚蔑洛夫警官的下属,他在故事中负责执行警官的命令,如脱下和穿上警官的大衣,以及将狗送到将军家确认其身份。从描述中可以看出,叶尔德林是一个服从命令、执行任务的巡警。
狗起到了什么作用
Graph RAG 300chunk size 100 overlap
狗在事件中扮演了核心角色,涉及其归属问题以及可能的恶行。狗被描述为一条宠物狗,被怀疑是日加洛夫将军家的,且被认为是可能的疯狗。狗因咬人而引起了和价值。[Data: Reports (0, 3, 2)]
此外,狗是事件中的关键元素,被描述为伶俐且咬了某人的手指。狗的归属问题成为事件的核心,影响了社区的动态。白毛小猎狗是事件中的关键角色,它坐在人群中央,表现出苦恼和恐惧。赫留金与白毛小猎狗之间存在冲突,赫留金似乎因为白毛小猎狗而受伤并表现出愤怒。[Data: Reports (3, 2)]
综上所述,狗不仅是事件的触发点,也是推动情节发展和人物关系变化的关键因素。
Graph RAG 600 chunk size 50 overlap
在将军家的狗事件中,白毛小猎狗起到了关键作用。首先,它是导致赫留金手指受伤的动物,这一行为直接引发了后续的事件 [Data: Reports (2)]。其次,狗在复杂性 [Data: Reports (2)]。
奥楚蔑洛夫最初决定狗是野狗并应被处理,但后来得知狗是将军哥哥的后改变了决定。这一转变不仅影响了事件的处理方式,也可能影响公众对执法机构的信任和看法 [Data: Reports (3)]。因此,狗不仅是事件的直接原因,也是影响事件发展和公众反应的重要因素。
RAG
狗在故事中起到了引发事件和冲突的作用。它被误认为是将军家的狗,导致人们对它的态度和行为发生了变化。最终,狗的身份和行为成为了人们争论和判断的焦点。
介绍下赫留金
Graph RAG 300chunk size 100 overlap
赫留金是社区中一个引人注目的人物,他在一次事件中被狗咬伤,成为受害者。他的遭遇不仅引起了社区的关注,还激发了他寻求赔偿和正义的决心。赫留金在事件中表现出强烈的愤怒和揭露真相的决心,尽管他也成为了人群嘲笑的对象。
此外,赫留金的受伤和后续行动引起了奥楚蔑洛夫的关注,并成为事件的关键人物。他的角色在事件的发展中起到了至关重要的作用,推动了整个事件的进展。
Graph RAG 600 chunk size 50 overlap
赫留金是社区中的一个关键人物,他遭受了不公正的待遇。具体来说,他的手指被一只白毛小猎狗咬伤,这一事件在社区中引起了关注。赫留金在人群中展示他受区中的弱势地位。这些情况揭示了赫留金在社区中的复杂处境和他对正义的坚持。[Data: Reports (2)]
RAG
赫留金是一位首饰匠,他在与他人谈论木柴时,被一条狗咬伤了手指。他要求赔偿,认为法律不应让人忍受畜生的伤害。人群和官员奥楚蔑洛夫对此事进行了讨论和处理。
可以发现确实如论文所说,Graph RAG 在全面性和多样性上 效果出众,但是朴素 RAG 的回答相对更加直接。
使用Neo4j 可视化
这个可视化是从 github 上看一个大佬分享的(原文地址)。
下载运行 neo4j 的 docker
docker run \
-p 7474:7474 -p 7687:7687 \
--name neo4j-apoc \
-e NEO4J_apoc_export_file_enabled=true \
-e NEO4J_apoc_import_file_enabled=true \
-e NEO4J_apoc_import_file_use__neo4j__config=true \
-e NEO4J_PLUGINS=\[\"apoc\"\] \
neo4j:5.21.2
安装依赖
pip install --quiet pandas neo4j-rust-ext
浏览器设置
浏览器打开http://localhost:7474/,然后输入默认用户名neo4j
,默认密码neo4j
即可登录,登录之后要求重设密码。
执行脚本
下面脚本已经调整好了,可以直接使用脚本,修改对应 OPENAI_API_KEY、GRAPHRAG_FOLDER、NEO4J_PASSWORD 参数即可。
neo4j转换成图的脚本
也可以直接看我这边生成好的图。
http://10.189.124.193:7474/browser/
Username: neo4j
Password: liujiangbo
浏览器查看
其他
因为免费的 neo4j 只支持 1 个 db,不支持多个。
如果想要用新数据,我们可以执行下面两个命令删除现有数据。修改GRAPHRAG_FOLDER, 再重新执行上面的 py 脚本即可再次生成。
删除所有关系 MATCH ()-[r]-() DELETE r;
删除所有节点 MATCH (n) DELETE n;
当然,我这里也写了对 Graph RAG 的解析和自己的理解