GraphRAG 工作原理逐步解析:从图创建到搜索的实战示例

本篇文章How GraphRAG Works Step-By-Step: From Graph Creation to Search with Real Examples | Towards AI详细介绍了GraphRAG的工作原理,适合对检索增强生成(RAG)和知识图谱感兴趣的读者。文章的技术亮点在于通过图结构提升信息检索效率,并且提供了本地搜索和全局搜索等多种查询方法。适用场景包括文本分析、信息提取和主题总结等。实际案例中,作者以书籍《Penitencia》为例,展示了如何构建图谱并进行有效查询,具体步骤清晰易懂,适合开发者和研究者参考。


文章目录

  • 1. 什么是 GraphRAG?
  • 2. 设置
  • 3. 图创建
    • 3.1 实体提取
    • 3.2 图社区划分
  • 4. 查询
    • 4.1 局部搜索
    • 4.2 全局搜索
  • 5. 结论


你可能读过微软研究院关于使用知识图谱进行检索增强生成(RAG)的论文——《从局部到全局:一种面向查询摘要的 GraphRAG 方法》。或许你觉得论文中的某些部分有些模糊。或许你希望文档能更详细地解释信息是如何从图谱中检索出来的。如果这听起来像你,那就继续读下去吧!

我已经深入研究了代码,所以你无需再费力,在这篇文章中,我将详细描述 GraphRAG 过程的每个步骤。你甚至会学到论文中根本没有提及的一种搜索方法(局部搜索)。

1. 什么是 GraphRAG?

简而言之,GraphRAG 是一种利用图结构增强检索增强生成的方法。

它有不同的实现方式,这里我们主要关注微软的方法。它可以分解为两个主要步骤:图创建(即索引)和查询(其中有三种可能性:局部搜索全局搜索漂移搜索)。

我将使用一个真实世界的例子来引导你完成图创建、局部搜索和全局搜索。因此,事不宜迟,让我们使用 GraphRAG 来索引和查询 Pablo Rivero 的著作《Penitencia》。

Key GraphRAG steps: Graph creation and graph querying

GraphRAG 的关键步骤:图创建和图查询

2. 设置

GraphRAG 的文档会引导你完成项目设置。一旦初始化工作区,你会在 ragtest 目录中找到一个配置文件(settings.yaml)。

Project structure

项目结构

我已将书籍《Penitencia》添加到 input 文件夹。为了本文,我未修改配置文件,以使用默认设置和索引方法(IndexingMethod.Standard)。

3. 图创建

要创建图,运行:

graphrag index --root ./ragtest

这会触发两个关键操作:从源文档中提取实体将图划分为社区,这些操作在 GraphRAG 项目的 workflows 目录的模块中定义。

Modules implementing entity extraction and graph partitioning into communities. The numbers (yellow) show the order of execution.

实现实体提取和图社区划分的模块。黄色数字显示了执行顺序。

3.1 实体提取

  1. create_base_text_units 模块中,文档(在我们的例子中是书籍《Penitencia》)被分割成 N 个 token 的小块。

The first five chunks of the book Penitencia. Each chunk is 1200 tokens long and has a unique ID.

书籍《Penitencia》的前五个文本块。每个文本块长 1200 个 token,并具有唯一的 ID。

  1. create_final_documents 中,创建一个查找表,将文档映射到其相关的文本单元。每一行代表一个文档,由于我们只处理一个文档,所以只有一行。

Table showing all documents by their IDs. For each document, all the associated chunks (i.e. text units) are listed by their IDs.

显示所有文档及其 ID 的表格。对于每个文档,所有相关的文本块(即文本单元)都按其 ID 列出。

  1. extract_graph 中,使用 LLM(来自 OpenAI)分析每个文本块,根据此提示提取实体和关系。

在此过程中,可能会出现重复的实体和关系。例如,主角 Jon 在 82 个不同的文本块中被提及,因此他被提取了 82 次——每个文本块一次。

Snapshot of the entity table. Entities are grouped by entity title and type. The entity Jon was extracted 82 times, as observable from the frequency column. The text_unit_ids and description columns contain a list of 82 IDs and descriptions, respectively, showing in which chunks Jon was identified and described from. By default, there are four entity types (Geo, Person, Event, and Organization).

实体表的快照。实体按实体标题和类型分组。实体 Jon 被提取了 82 次,这可以从频率列中观察到。text_unit_idsdescription 列分别包含 82 个 ID 和描述的列表,显示了 Jon 在哪些文本块中被识别和描述。默认情况下,有四种实体类型(地理、人物、事件和组织)。

Snapshot of the relationship table. Relationships are grouped by source and target entities. For Jon and Celia, the description and text_unit_ids columns contain lists with 14 entries each, revealing that these two characters had relationships identified in 14 distinct text chunks. The weight columns shows the sum of the LLM-assigned relationship strength (weight is not the number of connections between source and target nodes!).

关系表的快照。关系按源实体和目标实体分组。对于 Jon 和 Celia,descriptiontext_unit_ids 列分别包含 14 个条目的列表,表明这两个角色在 14 个不同的文本块中存在关系。weight 列显示了 LLM 分配的关系强度的总和(权重不是源节点和目标节点之间的连接数!)。

通过根据实体标题和类型对实体进行分组,以及根据源节点和目标节点对关系进行分组,尝试进行去重。然后,提示 LLM 通过分析所有出现位置的较短描述来为每个唯一实体和唯一关系编写详细描述(参见提示)。

Snapshot of the entity table with the final entity description (composed from all extracted short descriptions).

实体表的快照,包含最终的实体描述(由所有提取的短描述组成)。

Snapshot of the relationship table with the final relationship description (composed from all extracted short descriptions).

关系表的快照,包含最终的关系描述(由所有提取的短描述组成)。

如你所见,去重有时并不完美。此外,GraphRAG 不处理实体消歧(例如,JonJon Márquez 尽管指代同一个人,但仍将是独立的节点)。

  1. finalize_graph 中,使用 NetworkX 库将实体和关系表示为图的节点和边,包括节点度等结构信息。

Snapshot of the final entity table where each entity represents a node in the graph. A node’s degree is the number of edges it has (i.e. the number of other nodes that it connects to).

最终实体表的快照,其中每个实体代表图中的一个节点。节点的度是它拥有的边数(即它连接的其他节点的数量)。

Snapshot of the final relationship table where each relationship represents an edge in the graph. An edge’s combined_degree represents the sum of source and target node degrees. An edge with a high combined_degree is important because it links highly-connected nodes.

最终关系表的快照,其中每个关系代表图中的一条边。边的 combined_degree 表示源节点和目标节点度的总和。具有高 combined_degree 的边很重要,因为它连接了高度连接的节点。

为了更好地理解,我发现实际查看图很有帮助,因此我使用 Neo4j 进行了可视化(notebook):

The book Penitencia visualized as a graph using Neo4j

使用 Neo4j 将书籍《Penitencia》可视化为图

The entity Jon and his relationships visualized using Neo4j

使用 Neo4j 可视化实体 Jon 及其关系

The relationship between Laura and Mario visualized as a graph edge using Neo4j

使用 Neo4j 将 Laura 和 Mario 之间的关系可视化为图边

3.2 图社区划分

  1. create_communities 中,使用 Leiden 算法(一种分层聚类算法)将图划分为社区。

社区是一组节点,它们彼此之间的关系比与图其余部分的关系更紧密。Leiden 算法的分层性质允许检测不同特异性的社区,这反映在它们的级别中。级别越高,社区越具体(例如,级别 3 相当具体,而级别 0 是根社区,非常通用)。

Snapshot of the community table. Community 0 is a level 0 community, making it a root community (has no parent). It has two sub-communities, as seen in the children column. All the relationships, text units, and entities encapsulated by the community are listed in respective columns. The size columns shows the community is made up of 131 entities.

社区表的快照。社区 0 是一个级别 0 的社区,使其成为一个根社区(没有父级)。它有两个子社区,如 children 列所示。社区封装的所有关系、文本单元和实体都列在相应的列中。size 列显示该社区由 131 个实体组成。

如果我们将每个社区可视化为一个节点,包括属于该社区的实体,我们就可以识别出聚类。

The Penitencia graph filtered for IN_COMMUNITY relationships reveals 15 root level communities (red circles)

过滤 IN_COMMUNITY 关系的《Penitencia》图揭示了 15 个根级别社区(红色圆圈)

社区的价值在于它们能够整合来自广泛来源的信息,如实体和关系,从而提供宏观的洞察。对于书籍而言,社区可以揭示文本中的主要主题或话题,正如我们将在步骤 8 中看到的那样。

Neo4j visualization of three hierarchically connected communities: Community 2 (Celia Gómez and the Tetuán Incident) — [parent of]→ Community 23 (Celia’s Desperation and Familial Violence) — [parent of]→ Community 42 (Celia’s Struggle with Laura). Rank is the LLM-assigned importance of the community from 1 (lowest importance) to 10 (highest importance).

三个分层连接的社区的 Neo4j 可视化:社区 2(Celia Gómez 和 Tetuán 事件)— [父级]→ 社区 23(Celia 的绝望和家庭暴力)— [父级]→ 社区 42(Celia 与 Laura 的斗争)。Rank 是 LLM 分配的社区重要性(1 为最低,10 为最高)。

  1. create_final_text_units 中,步骤 1 中的文本单元表会映射每个文本单元 ID 对应的实体 ID、关系 ID 和协变量 ID(如果有),以便于查找。

Snapshot of final text units table

最终文本单元表的快照

协变量本质上是声明。例如,“Celia 谋杀了她的丈夫和孩子(嫌疑)。” LLM 根据此提示从文本单元中推断出它们。默认情况下,不提取协变量。

  1. create_community_reports 中,LLM 为每个社区编写一份报告,详细说明其主要事件或主题,以及报告的摘要。LLM 遵循此提示,并接收来自社区的所有实体、关系和声明作为上下文。

Snapshot of a table showing an intermediate step before report generation. For each community, all entities and relationships are collected, then structured into a string to be passed to the LLM as context. The column context_exceed_limit alerts the algorithm when the context_string needs to be shortened.

显示报告生成前中间步骤的表格快照。对于每个社区,收集所有实体和关系,然后将其结构化为字符串,作为上下文传递给 LLM。context_exceed_limit 列在 context_string 需要缩短时提醒算法。

对于大型社区,上下文字符串(包括实体、关系,可能还有协变量)可能会超过配置文件中指定的 max_input_length。如果发生这种情况,算法有一种方法可以减少上下文中的文本量,包括层次替换(Hierarch Substitution),如果需要,还可以进行截断(Trimming)。

在层次替换中,来自实体、关系、声明的原始文本被子社区的社区报告替换。

例如,假设社区 C(级别 0)有两个子社区 S1 和 S2(均为级别 1)。社区 S1 的规模(实体数量)大于 S2。在这种情况下,C 中属于 S1 的所有实体、关系和声明都将被 S1 的社区报告替换。这优先考虑最大程度地减少 token 数量。如果此更改后上下文长度仍超过 max_input_length,则使用 S2 替换 C 中的相关实体和关系。

如果在层次替换后,上下文仍然过长(或者社区根本没有子社区),则需要截断上下文字符串——不那么相关的数据将被简单地排除。实体和关系分别按其节点度数和组合度数排序,并删除值最低的那些。

最终,LLM 使用提供的上下文字符串生成关于社区的发现(5-10 个关键洞察的列表)和摘要。这些内容组合起来形成社区报告。

Image of community report.

Snapshot of the community table including LLM-generated reports (full_content column) and report summaries (summary column). The report text is a combination of the summary (red) and findings (blue). The columns rank and rating_explanation contain an LLM-assigned value of importance for the community (between 1 and 10) and a justification for the chosen value, respectively.

社区表的快照,包括 LLM 生成的报告(full_content 列)和报告摘要(summary 列)。报告文本是摘要(红色)和发现(蓝色)的组合。rankrating_explanation 列分别包含 LLM 分配的社区重要性值(介于 1 到 10 之间)以及所选值的理由。

  1. 最后,在 generate_embeddings 中,使用配置中指定的 OpenAI 嵌入模型为所有文本单元、实体描述和 full_content 文本(社区标题 + 社区摘要 + 社区报告 + 排名 + 评级解释)创建嵌入。向量嵌入允许基于用户查询对图进行高效的语义搜索,这在局部搜索和全局搜索中是必需的。

4. 查询

图构建完成后,我们就可以开始查询它了。搜索功能的实现可以在 GraphRAG 项目的structure_search目录中找到。

4.1 局部搜索

如果你有一个具体的问题,请使用 GraphRAG 提供的局部搜索功能(更多示例用法请参见notebook)。

graphrag query \
--root ./ragtest \
--method local \
--query "What kind of retribution is Laura seeking, and why?"

Key step in Local Search

局部搜索的关键步骤

  1. 社区报告、文本单元、实体、关系和协变量(如果有)从 ragtest/output/ 中的 parquet 文件加载,它们在图创建后已自动保存。

然后,对用户查询进行嵌入,并计算其与每个实体描述嵌入的语义相似度。

Snapshot of entities and their cosine distance to the user query

实体及其与用户查询的余弦距离快照

检索到 N 个语义最相似的实体。N 的值由配置中的超参数 top_k_mapped_entities 定义。

奇怪的是,GraphRAG 会以 2 倍的因子进行过采样,有效地检索 2 * top_k_mapped_entities 个实体。这样做是为了确保提取足够的实体,因为有时检索到的实体具有无效 ID。

Snapshot of the entities that are most semantically similar to the user query. In this example, top_k_mapped_entities=10, so 20 entities should have been retrieved with oversampling but only 17 had valid IDs, so 17 entities were actually retrieved. The rank column displays the entity node’s degree.

与用户查询语义最相似的实体快照。在此示例中,top_k_mapped_entities=10,因此通过过采样应该检索到 20 个实体,但只有 17 个具有有效 ID,因此实际检索到 17 个实体。rank 列显示实体节点的度数。

在这里插入图片描述

摘要图:局部搜索中提取实体的检索

  1. 所有提取的实体都成为候选实体。提取实体的社区、关系和文本单元成为候选社区候选关系候选文本单元

具体来说:

  • 候选社区是所有包含至少一个提取实体的社区。
  • 候选关系是所有图边,其中提取的实体是源节点或目标节点。
  • 候选文本单元是包含至少一个提取实体的书籍中的文本块。

Summary diagram: Selection of candidate communities, entities, relationships and text units in Local Search

摘要图:局部搜索中候选社区、实体、关系和文本单元的选择

  1. 候选对象被排序,最相关的项目放在各自列表的顶部。这确保了最重要的信息被优先用于回答查询。

优先级是必要的,因为 LLM 上下文长度不是无限的。可以传递给模型的信息量是有限的。配置中设置的超参数决定了分配给实体、关系、文本单元和社区的上下文窗口 token 数量。默认情况下,text_unit_prop=0.5community_prop=0.1,这意味着配置中指定的 max_tokens 的 50% 将被文本单元占用,10% 被社区报告占用,剩下 40% 用于实体和关系的描述。max_tokens 默认为 12000。

  • 社区按其“匹配”数排序,即社区中提取实体出现的不同文本单元的数量。如果匹配数相同,则按其“排名”(LLM 分配的重要性)排序。给定 max_tokens=12000community_prop=0.1,则社区报告最多可占用 1200 个 token。只允许完整的社区报告,这意味着没有截断——社区报告要么完整包含,要么完全不包含。

Snapshot of candidate communities sorted by matches and rank. Matches are the number of distinct text units in which extracted entities appear. Rank is the importance score of the community, as decided by the LLM.

按匹配数和排名排序的候选社区快照。匹配数是提取实体出现的不同文本单元的数量。排名是社区的重要性得分,由 LLM 决定。

  • 候选实体不进行排序,保持实体与其用户查询的语义相似度顺序。尽可能多的候选实体被添加到上下文中。如果 max_tokens 的 40% 分配给实体和关系,这意味着最多有 4800 个 token 可用。

Snapshot of candidate entities

候选实体快照

  • 候选关系根据其是网络内(in-network)关系还是网络外(out-network)关系进行不同优先级的处理。网络内关系是指两个提取实体之间的关系。网络外关系是指提取实体与另一个非提取实体集中的实体之间的关系。网络内候选关系按其 combined_degree(源节点和目标节点度的总和)排序。网络外候选关系首先按其链接(links)数量(即网络外实体与网络内实体之间的链接数量)排序,如果链接数量相同,则按 combined_degree 排序。

Table showing in-network relationships. The rank columns shows the combined_degree.

显示网络内关系的表格。rank 列显示 combined_degree

在这里插入图片描述

显示网络外关系的表格快照。rank 列显示 combined_degreeattributes 列显示网络外实体与网络内实体(Crímenes, Papás de Laura, and Laura)的链接数量。

查找网络内和网络外关系是一个迭代过程,一旦可用 token 空间被填满(在我们的示例中,available_tokens = 4800 — entity_descriptions),就停止。网络内关系首先添加到上下文中,因为它们被认为更重要。然后,在空间允许的情况下,添加网络外关系。

Snapshot of prioritized candidate relationships. Observe that the two first rows are the in-network relationships. Weight is not used by default and links are outdated/ incorrect for in-network relationships.

优先级排序的候选关系快照。请注意,前两行是网络内关系。默认情况下不使用权重,并且网络内关系的链接已过时/不正确。

  • 候选文本单元按提取实体顺序排序,然后按与文本单元相关的提取实体关系数量排序。实体顺序确保提及与用户查询语义最相似的实体的文本单元获得优先权。例如,如果 Crímenes 是与用户查询语义最相似的实体,并且文本单元 CB6F…是提取 Crímenes 的文本块,那么 CB6F…将位于列表顶部,即使与之相关的提取实体关系很少。

Snapshot of table showing prioritized text units

显示优先级排序的文本单元的表格快照

Every graph edge (relationship) has a property which informs from which text units it was extracted. This property makes it possible to trace the relationship of an extracted entity to the text units where it was detected.

每个图边(关系)都有一个属性,指示它是从哪个文本单元中提取的。此属性使得追踪提取实体与检测到它的文本单元之间的关系成为可能。

给定 max_tokens=12000text_unit_prop=0.5,则文本单元最多可占用 6000 个 token。与社区报告的情况一样,文本单元被添加到上下文中直到达到 token 限制,不进行截断。

Summary diagram: Sorting of candidate communities, entities, relationships and text units in Local Search

摘要图:局部搜索中候选社区、实体、关系和文本单元的排序

  1. 最后,按此顺序将优先级排序的社区报告、实体、关系和文本单元的描述连接起来,并作为上下文提供给 LLM,LLM 生成对用户查询的详细响应。

Summary diagram: Response generation to the user query in Local Search

摘要图:局部搜索中对用户查询的响应生成

4.2 全局搜索

如果你有一个一般性问题,请使用全局搜索功能(更多示例用法请参见notebook)。

graphrag query \
--root ./ragtest \
--method global \
--query "What themes are explored in the book?"

Key steps in Global Search

全局搜索的关键步骤

  1. 社区报告和实体从已保存的 parquet 文件中加载。

对于每个社区,计算一个 occurrence_weightoccurrence_weight 表示与社区相关的实体出现的不同文本单元的归一化计数。该值反映了社区在整个文档中的普遍程度。

Image of community report.

Snapshot of community table

社区表快照

2.所有社区都被打乱,然后分批处理。打乱有助于减少偏差,确保最相关的社区不会全部集中在同一批次中。

每批次的社区都按其 community_weight 排序。本质上,实体出现在多个文本块中的社区会获得优先权。

在这里插入图片描述

摘要图:全局搜索中的社区批处理

  1. 对于每个批次,LLM 使用社区报告作为上下文,生成对用户查询的多个响应,并为每个响应分配一个分数,以反映其在回答用户问题方面的帮助程度(提示)。通常每个批次生成 5 个响应。

Summary diagram: Response generation for each batch in Global Search

摘要图:全局搜索中每个批次的响应生成

所有响应都按其分数排名,任何分数为零的响应都将被丢弃。

Table showing all responses to the user question sorted by their score. The analyst column represents the batch ID.

显示所有用户问题响应的表格,按分数排序。analyst 列代表批次 ID。

  1. 排序后的响应文本被连接成一个单一的输入,作为上下文传递给 LLM,LLM 生成对用户问题的最终答案(提示)。

Summary diagram: Final response generation in Global Search

摘要图:全局搜索中的最终响应生成

5. 结论

本文逐步引导你了解了 Microsoft GraphRAG 中图创建、局部搜索和全局搜索的实现方式,并结合了真实数据和代码层面的见解。尽管自 2024 年初我开始使用该项目以来,官方文档已显著改进,但这次深入探讨填补了知识空白,并揭示了幕后发生的事情。迄今为止,这是我遇到的关于 GraphRAG 最详细和最新的资源,我希望你觉得它有用。

现在,我鼓励你超越默认配置:尝试调整参数,微调实体提取提示,或使用不同的索引方法。进行实验,并利用 GraphRAG 的强大功能来完成你自己的项目!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LAMPSecurity: CTF8靶场渗透

LAMPSecurity: CTF8 来自 <https://www.vulnhub.com/entry/lampsecurity-ctf8,87/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.128&#xff0c;靶场IP192.168…

绿算技术闪耀智博会 赋能乡村振兴与产业升级

9月5日至7日&#xff0c;由宁波市人民政府、浙江省经济和信息化厅、中国信息通信研究院联合主办的第十五届智慧城市与智能经济博览会在宁波国际会展中心圆满落幕。绿算技术受邀参展&#xff0c;并发布与北京东方联鸣科技发展有限公司联合打造的《360数智牧业AI模型支撑底座》&a…

浅谈“SVMSPro视频切片”技术应用场景

技术定义视频切片是一项将连续不断的视频流&#xff0c;按特定规则&#xff08;如时间点、事件触发&#xff09;切割成一个个独立、完整的MP4等标准视频文件的技术。这些切片文件体积小、格式通用&#xff0c;易于管理、传输和播放。核心价值精准存档&#xff1a;从海量录像中精…

php 使用html 生成pdf word wkhtmltopdf 系列1

php 使用html 生成pdf word wkhtmltopdf 系列2 php 使用html 生成 pdf word 项目有个需求 想同时生成word 和pdf 并且对pdf要求比较高 为了一劳永逸 决定写成html 分别转成word 和pdf 系统环境 windows10 小皮面板&#xff08;php8&#xff09; linux centos 7.9 宝塔&…

Git常用命令大全:高效开发必备

目录 常用Git命令清单 1. 新建代码库 2. 配置 3. 增加/删除文件 4. 代码提交 5. 分支 6. 标签 7. 查看信息 8. 远程同步 9. 撤销 10. 常用操作组合 修改本地分支名和远程分支名 附录&#xff1a;Git命令思维导图 安装gitlab 常用Git命令清单 一般来说&#xff0…

AJAX入门-URL

本系列可作为前端学习系列的笔记&#xff0c;代码的运行环境是在VS code中&#xff0c;小编会将代码复制下来&#xff0c;大家复制下来就可以练习了&#xff0c;方便大家学习。 HTML、CSS、JavaScript系列文章 已经收录在前端专栏&#xff0c;有需要的宝宝们可以点击前端专栏查…

【深度学习新浪潮】什么是具身智能?

具身智能(Embodied AI)是人工智能与机器人技术深度融合的前沿领域,其核心是通过物理实体与环境的实时交互闭环,实现感知-认知-决策-行动的一体化自主进化。这类系统不仅能理解语言指令,更能通过高精度传感器(如触觉、视觉、力觉融合)感知物理世界,依托多模态大模型完成…

动画蓝图与动画状态机:从 Unity Mecanim 到 Unreal Animation Blueprint 的一把梭

动画蓝图与动画状态机&#xff1a;从 Unity Mecanim 到 Unreal Animation Blueprint 的一把梭这篇是系列的第一篇。目标很简单&#xff1a;把 Unreal 的 Animation Blueprint 和 Unity 的 Animator Controller&#xff08;Mecanim&#xff09; 放在同一张桌子上&#xff0c;系统…

实战案例:数字孪生+可视化大屏,如何高效管理智慧能源园区?

摘要&#xff1a; 当智慧遇上能源&#xff0c;一场管理革命正在悄然发生。想象一下&#xff1a;一个占地千亩的能源园区&#xff0c;光伏板、储能站、风力机组星罗棋布&#xff0c;传统管理模式下&#xff0c;数据分散、响应滞后、故障频发... 但某园区引入“数字孪生可视化大屏…

Django 从环境搭建到第一个项目

作为一名刚接触 Django 的开发者&#xff0c;我在学习过程中整理了这份入门笔记&#xff0c;涵盖 Django 框架基础、环境搭建、第一个项目创建以及核心配置&#xff0c;希望能为同样刚入门的小伙伴提供清晰的学习思路。 一、Django 框架基础认知 在开始实际操作前&#xff0c…

机器学习实操项目02——Pandas入门(基本操作、创建对象、查看数据、数据选择、处理缺失数据、数据合并、数据分组、时间序列、绘图、文件导出)

上一章&#xff1a;机器学习实操项目01——Numpy入门&#xff08;基本操作、数组形状操作、复制与试图、多种索引技巧、线性代数&#xff09; 下一章&#xff1a; 机器学习核心知识点目录&#xff1a;机器学习核心知识点目录 机器学习实战项目目录&#xff1a;【从 0 到 1 落地…

springboot超市货品信息管理系统

开发环境开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Mave…

c# .net中using的使用

using示例代码 示例代码1&#xff1a; using HttpContent httpContent new StringContent(postData, Encoding.UTF8);示例代码2&#xff1a; using (var process Process.Start(info)) {output process.StandardOutput.ReadToEnd(); }示例代码1写法&#xff1a; using HttpC…

STM32HAL 快速入门(二十):UART 中断改进 —— 环形缓冲区解决数据丢失

前言 大家好&#xff0c;这里是 Hello_Embed。上一篇我们用中断方式实现了 UART 收发&#xff0c;但发现一个关键问题&#xff1a;若 CPU 在处理其他任务时未及时重新使能接收中断&#xff0c;新数据会覆盖旧数据&#xff0c;导致丢失。本篇的核心改进方案是 ——“中断接收 环…

使用Docker搭建MaxKB智能体平台

1、系统要求 详见&#xff1a; https://maxkb.cn/docs/v2/quick_start https://maxkb.cn/docs/v2/installation/offline_installtion https://maxkb.cn/docs/v2/installation/online_installtion 2、安装Docker 合集&#xff1a;Docker安装与使用 3、安装MaxKB 详见&#xf…

宠物电商痛点破解:智能客服的关键作用

在宠物电商蓬勃发展的当下&#xff0c;行业面临着诸多痛点。从客户咨询的高频率到订单处理的复杂性&#xff0c;每一个环节都可能成为制约发展的瓶颈。而智能客服的出现&#xff0c;为这些痛点提供了有效的解决方案&#xff0c;成为宠物电商行业不可或缺的助力。一、宠物电商的…

基于GraphRAG+Ollama验证知识图谱和检索增强融合

之前介绍了知识图谱与检索增强的融合探索GraphRAG。 https://blog.csdn.net/liliang199/article/details/151189579 这里尝试在CPU环境&#xff0c;基于GraphRAGOllama&#xff0c;验证GraphRAG构建知识图谱和检索增强查询过程。 1 环境安装 1.1 GraphRAG安装 在本地cpu环境…

36页可编辑PPT | 某制造集团灯塔工厂解决方案

制造业企业订单种类多&#xff0c;传统产线换型慢&#xff0c;库存高&#xff0c;财务压力大。工人年龄大&#xff0c;招工难&#xff0c;工资涨&#xff0c;效率低。海外对手用低价和柔性产线抢单&#xff0c;国内同行用数字化缩短交期。企业想扩产&#xff0c;又怕投资重、回…

Redis 非缓存核心场景及实例说明

Redis 非缓存核心场景及实例说明 一、分布式锁 分布式锁用于解决分布式系统中多节点竞争同一资源的问题&#xff0c;确保操作原子性。Redis 实现分布式锁的核心思路是利用键的唯一性和原子命令&#xff0c;通常基于 Redisson 框架简化实现&#xff08;底层依赖 Redis 命令&…

【技术教程】如何将ONLYOFFICE文档集成到使用Spring Boot框架编写的Java Web应用程序中

在现代协作办公环境中&#xff0c;将功能强大的文档编辑器无缝集成到自有业务系统中&#xff0c;已成为提升工作效率和用户体验的关键需求。ONLYOFFICE 文档服务器提供了一套成熟的在线文档编辑解决方案&#xff0c;而 Java Spring Boot 则是构建高效、模块化 Web 应用的热门框…