10分钟上手RAGFlow图提取:让文档自动生成知识图谱
你是否还在为整理复杂文档中的实体关系而烦恼?手动梳理耗时费力还容易出错?RAGFlow的图提取功能可以帮你解决这个问题!只需简单几步,就能让文档内容自动转化为结构化的知识图谱,让信息关系一目了然。读完本文,你将掌握如何使用RAGFlow实现从文档到知识图谱的自动转化,提升信息处理效率。
RAGFlow图提取功能简介
RAGFlow是一个基于深度文档理解的开源RAG(检索增强生成)引擎,其图提取功能能够从非结构化文本中自动识别实体和关系,构建可视化的知识图谱。这一功能主要通过graphrag/general/graph_extractor.py实现,该模块定义了GraphExtractor类,负责实体和关系的提取与图谱构建。
核心工作流程
图提取功能的工作流程主要包括以下几个步骤:
- 实体识别:从文本中识别出指定类型的实体
- 关系提取:识别实体之间的关系并评分
- 图谱构建:将提取的实体和关系组织成知识图谱
实体与关系提取详解
实体提取
实体提取是图提取的第一步,其目标是从文本中识别出预定义类型的实体。在graphrag/general/graph_extractor.py中,实体提取通过正则表达式匹配实现。以下是相关代码片段:
records = split_string_by_multi_markers(
results,
[self._prompt_variables[self._record_delimiter_key], self._prompt_variables[self._completion_delimiter_key]],
)
rcds = []
for record in records:
record = re.search(r"\((.*)\)", record)
if record is None:
continue
rcds.append(record.group(1))
records = rcds
maybe_nodes, maybe_edges = self._entities_and_relations(chunk_key, records, self._prompt_variables[self._tuple_delimiter_key])
实体提取支持多种类型,如人员、组织、技术、地点等。系统会为每个实体生成名称、类型和描述,格式如下:
("entity"{tuple_delimiter}"实体名称"{tuple_delimiter}"实体类型"{tuple_delimiter}"实体描述")
关系提取
关系提取是在实体识别的基础上,进一步识别实体之间的关联。关系提取不仅要确定两个实体之间是否存在关系,还要对关系强度进行评分。关系的格式定义如下:
("relationship"{tuple_delimiter}"源实体"{tuple_delimiter}"目标实体"{tuple_delimiter}"关系描述"{tuple_delimiter}关系强度)
关系提取的规则和示例可以在graphrag/general/graph_prompt.py中找到,该文件定义了图提取的提示模板和示例,指导模型如何正确识别实体关系。
知识图谱构建过程
提取参数配置
在使用图提取功能时,需要配置一些关键参数,这些参数会影响提取结果的质量和数量:
| 参数 | 描述 | 默认值 |
|---|---|---|
| tuple_delimiter | 元组分隔符 | <|> |
| record_delimiter | 记录分隔符 | ## |
| completion_delimiter | 完成分隔符 | <|COMPLETE|> |
| max_gleanings | 最大提取次数 | ENTITY_EXTRACTION_MAX_GLEANINGS |
这些参数可以在初始化GraphExtractor类时进行调整,以适应不同的文本类型和提取需求。
图谱构建步骤
- 文本分块:将输入文本分割成适合处理的小块
- 实体识别:对每个文本块进行实体识别
- 关系提取:识别实体之间的关系并评分
- 图谱组装:将提取的实体和关系组装成知识图谱
- 结果优化:通过多次提取提高实体和关系的覆盖率
以下是图谱构建的核心代码:
async def _process_single_content(self, chunk_key_dp: tuple[str, str], chunk_seq: int, num_chunks: int, out_results):
token_count = 0
chunk_key = chunk_key_dp[0]
content = chunk_key_dp[1]
variables = {
**self._prompt_variables,
self._input_text_key: content,
}
hint_prompt = perform_variable_replacements(self._extraction_prompt, variables=variables)
async with chat_limiter:
response = await trio.to_thread.run_sync(lambda: self._chat(hint_prompt, [{"role": "user", "content": "Output:"}], {}))
token_count += num_tokens_from_string(hint_prompt + response)
results = response or ""
history = [{"role": "system", "content": hint_prompt}, {"role": "user", "content": response}]
# 重复提取以确保最大化实体数量
for i in range(self._max_gleanings):
history.append({"role": "user", "content": CONTINUE_PROMPT})
async with chat_limiter:
response = await trio.to_thread.run_sync(lambda: self._chat("", history, {}))
token_count += num_tokens_from_string("\n".join([m["content"] for m in history]) + response)
results += response or ""
# 如果是最后一次提取,不需要更新继续标志
if i >= self._max_gleanings - 1:
break
history.append({"role": "assistant", "content": response})
history.append({"role": "user", "content": LOOP_PROMPT})
async with chat_limiter:
continuation = await trio.to_thread.run_sync(lambda: self._chat("", history))
token_count += num_tokens_from_string("\n".join([m["content"] for m in history]) + response)
if continuation != "Y":
break
history.append({"role": "assistant", "content": "Y"})
实际应用示例
示例文本处理
以下是一个使用RAGFlow图提取功能处理文本的示例。输入文本如下:
当Alex咬紧牙关时,Taylor那种权威式的确定性让他感到一阵沮丧。正是这种竞争暗流让他保持警惕,他和Jordan对发现的共同承诺是对Cruz狭隘控制和秩序愿景的无言反抗。
然后Taylor做了一件出乎意料的事。他们在Jordan旁边停下,片刻间带着近乎敬畏的神情观察着这个装置。"如果这项技术能够被理解..."Taylor轻声说,"它可能会改变我们的游戏规则。对我们所有人来说。"
使用RAGFlow图提取功能处理后,得到的知识图谱包含以下实体和关系:
实体:
- ("entity"<|>"Alex"<|>"person"<|>"Alex是一个感到沮丧并观察其他角色之间动态的人物。")
- ("entity"<|>"Taylor"<|>"person"<|>"Taylor表现出权威式的确定性,并对一个装置表现出敬畏之情,表明其观点发生了变化。")
- ("entity"<|>"Jordan"<|>"person"<|>"Jordan对发现有共同的承诺,并与Taylor就一个装置有重要互动。")
- ("entity"<|>"Cruz"<|>"person"<|>"Cruz与控制和秩序的愿景相关,影响其他角色之间的动态。")
- ("entity"<|>"The Device"<|>"technology"<|>"The Device是故事的核心,具有改变游戏规则的潜力,并受到Taylor的敬畏。")
关系:
- ("relationship"<|>"Alex"<|>"Taylor"<|>"Alex受到Taylor的权威式确定性的影响,并观察Taylor对装置态度的变化。"<|>7)
- ("relationship"<|>"Alex"<|>"Jordan"<|>"Alex和Jordan对发现有共同的承诺,这与Cruz的愿景形成对比。"<|>6)
- ("relationship"<|>"Taylor"<|>"Jordan"<|>"Taylor和Jordan就装置直接互动,导致相互尊重和不安的暂时缓和。"<|>8)
- ("relationship"<|>"Jordan"<|>"Cruz"<|>"Jordan对发现的承诺是对Cruz控制和秩序愿景的反抗。"<|>5)
- ("relationship"<|>"Taylor"<|>"The Device"<|>"Taylor对装置表现出敬畏之情,表明其重要性和潜在影响。"<|>9)
图谱可视化
提取的知识图谱可以通过RAGFlow的前端界面进行可视化展示,帮助用户直观地理解实体之间的关系。虽然本文无法直接展示可视化效果,但你可以通过chat_demo/index.html体验RAGFlow的交互界面,包括知识图谱的可视化功能。
高级应用与优化
自定义实体类型
RAGFlow允许用户自定义实体类型,以适应特定领域的需求。通过在初始化GraphExtractor时指定entity_types参数,可以告诉系统需要识别哪些类型的实体。例如:
graph_extractor = GraphExtractor(
llm_invoker=llm,
entity_types=["person", "company", "product", "technology"]
)
调整关系强度阈值
关系强度是一个数值评分,用于表示实体之间关系的强弱。通过调整关系强度阈值,可以过滤掉一些较弱的关系,使知识图谱更加简洁和聚焦。相关代码可以在graphrag/general/graph_extractor.py中找到和修改。
批量处理文档
对于大量文档的批量处理,可以使用RAGFlow提供的流水线功能。相关实现可以在agent/templates/advanced_ingestion_pipeline.json中找到,该模板定义了一个高级的文档摄入流水线,包括图提取步骤。
总结与展望
RAGFlow的图提取功能为从非结构化文本中提取结构化知识提供了一种高效、准确的方法。通过自动识别实体和关系,构建知识图谱,RAGFlow可以帮助用户更好地理解和利用文档中的信息。
未来,RAGFlow的图提取功能将在以下方面进行改进:
- 提高实体识别和关系提取的准确性
- 支持更多类型的实体和关系
- 增强图谱可视化功能
- 优化处理大型文档的性能
要了解更多关于RAGFlow的信息,可以参考以下资源:
现在,你已经掌握了RAGFlow图提取功能的基本使用方法。开始尝试使用这一强大的工具,让文档处理变得更加高效和智能吧!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



