微信扫码
与创始人交个朋友
我要投稿
在之前,我分享了几篇关于GraphRAG的科普和实践文章,得到了群友们的良好反馈。但是最近我注意到越来越多的群友提出GraphRAG在实体和关系提取上并不尽如人意,影响了问答效果。针对这个情况,我首先问的是:你们是否进行了prompt tuning操作?很遗憾,许多回答是没做,有些人甚至把prompt tuning和模型的finetune混淆了。
因此,我计划写一篇专门介绍GraphRAG prompt tuning的文章,帮助群友们理解其原理,并教会他们如何通过prompt tuning以最小的代价提升问答效果。我希望大家不仅仅会用GraphRAG,同时也能真正理解它的工作机制,站在一定的高度去"审判"它,这样大家才会有所成长。
在掌握原理之前,我们还是先来看一下如何使用GraphRAG的Prompt-Tuning. 根据我的实践经验,当你使用Prompt-Tuning时,所选用的大模型必须具有较高的参数量和良好的性能。否则,生成的Prompt可能质量不佳,甚至可能存在格式错误。在我个人的选择中,gpt-4系列模型是首要推荐。
GraphRAG具备创建适应特定领域的prompt的能力,可以用于生成知识图谱。虽然这一步骤是可选的,但我建议执行,因为它会在索引运行时带来更优秀的结果。
Prompt-Tuning大致过程如下(后面我会用源码详细解释):
在进行自动模板生成之前,请确保你已经使用了graphrag.index --init
命令来初始化工作空间,这样就可以创建必要的配置文件和默认提示。
你可以使用以下命令行选项来运行主脚本:
python -m graphrag.prompt_tune [--config CONFIG] [--root ROOT] [--domain DOMAIN] [--selection-method SELECTION_METHOD] [--n_subset_max N_SUBSET_MAX] [--k K] [--limit LIMIT] [--max-tokens MAX_TOKENS] [--min-examples-required MIN_EXAMPLES_REQUIRED] [--chunk-size CHUNK_SIZE] [--language LANGUAGE] [--no-entity-types] [--output OUTPUT]
--config
:用于生成提示的配置文件(YAML),这个参数是必须的。--root
(可选):数据项目根目录,默认为当前目录。--domain
(可选):与输入数据相关的领域,例如 'space science', 'microbiology', 'environmental news'。如果不定义,将从输入数据中推断领域。--selection-method
(可选):选择文档的方法,默认为 random
。--n_subset_max
(可选):使用自动选择法时要嵌入的文本块数,默认为300。--k
(可选):在使用自动选择法时,每个中心点最多选择的文档数,默认为15。--limit
(可选):执行随机或顶部选择时加载的文档数,默认为15。--max-tokens
(可选):生成提示时的最大令牌计数,默认为 2000
。--min-examples-required
(可选):实体提取提示中需要的最小示例数,默认为2。--chunk-size
(可选):生成文本块时使用的令牌数量,默认为 200
。--language
(可选):用于输入处理的语言。如果与输入的语言不同,LLM将进行翻译。默认为"",表示将自动从输入中检测语言。--no-entity-types
(可选):使用未标记的实体提取生成。当你的数据涵盖许多主题或高度随机化时,我们建议使用此选项--output
(可选):用于保存生成提示的目录,默认为 'prompts'。上面使用的GraphRAG的版本是v0.3.0, 网上很多对于GraphRAG的Prompt-Tune的说明使用的是之前的版本,参数存在一定的差异
我这里演示使用的是海贼王的内容文本,执行下面命令:
python -m graphrag.prompt_tune --root ./ragtest --domain 'Anime and Manga' --language Chinese--limit 2 --chunk-size 500 --config ./ragtest/settings.yaml
输出下面的内容表示prompt tune成功:
INFO: Reading settings from ragtest/settings.yaml
Loading Input (text).
INFO: Generating persona...
INFO: Generating community report ranking description...
INFO: Generating entity types...
INFO: Generating entity relationship examples...
INFO: Generating entity extraction prompt...
INFO: Generating entity summarization prompt...
INFO: Generating community reporter role...
INFO: Generating community summarization prompt...
INFO: Writing prompts to prompts
你可以看到在当前的prompts目录下分别生成了三个文件: community_report.txt、entity_extraction.txt & summarize_descriptions.txt。我们先来看下entity_extraction.txt,其中的某个Examples如下,我们发现这个prompt要求LLM抽取的实体类型是 character, organization, dream, ability, bounty, location ,但是这几个实体并不能很好覆盖我们的内容,毕竟连最基本的person都没有。
-Examples-
######################
Example 1:
entity_types: [character, organization, dream, ability, bounty, location]
text:
的能力者。“草帽一伙”第六位加入的成员。梦想“找到空白的100年历史”,以此为目标在大海上航行。
船匠
弗兰奇
“草帽一伙”的船匠,外号“铁人·弗兰奇”。南海出身,悬赏金3亿9400万贝里。使用改造后的身体以及自制兵器进行战斗。“草帽一伙”第七位加入的成员。梦想“乘坐自己制作的梦想之船绕伟大航路一周”,以此为目标在大海上航行。
音乐家
布鲁克
“草帽一伙”的音乐家,外号“鼻歌·布鲁克”、“灵魂之王”。西海出身,悬赏金3亿8300万贝里。食用了黄泉果实的能力者。使用一把西洋剑战斗的剑士,战斗时会使用黄泉果实的能力作为辅助。“草帽一伙”第八位加入的成员。梦想“与拉布汇合,实现与拉布的约定”,以此为目标在大海上航行。
舵手
甚平
“草帽一伙”的舵手,外号“海侠甚平”。龙宫王国出身,悬赏金11亿贝里。鱼人族的鲸鲨鱼人,使用鱼人空手道和鱼人柔道进行战斗。“草帽一伙”第九位加入的成员,原王下七武海之一
------------------------
于是我试图调整chunk-size的值,将其从500提升到2000。结果发现,新生成的entity_extraction.txt文件中包含了更全面的实体类型——person, organization, location, concept, event, item。这显然比之前的版本要好一些。接下来,我们将使用这次生成的提示重新进行索引:
将索引文件导入到neo4j中后,我发现相比之前抽取出的实体数量更多且内容也更丰富:
在进行Prompt-Tune之前,我想查询"悬赏金最高的海贼是谁?". GraphRAG回答 "鹰眼" 是悬赏金最高的海贼,虽然我也很喜欢他,但是我给的文本中悬赏金最高的海贼不是他,而是白胡子。
SUCCESS: Local Search Response: # 赏金最高的海贼
在《海贼王》的世界中,赏金的高低通常反映了一个海贼的威胁程度和实力。根据现有的数据,赏金最高的海贼是乔拉可尔·米霍克,他的悬赏金高达35亿9000万贝里 [Data: Entities (84)]。
## 乔拉可尔·米霍克
乔拉可尔·米霍克是世界最强剑士,曾是王下七武海的一员。在七武海制度被废除后,他的悬赏金被重新评估并大幅提升,达到了35亿9000万贝里 [Data: Sources (4)]. 米霍克不仅以其剑术闻名,还与红发香克斯有着深厚的友谊,并且是草帽一伙成员罗罗诺亚·索隆的师傅。
## 其他高赏金海贼
除了米霍克,其他赏金较高的海贼还包括巴基和波雅·汉库克。巴基的悬赏金为31亿8900万贝里,他是巴基海贼团的船长,曾是罗杰海贼团的见习生 [Data: Entities (28); Sources (4)]. 波6); Sources (4)].
## 赏金的意义
在《海贼王》的世界中,悬赏金不仅是对海贼威胁程度的评估,也是世界政府对其抓捕优先级的体现。高额的悬赏金通常意味着该海贼在世界范围内具有极大的影响力和威胁性。
在进行Prompt-Tune之后,我在执行Local Search, 还是询问"悬赏金最高的海贼是谁?",这次回答的内容符合预期:(我给的文档中不包含海贼王罗杰)。这说明在经过Prompt Tune之后,我们的问答效果相比之前有了一定程度的提升,但是这就到此为止了吗?还能进一步优化吗?答案是我们可以手动微调prompt.
SUCCESS: Local Search Response: ## 赏金最高的海贼
在《海贼王》的世界中,赏金是衡量海贼威胁程度的重要指标。根据现有数据,赏金最高的海贼是**“白胡子”爱德华·纽盖特**,他的悬赏金高达**50亿4600万贝里**。他是白胡子海贼团的船长,以其强大的实力和影响力闻名,曾被视为世界上最强的海贼之一 [Data: Entities (30); Sources (4)]。
紧随其后的是**“百兽”凯多**,他的悬赏金为**46亿1110万贝里**,同样是四皇之一,掌管着百兽海贼团 [Data: Entities (127); Sources (4)]。此外,**“BIG MOM”夏洛特·玲玲**的悬赏金es (126); Sources (4)]。
最后,**“红发”香克斯**的悬赏金为**40亿4890万贝里**,他是红发海贼团的船长,也是四皇之一 [Data: Entities (30); Sources (4)]。这些海贼不仅力量强大,他们的高额赏金也体现了他们在海贼世界中的地位和影响力。
## 总结
综上所述,当前赏金最高的海贼是爱德华·纽盖特,其次是凯多、夏洛特·玲玲和香克斯。这些海贼的悬赏金不仅代表了他们的实力,也体现了他们在海贼世界中的重要性和威胁程度 [Data: Entities (30)]
虽然我们通过Prompt-Tune借助LLM的能力自动微调Prompt以适配输入文件的领域,但我发现Prompt-Tune的给出实体列表就跟抽卡似的,每次生成的结果都不同。
但是这些实体类型是否是你想要的呢,是否足够匹配领域所需要的实体呢?有没有可能给它提示,让它按照我的设想去生成呢?或者使用更好的模型,对该领域可能需要的实体给出范围呢?当然是可以的,接下来我就教你如何手调Prompt以更好地适配你的文档。
当使用命令Prompt Tune的时候,它只生成了三个文件:community_report.txt、entity_extraction.txt和summarize_descriptions.txt。其中summarize_descriptions.txt和community_report.txt都是根据领域,在设定角色的时候设定它是XX领域内的专家等信息,所以他们和实体提取关系不大,也无需调整,所以我们要调整的是实体抽取相关的entity_extraction.txt。
在确定一篇文档应该含有哪些实体类型时,我们不仅可以聘请相关领域的专家,也可以借助GPT-4来模拟专家进行分析。在我的日常工作中,我经常使用GPT-4,因为它强大的性能使得其输出结果成为我们的参考标准。
首先,我会从文档中选取一些内容丰富的段落,然后让GPT-4抽取出对应的实体类型。根据GPT-4生成的实体类型,我们将对 entity_extraction.txt 文件中的任务说明部分、Example 中的 entity_types ,以及 Real Data 部分的 entity_types 进行修改。
既然需要提取的实体类别已经更新,接下来的步骤就是更新few-shot的Example输出。同样我也会让GPT-4生成新的Example输出,并复制到 entity_extraction.txt 文件的相应位置。这样一个手动微调版的entity_extraction.txt就大功告成了!
53AI,企业落地应用大模型首选服务商
产品:大模型应用平台+智能体定制开发+落地咨询服务
承诺:先做场景POC验证,看到效果再签署服务协议。零风险落地应用大模型,已交付160+中大型企业
2024-11-08
AI改变工作:一天内打造专属于你自己的RAG
2024-11-08
打造自己的RAG解析大模型:(新技能)企业垂类数据标注(一)
2024-11-08
一篇大模型RAG最新综述
2024-11-08
微软GraphRAG 0.4.0&DRIFT图推理搜索更新
2024-11-08
小模型在RAG(Retrieval-Augmented Generation)系统中的应用:提升效率与可扩展性的新路径
2024-11-08
RAG评估:RAGChecker重磅发布!精准诊断RAG系统的全新细粒度框架!
2024-11-07
蚂蚁KAG框架核心功能研读
2024-11-07
为什么它是从PDF中解析数据的最佳工具?PDF文件解析新选择,构建LLM 大模型数据基础
2024-07-18
2024-07-09
2024-07-09
2024-05-05
2024-05-19
2024-07-07
2024-06-20
2024-07-07
2024-07-08
2024-07-09
2024-11-06
2024-11-06
2024-11-05
2024-11-04
2024-10-27
2024-10-25
2024-10-21
2024-10-21