百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

iText2KG:使用LLM构建增量知识图谱(KG)

liuian 2024-12-08 16:19 77 浏览

iText2KG

一种由 LLM 驱动的零样本方法,使用大型语言模型构建增量知识图谱(KG)

iText2KG 是一个 Python 包,通过利用大型语言模型从文本文档中提取实体和关系,逐步构建具有已解析实体和关系的一致知识图谱。

它具有零样本能力,无需专门的训练即可跨各个领域提取知识。

它包含四个模块:文档提炼器、增量实体提取器、增量关系提取器和图形集成器与可视化。

  • 文档提取器:此模块将原始文档重新表述为预定义的语义块,并由指导 LLM 提取特定信息的模式引导。
  • 增量实体提取器:此模块识别并解析语义块内的唯一语义实体,确保实体之间的清晰度和区别。
  • 增量关系提取器:此组件处理已解析的实体以检测语义上唯一的关系,解决语义重复的挑战。
  • Neo4j 图形集成器:最后一个模块以图形格式可视化关系和实体,利用 Neo4j 进行有效表示。

对于我们的 iText2KG 它包含了两大特点

  • 增量构建:iText2KG 允许增量构建 KG,这意味着它可以在新数据可用时不断更新和扩展图,而无需进行大量重新处理。
  • 零样本学习:该框架利用 LLM 的零样本功能,使其无需预定义集或外部本体即可运行。这种灵活性使其能够适应各种 KG 构建场景,而无需进行大量训练或微调。

一 、设置模型

在运行 iText2KG 之前,我们先设置好大模型,我这里选择的是 OpenAi 的模型以及 HuggingFace 的 bge-large-zh embedding 模型。这么选择也是考虑到构建 KG 的准确度。

from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import os
os.environ["OPENAI_API_KEY"] = "*****"
openai_api_key = os.environ["OPENAI_API_KEY"]
openai_llm_model = llm = ChatOpenAI(
    model="gpt-4o-mini",
    temperature=0,
    max_tokens=None,
    timeout=None,
    max_retries=2,
)
messages = [
    (
        "system",
        "You are a helpful assistant that translates English to French. Translate the user sentence.",
    ),
    ("human", "I love programming."),
]

ai_msg=openai_llm_model.invoke(messages)

开始部署我们的 Embedding 模型:

from langchain_huggingface.embeddings import HuggingFaceEmbeddings
openai_embeddings_model = HuggingFaceEmbeddings(model_name="BAAI/bge-large-zh-v1.5")
text = "This is a test document."
query_result = openai_embeddings_model.embed_query(text)
query_result[:3]
doc_result = openai_embeddings_model.embed_documents([text])

二 、使用 iText2KG 构建 KG

我们这里的场景是,给出一篇简历,使用知识图谱将在线职位描述与生成的简历联系起来。

设定目标是评估候选人是否适合这份工作。

我们可以为 iText2KG 的每个模块使用不同的 LLM 或嵌入模型。但是,重要的是确保节点和关系嵌入的维度在各个模型之间保持一致。

如果嵌入维度不同,余弦相似度可能难以准确测量向量距离以进行进一步匹配。

我们的简历放到根目录,加载简历:

from langchain.document_loaders import PyPDFLoader
loader = PyPDFLoader(f"./CV_Emily_Davis.pdf")
pages = loader.load_and_split()

初始化 DocumentDistiller 引入 llm :

from itext2kg.documents_distiller import DocumentsDisiller, CV
document_distiller = DocumentsDisiller(llm_model = openai_llm_model)

信息提炼:

IE_query = '''
# DIRECTIVES :
- Act like an experienced information extractor.
- You have a chunk of a CV.
- If you do not find the right information, keep its place empty.
'''
# 使用定义好的查询和输出数据结构提炼文档。
distilled_cv = document_distiller.distill(documents=[page.page_content.replace("{", '[').replace("}", "]") for page in pages], IE_query=IE_query, output_data_structure=CV)

将提炼后的文档格式化为语义部分。

semantic_blocks_cv = [f"{key} - {value}".replace("{", "[").replace("}", "]") for key, value in distilled_cv.items() if value !=[] and value != ""  and value != None]

我们可以自定义输出数据结构,我们这里定义了4种,工作经历模型,岗位,技能,证书。

from pydantic import BaseModel, Field
from typing import List, Optional

class JobResponsibility(BaseModel):
    description: str = Field(..., description="A specific responsibility in the job role")

class JobQualification(BaseModel):
    skill: str = Field(..., description="A required or preferred skill for the job")

class JobCertification(BaseModel):
    certification: str = Field(..., description="Required or preferred certifications for the job")

class JobOffer(BaseModel):
    job_offer_title: str = Field(..., description="The job title")
    company: str = Field(..., description="The name of the company offering the job")
    location: str = Field(..., description="The job location (can specify if remote/hybrid)")
    job_type: str = Field(..., description="Type of job (e.g., full-time, part-time, contract)")
    responsibilities: List[JobResponsibility] = Field(..., description="List of key responsibilities")
    qualifications: List[JobQualification] = Field(..., description="List of required or preferred qualifications")
    certifications: Optional[List[JobCertification]] = Field(None, description="Required or preferred certifications")
    benefits: Optional[List[str]] = Field(None, description="List of job benefits")
    experience_required: str = Field(..., description="Required years of experience")
    salary_range: Optional[str] = Field(None, description="Salary range for the position")
    apply_url: Optional[str] = Field(None, description="URL to apply for the job")

定义一个招聘工作需求的描述:

job_offer = """
About the Job Offer
THE FICTITIOUS COMPANY

FICTITIOUS COMPANY is a high-end French fashion brand known for its graphic and poetic style, driven by the values of authenticity and transparency upheld by its creator Simon Porte Jacquemus.

Your Role

Craft visual stories that captivate, inform, and inspire. Transform concepts and ideas into visual representations. As a member of the studio, in collaboration with the designers and under the direction of the Creative Designer, you should be able to take written or spoken ideas and convert them into designs that resonate. You need to have a deep understanding of the brand image and DNA, being able to find the style and layout suited to each project.

Your Missions

Translate creative direction into high-quality silhouettes using Photoshop
Work on a wide range of projects to visualize and develop graphic designs that meet each brief
Work independently as well as in collaboration with the studio team to meet deadlines, potentially handling five or more projects simultaneously
Develop color schemes and renderings in Photoshop, categorized by themes, subjects, etc.
Your Profile

Bachelor’s degree (Bac+3/5) in Graphic Design or Art
3 years of experience in similar roles within a luxury brand's studio
Proficiency in Adobe Suite, including Illustrator, InDesign, Photoshop
Excellent communication and presentation skills
Strong organizational and time management skills to meet deadlines in a fast-paced environment
Good understanding of the design process
Freelance cont

继续使用上面方法做信息提炼:

IE_query = '''
# DIRECTIVES :
- Act like an experienced information extractor.
- You have a chunk of a job offer description.
- If you do not find the right information, keep its place empty.
'''
distilled_Job_Offer = document_distiller.distill(documents=[job_offer], IE_query=IE_query, output_data_structure=JobOffer)
print(distilled_Job_Offer)
semantic_blocks_job_offer = [f"{key} - {value}".replace("{", "[").replace("}", "]") for key, value in distilled_Job_Offer.items() if value !=[] and value != ""  and value != None]

到这里准备工作完成,简历和工作需求都已经提炼完毕,然后正式开始构建 graph,我们将简历的所有语义块作为一个块传递给了 LLM。

也将工作需求作为另一个语义块传递,也可以在构建图时将语义块分开。

我们需要注意每个块中包含多少信息,然后好将它与其他块连接起来,我们在这里做的就是一次性传递所有语义块。

from itext2kg import iText2KG
itext2kg = iText2KG(llm_model = openai_llm_model, embeddings_model = openai_embeddings_model)

global_ent, global_rel = itext2kg.build_graph(sections=[semantic_blocks_cv], ent_threshold=0.6, rel_threshold=0.6)

global_ent_, global_rel_ = itext2kg.build_graph(sections=[semantic_blocks_job_offer], existing_global_entities = global_ent, existing_global_relationships = global_rel,  ent_threshold=0.6, rel_threshold=0.6)

iText2KG 构建 KG 的过程我们看到有很多参数,下面分贝是对每个参数的表示做一些解释:

  • llm_model:用于从文本中提取实体和关系的语言模型实例。
  • embeddings_model:用于创建提取实体的向量表示的嵌入模型实例。
  • sleep_time (int):遇到速率限制或错误时等待的时间(以秒为单位)(仅适用于 OpenAI)。默认为 5 秒。

iText2KG 的 build_graph 参数:

  • sections (List[str]):字符串(语义块)列表,其中每个字符串代表文档的一部分,将从中提取实体和关系。
  • existing_global_entities (List[dict], optional):与新提取的实体进行匹配的现有全局实体列表。每个实体都表示为一个字典。
  • existing_global_relationships (List[dict], optional):与新提取的关系匹配的现有全局关系列表。每个关系都表示为一个字典。
  • ent_threshold (float, optional):实体匹配的阈值,用于合并不同部分的实体。默认值为 0.7。
  • rel_threshold (float, optional):关系匹配的阈值,用于合并不同部分的关系。默认值为 0.7。

从图中结果看到我们构建过程中的实体,和关联关系。

最后使用 GraphIntegrator 对构建的知识图谱进行可视化。

使用指定的凭据访问图形数据库 Neo4j,并对生成的图形进行可视化,以提供从文档中提取的关系和实体的视觉表示。

from itext2kg.graph_integration import GraphIntegrator
URI = "bolt://3.216.93.32:7687"
USERNAME = "neo4j"
PASSWORD = "selection-cosal-cubes"
new_graph = {}
new_graph["nodes"] = global_ent_
new_graph["relationships"] = global_rel_
GraphIntegrator(uri=URI, username=USERNAME, password=PASSWORD).visualize_graph(json_graph=new_graph)

打开我们的 Neo4j 图形数据库:

可以看到简历和工作需求的匹配关系连接。这样子我们可以灵活的运用 iText2KG 框架做图形关系和实体的增量。

三、总结

本文介绍了使用大型语言模型 ( LLM ) 构建增量知识图谱 ( KG ) 的 iText2KG 框架。一个强大的 KG 构建框架,该框架利用了 LLM 的优势,解决了该领域的重大挑战,并提出了一种模块化方法,可增强不同领域的灵活性和适用性。

  • 增强的架构一致性:iText2KG 方法在各种文档类型中实现了高架构一致性,优于由于依赖预定义结构而经常难以保持一致性的传统方法。
  • 实体和关系提取的高精度:该框架有效地缓解了与语义重复和未解决实体相关的问题,这些问题在传统方法中普遍存在。这导致更准确和可靠的 KG。
  • 减少后处理需求:传统方法通常需要大量的后处理来解决歧义和冗余。iText2KG 通过采用结构化结构来最大限度地减少这种需求。

相关推荐

台式电脑怎么还原(台式电脑怎么还原备份的文件)
  • 台式电脑怎么还原(台式电脑怎么还原备份的文件)
  • 台式电脑怎么还原(台式电脑怎么还原备份的文件)
  • 台式电脑怎么还原(台式电脑怎么还原备份的文件)
  • 台式电脑怎么还原(台式电脑怎么还原备份的文件)
iso认证需要什么资料(iso认证是必须的吗)

ISO(国际标准化组织)颁发的证书在全球范围内享有较高的声誉。以下是一些被认为含金量较高的ISO证书:1.ISO9001:质量管理体系认证,适用于任何组织,强调质量管理和客户满意度。2.ISO...

为什么sd卡无法格式化(为什么我的sd卡不能格式化)
为什么sd卡无法格式化(为什么我的sd卡不能格式化)

如果SD卡提示格式化却格式化不了,可能是因为SD卡文件系统出现了错误或损坏,也可能是SD卡本身出现了硬件问题。可以尝试通过电脑或手机上的磁盘管理工具对SD卡进行修复或格式化,或者尝试更换一张新的SD卡。同时,建议在使用SD卡时注意安全移除,...

2026-01-29 17:37 liuian

win10字体在哪个文件夹(windows10字体放哪里)

1、首先这里演示的是W7操作系统的步骤,双击打开电脑桌面上的"计算机"图标。2、打开电脑桌面上的计算机图标之后,双击打开设置窗口里面的C盘,操作系统是安装到C盘里的,直接找C盘即可。3、在C盘里,...

性价比电脑笔记本(性价比超高笔记本电脑)

笔记本电脑相比较还是联想品牌的性价比比较高的。此款笔记本电脑的内存比较大的,运行速速度很快的,配置也是非常不错的,而且照相、摄相功能也是特别好的,照出的照片是特别好看的。此款电脑的操作方式也是非常不错...

windows7旗舰版怎么进入安全模式

你好,进入WIN7旗舰版的安全模式有两种方式:1.通过开机启动:a.关机后按下电源按钮,然后立即按下F8键,直到出现高级启动选项菜单。b.使用上下方向键选择“安全模式”或“安全模式(带网络)”,...

电脑开机后进不去桌面(电脑开机后进不去桌面怎么解决)

1.不能进入桌面2.这可能是由于多种原因造成的,例如系统故障、硬件问题、病毒感染等。系统故障可能是由于软件冲突、驱动程序错误或系统文件损坏等引起的。硬件问题可能包括硬盘故障、内存问题或电源供应不稳...

ms office2010(msoffice2010考试多少分过)

你好,这个问题有点外行了,office2010作为微软公司的办公套件,一般包括常用的word、excel、powerpoint等模块。另外,不常用的MicrosoftAccess2010(数据库管...

win7电话激活确认id网站(win7电话激活命令)

产品id:软件作品编号;激活id:激活码;productkey:类似激活码,一般由OEM商贴在机器标签上。激活id是通过产品id计算出来的。方法一分步阅读1/3“计算机”查看步骤一:电脑用户右击桌...

installer一直正在安装(windows installer正在准备安装取消不了)

windowsinstaller是系统的一个服务,基于微软系统平台的支持各种应用程序的安装及使用的一个服务。之所以出现你这种情况,可能是你的windowsinstaller服务没有开启,或者文件受...

打印机安装驱动找不到设备(打印机安装驱动找不到设备了)

1、检查驱动有没安装正确,打印时有没有选对对应的打印机驱动。  2、检查打印机驱动是不是脱机,如果脱机把打印机改成联机状态。  3、打印机驱动是否选了暂停打印,如果是把暂停打印去掉。  4、检查打印线...

win7分区类型(win7分区形式)

win7用传统的mbr就可以了,因为它不支持gpt,win8以上的操作系统才支持gpt。以后微软的操作系统将会gpt优先,因为安全性更高,性能上也有优势。win7一般就是MBR的结构了。 M...

显卡主要是干什么的(显卡主要是干什么用的)

显卡的作用是控制电脑的图形输出,它是架接在主机和显示器上的硬件。负责将cpu送过来的影像数据处理成显示器认识的格式并输出也就是人眼在显示器上看到的影像。显卡的主要作用是将CPU提供的指令和数据进行相应...

用windows7系统可以(windows7电脑可以装windows10吗)

所有电脑都能装win7,但是有的电脑不适合,电脑会运行不流畅。判断电脑不适合win7的方法:1,首先安装64位win7系统必须要求你电脑的CPU(处理器)为64位。(可以使用CPU-Z软件来查看自己的...

光纤和路由器怎么连接(光纤路由器怎么连接电脑)

要连接光纤和路由器,首先需要将光纤接入光猫或光纤调制解调器,然后通过以太网线将光猫或解调器与路由器连接。确保光猫或解调器的光纤接口和路由器的以太网接口类型相匹配,如光口与光口或光口与RJ45接口。连接...