10分钟上手RAGFlow图提取:让文档自动生成知识图谱

10分钟上手RAGFlow图提取:让文档自动生成知识图谱

【免费下载链接】ragflow RAGFlow是一个基于深度文档理解的开源RAG(检索增强生成)引擎。 【免费下载链接】ragflow 项目地址: https://gitcode.com/GitHub_Trending/ra/ragflow

你是否还在为整理复杂文档中的实体关系而烦恼?手动梳理耗时费力还容易出错?RAGFlow的图提取功能可以帮你解决这个问题!只需简单几步,就能让文档内容自动转化为结构化的知识图谱,让信息关系一目了然。读完本文,你将掌握如何使用RAGFlow实现从文档到知识图谱的自动转化,提升信息处理效率。

RAGFlow图提取功能简介

RAGFlow是一个基于深度文档理解的开源RAG(检索增强生成)引擎,其图提取功能能够从非结构化文本中自动识别实体和关系,构建可视化的知识图谱。这一功能主要通过graphrag/general/graph_extractor.py实现,该模块定义了GraphExtractor类,负责实体和关系的提取与图谱构建。

核心工作流程

图提取功能的工作流程主要包括以下几个步骤:

  1. 实体识别:从文本中识别出指定类型的实体
  2. 关系提取:识别实体之间的关系并评分
  3. 图谱构建:将提取的实体和关系组织成知识图谱

实体与关系提取详解

实体提取

实体提取是图提取的第一步,其目标是从文本中识别出预定义类型的实体。在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类时进行调整,以适应不同的文本类型和提取需求。

图谱构建步骤

  1. 文本分块:将输入文本分割成适合处理的小块
  2. 实体识别:对每个文本块进行实体识别
  3. 关系提取:识别实体之间的关系并评分
  4. 图谱组装:将提取的实体和关系组装成知识图谱
  5. 结果优化:通过多次提取提高实体和关系的覆盖率

以下是图谱构建的核心代码:

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的图提取功能将在以下方面进行改进:

  1. 提高实体识别和关系提取的准确性
  2. 支持更多类型的实体和关系
  3. 增强图谱可视化功能
  4. 优化处理大型文档的性能

要了解更多关于RAGFlow的信息,可以参考以下资源:

现在,你已经掌握了RAGFlow图提取功能的基本使用方法。开始尝试使用这一强大的工具,让文档处理变得更加高效和智能吧!

【免费下载链接】ragflow RAGFlow是一个基于深度文档理解的开源RAG(检索增强生成)引擎。 【免费下载链接】ragflow 项目地址: https://gitcode.com/GitHub_Trending/ra/ragflow

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值