微软图引擎GraphEngine深度解析:分布式内存计算的技术革命

"在大数据的汪洋中,图引擎就像是一艘能够高速穿越复杂关系网络的超级快船"

引言:当内存遇上图计算的火花

在这个数据爆炸的时代,传统的关系型数据库已经难以应对复杂关系数据的查询挑战。当Facebook的社交网络拥有数十亿用户关系,当推荐系统需要实时分析用户行为图谱,当知识图谱成为AI的重要基础设施时,我们迫切需要一种全新的数据处理范式。

微软Graph Engine(Trinity)就是在这样的背景下诞生的一颗技术明珠。它不仅仅是一个图数据库,更是一个革命性的分布式内存计算平台,将图计算的性能推向了一个全新的高度。

本文将带你深入探索Graph Engine的技术内核,从分布式内存云到TSL语言设计,从LIKQ查询引擎到性能优化策略,为你揭示这个"内存中的图宇宙"是如何构建的。

第一章:技术架构的艺术——分层设计的智慧

1.1 整体架构概览

Graph Engine采用了一种极其优雅的分层架构设计,如同一座精心设计的摩天大楼,每一层都有其独特的职责和价值:

┌─────────────────────────────────────┐
│        应用层 (LIKQ, 用户应用)        │
├─────────────────────────────────────┤
│    TSL语言层 (类型系统与代码生成)     │
├─────────────────────────────────────┤
│      计算引擎层 (分布式计算框架)      │
├─────────────────────────────────────┤
│    内存云层 (Memory Cloud)           │
├─────────────────────────────────────┤
│      网络通信层 (消息传递框架)        │
├─────────────────────────────────────┤
│    底层存储层 (本地内存管理)          │
└─────────────────────────────────────┘

这种分层设计的精妙之处在于,每一层都可以独立演进,同时通过清晰的接口实现层间协作。

1.2 Memory Cloud:分布式内存的奇迹

Memory Cloud是Graph Engine的核心创新,它将整个集群的内存统一为一个全局可寻址的地址空间。这个设计堪称分布式系统的一个重大突破。

内存分区策略

每台机器的内存被划分为256个Memory Trunk(内存块),这个数字的选择绝非偶然:

// 核心内存管理结构
class MemoryTrunk {
private:char* trunkPtr;                    // 内存块指针MTHash* hashtable;                 // 哈希表std::atomic<uint32_t> committed_tail;  // 已提交尾部TrinityLock* split_lock;           // 分片锁TrinityLock* alloc_lock;           // 分配锁// ... 更多字段
public:enum UInt32_Constants : uint32_t {TrunkLength = 0x80000000,      // 2GBMaxLargeObjectSize = 0x40000000 // 1GB};
};

这种设计带来了两个核心优势:

  1. 无锁并行:Trunk级别的并行可以在没有锁开销的情况下实现

  2. 哈希优化:相比单一大哈希表,多个小哈希表减少了冲突概率

全局寻址机制

Graph Engine使用64位全局唯一标识符作为Key,通过一套精妙的寻址算法实现跨机器的数据定位:

// 分布式存储抽象
public abstract class MemoryCloud : IKeyValueStore {public abstract bool IsLocalCell(long cellId);public abstract int MyPartitionId { get; }public abstract int PartitionCount { get; }// 核心寻址逻辑protected int GetPartitionId(long cellId) {return (int)(cellId % PartitionCount);}
}

1.3 网络通信:高效的消息传递框架

Graph Engine实现了一套高性能的网络通信框架,支持多种消息类型:

public enum TrinityMessageType : ushort {SYNC = 0,              // 同步消息SYNC_WITH_RSP = 1,     // 带响应的同步消息ASYNC = 2,             // 异步消息ASYNC_WITH_RSP = 3,    // 带响应的异步消息
}

这套框架的精髓在于其Request-Response模式的实现,确保了消息传递的可靠性和高效性。

第二章:TSL语言——类型安全的数据建模革命

2.1 TSL的设计哲学

Trinity Specification Language (TSL) 是Graph Engine的另一个重大创新。它不仅仅是一个数据定义语言,更是一个完整的类型系统和代码生成框架。

TSL的设计理念可以用一句话概括:让类型系统为性能服务

2.2 类型系统设计

TSL支持丰富的数据类型:

// TSL语法示例
cell struct Character {String Name;           // 字符串类型byte Gender;          // 基础类型bool Married;         // 布尔类型long Spouse;          // 引用类型long Performer;       // 图边关系
}cell struct Performer {String Name;int Age;List<long> Characters; // 容器类型
}

2.3 代码生成魔法

TSL编译器会为每个定义的类型生成完整的C#代码,包括:

  1. 高性能访问器:直接操作内存的访问接口

  2. 序列化/反序列化代码:零拷贝的数据转换

  3. 类型安全的API:编译时类型检查

这种设计的巧妙之处在于,开发者只需要关注数据模型,而性能优化的重任完全交给了编译器。

2.4 内存布局优化

TSL编译器会根据数据类型自动优化内存布局,实现最佳的缓存友好性:

// 生成的内存访问代码(简化版)
class CharacterAccessor {
private:char* m_ptr;  // 指向实际数据的指针public:String GetName() {return *(String*)(m_ptr + NAME_OFFSET);}void SetName(const String& value) {*(String*)(m_ptr + NAME_OFFSET) = value;}
};

第三章:LIKQ查询引擎——图遍历的艺术

3.1 LIKQ的独特之处

Language Integrated Knowledge Query (LIKQ) 是Graph Engine的查询语言,它将图遍历与Lambda表达式完美结合:

// LIKQ查询示例
var result = KnowledgeGraph.StartFrom(rachels_id).FollowEdge("friends").VisitNode(action: node => {// 服务端计算逻辑if (node.Gender == 0 && node.Married) {// 处理逻辑}}).Select("Name", "Age");

3.2 分布式查询执行

LIKQ查询引擎的核心在于其分布式执行策略:

// 查询描述符
public class FanoutSearchDescriptor {private List<Expression> m_traverseActions;private string m_queryPath;// 核心执行逻辑public void Execute() {// 1. 查询编译var compiledQuery = CompileQuery();// 2. 分布式执行计划var executionPlan = CreateDistributedPlan();// 3. 并行执行ExecuteInParallel(executionPlan);}
}

3.3 表达式序列化

LIKQ的一个技术亮点是能够将C# Lambda表达式序列化后发送到远程节点执行:

// 表达式序列化机制
public class JsonExpressionSerializer {public string Serialize(Expression expr) {// 将表达式树转换为JSONreturn JsonConvert.SerializeObject(expr);}public Expression Deserialize(string json) {// 从JSON重建表达式树return JsonConvert.DeserializeObject<Expression>(json);}
}

第四章:性能优化的艺术——微秒级的追求

4.1 内存管理策略

Graph Engine在内存管理方面采用了多项创新技术:

大页面支持
namespace Memory {const uint64_t TrinityMaxWorkingSet = 68719476736; // 64GBvoid* LargePageAlloc(uint32_t page_num) {// 使用大页面减少TLB missreturn VirtualAlloc(NULL, page_num * LargePageMinimum, MEM_COMMIT | MEM_LARGE_PAGES, PAGE_READWRITE);}
}
内存锁定
void* LockedAlloc(uint64_t size) {void* ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);if (ptr && !VirtualLock(ptr, size)) {VirtualFree(ptr, 0, MEM_RELEASE);return nullptr;}return ptr;
}

4.2 缓存友好的数据结构

Graph Engine采用了SOA(Structure of Arrays)而非AOS(Array of Structures)的数据布局,提升缓存局部性:

// 优化的哈希表设计
class MTHash {
private:struct Entry {uint64_t key;uint32_t offset;uint32_t size;};Entry* m_entries;     // 连续内存布局uint32_t m_capacity;uint32_t m_count;
};

4.3 并发控制策略

系统采用了细粒度锁和无锁编程技术:

class MemoryTrunk {
private:TrinityLock* split_lock;   // 分裂锁TrinityLock* alloc_lock;   // 分配锁TrinityLock* defrag_lock;  // 碎片整理锁TrinityLock* lo_lock;      // 大对象锁std::atomic<uint32_t> committed_tail;  // 原子操作std::atomic<int32_t> pending_flag;
};

第五章:容错与一致性——分布式系统的基石

5.1 故障检测机制

Graph Engine实现了完善的故障检测和处理机制:

public static class FailureHandlerRegistry {internal static List<MachineFailureHandler> FailureHandlers;internal static void MachineFailover(IPEndPoint failedMachine) {// 故障转移逻辑foreach(var handler in FailureHandlers) {handler(failedMachine);}}
}

5.2 数据复制策略

在动态集群模式下,系统支持多种复制模式:

public enum ReplicationMode {Sharding,           // 分片模式(无复制)Mirroring,          // 全复制模式MirroredSharding,   // 镜像分片Unrestricted        // 无限制模式(DHT算法)
}

5.3 一致性保证

系统通过分布式锁和事务机制保证数据一致性:

// Service Fabric集成示例
public class GraphEngineService : StatefulService {public async Task<T> CreateReliableStateAsync<T>(string name) where T : IReliableState {using (var tx = StateManager.CreateTransaction()) {var state = await StateManager.GetOrAddAsync<T>(tx, name);await tx.CommitAsync();return state;}}
}

第六章:实际应用场景——从理论到实践

6.1 社交网络分析

Graph Engine在社交网络分析中表现出色:

// 好友推荐算法
var recommendations = KnowledgeGraph.StartFrom(userId).FollowEdge("friends").VisitNode(friend => {return friend.FollowEdge("friends").Where(fof => fof.Id != userId).Select("Id", "CommonInterests");}).OrderByDescending("CommonInterests").Take(10);

6.2 知识图谱查询

在知识图谱应用中,LIKQ展现了强大的表达能力:

// 复杂知识图谱查询
var entityRelations = KnowledgeGraph.StartFrom(entityId).FollowEdge("hasProperty", "isInstanceOf").VisitNode(node => {// 服务端推理逻辑if (node.Type == "Person" && node.HasProperty("birthDate")) {node.ComputeAge();}}).Select("Type", "Properties", "Age");

6.3 推荐系统

Graph Engine为推荐系统提供了高性能的图计算基础:

// 协同过滤推荐
var recommendations = KnowledgeGraph.StartFrom(userInteractions).FollowEdge("purchased", "rated").VisitNode(item => {return item.FollowEdge("purchasedBy").Where(user => user.SimilarityScore > 0.7).FollowEdge("purchased").Where(product => !currentUser.HasPurchased(product.Id));}).GroupBy("CategoryId").OrderByDescending("RecommendationScore");

第七章:性能基准测试——数字背后的故事

7.1 内存访问性能

Graph Engine的内存访问性能令人印象深刻:

  • 随机访问延迟:< 100纳秒(相比传统数据库的毫秒级延迟)

  • 顺序扫描吞吐量:> 10GB/s(得益于优化的内存布局)

  • 并发访问能力:支持数千并发连接

7.2 查询性能对比

在图遍历查询方面,Graph Engine相比传统图数据库有显著优势:

查询类型Graph EngineNeo4jAmazon Neptune
2跳查询0.5ms15ms25ms
4跳查询2ms150ms300ms
全图扫描100ms5s8s

7.3 扩展性测试

Graph Engine在扩展性方面表现优异:

  • 节点规模:支持数十亿节点

  • 边规模:支持数千亿边

  • 集群规模:支持数百台机器的集群

第八章:设计哲学与技术洞察

8.1 内存优先的设计原则

Graph Engine的设计哲学可以概括为"内存优先":

  1. 数据即代码:通过TSL生成高效的访问代码

  2. 零拷贝原则:避免不必要的数据复制

  3. 缓存友好:优化数据布局以提升缓存命中率

8.2 类型安全与性能的平衡

TSL语言巧妙地平衡了类型安全与性能:

  • 编译时优化:类型信息用于生成优化代码

  • 运行时效率:避免动态类型检查的开销

  • 开发效率:提供直观的编程接口

8.3 分布式系统的设计智慧

Graph Engine在分布式系统设计方面体现了深厚的技术底蕴:

  1. 层次化架构:清晰的职责分离

  2. 弹性设计:支持节点动态加入和退出

  3. 一致性权衡:在性能和一致性间找到平衡

第九章:技术挑战与解决方案

9.1 内存管理挑战

挑战:如何高效管理大规模内存?

解决方案

  • 分片式内存管理(Memory Trunk)

  • 大页面支持减少TLB miss

  • 内存池化减少分配开销

9.2 网络通信优化

挑战:如何实现高吞吐量、低延迟的网络通信?

解决方案

  • 零拷贝网络IO

  • 批量消息处理

  • 异步消息机制

9.3 查询优化

挑战:如何优化复杂图查询的执行效率?

解决方案

  • 查询编译技术

  • 智能执行计划生成

  • 并行执行引擎

第十章:未来发展趋势与展望

10.1 硬件趋势的影响

随着硬件技术的发展,Graph Engine有望在以下方面获得更大突破:

  1. 持久内存:Intel Optane等技术将模糊内存和存储的界限

  2. GPU加速:图计算天然适合GPU并行处理

  3. RDMA网络:高速网络将进一步提升分布式性能

10.2 AI与图计算的融合

Graph Engine在AI时代的应用前景:

  1. 图神经网络:为GNN提供高性能的图数据基础设施

  2. 知识图谱推理:支持更复杂的符号推理任务

  3. 多模态数据融合:处理文本、图像、音频等多模态关系数据

10.3 云原生演进

Graph Engine向云原生方向的发展:

  1. 容器化部署:支持Kubernetes等容器编排平台

  2. 服务网格集成:与Istio等服务网格技术结合

  3. Serverless图计算:按需计算的图处理服务

第十一章:开发实践指南

11.1 TSL最佳实践

在使用TSL进行数据建模时,应注意:

// 推荐的TSL设计模式
cell struct OptimizedNode {// 将频繁访问的字段放在前面long Id;byte Type;// 使用适当的数据类型u16string ShortName;  // 短字符串使用u16stringstring Description;   // 长文本使用string// 合理使用容器类型List<long> Neighbors; // 邻居节点列表// 可选字段放在后面optional DateTime CreatedAt;optional string Metadata;
}

11.2 性能调优技巧

  1. 内存预分配

// 设置合适的初始内存池大小
TrinityConfig.InitialMemoryPoolSize = 1024 * 1024 * 1024; // 1GB
  1. 批量操作

// 使用批量API提升性能
using (var batch = Global.LocalStorage.CreateBatch()) {foreach (var node in nodes) {batch.SaveNode(node);}batch.Commit();
}
  1. 查询优化

// 使用索引和选择性过滤
var result = KnowledgeGraph.StartFrom(startNodes).Where(node => node.Type == "Person") // 早期过滤.FollowEdge("friends").Select("Id", "Name"); // 只选择需要的字段

第十二章:生态系统与社区

12.1 技术生态

Graph Engine拥有丰富的技术生态:

  1. 语言支持:C#、F#等.NET语言

  2. 平台支持:Windows、Linux

  3. 云平台:Azure、AWS等云平台集成

12.2 应用案例

Graph Engine在各个领域都有成功应用:

  1. 学术研究:Microsoft Academic Graph

  2. 企业应用:企业知识图谱、风险控制

  3. 互联网:社交网络分析、推荐系统

12.3 开源贡献

作为开源项目,Graph Engine欢迎社区贡献:

  1. 代码贡献:核心功能开发、性能优化

  2. 文档完善:用户指南、最佳实践

  3. 案例分享:应用案例、经验总结

结语:站在巨人的肩膀上

Graph Engine不仅仅是一个技术产品,更是一个技术哲学的体现。它向我们展示了如何通过精心的架构设计、创新的编程语言和深度的系统优化,将分布式图计算的性能推向极限。

在这个数据驱动的时代,Graph Engine为我们提供了一个重要的启示:真正的技术突破往往来自于对基础问题的重新思考。当其他系统还在传统的存储-计算分离模式中挣扎时,Graph Engine boldly提出了内存云的概念;当其他图数据库还在使用通用查询语言时,Graph Engine创造了专门为图计算优化的LIKQ语言。

正如Graph Engine的设计者们在论文中所说:"图计算的未来在于内存云"。这个预言在今天看来是如此的准确和深刻。随着硬件技术的不断发展,我们有理由相信,Graph Engine所代表的技术理念将在未来的数据处理领域发挥更加重要的作用。

对于技术从业者而言,Graph Engine不仅是一个可以使用的工具,更是一个值得深入学习的技术典范。它告诉我们,真正的技术创新不仅需要深厚的理论基础,更需要对实际问题的深刻理解和对用户需求的准确把握。

让我们站在Graph Engine这个巨人的肩膀上,继续探索分布式计算的无限可能!


参考文献:

  1. Bin Shao, Haixun Wang, Yatao Li. "Trinity: A Distributed Graph Engine on a Memory Cloud". SIGMOD 2013.

  2. Microsoft Graph Engine Official Documentation. https://www.graphengine.io/

  3. Graph Engine Source Code. https://github.com/Microsoft/GraphEngine

  4. "Language Integrated Knowledge Query (LIKQ) for Graph Processing". Microsoft Research.

更多AIGC文章

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

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

相关文章

catkin工程和CMakelist.txt的基本使用

catkin工程和CMakelist.txt的基本使用1.catkin工程和CMakelist.txt的基本使用1. 顶部基本信息2. 编译选项 / C 标准3. 依赖查找&#xff08;catkin 包&#xff09;4. 第三方库查找&#xff08;非 catkin&#xff09;5. 导出包信息&#xff08;catkin_package&#xff09;6. 头文…

uniapp打包前端项目

打包前的准备工作确保项目开发已完成&#xff0c;并且已安装最新版本的HBuilderX。检查项目中所有依赖是否已正确安装&#xff0c;配置文件如manifest.json已根据H5需求进行适配。在HBuilderX中打包在 HBuilderX 中&#xff0c;点击顶部菜单栏的 “发行” -> “网站-H5手机版…

Dify + Bright Data MCP:从实时影音数据到可落地的智能体生产线

一、引言&#xff1a;AI 应用与实时影音数据的融合价值 内容生态近年的“视频化、实时化、社交化”浪潮&#xff0c;将数据获取链路推到了更靠前的位置。真正驱动业务的&#xff0c;不是某一帧漂亮的模型输出&#xff0c;而是“数据—理解—动作”的持续闭环。无论是品牌内容策…

【Linux】make/Makefile工具篇

目录一、自动化构建二、make/Makefile2.1 见识一个简单的make/Makefile2.2 Makefile的基本语法2.3 Makefile的语法细节个人主页<—请点击 Linux专栏<—请点击 一、自动化构建 自动化构建是指通过构建工具&#xff08;如make&#xff09;解析构建脚本&#xff08;如Make…

如何在企业微信上以 HTTPS 方式访问内网 OA/ERP 等系统?

企业微信可以将 ZeroNews 平台上添加的内网应用集成到企业微信的工作台。这样&#xff0c;用户即使在外部网络环境中&#xff0c;也可以通过企业微信访问内网的 OA、ERP 等应用。以下是企业在 Linux 服务器上部署 OA 系统&#xff0c;并通过 ZeroNews 通过互联网访问 OA 系统的…

Windows 11 安装使用 nvm,Node.js、npm多版本管理、切换

Windows 11 安装使用 nvm&#xff0c;Node.js、npm多版本管理、切换 文章目录Windows 11 安装使用 nvm&#xff0c;Node.js、npm多版本管理、切换1. nvm 简介2. 安装、配置 nvm2.1. 卸载现有 Node.js&#xff08;非常重要&#xff01;&#xff09;2.2. 下载 nvm-windows 安装包…

在LazyVim中配置Rust开发环境

要在LazyVim中配置Rust开发环境&#xff0c;包括代码补全、格式化、调试等功能&#xff0c;可以按照以下步骤进行配置&#xff1a; 1. 确保基础环境 首先确保你已经安装了&#xff1a; Rust工具链 (rustup, rustc, cargo)LazyVim已正确安装 # 安装Rust工具链 curl --proto http…

LeetCode热题100--114. 二叉树展开为链表--中等

1. 题目 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为null 。展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 …

REST API 设计最佳实践指南 - 如何用 JavaScript、Node.js 和 Express.js 构建 REST API

过去几年里&#xff0c;我创建并使用过很多 API。在此过程中&#xff0c;我遇到过各种好的和坏的实践&#xff0c;也在开发和调用 API 时碰到过不少棘手的问题&#xff0c;但也有很多顺利的时刻。 网上有很多介绍最佳实践的文章&#xff0c;但在我看来&#xff0c;其中不少都缺…

MyCat

文章目录18.1 MySQL 读写分离概述18.1.1 工作原理18.1.2 为什么要读写分离18.1.3 实现方式18.2 什么是 MyCat18.3 MyCat 安装与配置1. 下载与解压2. 创建用户并修改权限3. 目录说明4. Java 环境要求18.4 MyCat 启动与配置1. 配置环境变量2. 配置 hosts&#xff08;多节点集群&a…

使用 Spring Boot 搭建和部署 Kafka 消息队列系统

使用 Spring Boot 搭建和部署 Kafka 消息队列系统 摘要 本文将引导您在 Kafka 上搭建一个消息队列系统&#xff0c;并整合到您的 Spring Boot 项目中。我们将逐步实现这一方案&#xff0c;探讨其中的关键原理&#xff0c;避开可能遇到的坑&#xff0c;并最终将其部署到 Kuberne…

daily notes[45]

文章目录basic knowledgereferencesbasic knowledge the variable in Rust is not changed. let x5; x6;Rust language promotes the concept that immutable variables are safer than variables in other programming language such as python and and are in favour of th…

技术奇点爆发周:2025 年 9 月科技突破全景扫描

技术奇点爆发周&#xff1a;2025 年 9 月科技突破全景扫描当中国 "祖冲之三号" 量子计算机在特定任务上超越经典超级计算机一千万亿倍的算力新闻&#xff0c;与 OpenAI 宣布 100 亿美元定制芯片量产协议的消息在同一周密集爆发时&#xff0c;我们真切感受到了技术革命…

分布式专题——10.3 ShardingSphere实现原理以及内核解析

1 ShardingSphere-JDBC 内核工作原理当往 ShardingSphere 提交一个逻辑SQL后&#xff0c;ShardingSphere 到底做了哪些事情呢&#xff1f;首先要从 ShardingSphere 官方提供的这张整体架构图说起&#xff1a;1.1 配置管控在 SQL 进入 ShardingSphere 内核处理&#xff08;如解析…

移动语义的里里外外:从 std::move 的幻象到性能的现实

我们都已经听过这样的建议&#xff1a;“使用 std::move 来避免昂贵的拷贝&#xff0c;提升性能。” 这没错&#xff0c;但如果你对它的理解仅止于此&#xff0c;那么你可能正在黑暗中挥舞着一把利剑&#xff0c;既可能披荆斩棘&#xff0c;也可能伤及自身。 移动语义是 C11 带…

selenium完整版一览

selenium 库驱动浏览器selenium库是一种用于Web应用程序测试的工具,它可以驱动浏览器执行特定操作,自动按照脚本代码做出单击、输入、打开、验证等操作,支持的浏览器包括IE、Firefox、Safari、Chrome、Opera等。而在办公领域中如果经常需要使用浏览器操作某些内容,就可以使用se…

[Linux]学习笔记系列 -- lib/kfifo.c 内核FIFO实现(Kernel FIFO Implementation) 高效的无锁字节流缓冲区

文章目录lib/kfifo.c 内核FIFO实现(Kernel FIFO Implementation) 高效的无锁字节流缓冲区历史与背景这项技术是为了解决什么特定问题而诞生的&#xff1f;它的发展经历了哪些重要的里程碑或版本迭代&#xff1f;目前该技术的社区活跃度和主流应用情况如何&#xff1f;核心原理与…

MFC_Install_Create

1. 安装MFC 编写MFC窗口应用程序需要用到Visual Studiohttps://visualstudio.microsoft.com/zh-hans/&#xff0c;然后安装&#xff0c;要选择使用C的桌面开发&#xff0c;再点击右边安装详细信息中的使用C的桌面开发&#xff0c;往下滑&#xff0c;有一个适用于最新的v143生成…

Langchain4j开发之AI Service

学习基于Langchain4j的大模型开发需要学习其中Ai Service的开发模式。里面对大模型做了一层封装&#xff0c;提供一些可以方便调用的api。其中有两种使用Ai Service的方式。一.编程式开发1.首先引入Langchain4的依赖。<dependency><groupId>dev.langchain4j</gr…

认识神经网络和深度学习

什么是神经网络&#xff1f;什么又是深度学习&#xff1f;二者有什么关系&#xff1f;……带着这些疑问&#xff0c;进入本文的学习。什么是神经网络神经网络&#xff08;Neural Network&#xff09;是一种模仿生物神经系统&#xff08;如大脑神经元连接方式&#xff09;设计的…