graphRAG+llama3.2的MOOC课程资源问答系统

文章目录

  • 参考
  • 代码地址
  • anaconda+pycharm
  • LLaMA 3
  • 传统rag
  • GraphRAG
    • 初始化
    • 提示词微调 prompt tuning来创建更适应知识库的知识图谱
    • 使用语言模型(LLM)从每个文本块中提取实体、关系和声明。
    • 检索 query(本地搜索(Local Search)、全局搜索(Global Search)、问题生成(Question Generation) )
    • 加载csv
  • 部署
  • 索引导入nod4j生成知识图谱
  • 报错
  • 生成neo4j知识图谱报错
  • 待完善

参考

为什么说知识图谱 + RAG > 传统 RAG?
如何利用 LLaMA 3 打造Agent智能体应用
合集·大模型科普
https://github.com/NanGePlus/GraphragTest

代码地址

https://github.com/FULLK/Graphrag_LLama3.2-class-project

anaconda+pycharm

【大模型应用开发基础】集成开发环境搭建Anaconda+PyCharm

LLaMA 3

ollama网上搜,然后下载

ollama pull llama3.1:latest
ollama pull nomic-embed-text:latest
ollama server

上面是windows

对于ubuntu

sudo docker pull ollama/ollama
docker run --gpus all -d  -p 11434:11434 --name ollama ollama/ollama
docker exec -it ollama   /bin/sh

传统rag

问题去知识库检索后再整合得到prompt,再给LLM回答

适合微观

GraphRAG

微软最新GraphRAG和普通RAG有什么区别?
GraphRAG 中文网

就是拿问题去大模型构造得知识图谱里面检索相关的子图得到prompt,再去给LLM拿回答

适合宏观

  • 图谱构造问题
  • 新数据进入图谱
  • 图谱构建耗费资源

GraphRAG 是一种结构化的、分层的检索增强生成(RAG)方法,而不是使用纯文本片段的语义搜索方法。GraphRAG 过程包括从原始文本中提取出知识图谱,构建社区层级(这种结构通常用来描述个体、群体及它们之间的关系,帮助理解信息如何在社区内部传播、知识如何共享以及权力和影响力如何分布),为这些社区层级生成摘要,然后在执行基于 RAG 的任务时利用这些结构。

在这里插入图片描述

初始化

python -m graphrag.index --init --root ./ 

这将在当前目录中创建input目录 output目录和prompts目录和.env和settings.yaml

  • env包含运行GraphRAG流程所需的环境变量。如果你检查该文件,你会看到定义了一个单一的环境变量,GRAPHRAG_API_KEY=<API_KEY>。这是用于OpenAI API或Azure OpenAI端点的API密钥。你可以将其替换为你自己的API密钥。
  • settings.yaml包含流程的设置。你可以修改此文件以更改流程的设置。里面会设置使用什么模型进行提示词优化或者生成知识图谱(索引)
  • prompt:
    提供初始提示词:
    在初始化过程中,graphrag 工具可能会生成一些初始的提示词(prompts),这些提示词是用于引导语言模型生成特定领域的知识图谱。这些提示词通常是一些通用的模板,可以根据实际需求进行调整和优化。
    提供支持微调:
    生成的提示词可以作为提示微调(prompt tuning)的起点。通过提示微调,可以进一步优化这些提示词,来更好提取实体关系

提示词微调 prompt tuning来创建更适应知识库的知识图谱

自动调整: 通过加载输入,将输入分割成文本块,然后运行一系列LLM调用和prompt模版替换来生成最终的prompt模版
手动调整: 手动调整prompt模版

python -m graphrag.prompt_tune --config ./settings.yaml --root ./ --no-entity-types --language Chinese --output ./prompts

具体用法如下:
python -m graphrag.prompt_tune --config ./settings.yaml --root ./ --no-entity-types --language Chinese --output ./prompts
根据实际情况选择相关参数:
--config :(必选) 所使用的配置文件,这里选择setting.yaml文件
--root :(可选)数据项目根目录,包括配置文件(YML、JSON 或 .env)。默认为当前目录
--domain :(可选)与输入数据相关的域,如 “空间科学”、“微生物学 ”或 “环境新闻”。如果留空,域将从输入数据中推断出来
--method :(可选)选择文档的方法。选项包括全部(all)、随机(random)或顶部(top)。默认为随机
--limit :(可选)使用随机或顶部选择时加载文本单位的限制。默认为 15
--language :(可选)用于处理输入的语言。如果与输入语言不同,LLM 将进行翻译。默认值为“”,表示将从输入中自动检测
--max-tokens :(可选)生成提示符的最大token数。默认值为 2000
--chunk-size :(可选)从输入文档生成文本单元时使用的标记大小。默认值为 20
--no-entity-types(无实体类型) :(可选)使用无类型实体提取生成。建议在数据涵盖大量主题或高度随机化时使用
--output :(可选)保存生成的提示信息的文件夹。默认为 “prompts”

在这里插入图片描述

使用语言模型(LLM)从每个文本块中提取实体、关系和声明。

实体可以是人名、地名、组织名等,关系可以是实体之间的关联,声明可以是关于实体的具体信息。

python -m graphrag.index --root ./

–resume可以从上次结束的地方继续开始

检索 query(本地搜索(Local Search)、全局搜索(Global Search)、问题生成(Question Generation) )

本地搜索(Local Search):基于实体的推理
本地搜索方法将知识图谱中的结构化数据与输入文档中的非结构化数据结合起来,在查询时用相关实体信息增强 LLM 上下文
这种方法非常适合回答需要了解输入文档中提到的特定实体的问题(例如,"洋甘菊有哪些治疗功效?)
使用局部搜索来提出一个关于特定角色的更具体的问题的示例:

python -m graphrag.query \
--root ./\
--method local \
"Scrooge 这个故事的主人公是谁,他的主要关系是什么?"

全局搜索(Global Search): 基于全数据集推理
根据LLM生成的知识图谱结构能知道整个数据集的结构(以及主题)
这样就可以将私有数据集组织成有意义的语义集群,并预先加以总结。LLM在响应用户查询时会使用这些聚类来总结这些主题
使用全局搜索来提出一个高层次问题的示例:

python -m graphrag.query \
--root ./ \
--method global \
"这个故事的主题是什么?"

问题生成(Question Generation):基于实体的问题生成
将知识图谱中的结构化数据与输入文档中的非结构化数据相结合,生成与特定实体相关的候选问题

加载csv

如何用GraphRAG加载csv数据?通过源码告诉你怎么更改配置文件,成功加载你的csv数据
Default Configuration Mode (using YAML/JSON)

修改settings.yaml里面的input

input:
  type: file # or blob
  file_type: csv # or csv
  # base_dir: "input"cl
  base_dir: ${GRAPHRAG_INPUT_DIR}
  file_encoding: utf-8
  file_pattern: ".*\\.csv"
  source_column: "id"
  title_column: "name"
  text_column: "schoolName"

在这里插入图片描述

部署

将https://github.com/NanGePlus/GraphragTest的utils文件夹克隆到工作目录里,修改INPUT_DIR为你生成的artifacts

python main.py  #启动服务器

索引导入nod4j生成知识图谱

【GraphRAG+知识图谱可视化】知识图谱neo4j可视化呈现,构建近2万字文本知识图谱,打造基于知识图谱的本地知识库,本地搜索、全局搜索二合一
下载这个插件,方便查看Parquet

在这里插入图片描述

修改GRAPHRAG_FOLDER为你生成的artifacts文件

使用在线的neo4j生成实例
https://console-preview.neo4j.io/tools/query
改改密码账号实例名字

python3  neo4jTest.py

在这里插入图片描述

在这里插入图片描述

报错

会爆出错误https://github.com/microsoft/graphrag/issues/1109

这个我怀疑是提取实体时候提取的不是很好就会出现这样的问题

22:51:58,218 graphrag.index.reporting.file_workflow_callbacks INFO Claim Extraction Error details={'doc_index': 0, 'text': '������ѧ'}
22:51:58,265 datashaper.workflow.workflow INFO executing verb window
22:51:58,266 datashaper.workflow.workflow ERROR Error executing verb "window" in create_final_covariates: 'covariate_type'
Traceback (most recent call last):
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\datashaper\workflow\workflow.py", line 410, in _execute_verb
    result = node.verb.func(**verb_args)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\datashaper\engine\verbs\window.py", line 73, in window
    window = __window_function_map[window_operation](input_table[column])
                                                     ~~~~~~~~~~~^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\pandas\core\frame.py", line 4102, in __getitem__
    indexer = self.columns.get_loc(key)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\pandas\core\indexes\range.py", line 417, in get_loc
    raise KeyError(key)
KeyError: 'covariate_type'
22:51:58,276 graphrag.index.reporting.file_workflow_callbacks INFO Error executing verb "window" in create_final_covariates: 'covariate_type' details=None
22:51:58,277 graphrag.index.run ERROR error running workflow create_final_covariates
Traceback (most recent call last):
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\graphrag\index\run.py", line 325, in run_pipeline
    result = await workflow.run(context, callbacks)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\datashaper\workflow\workflow.py", line 369, in run
    timing = await self._execute_verb(node, context, callbacks)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\datashaper\workflow\workflow.py", line 410, in _execute_verb
    result = node.verb.func(**verb_args)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\datashaper\engine\verbs\window.py", line 73, in window
    window = __window_function_map[window_operation](input_table[column])
                                                     ~~~~~~~~~~~^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\pandas\core\frame.py", line 4102, in __getitem__
    indexer = self.columns.get_loc(key)
              ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Liulk\anaconda3\envs\graphragllama3\Lib\site-packages\pandas\core\indexes\range.py", line 417, in get_loc
    raise KeyError(key)
KeyError: 'covariate_type'
22:51:58,278 graphrag.index.reporting.file_workflow_callbacks INFO Error running pipeline! details=None

在这里插入图片描述
关闭即可,默认关闭注释掉即可

https://github.com/microsoft/graphrag/issues/455

ValueError: Columns must be same length as key

这个根本原因是你的模型提取的结果不够好。一方面,你可以选择一个更强大的模型;另一方面,你可以将 settings.yaml 中的 llm:max_token 调小,或者也减小 chunks:size 和 overlap。

在这里插入图片描述

生成neo4j知识图谱报错

[4 rows x 9 columns]
Traceback (most recent call last):
File "/data_disk/liulk/GraphragTest/class_project/utils/neo4jTest.py", line 226, in
batched_import(community_statement, community_report_df)
File "/data_disk/liulk/GraphragTest/class_project/utils/neo4jTest.py", line 96, in batched_import
result = driver.execute_query("UNWIND $rows AS value " + statement,
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/driver.py", line 969, in execute_query
return session._run_transaction(
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/work/session.py", line 581, in _run_transaction
result = transaction_function(tx, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/driver.py", line 1305, in _work
res = tx.run(query, parameters)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/work/transaction.py", line 195, in run
result._tx_ready_run(query, parameters)
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/work/result.py", line 175, in _tx_ready_run
self._run(query, parameters, None, None, None, None, None, None)
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/work/result.py", line 231, in _run
self._attach()
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/work/result.py", line 425, in _attach
self._connection.fetch_message()
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/io/_common.py", line 184, in inner
func(*args, **kwargs)
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/io/_bolt.py", line 994, in fetch_message
res = self._process_message(tag, fields)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/io/_bolt5.py", line 1204, in _process_message
response.on_failure(summary_metadata or {})
File "/home/liulk/miniconda3/envs/GraphragTest/lib/python3.12/site-packages/neo4j/_sync/io/_common.py", line 254, in on_failure
raise self._hydrate_error(metadata)
neo4j.exceptions.ClientError: {code: Neo.ClientError.Schema.TokenNameError} {message: '' is not a valid token name. Token names cannot be empty or contain any null-bytes.}

问题出在社区节点的创建过程中。错误提示说标记名称不能为空或包含空字节。让我们修改社区导入的语句,确保所有值都是有效的。

# 5、创建或更新community与entity、chunk节点之间的关系
community_statement = """
MERGE (c:__Community__ {community: COALESCE(value.community, 'unknown')})
SET c += value {
    .id,
    .title,
    .summary,
    .level,
    .rank,
    .rank_explanation,
    .full_content
}
WITH c, value
UNWIND value.findings AS finding
MERGE (f:__Finding__ {id: finding.id})
SET f += finding
MERGE (c)-[:HAS_FINDING]->(f)
"""

# 在导入之前确保数据的有效性
community_report_df = community_report_df.fillna({
    'community': 'unknown',
    'id': 'unknown',
    'title': '',
    'summary': '',
    'level': '',
    'rank': 0,
    'rank_explanation': '',
    'full_content': ''
})

# 确保findings列是一个有效的JSON字符串列表
def parse_findings(findings):
    if isinstance(findings, str):
        try:
            return json.loads(findings)
        except:
            return []
    return findings if isinstance(findings, list) else []

community_report_df['findings'] = community_report_df['findings'].apply(parse_findings)

batched_import(community_statement, community_report_df)

待完善

  • 未来考虑使用csv来当作数据,效果应该会更好
  • graphrag可以使用最新版本,有增加的功能,效果也许也会更好

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/942377.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

一键打断线(根据相交点打断)——CAD c# 二次开发

多条相交线根据交点一键打断&#xff0c;如下图&#xff1a; 部分代码如下: finally namespace IFoxDemo; public class Class1 {[CommandMethod("ddx")]public static void Demo(){//"ifox可以了".Print();Database db HostApplicationServices.Workin…

Websocket客户端从Openai Realtime api Sever只收到部分数据问题分析

目录 背景 分析 解决方案 背景 正常情况下&#xff0c;会从Openai Realtime api Sever收到正常的json数据,但是当返回音频数据时&#xff0c;总会返回非json数据。这是什么问题呢&#xff1f; 分析 期望的完整响应数据如下&#xff1a; {"session": {"inp…

flask后端开发(1):第一个Flask项目

目录 一、Helloworddebug、host、port的配置 一、Helloword 一般是会创建两个文件夹和app.py app.py from flask import FlaskappFlask(__name__)app.route(/) def hello_world():return Hello World!if __name__ __main__:app.run()右键运行这个py文件&#xff0c;消息绑定…

OAuth 2.0

简介 OAuth 是一种开放标准的授权协议或框架&#xff0c;它提供了一种安全的方式&#xff0c;使第三方应用程序能够访问用户在其他服务上的受保护资源&#xff0c;而无需共享用户的凭证&#xff08;如用户名和密码&#xff09;。OAuth 的核心思想是通过“授权令牌”来代替直接…

玩原神学编程-原神时钟

前言 最近喜欢玩原神这种开放世界探索的游戏&#xff08;还有黑神话、古墓丽影等&#xff09;&#xff0c;只能说纳塔版本的boss盾真的厚&#xff0c;萌新的我去打boss&#xff0c;从白天打到黑夜&#xff0c;黑夜再打到白天&#xff08;游戏里面的时间&#xff09;。 闲话结…

【Spring】深入解析 Spring 原理:Bean 的多方面剖析(源码阅读)

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 一、Bean的作用域 在 Java Spring 框架中&#xff0c;Bean 的作用域是一个关键概念&#xff0c;它决定了 Bean 的生命周期和实例化方式&#xff0c;对应用的性…

基于高德地图js api实现掩膜效果 中间矢量 周围卫星图

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>管网服务</title><style>html,body,#ma…

Vue.js组件(6):echarts组件

1 前言 本章主要对常用的echars图表展示进行基本的组件封装。使用该组件前需要在项目中引入echarts。官网&#xff1a;Apache ECharts npm install echarts --save 2 图表组件 2.1 折线图组件 组件属性&#xff1a;chartId&#xff0c;指定图表挂载div的id&#xff0c;注意不…

RCE常见姿势

文章目录 常见漏洞执行函数&#xff1a;1.系统命令执行函数2.代码执行函数 命令拼接符读取文件命令绕过&#xff1a;空格过滤绕过关键字绕过长度过滤绕过无参数命令执行绕过无字母数字绕过利用%0A截断利用回溯绕过利用create_function()代码注入无回显RCE1.反弹shell2.dnslog外…

selenium执行js

JS知识 获取元素 document.getElement 移除属性&#xff1a;removeAttribute("xx") 窗口移动&#xff1a;window.scrollTo(0, document.body.scrollHeight)方法 drivier.execute_script(js)场景&#xff1a; 日期选择框&#xff0c;不能输入&#xff0c;只能设置…

三维场景重建与3D高斯点渲染技术探讨

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月25日10点11分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 文章源地址(有视频)&#xff1a;链接h…

springboot启动不了 因一个spring-boot-starter-web底下的tomcat-embed-core依赖丢失

这个包丢失了 启动不了 起因是pom中加入了 <tomcat.version></tomcat.version>版本指定&#xff0c;然后idea自动编译后&#xff0c;包丢了&#xff0c;删除这个配置后再也找不回来&#xff0c; 这个包正常在 <dependency><groupId>org.springframe…

Java日志框架:log4j、log4j2、logback

文章目录 配置文件相关1. properties测试 2. XMl使用Dom4j解析XML Log4j与Log4j2日志门面 一、Log4j1.1 Logges1.2 Appenders1.3 Layouts1.4 使用1.5 配置文件详解1.5.1 配置根目录1.5.2 配置日志信息输出目的地Appender1.5.3 输出格式设置 二、Log4j22.1 XML配置文件解析2.2 使…

基于LSTM长短期记忆神经网络的多分类预测【MATLAB】

在深度学习中&#xff0c;长短期记忆网络&#xff08;LSTM, Long Short-Term Memory&#xff09;是一种强大的循环神经网络&#xff08;RNN&#xff09;变体&#xff0c;专门为解决序列数据中的长距离依赖问题而设计。LSTM因其强大的记忆能力&#xff0c;广泛应用于自然语言处理…

机器学习基础 衡量模型性能指标

目录 1 前言 ​编辑1.1 错误率(Error rate)&精度(Accuracy)&误差(Error)&#xff1a; 1.2 过拟合(overfitting): 训练误差小&#xff0c;测试误差大 1.3 欠拟合(underfitting)&#xff1a;训练误差大&#xff0c;测试误差大 1.4 MSE: 1.5 RMSE: 1.6 MAE: 1.7 R-S…

TCP的流量控制的实现

滑动窗口的介绍 滑动窗口是tcp协议中的一个重要概念&#xff0c;滑动窗口是字节为单位&#xff0c;而tcp头部的序列化和确认号也是以字节为单位的&#xff0c;滑动窗口里是含有可以传输的字节的数量&#xff08;可以传输不是已经传输&#xff09;&#xff0c;而滑动窗口的大小是…

【0x001D】HCI_Read_Remote_Version_Information命令详解

目录 一、命令概述 二、命令格式及参数说明 2.12. HCI_Read_Remote_Version_Information 命令格式 2.2. Connection_Handle 三、生成事件 3.1. HCI_Command_Status 事件 3.2. HCI_Read_Remote_Version_Information_Complete 事件 四、命令执行流程 4.1. 命令发起阶段(…

一篇文章学会HTML

目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…

C语言项目 天天酷跑(上篇)

前言 这里讲述这个天天酷跑是怎么实现的&#xff0c;我会在天天酷跑的下篇添加源代码&#xff0c;这里会讲述天天酷跑这个项目是如何实现的每一个思路&#xff0c;都是作者自己学习于别人的代码而创作的项目和思路&#xff0c;这个代码和网上有些许不一样&#xff0c;因为掺杂了…

如何完全剔除对Eureka的依赖,报错Cannot execute request on any known server

【现象】 程序运行报错如下&#xff1a; com.netflix.discovery.shared.transport.TransportException报错Cannot execute request on any known server 【解决方案】 &#xff08;1&#xff09;在Maven工程中的pom去掉Eureka相关的引用&#xff08;注释以下部分&#xff0…