高效打造常识图谱 Relik实事实体关联和相关抽取 经常使用LlamaIndex

文本消息转化为常识图谱的技术,自问世以来不时是钻研界的宠儿。大型言语模型(LLMs)的兴起让这个畛域遭到更多关注,但LLMs的老本之高令人却步。但是,经过对小型模型微调优化,咱们可以找到一种更经济高效的处置计划。

当天向大家引见Relik,这是由罗马大学(Sapienza University of Rome)人造言语处置团队精心研发的极速、轻量级消息提取框架。

1 消息提取流程

在不依赖LLMs的状况下,消息提取流程理论包括:

上图出现了消息提取的完整流程。始于一段方便的文本输入:“Tomaz likes to write blog posts. He is particularly interested in drawing diagrams.”。流程首先启动指代消解,将“Tomaz”和“He”辨以为同一人。紧接着,命名实体识别(NER)技术辨识出“Tomaz”、“Blog”和“Diagram”等主要实体。

随后,实体链接环节将这些识别出的实体与数据库或常识库中的相应条目相对应。例如,“Tomaz”对应到“Tomaz Bratanic (Q12345)”,“Blog”对应到“Blog (Q321)”。但是,"Diagram"在常识库中未找到婚配项。

接上去,相关提取步骤进一步剖析实体间的咨询,如识别出“Tomaz”与“Blog”之间存在“WRITES”相关,说明Tomaz撰写博客;“Tomaz”与“Diagram”之间存在“INTERESTED_IN”相关,标明他对图表有兴味。

最后,这些经过结构化的实体和相关消息被整合进常识图谱中,为后续的数据剖析或消息检索提供了有序且易于访问的资源。

在没有大型言语模型(LLMs)允许的状况下,消息提取上班理论依赖一系列专业模型来区分处置指代消解、命名实体识别、实体链接和相关提取等义务。整合这些模型须要付出额外的上班和粗疏的调整,但这种方法能够有效降落老本。经过经常使用和优化这些小型、特定义务的模型,可以在全体上缩小系统的构建和保养老本。

代码可在 GitHub 上失掉:

2 环境搭建与数据预备

介绍经常使用独立的Python环境,例如Google Colab,以便治理名目依赖项。

接上去性能Neo4j图数据库以存储解析出的数据。介绍经常使用Neo4j Aura(),它提供方便的收费云服务,且与Google Colab笔记本完美兼容。

成功数据库的搭建后,可经过LlamaIndex建设数据库衔接。

from llama_index.graph_stores.neo4j import Neo4jPGStoreusername="neo4j"password="rubber-cuffs-radiator"url="bolt://54.89.19.156:7687"graph_store = Neo4jPGStore(username=username,password=password,url=url,refresh_schema=False)

数据集

这里经常使用一个资讯数据集启动剖析,这个数据集是经过Diffbot API()失掉的。

import pandas as pdNUMBER_OF_ARTICLES = 100news = pd.read_csv("https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/news_articles.csv")news = news.head(NUMBER_OF_ARTICLES)

3 技术成功

消息提取流程首先从指代消解着手,其义务是识别文本中指代相反实体的不同表述。

据了解,目前可用于指代消解的开源模型相对较少。经过尝试比拟,这里选用经常使用spaCy的Coreferee()。须要留意的是,经常使用Coreferee或许会遇到一些依赖性疑问。

加载spaCy中的指代消解模型,经常使用以下代码成功:

import spacy, corefereecoref_nlp = spacy.load('en_core_web_lg')coref_nlp.add_pipe('coreferee')

Coreferee模型能够识别文本中指代相反实体或实体组的表白式集群。为了依据这些识别出的集群对文本启动重写,须要自定义函数来成功这一环节。

def coref_text(text):coref_doc = coref_nlp(text)resolved_text = ""for token in coref_doc:repres = coref_doc._.coref_chains.resolve(token)if repres:resolved_text += " " + "and".join([t.textif t.ent_type_ == ""else [e.text for e in coref_doc.ents if t in e][0]for t in repres])else:resolved_text += " " + token.textreturn resolved_text

测试下这个函数,确保模型和依赖项设置正确:

print(coref_text("Tomaz is so cool. He can solve various Python dependencies and not cry"))

在这个例子中,模型成功识别出“Tomaz”和“He”实践上指向同一实体。经过运行coref_text函数,将“Tomaz”交流“He”。

请留意,这种重写机制并不总能生成齐全合乎语法规定的句子,由于它驳回了一种间接的交流逻辑来处置文本中的实体集群。虽然如此,关于大少数运行场景,这种方法曾经足够有效。

如今把这一指代消解技术运行于咱们的资讯数据集,并将其转换为LlamaIndex文档格局:

from llama_index.core import Documentnews["coref_text"] = news["text"].apply(coref_text)documents = [Document(text=f"{row['title']}: {row['coref_text']}")for i, row in news.iterrows()]

实体链接和相关提取

Relik库集成了实体链接和相关提取两大性能,能够将这两种技术融合运行。实体链接时,Relik以维基百科为附丽,成功文本实体与百科条目标精准对应。

将实体链接到维基百科

在相关提取方面,Relik经过辨识和定义文本中实体间的相关,协助咱们将原始的非结构化数据转化为有序的结构化消息。

相关提取

假设你经常使用的是Colab的收费版本,请选用relik-ie/relik-relation-extraction-small模型,这个模型专门担任相关提取。假设有Colab Pro版本,或许计划在本地更高性能的机器上运转,那么可以尝试relik-ie/relik-cie-small模型,它不只蕴含相关提取,还能启动实体链接的性能。

from llama_index.extractors.relik.base import RelikPathExtractorrelik = RelikPathExtractor(model="relik-ie/relik-relation-extraction-small")# 在Pro Collab上经常使用GPU# relik = RelikPathExtractor(#model="relik-ie/relik-cie-small", model_cnotallow={"skip_metadata": True, "device":"cuda"}# )

此外,咱们必定定义将用于嵌入实体的嵌入模型,以及用于问答流程的LLM:

import osfrom llama_index.embeddings.openai import OpenAIEmbeddingfrom llama_index.llms.openai import OpenAIos.environ["OPENAI_API_KEY"] = "sk-"llm = OpenAI(model="gpt-4o", temperature=0.0)embed_model = OpenAIEmbedding(model_name="text-embedding-3-small")

留意在构建常识图谱的环节中,不会经常使用大型言语模型(LLM)。

4 常识图谱的构建与运行

目前,一切预备上班曾经就绪。接上去,可以创立PropertyGraphIndex实例,并将资讯文档作为数据输入,整合进常识图谱中。

此外,为了提取文档中的相关,须要将relik模型设置为kg_extractors参数的值。

from llama_index.core import PropertyGraphIndexindex = PropertyGraphIndex.from_documents(documents,kg_extractors=[relik],llm=llm,embed_model=embed_model,property_graph_store=graph_store,show_progress=True,)

构建图后,可以关上Neo4j阅读器来验证导入的图。经过运转以下Cypher语句取得相似的可视化:

MATCH p=(:__Entity__)--(:__Entity__)RETURN p LIMIT 250

结果:

5 问答性能成功

经常使用LlamaIndex,如今可以轻松地启动问答。只无应用系统自带的图检索器,便能够间接提出疑问:

query_engine = index.as_query_engine(include_text=True)response = query_engine.query("What happened at Ryanair?")print(str(response))

这就是定义的 LLM 和嵌入模型施展作用的中央。

6 总结

不依赖大型言语模型构建常识图谱是实际可行,具备老本效益且效率高。经过优化调整如Relik框架中的小型、义务专精的模型,检索增强型生成运行便能高效提敞开息。

实体链接作为主要步骤,确保了识别出的实体能够准确映射到常识库中的对应条目,从而维持了常识图谱的完整性与适用性。

借助Relik框架和Neo4j平台,咱们能够构建出性能弱小的常识图谱,这些图谱可以助力复杂的数据剖析和检索义务,而且防止了部署大型言语模型所带来的高昂老本。这种方法不只让先进的数据处置工具变得愈加亲民,也推进了消息提取流程的翻新与效率。

本文转载自​​,作者:

您可能还会对下面的文章感兴趣: