iText2KG:使用LLM构建增量知识图谱(KG)
liuian 2024-12-08 16:19 58 浏览
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 通过采用结构化结构来最大限度地减少这种需求。
相关推荐
- 手机怎么样修改路由器密码(手机怎么修改路由器的密码)
-
首先打开手机设置,进入WIFI,先将路由器和手机匹配连接,通过路由器背面,都有路由器名称,只要保持连接到这个路由器就可以。第二步,点击手机wifi后面的点,网络详情里面就有IP地址,一般IP地址是19...
- 联想笔记本电脑驱动官网(联想笔记本驱动大全)
-
一,联想官网提供的显卡驱动版本一般不是最新的,但确实比较能稳定使用,如果对显卡要求不高那么就可以继续使用。二,如果有新版本显卡驱动而且有助于提高显卡性能也能够稳定使用那么就更新驱动。1、首先我们打开桌...
- w7系统下载gho(win7 gho下载)
-
系统下载排行一:系统之家ghostwin1064位旗舰正式版v2020系统之家ghostwin1064位旗舰正式版使用微软官方windows10X64原版制作,集成了最新的安全补丁和其它系统...
- 日本樱花服务器怎么样(日本樱花服务器正品)
-
使用樱花服务器需要一定的技术知识和经验,以下是一些基本步骤:获取樱花服务器:首先,你需要获取一个樱花服务器的IP地址和端口号。这通常需要通过向樱花服务商购买或通过其他途径获得。连接服务器:使用你喜欢的...
- 电脑有没有win8系统的(win8支持的软件多吗)
-
1、首先是大家热衷比拼的开机速度上win8系统操作类似于休眠的技术,所以win8系统远比win7系统快的多,这也满足也很大一部分追求速度的用户。其实早在xp时代,就有通过人工设置来做到这一点,而在wi...
-
- 电脑显卡温度多少算正常(显卡温度多少属于正常)
-
电脑显卡的正常工作温度范围会因不同的显卡型号和使用环境而有所差异。一般来说,显卡的温度在正常情况下应该在40°C至85°C之间。以下是一些常见的温度范围指导:40°C至60°C:这是显卡处于轻负荷状态时的正常温度范围。在进行一般办公、浏览网...
-
2025-11-30 14:55 liuian
-
- 网线插座接法(家装网线插座接法)
-
接线步骤如下:1.首先将透明压板抬起。2.第二步将网线按颜色插入对应的插孔中,再用工具将网线适当下压,卡在相应的模块内,将不用的线头处理掉,最后用剪刀将线剪平。3.一般的操作方法不会一次性将8根线都塞进去,这样在压板的时候很费力。因此,我们...
-
2025-11-30 14:05 liuian
- 笔记本电脑型号在哪里找(笔记本的电脑型号在哪里看)
-
方法一:查看笔记本外观上的型号标识 多数笔记本的型号都会标注在笔记本机身上,比较常见的是在机身屏幕四周或者键盘下方或者机身底部,大家可以去仔细看看笔记本表面上的一些标注信息,一般很容易就可以找到笔记...
- realtek网卡驱动win7(realtek网卡驱动官网)
-
适配器RealtekPCIeFEFamilyCont设备管理器中网卡驱动是黄色叹号:此类故障是驱动异常或者安装的驱动不兼容。解决方法:1、选择桌面上的计算机,鼠标右键选择管理;2、点设备管理器,展开网...
- win10主题怎么下载(win10主题包怎么安装)
-
首先在win10桌面空白处,鼠标右键菜单中选择“个性化”选项 2、打开个性化设置窗口后,在左侧列表中选择“主题”选项,然后在右侧窗口中选择“主题设置”,当前为系统默认主题,我们简称为“蓝色主题”。 ...
- w9系统和w7哪个好
-
老实说,还是W10更好点。。。你咨询现在是使用还是使用win10好?怎么说呢,你选择使用win7或选择使用win10,这个主要还是需要看你使用的电脑或笔记本电脑是哪年购买的产品,能不能带动或这能不能...
- 微软维修点(微软售后服务维修点查询)
-
对于xbox国内售后维修点的查询,可以在微软官方网站或者xbox官方App上进行查询。1,因为微软在中国地区设有多个授权的售后维修点,这些维修点可以提供专业的维修和售后服务。2,可以通过输入相关信息,...
- win10设置动态壁纸桌面(windows10设置动态壁纸)
-
windows10设动态壁纸的方法如下1、首先回到桌面,点击开始按钮。2、然后开始菜单点击设置。3、在弹出来的界面设置中点击个性化。4、接着在弹出来的个性化界面点击背景下面的箭头。5、然后背景点击幻灯...
- sql和python哪个难(sql语句聚合函数)
-
你是想做数据分析对吧?建议啊,MySQL能应付很多统计问题了再去学python,python语法当然了必须先掌握,这个很简单,然后就是python有两个跟数据分析密切相关的包,如果你想做数据分析,请把...
- 一周热门
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)
