【实战】从零开始构建知识图谱RAG系统,让大模型更精准理解复杂关系(收藏级教程)

部署运行你感兴趣的模型镜像

结构化数据能够显著提高检索的准确性。

您可以在 Neo4j AuraDB 中免费创建图数据库实例。

检索增强生成(RAG)作为一项通过外部知识增强大型语言模型(LLM)能力的强大技术已然兴起。然而,传统的基于向量的 RAG 方法在处理复杂、相互关联的信息时,其局限性也日益凸显。简单的语义相似性搜索难以捕捉实体之间的细微关系,也难以进行多跳推理。此外,这种方法还可能遗漏跨文档的关键上下文信息。

尽管有多种方法来应对这些挑战,但一个特别有前景的解决方案是结构化数据,能释放更复杂的检索和推理能力。通过将非结构化文档转换为结构化的知识表示,我们能够执行复杂的图遍历、关系查询和上下文推理,这些都远超简单的相似性匹配。

在此背景下,LlamaCloud 等工具的价值便凸显出来。它提供了强大的解析和提取功能,能够将原始文档转换为结构化数据。Neo4j 则作为知识图谱表示的基石,构成了 GraphRAG 架构的基础,使我们不仅能理解信息本身,更能洞察信息之间的关联方式。

法律领域是应用结构化数据改进 RAG 技术最具吸引力的场景之一,因为信息检索的准确性和精确性会产生重大的现实影响。法律文档本身就相互关联,案件、法规、规章和判例之间存在复杂的引用网络,而传统向量搜索往往难以有效捕捉这些关系。法律信息的层级性质,以及理解实体、条款和法律概念之间关系的重要性,使得结构化知识图谱对于提高检索准确性尤其有价值。

为展示其潜力,本文将通过一个全面的法律文档处理示例,演示如下所示的完整流程。

在这里插入图片描述
在这里插入图片描述

从法律文档中提取信息并将其表示为图的加工流程

整个流程可以分为以下几个步骤:

  • • 使用 LlamaParse 解析 PDF 文档并提取可读文本。
  • • 利用大型语言模型 (LLM) 对合同类型进行分类,从而实现上下文感知处理。
  • • 根据合同分类结果,利用 LlamaExtract 提取针对每种特定合同类别定制的相关属性集。
  • • 将所有结构化信息存储到 Neo4j 知识图谱中,创建一个内容丰富、可查询的表示,捕获法律文档中的内容和复杂的相互关系。

相关代码可在 LlamaIndex cookbook(https://docs.llamaindex.ai/en/latest/examples/cookbooks/build_knowledge_graph_with_neo4j_llamacloud/?utm_source=socials&utm_medium=li_social)中获取。

环境设置

在运行此代码之前,您需要设置 LlamaCloud (https://docs.llamaindex.ai/en/stable/llama_cloud/) 和 OpenAI 的 API 密钥。对于 Neo4j,最快捷的方式是创建一个免费的 Aura 数据库实例(https://neo4j.com/product/auradb/)。

使用 LlamaParse 进行 OCR 处理

在本教程中,我们将分析来自 合同理解 Atticus 数据集 (CUAD)(https://www.atticusprojectai.org/cuad) 的一份商业合同示例。

现在,我们将使用 LlamaParse (https://docs.llamaindex.ai/en/stable/llama_cloud/llama_parse/) 解析合同文档,提取其文本内容:

# Initialize parser with specified mode

parser = LlamaParse(
api_key=llama_api_key,
parse_mode="parse_page_without_llm"
)
pdf_path = "CybergyHoldingsInc_Affliate Agreement.pdf"
results = await parser.aparse(pdf_path)

这段代码初始化了一个 LlamaParse 实例,并用于解析示例合同 PDF 文件。

文档分类

在从合同中提取相关信息之前,我们需要确定合同的类型。由于不同类型的合同具有各自的条款结构和法律信息,因此我们需要根据合同类型动态选择合适的提取模式。

openai_client = AsyncOpenAI(api_key=openai_api_key)classification_prompt =
"""You are a legal document classification assistant. Your task is to identify
the most likely contract type based on the content of the first 10 pages of a
contract. Instructions: Read the contract excerpt below. Review the list of
possible contract types. Choose the single most appropriate contract type from
the list. Justify your classification briefly, based only on the information in
the excerpt.Contract Excerpt: {contract_text} Possible Contract Types:
{contract_type_list}Output Format:
<Reason>brief_justification</Reason>
<ContractType>chosen_type_from_list</ContractType>
"""async def classify_contract(contract_text: str, contract_types: list[str]) ->
dict: prompt = classification_prompt.format( contract_text=file_content,
contract_type_list=contract_types ) history = [{"role": "user", "content":
prompt}] response = await openai_client.responses.create( input=history,
model="gpt-4o-mini", store=False, ) return
extract_reason_and_contract_type(response.output[0].content[0].text)

这段代码设置了一个 OpenAI 客户端,并创建了一个分类系统,该系统包含两部分:一个用于指导 LLM 如何分类合同的提示模板,以及一个处理实际分类过程的函数。

现在,我们使用解析后的合同数据执行分类过程:

contract_types = ["Affiliate_Agreements", "Co_Branding", "Development"]

# Take only the first 10 pages for contract classification as input

file_content = " ".join([el.text for el in results.pages[:10]])classification = await classify_contract(file_content, contract_types)

使用 LlamaExtract 进行信息提取

LlamaExtract (https://www.llamaindex.ai/llamaextract) 是一项云服务,它利用 AI 驱动的模式化提取技术,将非结构化文档转化为结构化数据。

定义模式 (Schema)

在这里,我们定义了两个 Pydantic 模型:Location 用于捕获结构化的地址信息,包含可选的国家、州和地址字段;Party 用于表示合同方,包含必填的名称和可选的位置详细信息。字段描述有助于指导提取过程,精确地告诉 LLM 在每个字段中寻找哪些信息。

classLocation(BaseModel):
"""Location information with structured address components."""country: Optional[str] = Field(None, description="Country")
state: Optional[str] = Field(None, description="State or province")
address: Optional[str] = Field(None, description="Street address or city")classParty(BaseModel):
"""Party information with name and location."""name: str = Field(description="Party name")
location: Optional[Location] = Field(None, description="Party location details")

请记住,我们有多种合同类型,因此我们需要为每种类型定义特定的提取模式,并创建一个映射系统,以便根据分类结果动态选择合适的模式。

classBaseContract(BaseModel):
"""Base contract class with common fields."""
parties: Optional[List[Party]] = Field(None, description="All contracting parties")
agreement_date: Optional[str] = Field(None, description="Contract signing date. Use YYYY-MM-DD")
effective_date: Optional[str] = Field(None, description="When contract becomes effective. Use YYYY-MM-DD")
expiration_date: Optional[str] = Field(None, description="Contract expiration date. Use YYYY-MM-DD")
governing_law: Optional[str] = Field(None, description="Governing jurisdiction")
termination_for_convenience: Optional[bool] = Field(None, description="Can terminate without cause")
anti_assignment: Optional[bool] = Field(None, description="Restricts assignment to third parties")
cap_on_liability: Optional[str] = Field(None, description="Liability limit amount")classAffiliateAgreement(BaseContract):
"""Affiliate Agreement extraction."""
exclusivity: Optional[str] = Field(None, description="Exclusive territory or market rights")
non_compete: Optional[str] = Field(None, description="Non-compete restrictions")
revenue_profit_sharing: Optional[str] = Field(None, description="Commission or revenue split")
minimum_commitment: Optional[str] = Field(None, description="Minimum sales targets")classCoBrandingAgreement(BaseContract):
"""Co-Branding Agreement extraction."""
exclusivity: Optional[str] = Field(None, description="Exclusive co-branding rights")
ip_ownership_assignment: Optional[str] = Field(None, description="IP ownership allocation")
license_grant: Optional[str] = Field(None, description="Brand/trademark licenses")
revenue_profit_sharing: Optional[str] = Field(None, description="Revenue sharing terms") mapping = {
"Affiliate_Agreements": AffiliateAgreement,
"Co_Branding": CoBrandingAgreement,
}

这种模式设计包含两部分内容:一是结构化的提取字段,例如当事方名称、日期和布尔标志;二是针对复杂条款(如排他性条款、收益分享安排和知识产权所有权细节)的总结性字段。

现在,我们可以将定义的模式与解析后的合同文本一起使用,以提取结构化信息。LlamaExtract 将分析整个文档内容并提取我们定义的特定字段。

extractor = LlamaExtract(api_key=llama_api_key)agent = extractor.create_agent(
   name=f"extraction_workflow_import_{uuid.uuid4()}",
   data_schema=mapping[classification['contract_type']],
   config=ExtractConfig(
       extraction_mode=ExtractMode.BALANCED,
   ),
)result = await agent.aextract(
   files=SourceText(
       text_content=" ".join([el.text for el in results.pages]),
       filename=pdf_path
   ),
)

Neo4j 知识图谱

最后一步是将提取的结构化信息构建成知识图谱,以表示合同实体之间的关系。我们需要定义一个图模型,明确合同数据在 Neo4j 中应如何组织为节点和关系。

法律图模型

我们的图模型由三种主要节点类型组成:

  • 合同 (Contract) 节点存储核心协议信息,包括日期、条款和法律条款。
  • 当事方 (Party) 节点代表合同实体及其名称。
  • 位置 (Location) 节点捕获包含地址组成部分的地理信息。

接下来,我们将按照定义的图模型,将提取的合同数据导入 Neo4j:

import_query = """WITH $contract AS contract
MERGE (c:Contract {path: $path})
SET c += apoc.map.clean(contract, ["parties", "agreement_date", "effective_date", "expiration_date"], [])
// Cast to date
SET c.agreement_date = date(contract.agreement_date),
   c.effective_date = date(contract.effective_date),
   c.expiration_date = date(contract.expiration_date)
// Create parties with their locations
WITH c, contract
UNWIND coalesce(contract.parties, []) AS party
MERGE (p:Party {name: party.name})
MERGE (c)-[:HAS_PARTY]->(p)
// Create location nodes and link to parties
WITH p, party
WHERE party.location IS NOT NULL
MERGE (p)-[:HAS_LOCATION]->(l:Location)
SET l += party.location
"""response = await neo4j_driver.execute_query(import_query, contract=result.data, path=pdf_path)
response.summary.counters

数据导入后,您的 Neo4j 图应如下所示:

提取的信息以图的形式表示

将所有部分整合到工作流中

最后,我们可以将所有这些逻辑组合成一个可执行的代理工作流。该工作流支持接受单个 PDF 文件,并能每次都向 Neo4j 图中添加新的条目。

您可以在相应的 notebook (https://docs.llamaindex.ai/en/latest/examples/cookbooks/build_knowledge_graph_with_neo4j_llamacloud/?utm_source=socials&utm_medium=li_social) 中找到创建此工作流的所有代码。我们将其保留在那里,以避免本文中出现冗长的代码块。

该工作流设计简洁,您只需一个命令即可处理任何文档。

knowledge_graph_builder = KnowledgeGraphBuilder(
    parser=parser,
    affiliate_extract_agent=affiliage_extraction_agent,
    branding_extract_agent=cobranding_extraction_agent,
    classification_prompt=classification_prompt,
    timeout=None,
    verbose=True,
)response = await knowledge_graph_builder.run(
    pdf_path="CybergyHoldingsInc_Affliate Agreement.pdf"
)

总结

传统 RAG 系统通常依靠文档片段的语义相似性搜索,这常常会丢失实体之间的关键上下文和关系。通过将合同数据结构化为知识图谱,我们创建了一个更智能的检索系统,该系统能够理解合同、当事方和地点是如何相互关联的。现在,您的大型语言模型不再是搜索非结构化文本片段,而是可以利用精确的实体关系来回答复杂的查询,例如“Cybergy Holdings 参与的所有合同中的所有当事方位于何处?”或者“显示所有涉及纽约公司的附属协议。”

相关代码可在 LlamaIndex cookbook (https://docs.llamaindex.ai/en/latest/examples/cookbooks/build_knowledge_graph_with_neo4j_llamacloud/?utm_source=socials&utm_medium=li_social) 中获取。

普通人如何抓住AI大模型的风口?

领取方式在文末

为什么要学习大模型?

目前AI大模型的技术岗位与能力培养随着人工智能技术的迅速发展和应用 , 大模型作为其中的重要组成部分 , 正逐渐成为推动人工智能发展的重要引擎 。大模型以其强大的数据处理和模式识别能力, 广泛应用于自然语言处理 、计算机视觉 、 智能推荐等领域 ,为各行各业带来了革命性的改变和机遇 。

目前,开源人工智能大模型已应用于医疗、政务、法律、汽车、娱乐、金融、互联网、教育、制造业、企业服务等多个场景,其中,应用于金融、企业服务、制造业和法律领域的大模型在本次调研中占比超过 30%。
在这里插入图片描述

随着AI大模型技术的迅速发展,相关岗位的需求也日益增加。大模型产业链催生了一批高薪新职业:
在这里插入图片描述

人工智能大潮已来,不加入就可能被淘汰。如果你是技术人,尤其是互联网从业者,现在就开始学习AI大模型技术,真的是给你的人生一个重要建议!

最后

只要你真心想学习AI大模型技术,这份精心整理的学习资料我愿意无偿分享给你,但是想学技术去乱搞的人别来找我!

在当前这个人工智能高速发展的时代,AI大模型正在深刻改变各行各业。我国对高水平AI人才的需求也日益增长,真正懂技术、能落地的人才依旧紧缺。我也希望通过这份资料,能够帮助更多有志于AI领域的朋友入门并深入学习。

真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

在这里插入图片描述

大模型全套学习资料展示

自我们与MoPaaS魔泊云合作以来,我们不断打磨课程体系与技术内容,在细节上精益求精,同时在技术层面也新增了许多前沿且实用的内容,力求为大家带来更系统、更实战、更落地的大模型学习体验。

图片

希望这份系统、实用的大模型学习路径,能够帮助你从零入门,进阶到实战,真正掌握AI时代的核心技能!

01 教学内容

图片

  • 从零到精通完整闭环:【基础理论 →RAG开发 → Agent设计 → 模型微调与私有化部署调→热门技术】5大模块,内容比传统教材更贴近企业实战!

  • 大量真实项目案例: 带你亲自上手搞数据清洗、模型调优这些硬核操作,把课本知识变成真本事‌!

02适学人群

应届毕业生‌: 无工作经验但想要系统学习AI大模型技术,期待通过实战项目掌握核心技术。

零基础转型‌: 非技术背景但关注AI应用场景,计划通过低代码工具实现“AI+行业”跨界‌。

业务赋能突破瓶颈: 传统开发者(Java/前端等)学习Transformer架构与LangChain框架,向AI全栈工程师转型‌。

image.png

vx扫描下方二维码即可
在这里插入图片描述

本教程比较珍贵,仅限大家自行学习,不要传播!更严禁商用!

03 入门到进阶学习路线图

大模型学习路线图,整体分为5个大的阶段:
图片

04 视频和书籍PDF合集

图片

从0到掌握主流大模型技术视频教程(涵盖模型训练、微调、RAG、LangChain、Agent开发等实战方向)

图片

新手必备的大模型学习PDF书单来了!全是硬核知识,帮你少走弯路(不吹牛,真有用)
图片

05 行业报告+白皮书合集

收集70+报告与白皮书,了解行业最新动态!
图片

06 90+份面试题/经验

AI大模型岗位面试经验总结(谁学技术不是为了赚$呢,找个好的岗位很重要)图片
在这里插入图片描述

07 deepseek部署包+技巧大全

在这里插入图片描述

由于篇幅有限

只展示部分资料

并且还在持续更新中…

真诚无偿分享!!!
vx扫描下方二维码即可
加上后会一个个给大家发

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值