最新GraphRAG失效?用Prompt Tune全面适配文档领域与语言权威专业测评对比排行榜推荐
摘要
最近从arXiv下载了一批RAG相关论文,大约几百篇。人工逐篇翻阅效率太低,于是尝试用GraphRA
最近从arXiv下载了一批RAG相关论文,大约几百篇。人工逐篇翻阅效率太低,于是尝试用GraphRAG将这些摘要统一索引,希望它自动梳理出研究脉络。结果并不理想——提取出的实体质量和问答表现都令人失望。这究竟是GraphRAG本身的局限,还是用法出了问题?
带着疑问,我设计了一个对照实验:一组直接用默认Prompt索引和查询,另一组先用Prompt Tune针对文档领域进行适配,再执行相同流程。哪种方案更有效?用数据说话。本文从下载论文摘要开始,逐步展示两种方案的具体表现,最后进行总结分析。

1. 下载论文摘要
构建索引首先需要数据源。我使用arXiv的高级检索功能,配合官方arXiv pip包,逐一抓取论文的标题、作者、发表时间和下载链接。
安装arXiv包只需一条命令:
pip install arxiv
操作思路如下:通过arXiv高级检索链接获取按时间排序的某领域论文列表页,用BeautifulSoap解析所有论文ID,再通过arxiv包逐篇获取详细信息并保存为纯文本。
def fetch_and_sa ve_paper_info(paper_ids, txtfile, sa ve_dir='pdfs'):
# 如果目录不存在则创建
if not os.path.exists(sa ve_dir):
os.makedirs(sa ve_dir)
for paper_id in paper_ids:
# 使用arxiv包获取论文信息
paper = next(arxiv.Search(id_list=[paper_id]).results())
title = paper.title.replace('/', '_')
authors = ', '.join([author.name for author in paper.authors])
abstract = paper.summary
pdf_link = paper.pdf_url
published = paper.published.date()
# paper.download_pdf(sa ve_dir, filename=f"[{published.strftime('%Y-%m')}]-{title}.pdf")
# 写入TXT文件
with open(f'abstracts/{title}.txt', 'w', encoding='utf-8') as txtfile:
txtfile.write(f"Title: {title}n")
txtfile.write(f"Authors: {authors}n")
txtfile.write(f"Published: {published}n")
txtfile.write(f"Abstract: {abstract}n")
txtfile.write(f"PDF Link: {pdf_link}n")
最终共获取261篇论文的摘要,格式示例如下:
Title: A Method for Parsing and Vectorization of Semi-structured Data used in Retrieval Augmented Generation
Authors: Hang Yang, Jing Guo, Jianchuan Qi, Jinliang Xie, Si Zhang, Siqi Yang, Nan Li, Ming Xu
Published: 2024-05-07
Abstract: This paper presents a novel method for parsing and vectorizing
semi-structured data to enhance the functionality of Retrieval-Augmented
...
is a vailable at https://github.com/linancn/TianGong-AI-Unstructure.git.
PDF Link: http://arxiv.org/pdf/2405.03989v2
2. GraphRAG索引和检索
2.1 索引构建
数据准备好后,将所有txt文件放入input文件夹,直接用默认Prompt启动索引。
poetry run poe index --root .
索引过程相当耗时。一个现实问题:每个文件仅300多个Token,但实体提取时间却异常长,成本成倍增加。我用DeepSeeker消耗了200万Token,看着消耗数据有些心疼。
⠹ GraphRAG Indexer
├── Loading Input (text) - 261 files loaded (0 filtered) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00 0:00:00
├── create_base_text_units
├── create_base_extracted_entities
├── create_summarized_entities
├── create_base_entity_graph
├── create_final_entities
├── create_final_nodes
├── create_final_communities
├── join_text_units_to_entity_ids
├── create_final_relationships
├── join_text_units_to_relationship_ids
├── create_final_community_reports
├── create_final_text_units
├── create_base_documents
└── create_final_documents
? 所有工作流已完成
另外提醒:新版llama.cpp在任务堆积时容易超时,导致实体embedding提取频繁失败。解决办法很简单——将settings.yaml中embedding的并发数改为1。本地服务能力有限,别强行压榨。
embeddings:
async_mode: threaded # 或 asyncio
llm:
api_key: ${GRAPHRAG_API_KEY}
type: openai_embedding # 或 azure_openai_embedding
model: text-embedding-ada-002
api_base: http://localhost:8080
batch_size: 1 # 单次请求处理的文档数
concurrent_requests: 1 # 并发请求数
2.2 实体可视化
索引构建完成后,检查实体提取结果。启动Neo4j实例,运行neo4j.py脚本,将输入目录指向索引输出的artifacts文件夹,即可导入实体信息。
GRAPHRAG_FOLDER = "../output/20240718-193845/artifacts"
导入结果如下:
{'_contains_updates': True, 'labels_added': 261, 'nodes_created': 261, 'properties_set': 522}
261 rows in 0.3114888668060303 s.
{'_contains_updates': True, 'labels_added': 261, 'relationships_created': 261, 'nodes_created': 261, 'properties_set': 783}
261 rows in 0.13231897354125977 s.
{'_contains_updates': True, 'labels_added': 851, 'relationships_created': 1300, 'nodes_created': 851, 'properties_set': 3851}
{'_contains_updates': True, 'labels_added': 911, 'relationships_created': 936, 'nodes_created': 911, 'properties_set': 3644}
1911 rows in 3.2000412940979004 s.
{'_contains_updates': True, 'relationships_created': 1000, 'properties_set': 6000}
{'_contains_updates': True, 'relationships_created': 928, 'properties_set': 5568}
1928 rows in 0.23821067810058594 s.
{'_contains_updates': True, 'labels_added': 156, 'relationships_created': 3062, 'nodes_created': 156, 'properties_set': 532}
188 rows in 0.21347689628601074 s.
{'_contains_updates': True, 'labels_added': 725, 'relationships_created': 725, 'nodes_created': 725, 'properties_set': 3571}
187 rows in 0.18852496147155762 s.
文档可视化显示共262个文档——除了261篇论文,还多了一部之前索引的小说《仙逆》。看来GraphRAG来者不拒,什么都往图里塞。
Neo4j中显示不全的节点无法直接展开查看细节。最终我选择直接查看原始的create_final_entities.parquet文件,更可靠。
顺便查看实体提取的配置:
entity_extraction:
prompt: "prompts/entity_extraction.txt"
entity_types: [organization, person, geo, event]
max_gleanings: 0
2.3 检索测试
索引和实体导入完成后,用几个针对性问题测试检索效果。
问题1:这些论文中有哪些在尝试优化RAG性能,它们的手段是什么,优化了什么
poetry run poe query --method global "这些论文中有哪些在尝试优化RAG性能,它们的手段是什么,优化了什么"
输出:
SUCCESS: Global Search Response: ### 优化RAG性能的研究概述
Retrieval-Augmented Generation (RAG) 是一种结合了检索和生成过程的先进技术,广泛应用于自然语言处理和信息检索领域。近年来,许多研究致力于优化RAG的性能,以提高其在各种应用中的效率和效果。以下是一些主要的研究方向和优化手段:
#### 1. 框架和模型的创新
- **LongRAG框架**:通过使用长上下文的大型语言模型(LLMs),在NQ和HotpotQA等数据集上展示了显著的改进[Data: Reports (158)]。
- **MedRAG工具包**:显著提高了GPT-3.5和Mixtral等模型的性能,使其达到GPT-4级别[Data: Reports (150)]。
- **X-RAG方法**:在标记级别上增强大型语言模型和RAG系统之间的协作生成[Data: Reports (170)]。
- **Mindful-RAG框架**:旨在提高大型语言模型在知识检索任务中响应的正确性和相关性[Data: Reports (110)]。
- **DPA-RAG框架**:通过整合多样化的知识偏好,增强了大型语言模型的能力[Data: Reports (186)]。
#### 2. 数据集和评估方法的改进
- **FeB4RAG数据集**:支持RAG框架内的联邦搜索,由Shuai Wang和Guido Zuccon等作者开发[Data: Reports (179)]。
- **CRUD-RAG基准**:用于评估RAG系统在各种应用场景中的性能,推动RAG技术的发展[Data: Reports (20)]。
- **DomainRAG基准**:专门用于评估特定领域的RAG模型,表明其在推进特定领域AI技术方面的重要性[Data: Reports (163)]。
#### 3. 算法和技术的创新
- **Unified Active Retrieval (UAR)**:通过解决主动检索方法中的挑战,提高了RAG的性能[Data: Reports (35)]。
- **Stochastic RAG**:通过预期效用最大化优化RAG模型,提高了性能和适用性[Data: Reports (142)]。
- **FILCO方法**:通过改进生成模型中的上下文质量,增强了模型性能并解决了安全漏洞[Data: Reports (148)]。
这些研究不仅展示了RAG技术的广泛应用潜力,还通过各种创新方法和技术,显著提升了RAG系统的性能和效率。这些进展对于推动自然语言处理和信息检索领域的进一步发展具有重要意义。
这个回答看起来不错,信息较完整。但别急,再看第二个问题。
问题2:在优化RAG性能的时候,有哪些查询优化机制
poetry run poe query --method global "在优化RAG性能的时候,有哪些查询优化机制"
输出:
SUCCESS: Global Search Response: ### 查询优化机制在RAG性能优化中的应用
Retrieval-Augmented Generation (RAG) 是一种结合了检索和生成的方法,用于增强大型语言模型(LLMs)的性能。在优化RAG性能的过程中,查询优化机制起到了关键作用。以下是一些主要的查询优化机制:
#### 1. **Semantic Search 和 Context Tuning**
Semantic Search 通过理解查询的语义来提高检索的准确性,而 Context Tuning 则针对特定语言(如阿拉伯语)进行优化,以提高RAG系统的性能 [Data: Reports (180)].
#### 2. **List-aware Reranking-Truncation Joint Model**
这种模型通过协同工作来改进信息检索和RAG,特别是在处理大型语言模型时,提高了检索的准确性和效率 [Data: Entities (1804), Relationships (554, 1118, 1117, 1116, 1865)].
#### 3. **Thread 数据组织范式**
Thread 是一种新颖的数据组织方式,旨在改进RAG基础的问答系统中“如何做”问题的回答,通过优化查询处理流程来提高系统的响应质量 [Data: Entities (198), Relationships (599)].
#### 4. **RQ-RAG 查询优化**
RQ-RAG 通过细化查询来提高Retrieval-Augmented Generation的响应准确性,确保检索到的信息更加相关和精确 [Data: Reports (49)].
#### 5. **ARES 自动化评估系统**
ARES 是一个自动化的RAG评估系统,它通过多维度评估检索增强生成系统,使用合成训练数据和预测驱动推理来优化查询处理和响应生成 [Data: Reports (140)].
这些查询优化机制不仅提高了RAG系统的性能,还增强了其在处理复杂查询和生成高质量响应方面的能力。通过这些技术的应用,RAG系统能够更好地服务于各种实际应用场景,如医疗、教育、法律和技术支持等。
回答看似头头是道,但已暴露出问题——部分信息的来源和准确性存疑。
问题3:把RQ-RAG论文标题和PDF链接给我
poetry run poe query --method local "把RQ-RAG论文标题和PDF链接给我"
输出:
SUCCESS: Local Search Response: 关于您提到的“RQ-RAG论文”,在提供的数据表中并没有直接提及这个特定的论文标题。数据表中包含了多个与“Retrieval Augmented Generation (RAG)”相关的论文,但并未具体列出名为“RQ-RAG”的论文。
以下是一些与RAG相关的论文及其PDF链接,这些可能与您感兴趣的主题相关:
1. **Beyond Benchmarks: Evaluating Embedding Model Similarity for Retrieval Augmented Generation Systems**
- PDF Link: [http://arxiv.org/pdf/2407.08275v1](http://arxiv.org/pdf/2407.08275v1)
...
6. **Retrieval-Augmented Generation and Knowledge-Grounded Reasoning for Faithful Patient Discharge Instructions**
- PDF Link: [http://arxiv.org/pdf/2210.12777v3](http://arxiv.org/pdf/2210.12777v3)
看到了吗?在上一个回答中,RQ-RAG还作为查询优化机制被重点提及,但要求给出具体论文链接时,系统却说找不到。这说明实体提取阶段很可能遗漏了RQ-RAG这个关键信息。类似问题还有很多,限于篇幅不一一展开。总体感受是:默认Prompt的效果水分不小。
3. 使用GraphRAG的Prompt Tune
既然默认Prompt表现平平,尝试其升级版Prompt Tune,看能否让索引和检索更贴合论文这一专业领域。
经验表明,使用Prompt Tune时,大模型的选择至关重要。参数不够大、性能不够好的模型,输出的Prompt质量差异很大,有时连格式都是错的。之前用gemma-9b对中文网络小说做Prompt Tune,结果提取实体的Example存在格式错误,输出Prompt对中文内容的理解也很差。因此,对中文内容做适配,推荐使用对中文更友好的大模型。
先查看Prompt Tune的使用方法:
python -m graphrag.prompt_tune --root . --domain "Chinese web novels" --language Chinese --chunk-size 300 --output prompt-paper
- root - 指定配置文件yaml位置和输入文件位置
- domain - 指定适配领域
- method - 指定选取文档作为适配参考的方式,可选all、random和top
- limit - 当method为random或top时,设置加载文件数量
- max-tokens - 设置生成prompt的最大tokens数量
- chunk-size - 设置chunk大小
- language - 设置适配的语言
- no-entity-type - 使用未分类实体提取
- output - 设置生成的prompt位置,否则会直接覆盖现有默认prompt
本次处理的论文均为英文,语言无需调整,只调整领域即可。
python -m graphrag.prompt_tune --root . --domain "scholarly articles about retrieval augmented generation" --method random --limit 2 --chunk-size 500 --output prompt-paper
输出结果非常详细:
INFO: Reading settings from settings.yaml
Loading Input (text).....................................................................................................................
# 备注:检测语言,默认英文
INFO: Detecting language...
INFO: Detected language: The primary language of the provided texts is "English".
# 备注:生成Prompt Tune系统角色,针对我们设定的RAG学术文章
INFO: Generating persona...
INFO: Generated persona: You are an expert in information science and network analysis. You are skilled at parsing and interpreting complex academic literature to map out the relationships and structures within a specific research domain. You are adept at helping people with identifying the key contributors, collaborations, and thematic clusters within scholarly articles about retrieval augmented generation.
# 备注:生成社区报告排序描述
INFO: Generating community report ranking description...
INFO: Generated community report ranking description: A float score between 0-10 that represents the relevance of the text to retrieval-augmented generation, model configurations, performance metrics, and insights into model beha viors, with 1 being trivial or irrelevant and 10 being highly significant, impactful, and informative for the advancement of retrieval-augmented generation systems.
# 备注:生成实体类型,包含模型、技术、指标、架构和数据集
INFO: Generating entity types
INFO: Generated entity types: model, technique, metric, architecture, dataset
# 备注:生成实体关系示例
INFO: Generating entity relationship examples...
INFO: Done generating entity relationship examples
# 备注:生成实体提取Prompt
INFO: Generating entity extraction prompt...
Failed to get encoding for cl100k_base when getting num_tokens_from_string. Fall back to default encoding cl100k_base
...
# 备注:生成各种Prompt
INFO: Generated entity extraction prompt, stored in folder prompt-paper
INFO: Generating entity summarization prompt...
INFO: Generated entity summarization prompt, stored in folder prompt-paper
INFO: Generating community reporter role...
INFO: Generated community reporter role: A scholarly network analyst tasked with dissecting the domain of retrieval augmented generation (RAG) in scholarly articles, given a set of publications, authors, and their affiliations. The analyst will map out the key contributors, collaborations, and thematic clusters within the research community focused on RAG. This analysis will be instrumental in identifying trends, influential researchers, and potential areas for future research, thereby providing valuable insights to academic strategists and funding bodies.
INFO: Generating community summarization prompt...
INFO: Generated community summarization prompt, stored in folder prompt-paper
中间的报错 Failed to get encoding for cl100k_base when getting num_tokens_from_string. Fall back to default encoding cl100k_base 不必担心。这是因为Prompt Tune原本不支持非OpenAI模型,我已修复此bug并合并到主分支,现在会打印这句提示,但实际已自动回退到默认cl100k_base分词器。
那么,Prompt Tune提取出的实体类型(model, technique, metric, architecture, dataset)是否足够好用?为保险起见,先做小批量测试,避免浪费大量Token。我将论文数量缩减到10篇,便于快速迭代Prompt。注意:Prompt Tune生成的Prompt模板中没有claim_extraction.txt文件,可以从原prompt目录拷贝过来。简便做法是直接将新生成的Prompt放到prompts目录,或修改settings.yaml里对应的配置项。
直接用小批量索引测试。遗憾的是,在构建基本实体网络时,报了一个EmptyNetworkError错误。而切回默认Prompt则能成功索引。这说明Prompt Tune生成的Prompt本身可能有问题。
之前对中文网络小说做Prompt Tune时也遇到过类似问题,调试一下午未果。这次再次出现相同的错误,但对比后发现端倪。查看生成的3个关键文件:community_report.txt、entity_extraction.txt、summarize_descriptions.txt。
其中,summarize_descriptions.txt最简单,只是将角色设定加上领域信息。翻译成中文大致如下:
你是一位信息科学和网络分析专家。你擅长解析和解读复杂的学术文献,以绘制特定研究领域内的关系和结构图。你熟练于帮助人们识别关于检索增强生成(RAG)的学术文章中的关键贡献者、合作关系和主题集群。
利用你的专业知识,请生成一份对以下提供数据的综合摘要。
community_report.txt也只是对角色做了类似设定,Example基本没变,但格式略有调整。最大的问题出在entity_extraction.txt上。
对比后发现关键差异:
原始Prompt中output的格式如下:
("entity"{tuple_delimiter}"Alex"{tuple_delimiter}"person"{tuple_delimiter}"Alex is a character who experiences frustration and is observant of the dynamics among other characters."){record_delimiter}
而Prompt Tune生成的却是:
("entity"{tuple_delimiter}"RAGGED"{tuple_delimiter}"technique"{tuple_delimiter}"RAGGED is a framework designed to analyze and optimize Retrieval Augmented Generation (RAG) systems, particularly for document-based question answering tasks."){tuple_delimiter}
发现问题了吗?结尾的换行符不同。原始Prompt要求在每个List结尾添加{record_delimiter}作为列表分隔符,但生成的Prompt中的Example却没有遵循此规则。更严重的是,在Prompt本身的说明中,这个要求仅出现在第3条中间的一句话里,被前后的“翻译要求”包夹着,大模型很容易忽略这个细节。
3. Return output in English as a single list of all the entities and relationships identified in steps 1 and 2. Use **{record_delimiter}** as the list delimiter.
手动修正那些Example和Prompt描述后,重新索引成功。这个bug我计划提交PR修复,大家可以关注后续版本。
4. 测试
修正后,再用同样的10篇论文小样本测试,看效果是否改善。
问题1:这些论文中有哪些优化RAG系统的方法
poetry run poe query --method global "这些论文中有哪些优化RAG系统的方法"
SUCCESS: Global Search Response: Retrieval-Augmented Generation (RAG) 系统通过多种优化方法显著提升了大型语言模型(LLMs)的性能和效率。以下是一些关键的优化方法:
Sparse RAG: 这是一种新颖的方法,通过使用稀疏性来并行编码文档并选择性解码输出,从而降低计算成本并提高效率 [Data: Reports (5)].
FLARE: 作为RAG的一种特定方法,FLARE通过迭代使用即将到来的句子的预测来检索相关文档,增强了LLMs的上下文相关性和准确性 [Data: Reports (0)].
集成广告和代码生成: RAG通过集成广告来增强其功能,并优化了为特定领域语言(DSLs)生成代码的性能 [Data: Reports (1, 4, 5)].
这些优化方法不仅提高了RAG系统的性能,还扩展了其在不同领域的应用,如环境管理和特定语言模型的解释能力。
问题2:FLARE是如何优化的
poetry run poe query --method local "FLARE是如何优化的"
SUCCESS: Local Search Response: FLARE (Forward-Looking Active REtrieval augmented generation) 是一种主动检索增强生成的方法,它通过迭代地预测即将生成的句子内容,并利用这些预测作为查询来检索相关文档,以提高生成内容的质量。以下是FLARE的优化细节:
优化机制FLARE的核心优化在于其主动检索策略。与传统的检索增强生成模型不同,FLARE不仅在生成过程的开始阶段进行一次检索,而是在整个生成过程中持续地决定何时以及检索什么信息。这种方法特别适用于需要生成较长文本的场景,因为它能够持续地从外部知识资源中获取信息,从而提高生成内容的准确性和相关性。
具体实现
- 迭代检索:FLARE使用迭代的方法,每次生成句子时,都会预测下一个句子的内容,并将其作为查询来检索相关文档。如果生成的句子中包含低置信度的标记,系统会重新生成该句子,以确保内容的准确性。
- 预测与检索的结合:FLARE将预测机制与检索机制紧密结合,通过预测即将生成的内容来指导检索过程,从而更有效地获取相关信息。性能评估FLARE在多个长文本生成任务中进行了测试,结果显示其在所有任务中都取得了优越或竞争性的性能。这表明FLARE的方法在处理长文本生成任务时是有效的,能够显著提高生成内容的质量和准确性。数据支持FLARE的优化和性能得到了相关研究的支持,具体数据和研究细节可以在以下文献中找到:
- FLARE研究论文:详细描述了FLARE的方法和性能评估结果 [Data: Sources (1)]。通过这些优化,FLARE能够更有效地利用外部知识资源,提高生成内容的质量,特别是在处理长文本和知识密集型生成任务时表现出色。
以上内容总结了FLARE的优化机制和实现细节,以及其在长文本生成任务中的性能表现。希望这些信息能够帮助你更好地理解FLARE的优化策略。
这次测试仅用10篇论文,但答案质量明显优于默认Prompt。从可视化结果也能看出,实体提取更加准确。例如,Domain实体中找出了环境、领域特定语言、机器翻译和计算广告等关键词,不再是笼统的organization、person等泛泛类别。
5. 总结
整体来看,通过Prompt Tune借助LLM自动微调Prompt以适配输入文件领域,确实能带来一定效果。但Prompt Tune给出的实体列表就像是在抽卡——同一个领域运行两次,结果可能完全不同。
- person, organization, technology, dataset, method
- model, person, publication, technology, optimization strategy
- model, technique, metric, architecture, dataset
这些实体类型是否真正符合你的需求?是否足够匹配领域?以论文为例,我们可能更希望提取出关键词、要解决的问题、解决方法这类信息。这样,通过“要解决的问题”就能把相关论文串联起来。例如,想了解“RAG在查询阶段有哪些优化?”“合成阶段又有哪些手段?”,但目前的提取方式还远远无法实现。
那么,如何让GraphRAG按照我们预设的类型去提取?能否在Prompt中给予一些提示,让其按照我们的思路生成?或者换一个更好的模型,让模型对该领域可能需要的实体给出更合理的范围?这些都是值得继续探索的方向。至于如何手动调整Prompt以更好地适配你的领域,那就是下一篇的内容了。
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。