diff --git a/README.md b/README.md
index b611ec3ba..f903eb7c5 100644
--- a/README.md
+++ b/README.md
@@ -2,12 +2,14 @@
> 你好,我是小傅哥,[《重学Java设计模式》](https://item.jd.com/13218336.html) 图书作者,一线互联网 Java 工程师、架构师。[:pencil2: 虫洞栈,博主](https://bugstack.cn),[:memo: 关于我](https://bugstack.cn/md/other/guide-to-reading.html)
-🚜 **虫洞栈,与你:上最快的车、唠最狠的嗑,爬最高的坡、拿最贵的Offer!**
-
-- 👉 如果你不知道自己要从哪开始、要学什么、有什么结果,请看 [阅读指南](https://bugstack.cn/md/other/guide-to-reading.html) 这是一个码农研发人员提升自身技术栈广度和深度的经验之路,也是小傅哥的亲身学习经历汇总!
-- 👉 如果你是刚入行、在外包、跨语言学习、想跳槽大厂、缺少学习动力等,可以阅读小傅哥的成长故事,这个系列包括了我的个人在外包到大厂的成长、跳槽的过程、互联网的学习经历 Go -> [关于小傅哥](https://bugstack.cn/md/about/me/2020-08-25-13%E5%B9%B4%E6%AF%95%E4%B8%9A%EF%BC%8C%E7%94%A8%E4%B8%A4%E5%B9%B4%E6%97%B6%E9%97%B4%E4%BB%8E%E5%A4%96%E5%8C%85%E8%B5%B0%E8%BF%9B%E4%BA%92%E8%81%94%E7%BD%91%E5%A4%A7%E5%8E%82.html)
-- 👉 推荐 [在线阅读 bugstack.cn](https://bugstack.cn) (Github 访问速度比较慢可能会导致部分图片无法刷新出来)
-- 👉 **【源码下载】** ❤下载指引:小傅哥博客【设计模式、Spring、字节码、插件、中间件等】涉及到的全部源码地址:[Go -> 源码索引](https://github.com/fuzhengwei/CodeGuide#1-%E6%BA%90%E7%A0%81)
+- :dog: 13年毕业,大厂互联网T8架构师,全网40万粉编程知识博主。
+- :man_technologist: 成长:[关于我,从小白到架构师的成长经历](https://www.bilibili.com/video/BV1FF41137q5)
+- :bus: 源码:[`RoadMap 编程路书`](https://github.com/fuzhengwei/RoadMap) | [`Java 数据结构和算法`](https://github.com/fuzhengwei/java-algorithms) | [`IM 仿微信`](https://github.com/fuzhengwei/NaiveChat) | [`Java 面经手册`](https://github.com/fuzhengwei/interview) | [`IntelliJ IDEA 插件开发`](https://github.com/fuzhengwei/guide-idea-plugin) | [`Lottery 抽奖系统 - 基于领域驱动设计的四层架构实践`](https://github.com/fuzhengwei/Lottery) | [`API网关`](https://github.com/fuzhengwei/api-gateway) | [`手写MyBatis`](https://github.com/fuzhengwei/small-mybatis) | [`重学Java设计模式`](https://github.com/fuzhengwei/itstack-demo-design) | [`Netty 实战案例`](https://github.com/fuzhengwei/itstack-demo-netty) | [`字节码编程`](https://github.com/fuzhengwei/itstack-demo-bytecode) | [`ChatGPT AI 问答助手`](https://github.com/fuzhengwei/chatbot-api) | [更多搜索...](https://github.com/fuzhengwei?tab=repositories)
+- :seedling: 干货:[公众号『 bugstack虫洞栈 』](https://bugstack.cn/images/personal/qrcode.png)
+- :pencil: 博客:[bugstack.cn](https://bugstack.cn/) - 足够硬核,内容老狠了!
+- :tv: 视频:[B站 小傅哥の码场](https://space.bilibili.com/15637440)
+- :love_letter: 微信:[fustack](https://bugstack.cn/images/personal/fustack.png) - 备注来意
+- :feet: 我的编程知识星球:[实战生产级项目、手写框架级源码,可以向我 1对1 提问,解答技术/职场/规划问题](https://bugstack.cn/md/zsxq/introduce.html)
星球
知识星球:码农会锁
+
PS:添加时请备注读者加群,谢谢!
- 赞赏我
-
-
+ 做项目
+
+ 八股文
+
+
+
+
+
+
+
+
+
+
diff --git a/docs/README.md b/docs/README.md
index 926c846a0..a1e629d10 100755
--- a/docs/README.md
+++ b/docs/README.md
@@ -5,12 +5,24 @@ actionLinks:
- link: /md/other/guide-to-reading.md
text: 开始阅读 →
class: primary
-- link: https://t.zsxq.com/09hMHNMEh
+#- link: https://wx.zsxq.com/group/48411118851818
+# text: 知识星球
+# class: secondary
+- link: /md/zsxq/introduce.html
text: 知识星球
class: secondary
-- link: /md/other/road-map.md
- text: 路书 👣
+- link: /md/road-map/road-map.md
+ text: 编程路书 👣
class: secondary
+- link: https://gaga.plus
+ text: 项目(+菜鸟教程) 💐
+ class: secondary
+#- link: https://618.gaga.plus
+# text: 9.9元/月(云服务器) ☁️
+# class: secondary
+- link: https://walicode.xiaofuge.cn/
+ text: WaLiCode 🤖
+ class: secondary
features:
- title: 沉淀
details: 承遇朝霞,年少正恰。整装戎马,刻印风华。
@@ -18,39 +30,68 @@ features:
details: 八表流云澄夜色,九霄华月动春城。
- title: 成长
details: 心怀天下,声色犬码。生有热烈,藏与俗常。
-footer: 京ICP备19031103号-1 | 
京公网安备 11030102010881号
| GPL Licensed | Copyright © 2019 小傅哥,All rights reserved. +footer: 京ICP备19031103号 |
京公网安备 11030102010881号
| GPL Licensed | Copyright © 2019 小傅哥,All rights reserved. --- --- -## 必看专栏 -- [重学Java设计模式](https://bugstack.cn/md/develop/design-pattern/2020-05-20-%E9%87%8D%E5%AD%A6Java%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E3%80%8A%E5%AE%9E%E6%88%98%E5%B7%A5%E5%8E%82%E6%96%B9%E6%B3%95%E6%A8%A1%E5%BC%8F%E3%80%8B.html):从互联网真实业务中抽离出,交易、营销、秒杀、中间件、源码等22个真实场景,学习设计模式的实践技巧和落地方案。 -- [面经手册](https://bugstack.cn/md/java/interview/2020-07-28-%E9%9D%A2%E7%BB%8F%E6%89%8B%E5%86%8C%20%C2%B7%20%E5%BC%80%E7%AF%87%E3%80%8A%E9%9D%A2%E8%AF%95%E5%AE%98%E9%83%BD%E9%97%AE%E6%88%91%E5%95%A5%E3%80%8B.html):此专栏并不是单纯的面试题,也不是内卷八股文。而是从一个单纯的和程序员有关的数学知识点开始,深入讲解 Java 的核心技术。 -- [手写 Spring](https://bugstack.cn/md/spring/develop-spring/2021-05-16-%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E5%BC%80%E7%AF%87%E4%BB%8B%E7%BB%8D%EF%BC%8C%E6%89%8B%E5%86%99Spring%E8%83%BD%E7%BB%99%E4%BD%A0%E5%B8%A6%E6%9D%A5%E4%BB%80%E4%B9%88%EF%BC%9F.html):渐进式手写 Spring 源码,摘取整体框架中的核心逻辑,简化代码实现过程,保留核心功能,例如:IOC、AOP、Bean生命周期、上下文、作用域、资源处理等内容实现。 -- [手写 Mybatis](https://bugstack.cn/md/spring/develop-mybatis/2022-03-20-%E7%AC%AC1%E7%AB%A0%EF%BC%9A%E5%BC%80%E7%AF%87%E4%BB%8B%E7%BB%8D%EF%BC%8C%E6%89%8B%E5%86%99Mybatis%E8%83%BD%E7%BB%99%E4%BD%A0%E5%B8%A6%E6%9D%A5%E4%BB%80%E4%B9%88%EF%BC%9F.html):在手写的过程中学习 Mybatis 从解析、绑定、反射、缓存,到会话和事务操作,以及如何与 Spring 进行关联注册 Bean 对象,完成整合部分功能逻辑。 - -## 大厂项目 - -- [API网关](https://bugstack.cn/md/assembly/api-gateway/2022-08-12-%E5%BC%80%E7%AF%87%EF%BC%9A%E5%A6%82%E6%9E%9C%E8%AE%A9%E6%88%91%E8%AE%BE%E8%AE%A1%E4%B8%80%E5%A5%97%EF%BC%8CTPS%E7%99%BE%E4%B8%87%E7%BA%A7API%E7%BD%91%E5%85%B3.html):是互联网大厂必备的系统,承接着:打车、外卖、购物、支付等多场景的使用,更是大促期间千万级访问量的核心服务。 -- [Lottery 抽奖系统](https://bugstack.cn/md/project/lottery/introduce/Lottery%E6%8A%BD%E5%A5%96%E7%B3%BB%E7%BB%9F.html):以贯穿整个互联网所需的分布式技术栈,基于DDD领域驱动设计的四层架构与设计模式逻辑的实践项目,非常适合手里没有大项目的读者进行学习。 -- [SpringBoot 中间件设计和开发](https://bugstack.cn/md/project/springboot-middleware/2021-03-31-%E3%80%8ASpringBoot%20%E4%B8%AD%E9%97%B4%E4%BB%B6%E8%AE%BE%E8%AE%A1%E5%92%8C%E5%BC%80%E5%8F%91%E3%80%8B%E4%B8%93%E6%A0%8F%E5%B0%8F%E5%86%8C%E4%B8%8A%E7%BA%BF%E5%95%A6%EF%BC%81.html):结合互联网所需解决的方案场景,开发 SpringBoot Starter,涵盖:技术框架、数据服务、数据组件、分布式技术、服务治理、字节码、IDEA插件七个方面,16种中间件的设计和开发。 -- [IM Netty](https://bugstack.cn/md/project/im/2020-03-04-%E3%80%8ANetty+JavaFx%E5%AE%9E%E6%88%98%EF%BC%9A%E4%BB%BF%E6%A1%8C%E9%9D%A2%E7%89%88%E5%BE%AE%E4%BF%A1%E8%81%8A%E5%A4%A9%E3%80%8B.html):`JavaFx`、`Netty4.x`、`SpringBoot`、`Mysql` 等技术栈和偏向于DDD领域驱动设计方式,搭建的仿桌面版微信聊天工程实现通信核心功能。 - -## 面试必备 +### 我是小傅哥 + +- :dog: 13年毕业,互联网大厂架构师,全网40万+粉编程知识博主。 +- :man_technologist: 成长:[关于我,从小白到架构师的成长经历](https://www.bilibili.com/video/BV1FF41137q5) +- :bus: 作品:[`CodeGuide | 程序员编码指南`](https://github.com/fuzhengwei/CodeGuide) | [`RoadMap 编程路书`](https://github.com/fuzhengwei/RoadMap) | [`Java 数据结构和算法`](https://github.com/fuzhengwei/java-algorithms) | [`IM 仿微信`](https://github.com/fuzhengwei/NaiveChat) | [`Java 面经手册`](https://github.com/fuzhengwei/interview) | [`IntelliJ IDEA 插件开发`](https://github.com/fuzhengwei/guide-idea-plugin) | [`Lottery 抽奖系统 - 基于领域驱动设计的四层架构实践`](https://github.com/fuzhengwei/Lottery) | [`API网关`](https://github.com/fuzhengwei/api-gateway) | [`手写MyBatis`](https://github.com/fuzhengwei/small-mybatis) | [`重学Java设计模式`](https://github.com/fuzhengwei/itstack-demo-design) | [`Netty 实战案例`](https://github.com/fuzhengwei/itstack-demo-netty) | [`字节码编程`](https://github.com/fuzhengwei/itstack-demo-bytecode) | [`ChatGPT AI 问答助手`](https://github.com/fuzhengwei/chatbot-api) | [`chatglm-sdk-java`](https://github.com/fuzhengwei/chatglm-sdk-java) | [`docker-image-pusher`](https://github.com/fuzhengwei/docker-image-pusher) | [`💱IDEA Plugin vo2dto —— 对象转换插件(15.8k+安装)`](https://bugstack.cn/md/product/idea-plugin/vo2dto.html) | [更多搜索...](https://github.com/fuzhengwei?tab=repositories) +- :seedling: 干货:[公众号『 bugstack虫洞栈 』](https://bugstack.cn/images/personal/qrcode.png) +- :pencil: 博客:[bugstack.cn](https://bugstack.cn/) - 足够硬核,内容老狠了! +- :tv: 视频:[B站 小傅哥の码场](https://space.bilibili.com/15637440) +- :love_letter: 微信:[fustack](https://bugstack.cn/images/personal/fustack.png) - 备注来意 +- :feet: 我的编程知识星球「码农会锁」:[实战生产级项目、手写框架级源码,可以向我 1对1 提问,解答技术/职场/规划问题](https://bugstack.cn/md/zsxq/introduce.html) + +### 开发的项目 + +- 创新项目「AI」(6) + - [AI MCP Gateway 网关服务系统](https://bugstack.cn/md/project/ai-mcp-gateway/ai-mcp-gateway.html) + - [AI Agent 脚手架 + 场景应用(draw.io、手机龙虾)](https://bugstack.cn/md/project/ai-agent-scaffold/ai-agent-scaffold.html) - 综合 Spring AI、LangChain4j + Google ADK(a2a、mcp、skills),打造全新智能体架构方案。 + - [AI Agent 拖拉拽 + 动态配置(RAG、MCP、Prompt)](https://bugstack.cn/md/project/ai-knowledge/ai-knowledge.html) + - [OpenAI 代码自动评审组件](https://bugstack.cn/md/zsxq/project/openai-code-review.html) + - [OpenAI 大模型微服务应用体系构建 - API-SDK、鉴权、公众号、微信支付](https://bugstack.cn/md/zsxq/project/chatgpt.html) + - [ChatGPT AI 问答助手 - 小型,对接知识星球](https://bugstack.cn/md/zsxq/project/chatbot-api.html) + +- 业务项目(5) + - [拼团交易平台系统](https://bugstack.cn/md/project/group-buy-market/group-buy-market.html) + - [小型支付电商系统 - 一套项目2套架构开发(MVC+DDD)](https://bugstack.cn/md/project/s-pay-mall/s-pay-mall.html) + - [大营销平台系统 - 前后端 + Dev-Ops 的全栈式综合编程实战DDD项目!](https://bugstack.cn/md/project/big-market/big-market.html) + - [Lottery 分布式抽奖系统 - 基于领域驱动设计的四层架构实践](https://bugstack.cn/md/zsxq/project/lottery.html) + - [Netty+JavaFx实战:仿桌面版微信聊天](https://bugstack.cn/md/zsxq/project/im.html) + +- 组件项目(8) + - [本地任务消息组件](https://bugstack.cn/md/project/local-task-message/local-task-message.html) + - [通用技术组件 - 🔧扳手工程](https://bugstack.cn/md/zsxq/project/xfg-wrench.html) + - [透视业务流程 - 监控系统](https://bugstack.cn/md/zsxq/project/business-behavior-monitor.html) + - [动态线程池组件](https://bugstack.cn/md/zsxq/project/dynamic-thread-pool.html) + - [蓝兔支付SDK设计和开发](https://bugstack.cn/md/zsxq/project/ltzf-sdk-java.html) + - [API网关:中间件设计和实践](https://bugstack.cn/md/zsxq/project/api-gateway.html) + - [SpringBoot Starter 中间件设计和开发](https://bugstack.cn/md/zsxq/project/springboot-starter.html) + - [IDEA Plugin 开发手册](https://bugstack.cn/md/zsxq/booklet/idea-plugin.html) + +### 我的出版物 + +- 2021年出版[《重学Java设计模式》](https://u.jd.com/4I2CXeO) —— 涵盖一线互联网众多真实案例;交易、营销、秒杀、规则引擎等场景 +- 2023年出版[《手写MyBatis:渐进式源码实践》](https://u.jd.com/wssnicY) —— 从零手写源码级复杂项目,提升架构思维与设计逻辑。锻炼编码能力。 + +### 我的电子书 + +- [小傅哥的《Java 面经手册》](https://download.csdn.net/download/Yao__Shun__Yu/14932325) —— 全书共计 5 章 29 节,417页11.5万字,耗时 4 个月完成。涵盖数据结构、算法逻辑、并发编程、JVM以及简历和互联网大厂面试等内容。但此书并不是单纯的面试题,也不是内卷八股文。而是从一个单纯的和程序员有关的数学知识点开始,深入讲解 Java 的核心技术。并且每一章节都配有实践验证的源码,可以对照着一起撸才更有感觉! +- [小傅哥的《倚天村·图解数据结构》](https://drive.weixin.qq.com/s?k=ACMA4AfQABUm2EZtFm#/) —— 全书共计4章14节,215页4.2万字100+张图片,耗时3个月完成。涵盖4类14种数据结构,包括:链表、数组、队列、堆栈、哈希表、堆、字典树、二分搜索树、平衡二叉树、2-3树、红黑树、并查集、图、布隆过滤器。 +- [小傅哥的《字节码编程》](https://drive.weixin.qq.com/s?k=ACMA4AfQABUJWQ0P92#/) —— 全书共计107页,11万7千字,20个章节涵盖三个字节码框架(ASM、Javassist、Byte-budy)和JavaAgent使用并附带整套案例源码! +- [小傅哥的《IDEA Plugin 开发手册》](https://download.csdn.net/download/Yao__Shun__Yu/77484299) —— 此开发手册,分为4章12节循序渐进的通过实践案例开发的方式,串联 IDEA Plugin 开发的各项常用技术点,为读者讲解如何开发一个 IDEA 插件。 + +### 面试必备 - [100道八股题考试测验](https://bugstack.cn/md/zsxq/material/exam.html) —— 考题范围:数据结构、算法、源码、设计模式、系统架构、中间件、网络通信、实战项目、扩展问题 - [面试题汇总](https://bugstack.cn/md/zsxq/material/interview.html):汇总关于面试问题、简历编写、上岸总结、招聘信息等内容 -- [简历模板](http://pan.bugstack.cn/?dl=0599585a4e691adc7137ea9cb25c087f):你可以在学习掌握博客中的技术以及大厂项目,按照简历模板的格式,包装和调整成你需要的简历内容,提高面试通过率。 - -## PDF - -- [《Java 面经手册》](https://download.csdn.net/download/Yao__Shun__Yu/14932325) -- [《重学Java设计模式》](https://download.csdn.net/download/Yao__Shun__Yu/19265731) -- [《手撸 Spring》](https://download.csdn.net/download/Yao__Shun__Yu/21009038) -- [《字节码编程》](https://download.csdn.net/download/Yao__Shun__Yu/12505051) -- [《IDEA Plugin 开发手册》](https://download.csdn.net/download/Yao__Shun__Yu/77484299) +- [简历模板](https://t.zsxq.com/19hxv0cgY):你可以在学习掌握博客中的技术以及大厂项目,按照简历模板的格式,包装和调整成你需要的简历内容,提高面试通过率。 -## 公众号 +### 公众号 - 关注获得新通知 最新文章会首发公众号,强烈推荐读者伙伴关注一波!另外,在公众号:bugstack虫洞栈 回复 `1024` 可以下载更多资源内容。 @@ -60,13 +101,13 @@ footer: 京ICP备19031103号-
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+If you see this page, the nginx web server is successfully installed and +working. Further configuration is required.
+ +For online documentation and support please refer to
+nginx.org.
+Commercial support is available at
+nginx.com.
Thank you for using nginx.
+ + +root@ed8dc07f2ae6:/usr/share/nginx/html# +root@ed8dc07f2ae6:/usr/share/nginx/html# exit +exit +``` + +- 配置:`/etc/nginx` +- 网页:`/usr/share/nginx/html` + +### 2. 拷贝 Nginx + +创建目录 + +```shell +[root@vultr ~]# mkdir -p /data/nginx/conf +[root@vultr ~]# mkdir -p /data/nginx/html +``` + +拷贝文件 + +```shell +[root@vultr ~]# docker container cp Nginx:/etc/nginx/nginx.conf /data/nginx/conf +[root@vultr ~]# docker container cp Nginx:/usr/share/nginx/html/index.html /data/nginx/html +``` + +查看信息 + +```shell +[root@vultr ~]# ls /data/nginx/conf/ +nginx.conf +[root@vultr ~]# ls /data/nginx/html/ +index.html +``` + +### 3. 部署 Nginx + +```shell +docker run \ +--restart always \ +--name Nginx \ +-d \ +-v /data/nginx/html:/usr/share/nginx/html \ +-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ +-p 80:80 \ +nginx +``` + +- 重启:`sudo service nginx restart` + + +## 三、证书安装 + +### 4.1 创建证书 + +SSL 免费的证书,在各个云服务厂商都有提供,可以自己申请。这里以阿里云举例; + +阿里云免费域名证书:[https://yundun.console.aliyun.com/?p=cas#/certExtend/free/cn-hangzhou](https://yundun.console.aliyun.com/?p=cas#/certExtend/free/cn-hangzhou) + + + +- 步骤1;通过免费的方式创建 SSL,之后通过引导的 DNS 方式进行验证。其实就是在你的域名里配置下验证信息。 +- 步骤2;申请后,3-5分钟左右 DNS 会验证通过,这个时候你直接下载 Nginx 的 SSL 包即可。里面有2个文件【x.key、x.pem】 + +### 4.2 准备内容 + +#### 4.2.1 单个证书 + +- 把下载好的 SSL 文件解压到桌面,你会得到一个文件夹,里面含有 x.key、x.pem 两个文件。 +- 创建一个 default.conf 这个文件配置的 SSL 信息 + +```conf +server { + listen 80; + listen [::]:80; + server_name openai.xfg.im; + + rewrite ^(.*) https://$server_name$1 permanent; + +} + +server { + listen 443 ssl; + server_name openai.xfg.im; + + ssl_certificate /etc/nginx/ssl/9740289_openai.xfg.im.pem; + ssl_certificate_key /etc/nginx/ssl/9740289_openai.xfg.im.key; + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} +``` + +- 你可以复制这份文件,在自己本地创建。注意修改域名和SSL文件路径。 + +#### 4.2.2 多个证书 + +如果你需要给1个以上的域名配置SSL,那么可以配置多组 server 如下; + +```shell script +server { + listen 80; + listen [::]:80; + server_name itedus.cn; + + rewrite ^(.*) https://$server_name$1 permanent; + +} + +server { + listen 443 ssl; + server_name itedus.cn; + + ssl_certificate /etc/nginx/ssl/9750021_itedus.cn.pem; + ssl_certificate_key /etc/nginx/ssl/9750021_itedus.cn.key; + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + root /usr/share/nginx/html; + index index.html index.htm; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} + +server { + listen 80; + listen [::]:80; + server_name chatgpt.itedus.cn; + + rewrite ^(.*) https://$server_name$1 permanent; + +} + +server { + listen 443 ssl; + server_name chatgpt.itedus.cn; + + ssl_certificate /etc/nginx/ssl/9749920_chatgpt.itedus.cn.pem; + ssl_certificate_key /etc/nginx/ssl/9749920_chatgpt.itedus.cn.key; + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + proxy_pass http://180.76.119.100:3002; + proxy_http_version 1.1; + chunked_transfer_encoding off; + proxy_buffering off; + proxy_cache off; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} +``` + +### 4.3 上传文件 + +你可以通过 `SFTP` 工具或者 `mkdir -p`、`touch` 命令创建一些服务器本地用于映射的文件夹和文件,这里小傅哥使用了 [Termius](https://www.termius.com/) 工具进行创建操作。 + + + +- 文件1;html +- 文件2;ssl - 把本地的 ssh 文件上传进来 +- 文件3;conf - 在 conf 下有个 `conf.d` 的文件夹,把 `default.conf` 上传进去。而 nginx.conf 传到 conf 中。 +- 文件4;logs - 创建日志 + +### 4.4 启动服务 + +在 nginx.conf 的配置文件有这么一句;`include /etc/nginx/conf.d/*.conf;` 那么只要是 conf.d 文件夹下的文件都会被加载。所以直接在 conf.d/default.conf 配置 SSL 就会被加载。接下来重新安装 Nginx 即可。`安装前记得删除 Nginx 你可以用命令【docker stop Nginx、docker rm Nginx】或者在 Portainer 中操作即可` + +```shell +docker run \ +--name Nginx \ +-p 443:443 -p 80:80 \ +-v /data/nginx/logs:/var/log/nginx \ +-v /data/nginx/html:/usr/share/nginx/html \ +-v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \ +-v /data/nginx/conf/conf.d:/etc/nginx/conf.d \ +-v /data/nginx/ssl:/etc/nginx/ssl/ \ +--privileged=true -d --restart=always nginx +``` + + + +## 五、重定向 + +### 1. default.conf + +在 default.conf 中添加如下配置后重启 Nginx 即可; + +```shell +location /d5fe/ { + rewrite ^/d5fe/(.*)$ /$1 break; + proxy_pass https://api.x.com; + proxy_ssl_server_name on; + proxy_set_header Host api.x.com; + proxy_set_header Connection ''; + proxy_http_version 1.1; + chunked_transfer_encoding off; + proxy_buffering off; + proxy_cache off; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; +} +``` + +### 2. auth_request + +```shell +server { + listen 80; + listen [::]:80; + server_name api.xfg.im; + + rewrite ^(.*) https://$server_name$1 permanent; + +} + +server { + listen 443 ssl; + server_name api.xfg.im; + + ssl_certificate /etc/nginx/ssl/9877497_api.xfg.im.pem; + ssl_certificate_key /etc/nginx/ssl/9877497_api.xfg.im.key; + + ssl_session_cache shared:SSL:1m; + ssl_session_timeout 5m; + + ssl_ciphers HIGH:!aNULL:!MD5; + ssl_prefer_server_ciphers on; + + location / { + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Host $http_host; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + root /usr/share/nginx/html; + index index.html index.htm; + } + + location /abc/ { + auth_request /auth; + rewrite ^/abc/(.*)$ /$1 break; + proxy_pass https://api.x.com; + proxy_ssl_server_name on; + proxy_set_header Host api.x.com; + proxy_set_header Connection ''; + proxy_http_version 1.1; + chunked_transfer_encoding off; + proxy_buffering off; + proxy_cache off; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location = /auth { + # 发送子请求到HTTP服务,验证客户端的凭据,返回响应码 + internal; + # 设置参数 + set $query ''; + if ($request_uri ~* "[^\?]+\?(.*)$") { + set $query $1; + } + # 验证成功,返回200 OK + proxy_pass http://207.246.123.*:8090/auth/token?$query; + # 发送原始请求 + proxy_pass_request_body off; + # 清空 Content-Type + proxy_set_header Content-Type ""; + } + + error_page 500 502 503 504 /50x.html; + location = /50x.html { + root /usr/share/nginx/html; + } +} +``` + +--- + +**其他资料**:[Nginx 简明教程 @dunwu](https://dunwu.github.io/nginx-tutorial/#/nginx-quickstart) - 非常适合学习Nginx配置。 + diff --git a/docs/md/devops/2023-04-18-portainer.md b/docs/md/devops/2023-04-18-portainer.md new file mode 100644 index 000000000..198531a1c --- /dev/null +++ b/docs/md/devops/2023-04-18-portainer.md @@ -0,0 +1,71 @@ +--- +title: Portainer +lock: need +--- + +# Portainer 环境配置 + +作者:小傅哥 +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
diff --git a/docs/md/product/book/mybatis.md b/docs/md/product/book/mybatis.md
new file mode 100644
index 000000000..56f02dff7
--- /dev/null
+++ b/docs/md/product/book/mybatis.md
@@ -0,0 +1,75 @@
+---
+title: 2023年:《手写MyBatis:渐进式源码实践》
+lock: no
+---
+
+# 《手写MyBatis:渐进式源码实践》—— 小傅哥新书上市!教你把MyBatis当成项目从零开发。
+
+作者:小傅哥
+
+
+












+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+)。 +- **价值**:显著提升了 LLM 在算术、常识推理和符号推理任务上的准确率,是 Agent 实现复杂规划的基础。 + +#### 18. 什么是 MCP (Model Context Protocol)?为什么它对 Agent 生态很重要? +**参考答案:** +- **定义**:MCP 是一个开放标准协议,用于标准化 AI 模型与外部数据/工具的连接方式。它定义了统一的接口规范,使得工具(Tools)、资源(Resources)和提示(Prompts)可以跨平台、跨模型复用。 +- **核心价值**: + - **去碎片化**:解决了每个 AI 应用都需要为 Google Drive、Slack、GitHub 等写独立连接器(Connector)的问题。MCP 提供了统一的“插座”。 + - **即插即用**:开发者只需编写一次 MCP Server,任何支持 MCP 的 Client(如 Claude Desktop、Cursor、IDEA)都可以直接使用该工具。 + - **安全性**:通过标准化的鉴权机制(如 SSE + Token)管理数据访问权限。 diff --git a/docs/md/project/ai-agent-scaffold/part-0/mobile-openclaw.md b/docs/md/project/ai-agent-scaffold/part-0/mobile-openclaw.md new file mode 100644 index 000000000..478d0fc9b --- /dev/null +++ b/docs/md/project/ai-agent-scaffold/part-0/mobile-openclaw.md @@ -0,0 +1,62 @@ +--- +title: 手机小龙虾,这次我比小米下手早! +lock: no +--- + +# 手机小龙虾,这次我比小米下手早! + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +🦞 OpenClaw 太火了,火到什么程度,给 Mac Mini 干断货了,各行各业都找程序员👨🏻💻安装小龙虾,上门部署 OpenClaw 也成了生意!3月6日,深圳腾讯大厦,公益装机,也排起了长长的队伍。很多父母带着电脑过来,给自己娃的电脑装上小龙虾。 + +++ +但当所有人都盯着 OpenClaw 小龙虾时,小米发布了 miclaw 手机版龙虾🦞,对标豆包手机、AutoGLM-Phone,首批支持小米17系列机型。 + +但,嘿嘿,不谋而合。我在看到和体验 OpenClaw 后,也想着,我的手机、平板,也可以来一个 Mobile-OpenClaw 呀!让这些电子设备,帮我完成一些工作不是美滋滋!`下文我会演示通过小龙虾手机的案例视频。` + ++
++ +所以,在小米 miclaw 发布之前,我也已经开始设计实现手机版龙虾。并且还申请了一个手机版龙虾的域名,哈哈哈 死鬼,早有预谋哇! + ++
++ +那手机版龙虾怎么做?🤔 它可以,通过 AI Agent 智能体,分析用户行为。之后下达一些列指令到应用设备的 Socket 网关端点上,完成功能指令动作。`小米 miclaw` 应该也是类似的,以后也可以体验下,但他可以原生态直接从系统上支持,控制整个米家的应用生态 👍🏻。 + +闲言少叙,接下来我们演示下运行效果。我的小米 Pad 7 Pro 也到位了。新的设备测试起来速度更快。😂 最近是一顿花钱呀,Mac Mini(电脑龙虾)、Pad 7 Pro(手机龙虾)、群辉 Nas(数据存储 + qwen3.5:9b)!**这个世界,终究是程序员的!** + +## 一、演示场景 + +小傅哥这里做了2个演示场景,一个是在小红书🍠发帖,一个是汽水音乐🎵自动看广告开会员。 + +### 1. 小红书 - 自动发帖 + +```java +打开小红书,点击下面的红色按钮,发送一个帖子。先写想法为,你好,世界,我是手机版小龙虾 🦞 想法编写后,点击【下一步】继续。在发帖页面,输入标题为;你好,世界,我是手机版小龙虾 🦞 内容为;我是 @小傅哥 正在测试开发的 MobileOpenClaw 欢迎关注我的动向!编写后,点击右上角【发布】。 +``` + +-- + +### 2. 汽水音乐 - 看广告 + +```java +打开汽水音乐,看广告获得VIP时长,操作流程; + +1. 点击右上角【免】按钮。 +2. 点击【免】后会进入后,右上角有倒计时播放广告,播放完成后显示为【领取成功】。这个时候点击【领取成功】,会有一个弹窗,点击弹窗的【领取奖励】,不要点x关闭。 +3. 完成领取后,继续看广告,重复步骤2,一直领取奖励,直至没有。 +``` + + + diff --git "a/docs/md/project/ai-agent-scaffold/part-1/\347\254\2541-1\350\212\202\357\274\232\350\204\232\346\211\213\346\236\266\351\234\200\346\261\202\345\210\206\346\236\220.md" "b/docs/md/project/ai-agent-scaffold/part-1/\347\254\2541-1\350\212\202\357\274\232\350\204\232\346\211\213\346\236\266\351\234\200\346\261\202\345\210\206\346\236\220.md" new file mode 100644 index 000000000..cf8a978c4 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-1/\347\254\2541-1\350\212\202\357\274\232\350\204\232\346\211\213\346\236\266\351\234\200\346\261\202\345\210\206\346\236\220.md" @@ -0,0 +1,46 @@ +--- +title: 【更】第1-1节:脚手架需求分析 +pay: https://t.zsxq.com/l3GtR +--- + +# 《AI Agent 脚手架》第1-1节:脚手架需求分析 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/uNA2K](https://t.zsxq.com/uNA2K) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +今天是我们 **《AI Agent 脚手架》** 项目学习的第1节课程,小傅哥会带着大家,以互联网公司正规的承接产品需求到开发部署上线的流程,带着大家以第一主人公视角的方式进行学习。这样既可以保证你学习到项目内容,也能了解到公司里正规的开发模式,以后进入到公司也可以很好的融入团队,承接项目需求。加油💪🏻!让我们开启新项目之旅! + +## 一、本章诉求 + +站在技术视角,分析 AI Agent 脚手架项目,这样一个产品功能需求的背景、诉求和目的。 + +首先,脚手架你可以理解为是一个工程模板框架,通过简单的配置即可完成初始化项目工程(IntelliJ IDEA)的搭建,并在工程内提供最为常用的基础服务,免去大家每次做新的项目,都要手动搭建工程的过程。 + +**那么,为什么叫技术视角?** + +在互联网公司中,项目通常分为两类:一类是源自产品业务的需求,另一类则是由研发驱动的纯技术项目(或由基架部门专门负责的技术产品)。后者的初衷在于解决研发在响应业务需求时,频繁且重复的工作负担,同时推动需求制定的统一标准化。 + +随着2025年起互联网公司纷纷通过AI赋能业务,推动各场景的效率提升,构建多样化的AI Agent智能体业务应用将成为常态。面对大量复杂的工程搭建需求,亟需一套统一的标准化框架,能够快速创建项目,显著降低用户的使用门槛和开发成本。 + +## 二、项目背景 + +为互联网企业构建业务场景下的 AI Agent 智能体,提供统一标准和便捷易用的脚手架。 + +**为什么要为创建脚手架?** + +回归本质,当前大规模语言模型(LLM)的使用,基本上是通过 HTTP 响应式接口进行对接。随着应用需求的增长,为了简化各自封装 AI HTTP 接口的复杂度,逐渐出现了以 AI SDK 方式进行对接的设计和实现,提升了开发效率和集成体验。 + +随后,AI 服务不仅仅局限于简单的接口调用,还引入了诸如 RAG(检索增强生成)知识库、Tool 工具(如 Function、MCP)等能力。同时,不同厂商的大模型(OpenAI、Google、智谱、阿里千问等)在接口和功能上存在差异,推动了类似 Spring AI 这类产品的诞生,帮助开发者更加便捷地统一调用和管理多样化的 AI 服务。 + +进入下一阶段,随着智能体(AI Agent)概念的兴起,开发者开始设计支持顺序执行、循环执行(分析与决策)、并行执行等复杂流程的智能体方案。Google 发布的 ADK(Agent Development Kit)智能体框架,标志着这一阶段的技术成熟和标准化趋势。 + +++ +综上所述,构建一个完整的智能体,需要综合运用上述所有技术和能力。为了统一标准、提升易用性,就很需要搭建一套统一的 AI Agent 智能体开发脚手架,剔除重复且复杂的工作环节,帮助业务快速融合并高效开展智能体开发。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-1/\347\254\2541-2\350\212\202\357\274\232\347\263\273\347\273\237\346\236\266\346\236\204\350\256\276\350\256\241.md" "b/docs/md/project/ai-agent-scaffold/part-1/\347\254\2541-2\350\212\202\357\274\232\347\263\273\347\273\237\346\236\266\346\236\204\350\256\276\350\256\241.md" new file mode 100644 index 000000000..8eab70477 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-1/\347\254\2541-2\350\212\202\357\274\232\347\263\273\347\273\237\346\236\266\346\236\204\350\256\276\350\256\241.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第1-2节:系统架构设计 +pay: https://t.zsxq.com/sSD6u +--- + +# 《AI Agent 脚手架》第1-2节:系统架构设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/v8C8a](https://t.zsxq.com/v8C8a) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +对 AI Agent 智能体脚手架,进行应用技术选型和工程框架设计。 + +这个过程就等同于大家做一个新项目时,分析项目实现过程,以及过程中所需的技术能力,并对未知的技术点进行案例验证。待全部梳理完成后,则进行详细的方案设计。 + +>随着大家进入公司以后,在你承接一个新的项目/需求时,会大量的做这个事情,你会遇到很多没用过却需要使用的技术或者方案。当然,也会随着你的积累,你做这个事情会越来越熟练,越来越高效。而与之相反的,如果你之前的学习总是对照视频cv代码,最好一次就成功运行,害怕出错,不敢排查,没有一个思考和验证的过程,那么其实是一点经验也没积累。所以,要正视自己的学习方法。 + +## 二、架构设计 + +如图,整体简要架构设计; + +++ +做这个事情,我们要思考,需要哪些东西来完成这样项目的开发。如下; \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-10\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-RunnerNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-10\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-RunnerNode.md" new file mode 100644 index 000000000..331e39a5c --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-10\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-RunnerNode.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第2-10节:装配域节点-RunnerNode +pay: https://t.zsxq.com/pEBw8 +--- + +# 《AI Agent 脚手架》第2-10节:装配域节点-RunnerNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/tMfj3](https://t.zsxq.com/tMfj3) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +把构建的智能体,填充到 InMemoryRunner 中,以及注册到 Spring 容器中。这样后续就可以使用 Spring 容器中的对象,进行 AI Agent 对话了。 + +>目前是把最后构建的 SequentialAgent 写入到 InMemoryRunner 中,后续会做成动态的,让配置任何的一个智能体都可以填充到 InMemoryRunner 中。 + +## 二、流程设计 + +如图,智能体构建完成后,则填充到 InMemoryRunner 中; + +++ +- 从 SequentialAgentNode 节点,流转到 RunnerNode 节点。 +- 在 RunnerNode 节点,创建 InMemoryRunner 以及注册到 Spring 容器。这样可以任何一个地方获取到执行对象。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-11\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\212\240\350\275\275\344\275\277\347\224\250\351\252\214\350\257\201.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-11\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\212\240\350\275\275\344\275\277\347\224\250\351\252\214\350\257\201.md" new file mode 100644 index 000000000..7cc2ac0a5 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-11\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\212\240\350\275\275\344\275\277\347\224\250\351\252\214\350\257\201.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第2-11节:智能体加载使用验证 +pay: https://t.zsxq.com/CyuXv +--- + +# 《AI Agent 脚手架》第2-11节:智能体加载使用验证 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/kgrzQ](https://t.zsxq.com/kgrzQ) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +启动程序,加载智能体yml配置,完成智能体的装配。以及编写测试案例,验证加载智能体的使用。这部分的内容,会为后续开发对话服务做一个基础。让大家知道对话的过程需要创建会话和处理消息请求。 + +## 二、流程设计 + +如图,智能体全部节点构建完成后,在程序启动的时候进行加载; + +++ +- 前面章节已经做好了全部的加载动作,到这可以把调用入口串联起来了。在程序启动的时候,完成自动化的加载处理。 +- 完成加载处理后,我们在做一个初步的验证操作,也就是使用这个智能体,通过这样的方式了解整个会话过程。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-12\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-RunnerNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-12\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-RunnerNode.md" new file mode 100644 index 000000000..7c73d00ba --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-12\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-RunnerNode.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第2-12节:增强装配-RunnerNode +pay: https://t.zsxq.com/jxbVS +--- + +# 《AI Agent 脚手架》第2-12节:增强装配-RunnerNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/Ls0hf](https://t.zsxq.com/Ls0hf) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +基础的智能体装配一个链路做完,并验证了会话的设计,让整个链路跑通。之后我们做一下增强设计操作。让整个智能体可以在后续适应更多的场景使用。 + +这一节,我们先来做下 RunnerNode 的增强,也就是前面提到的,用户如果只是配置一个基础的 Agent 不在配置其他的 loop(循环)、parallel(并行)、sequential(序列),就结束了。那么这里要怎么流转到 RunnerNode。 + +## 二、流程设计 + +如图,从 AgentWorkflowNode 流转到 RunnerNode 设计; + +++ +- 首先,在有了前面的内容学习后,我们了解到 RunnerNode 会做 InMemoryRunner 的构建,而这个对象的构建是需要拿到 SequentialAgentNode 作为最后一个节点,构建的 SequentialAgent 写入到上下文,到 RunnerNode 节点使用。它的核心本质是拿到 InMemoryRunner 创建的时候,所需 Agent 智能体。 +- 之后,这个 Agent 智能体,不非得以一个固定的写死,而是可以在配置文件中添加以 runner 配置,指定装配到 runner 中的 agent 名称。之后在 RunnerNode 构建 InMemoryRunner 的时候,则从上下文通过智能体名称获取 agent 装配进来即可。 +- 最后,思考下,AgentWorkflowNode 什么时候流转,这个流转则是根据当前 agentWorkflows 是不为空了,为空则直接流转到 RunnerNode 即可。RunnerNode 会根据配置的关联 agentName 进行配置。`这部分看代码的yml文件会更加清晰` diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-13\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-AgentWorkflowNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-13\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-AgentWorkflowNode.md" new file mode 100644 index 000000000..144a44533 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-13\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-AgentWorkflowNode.md" @@ -0,0 +1,417 @@ +--- +title: 【更】第2-13:增强装配-AgentWorkflowNode +pay: https://t.zsxq.com/qjhUb +--- + +# 《AI Agent 脚手架》第2-13:增强装配-AgentWorkflowNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/AuQlk](https://t.zsxq.com/AuQlk) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +换种设计方式,增强 AgentWorkflowNode 流转能力,让 LoopAgentNode、ParallelAgentNode、SequentialAgentNode 不在负责判断流转,而是每个流程处理完毕后,都回到 AgentWorkflowNode 中进行流转决策。这样我们就可以组合出更为复杂的智能体编排。 + +## 二、流程设计 + +如图,增强 AgentWorkflowNode 流转能力,每个节点流转完都重新回到 AgentWorkflowNode 节点进行决策; + +++ +- 左侧是旧版流程,LoopAgentNode、ParallelAgentNode、SequentialAgentNode,每个节点交叉流转。这次换到新版流程,所有的流转都由 AgentWorkflowNode 负责。这样会让三个功能 Agent 节点的职责更为清晰。 +- 这样,AgentWorkflowNode 就成了分发中心,三个 LoopAgentNode、ParallelAgentNode、SequentialAgentNode 智能体节点处理完业务后都回到 AgentWorkflowNode 即可。 + +## 三、功能实现 + +### 1. 工程结构 + ++
++ +- 修改 LoopAgentNode、ParallelAgentNode、SequentialAgentNode,三个节点中的流转操作,都转移到 AgentWorkflowNode 处理。 +- 在 AgentWorkflowNode 中,要拿到当前 agentWorkflows 配置的列表中,步骤中第N个,把拿到的值作为当前的信息存储到上下文,之后流转到任何一个节点,只负责从上下文取到当前值即可。 + +### 2. 核心模块 + +#### 2.1 定义上下文 + +```java +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public static class DynamicContext { + + /** + * LLM API + */ + private OpenAiApi openAiApi; + + /** + * 对话模型 + */ + private ChatModel chatModel; + + /** + * 原子安全的递进步骤 + */ + private AtomicInteger currentStepIndex = new AtomicInteger(0); + + /** + * 当前的智能体 + */ + private AiAgentConfigTableVO.Module.AgentWorkflow currentAgentWorkflow; + + /** + * 智能体组 + */ + private Map+
agentGroup = new HashMap<>(); + + private Map dataObjects = new HashMap<>(); +} +``` + +- 首先,去掉 agentWorkflows 列表值,增加一个 currentAgentWorkflow 当前值。 +- 之后,添加 currentStepIndex 步骤完成一个,则迭代+1,从 agentWorkflows 渠道的当前对象存储到 currentAgentWorkflow,这样会更加方便判断。(`这个就是前面提到的另外的一个方案设计,小傅哥在项目里也给大家增加这种演进的迭代设计,可以让大家多一些积累`) + +#### 2.2 增强流转 + +```java +@Slf4j +@Service +public class AgentWorkflowNode extends AbstractArmorySupport { + + @Resource + private LoopAgentNode loopAgentNode; + + @Resource + private ParallelAgentNode parallelAgentNode; + + @Resource + private SequentialAgentNode sequentialAgentNode; + + @Resource + private RunnerNode runnerNode; + + @Override + protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + log.info("Ai Agent 装配操作 - AgentWorkflowNode"); + + AiAgentConfigTableVO aiAgentConfigTableVO = requestParameter.getAiAgentConfigTableVO(); + List agentWorkflows = aiAgentConfigTableVO.getModule().getAgentWorkflows(); + + // 如果未配置 agentWorkflows 则直接流转到 RunnerNode + if (null == agentWorkflows || agentWorkflows.isEmpty() || dynamicContext.getCurrentStepIndex() >= agentWorkflows.size()) { + // 设置结果值 + dynamicContext.setCurrentAgentWorkflow(null); + // 路由下节点 + return router(requestParameter, dynamicContext); + } + + // 设置当前判断流程对象 + dynamicContext.setCurrentAgentWorkflow(agentWorkflows.get(dynamicContext.getCurrentStepIndex())); + + // 步骤值增加 + dynamicContext.addCurrentStepIndex(); + + return router(requestParameter, dynamicContext); + } + + @Override + public StrategyHandler get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + + AiAgentConfigTableVO.Module.AgentWorkflow currentAgentWorkflow = dynamicContext.getCurrentAgentWorkflow(); + + // 没有下一个节点,流转到结束节点 + if (null == currentAgentWorkflow) { + return runnerNode; + } + + String type = currentAgentWorkflow.getType(); + AgentTypeEnum agentTypeEnum = AgentTypeEnum.fromType(type); + + if (null == agentTypeEnum) { + throw new RuntimeException("agentWorkflow type is error!"); + } + + String node = agentTypeEnum.getNode(); + + return switch (node) { + case "loopAgentNode" -> loopAgentNode; + case "parallelAgentNode" -> parallelAgentNode; + case "sequentialAgentNode" -> sequentialAgentNode; + default -> runnerNode; + }; + + } + +} +``` + +- doApply 方法的核心是判断是否配置 agentWorkflows,以及不断的取值(类似for循环),是否取到了最后一个。如果是,则设置 `dynamicContext.setCurrentAgentWorkflow(null);` 并路由走。否则,从 agentWorkflows 获取当前步骤的对象并设置到上下文中,以及给步骤 +1 处理。 +- get 则负责节点流转,判断当前节点是否为null,为null则表示没有要处理的节点,直接进入 runnerNode 即可。如果不是 null 则按照不同的 node 流转到子 agent 智能体节点。 + +#### 2.3 子智能体节点 + +##### 2.3.1 LoopAgentNode + +```java +@Service +public class LoopAgentNode extends AbstractArmorySupport { + + @Override + protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + log.info("Ai Agent 装配操作 - LoopAgentNode"); + + AiAgentConfigTableVO.Module.AgentWorkflow currentAgentWorkflow = dynamicContext.getCurrentAgentWorkflow(); + + List subAgents = dynamicContext.queryAgentList(currentAgentWorkflow.getSubAgents()); + + LoopAgent loopAgent = + LoopAgent.builder() + .name(currentAgentWorkflow.getName()) + .description(currentAgentWorkflow.getDescription()) + .subAgents(subAgents) + .maxIterations(currentAgentWorkflow.getMaxIterations()) + .build(); + + dynamicContext.getAgentGroup().put(currentAgentWorkflow.getName(), loopAgent); + + return router(requestParameter, dynamicContext); + } + + @Override + public StrategyHandler get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + return getBean("agentWorkflowNode"); + } + +} +``` + +- doApply 要修改为从上下文的 `dynamicContext.getCurrentAgentWorkflow()` 获取当前节点的数据,构建 Agent 之后路由。 +- get 则负责流转回 `getBean("agentWorkflowNode")` 让 agentWorkflowNode 继续负责节点的流转判断。 + +##### 2.3.2 ParallelAgentNode + +```java +@Service +public class ParallelAgentNode extends AbstractArmorySupport { + + @Override + protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + log.info("Ai Agent 装配操作 - ParallelAgentNode"); + + AiAgentConfigTableVO.Module.AgentWorkflow currentAgentWorkflow = dynamicContext.getCurrentAgentWorkflow(); + + List subAgents = dynamicContext.queryAgentList(currentAgentWorkflow.getSubAgents()); + + ParallelAgent parallelAgent = + ParallelAgent.builder() + .name(currentAgentWorkflow.getName()) + .subAgents(subAgents) + .description(currentAgentWorkflow.getDescription()) + .build(); + + dynamicContext.getAgentGroup().put(currentAgentWorkflow.getName(), parallelAgent); + + return router(requestParameter, dynamicContext); + } + + @Override + public StrategyHandler get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + return getBean("agentWorkflowNode"); + } +} +``` + +- 代码修改方式同 `LoopAgentNode` + +##### 2.3.3 SequentialAgentNode + +```java +@Service +public class SequentialAgentNode extends AbstractArmorySupport { + + @Override + protected AiAgentRegisterVO doApply(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + log.info("Ai Agent 装配操作 - SequentialAgentNode"); + + AiAgentConfigTableVO.Module.AgentWorkflow currentAgentWorkflow = dynamicContext.getCurrentAgentWorkflow(); + + List subAgents = dynamicContext.queryAgentList(currentAgentWorkflow.getSubAgents()); + + SequentialAgent sequentialAgent = + SequentialAgent.builder() + .name(currentAgentWorkflow.getName()) + .description(currentAgentWorkflow.getDescription()) + .subAgents(subAgents) + .build(); + + dynamicContext.getAgentGroup().put(currentAgentWorkflow.getName(), sequentialAgent); + + return router(requestParameter, dynamicContext); + } + + @Override + public StrategyHandler get(ArmoryCommandEntity requestParameter, DefaultArmoryFactory.DynamicContext dynamicContext) throws Exception { + return getBean("agentWorkflowNode"); + } + +} +``` + +- 代码修改方式同 `LoopAgentNode` + +## 四、测试验证 + +### 1. 修改配置文件 + +**parallel_research_app.yml** + +```java +ai: + agent: + config: + tables: + testAgent02: + app-name: ResearchAndSynthesisPipeline + agent: + agent-id: 100002 + agent-name: 测试智能体02 + agent-desc: 并行研究并汇总的智能体管道 + module: + ai-api: + base-url: https://apis.itedus.cn + api-key: sk-Sp2jx3yeq7x7HJ663bDc9bF0D34b4f609f833840271519B1 + completions-path: v1/chat/completions + embeddings-path: v1/embeddings + chat-model: + model: gpt-4.1 + tool-mcp-list: + - sse: + name: baidu-search + base-uri: https://appbuilder.baidu.com/v2/ai_search/mcp/ + sse-endpoint: sse?api_key=bce-v3/ALTAK-3zODLb9qHozIftQlGwez5/2696e92781f5bf1ba1870e2958f239fd6dc822a4 + request-timeout: 5000 + agents: + - name: RenewableEnergyResearcher + description: Researches renewable energy sources. + instruction: | + You are an AI Research Assistant specializing in energy. + Research the latest advancements in 'renewable energy sources'. + Use the Google Search tool provided. + Summarize your key findings concisely (1-2 sentences). + Output *only* the summary. + output-key: renewable_energy_result + - name: EVResearcher + description: Researches electric vehicle technology. + instruction: | + You are an AI Research Assistant specializing in transportation. + Research the latest developments in 'electric vehicle technology'. + Use the Google Search tool provided. + Summarize your key findings concisely (1-2 sentences). + Output *only* the summary. + output-key: ev_technology_result + - name: CarbonCaptureResearcher + description: Researches carbon capture methods. + instruction: | + You are an AI Research Assistant specializing in climate solutions. + Research the current state of 'carbon capture methods'. + Use the Google Search tool provided. + Summarize your key findings concisely (1-2 sentences). + Output *only* the summary. + output-key: carbon_capture_result + - name: SynthesisAgent + description: Combines research findings into a structured report. + instruction: | + You are an AI Assistant responsible for combining research findings into a structured report. + Your primary task is to synthesize the following research summaries, clearly attributing findings to their source areas. Structure your response using headings for each topic. Ensure the report is coherent and integrates the key points smoothly. + **Crucially: Your entire response MUST be grounded *exclusively* on the information provided in the 'Input Summaries' below. Do NOT add any external knowledge, facts, or details not present in these specific summaries.** + **Input Summaries:** + + * **Renewable Energy:** + {renewable_energy_result} + + * **Electric Vehicles:** + {ev_technology_result} + + * **Carbon Capture:** + {carbon_capture_result} + + **Output Format:** + + ## Summary of Recent Sustainable Technology Advancements + + ### Renewable Energy Findings + (Based on RenewableEnergyResearcher's findings) + [Synthesize and elaborate *only* on the renewable energy input summary provided above.] + + ### Electric Vehicle Findings + (Based on EVResearcher's findings) + [Synthesize and elaborate *only* on the EV input summary provided above.] + + ### Carbon Capture Findings + (Based on CarbonCaptureResearcher's findings) + [Synthesize and elaborate *only* on the carbon capture input summary provided above.] + + ### Overall Conclusion + [Provide a brief (1-2 sentence) concluding statement that connects *only* the findings presented above.] + + Output *only* the structured report following this format. Do not include introductory or concluding phrases outside this structure, and strictly adhere to using only the provided input summary content. + agent-workflows: + - type: parallel + name: ParallelWebResearchAgent + description: Runs multiple research agents in parallel to gather information. + sub-agents: + - RenewableEnergyResearcher + - EVResearcher + - CarbonCaptureResearcher + - type: sequential + name: ResearchAndSynthesisPipeline + description: Coordinates parallel research and synthesizes the results. + sub-agents: + - ParallelWebResearchAgent + - SynthesisAgent + runner: + agent-name: ResearchAndSynthesisPipeline +``` + +- agent-workflows 配置下 ParallelWebResearchAgent、ResearchAndSynthesisPipeline,这样可以测试循环处理。 +- runner 则配置 ResearchAndSynthesisPipeline 进行运行体转配。 + +### 2. 测试方法 + +```java +@Test +public void test_handlerMessage_03(){ + AiAgentRegisterVO aiAgentRegisterVO = applicationContext.getBean("100002", AiAgentRegisterVO.class); + String appName = aiAgentRegisterVO.getAppName(); + InMemoryRunner runner = aiAgentRegisterVO.getRunner(); + Session session = runner.sessionService() + .createSession(appName, "xiaofuge") + .blockingGet(); + Content userMsg = Content.fromParts(Part.fromText("你具备哪些能力")); + Flowable events = runner.runAsync("xiaofuge", session.id(), userMsg); + List outputs = new ArrayList<>(); + events.blockingForEach(event -> outputs.add(event.stringifyContent())); + log.info("测试结果:{}", JSON.toJSONString(outputs)); +} +``` + +```java +26-01-01.13:20:04.106 [main ] INFO test_handlerMessage_03 - 测试结果:["我可以帮助你查询和分析可再生能源领域的最新进展,包括太阳能、风能、生物能、地热能、海洋能等各类新能源技术的发展趋势、创新成果及政策动态。同时,我可以利用互联网搜索功能,快速获取最新科研成果、行业动态和相关数据,并将关键信息进行简明总结。","我是专注于电动汽车技术(electric vehicle technology)研究的AI助理,具备以下能力:\n\n1. **新技术检索与总结**:我能利用Google搜索等工具,快速检索最新的电动汽车技术发展、行业动态和科研突破,并进行简洁明了的总结。\n2. **趋势与前沿分析**:能够获取并分析行业趋势,例如电池创新、驱动系统进展、智能网联、电驱动新材料等领域的最新动向。\n3. **政策与市场信息搜集**:可查询全球各地与电动汽车相关的政策、市场增长、补贴政策等信息。\n4. **参考文献和数据追溯**:能帮助定位权威期刊、会议论文、专利等技术文档,提供学术研究支持。\n5. **技术对比与评估**:可对比不同品牌、技术路径或产品,分析其优劣及市场应用前景。\n6. **简明交流和摘要能力**:围绕“电动汽车技术”,可将复杂技术信息压缩为1-2句话的核心摘要,便于快速理解。\n\n如果你有特定方向的需求(如电池、驱动控制、充电技术等),我也能定向进行最新信息搜索和研究。","我具备以下能力,专注于碳捕集(carbon capture)相关的研究与信息获取:\n\n1. 实时网络检索:我可以通过专业搜索工具实时获取最新关于碳捕集方法、技术进展、应用案例、政策法规等公开信息。\n2. 资料梳理与总结:对检索到的信息快速提炼要点,进行结构化、简明扼要的总结,便于决策与参考。\n3. 技术分类与比较:能够对比不同类型的碳捕集技术(如直接空气捕集、点源捕集、碳矿化、生物碳捕集等)的原理、优缺点和应用现状。\n4. 最新动态追踪:跟踪全球范围内碳捕集领域的最新动态、前沿研究和重大项目进展。\n5. FAQ解答:针对碳捕集相关的常见问题(如成本、能效、行业难点等)进行专业、准确回答。\n\n如需获取某一具体问题或领域的最新信息,请直接告诉我!","## Summary of Recent Sustainable Technology ... +``` + +- 运行后可以看到执行的结果。也表示了,我们的装配方式是没问题的。 + +## 五、读者作业 + +- 简单作业:完成本节功能的编写,理解此处的架构设计。对于节点的流转,打开思路,之后活学活用。 +- 复杂作业:尝试配置一个多层嵌套的智能体,来验证这样的装配。 + diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-14\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-\346\234\254\345\234\260mcp.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-14\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-\346\234\254\345\234\260mcp.md" new file mode 100644 index 000000000..64b058b53 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-14\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-\346\234\254\345\234\260mcp.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第2-14节:增强装配-本地mcp +pay: https://t.zsxq.com/KYNyM +--- + +# 《AI Agent 脚手架》第2-14节:增强装配-本地mcp + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/OoPsy](https://t.zsxq.com/OoPsy) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在用户使用 ai agent 脚手架的时候,会有诉求扩展一些自己实现的 mcp 服务。比如,做一些智能体客服场景,或者公司内部的系统巡检场景,这些场景并没有提供统一的 mcp 服务,则可能都要自己扩展,扩展后装配到整个智能体中。 + +同时因为引入了多种类型的 mcp 装配,sse、stdio 又加上这种本地自己实现的,所以这块还要做一些策略处理。 + +## 二、流程设计 + +如图,增强 mcp 服务装配能力设计; + +++ +- ChatModelNode 装配 MCP 主要是 sse、stdio 两种方式,通过 if···else 判断的方式进行处理。但现在又要扩展新的方式装配,则不适合继续编写 if···else 代码,而是要通过类来拆分一个大的方法。 +- 这块会使用到工厂 + 策略接口来扩展实现,并区分出 mcp 客户端、服务端。客户端负责策略装配,服务端负责用户自己扩展新的 mcp 服务。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-15\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-\345\233\236\350\260\203plugin.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-15\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-\345\233\236\350\260\203plugin.md" new file mode 100644 index 000000000..c5660f157 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-15\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-\345\233\236\350\260\203plugin.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第2-15节:增强装配-回调plugin +pay: https://t.zsxq.com/U1p49 +--- + +# 《AI Agent 脚手架》第2-15节:增强装配-回调plugin + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/tTIdy](https://t.zsxq.com/tTIdy) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +为 InMemoryRunner 运行体扩展 Plugin 插件能力,允许用户在智能体执行的各个阶段获取到上下文信息,并做出一定的监控、调整、治理的动作。 + +如果你有学习过星球「码农会锁」的扳手工程,在设计模式框架章节,有一个 `applyBefore`、`applyAfter`、`applyAfterError` 的处理,它可以让你在使用的阶段做拦截或者打印最后的结果。这些设计都是相同的,所以说学编程,最后都是学的思想。语言就像你的盗抢棍棒,斧钺钩叉,思想才是你的一招一式。 + +## 二、流程设计 + +如图,增强运行体插件配置,可以在各个节点埋入钩子; + +++ +- Runner 的 Plugin 通过回调钩子在 AI Agent 运行流程生命周期的各个阶段执行。包括;用户输入信息、调用模型、调用工具、智能体执行等步骤中。这一工具,可以用在日志记录、性能分析、步骤调试、策略执行(权限)、监控对接(普罗米修斯)、请求或响应的调整(如敏感词的处理)等。 +- 这些操作的步骤,就是图上的各个阶段的节点,可以被采集到。就像你设置的任何一个智能体 Agent 都可以拿到它的运行信息,甚至你可以在上下文中做一些拦截操作。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-16\350\212\202\357\274\232fix-\345\244\232\346\250\241\346\200\201\350\203\275\345\212\233\344\275\277\347\224\250.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-16\350\212\202\357\274\232fix-\345\244\232\346\250\241\346\200\201\350\203\275\345\212\233\344\275\277\347\224\250.md" new file mode 100644 index 000000000..a2a9a4a3c --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-16\350\212\202\357\274\232fix-\345\244\232\346\250\241\346\200\201\350\203\275\345\212\233\344\275\277\347\224\250.md" @@ -0,0 +1,123 @@ +--- +title: 【更】第2-16节:fix-多模态能力使用 +pay: https://t.zsxq.com/wF32j +--- + +# 《AI Agent 脚手架》第2-16节:fix-多模态能力使用 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/XqlKu](https://t.zsxq.com/XqlKu) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +为接入 Google ADK 的 Spring AI 提供图片识别的多模态能力。 + +这本应该是一个简单直接使用的功能,但在 `Google ADK 0.5.0`、`Spring AI 1.1.0` 版本上,它还是一个隐藏待处理的 Bug,小傅哥已于 2026年1月6日,提交 [https://github.com/google/adk-java/issues/705](https://github.com/google/adk-java/issues/705) + +Google ADK Java 开发工程师,在 2026年1月7日,处理提交了修复代码,应该会在后续版本更新。 + +不过,对于我们学习来说,这并不是坏事。我们可以借助这样的问题点,深入理解 Google ADK 和 Spring AI 的对接,以及学习如何排查这样的报错。最终,鉴于 Google ADK 版本更新周期,我们目前先在程序中打一个”补丁“实现。 + +## 二、发现问题 + +### 步骤1,功能诉求 + +```java +@Test +public void test_handlerMessage_03() throws IOException { + AiAgentRegisterVO aiAgentRegisterVO = applicationContext.getBean("100003", AiAgentRegisterVO.class); + + String appName = aiAgentRegisterVO.getAppName(); + InMemoryRunner runner = aiAgentRegisterVO.getRunner(); + Session session = runner.sessionService() + .createSession(appName, "xiaofuge") + .blockingGet(); + + Content userMsg = Content.fromParts(Part.fromText("这是什么图片?"), + Part.fromBytes(imageResource.getContentAsByteArray(), MimeTypeUtils.IMAGE_PNG_VALUE)); + + Flowableevents = runner.runAsync("xiaofuge", session.id(), userMsg); + + List outputs = new ArrayList<>(); + events.blockingForEach(event -> outputs.add(event.stringifyContent())); + log.info("测试结果:{}", JSON.toJSONString(outputs)); +} +``` + + ++ +- 在新的章节,需要验证多模态能力的时候,传入了一个图片 byte,但无论如何修改运行,都只是提示无法识别图片。 +- 这个时候猜想,是不是 InMemoryRunner 构建问题,或者 Agent 实例化参数问题。所以,决定把问题缩小,单独验证 Google ADK + Spring AI。 + +### 步骤2,分块验证 + +```java +@Slf4j +public class SpringAiTest { + + @SneakyThrows + public static void main(String[] args) { + + OpenAiApi openAiApi = OpenAiApi.builder() + .baseUrl("https://apis.itedus.cn") + .apiKey("sk-2GQTYTNoQSs7qizlE9F00bD84d254c2994D44d6410B0Ac8f") + .completionsPath("v1/chat/completions") + .embeddingsPath("v1/embeddings") + .build(); + + ChatModel chatModel = OpenAiChatModel.builder() + .openAiApi(openAiApi) + .defaultOptions(OpenAiChatOptions.builder() + .model("gpt-4.1") + .build()) + .build(); + + LlmAgent agent = LlmAgent.builder() + .name("test") + .description("Chess coach agent") + .model(new SpringAI(chatModel)) + .instruction(""" + You are a knowledgeable chess coach + who helps chess players train and sharpen their chess skills. + """) + .build(); + + InMemoryRunner runner = new InMemoryRunner(agent); + + Session session = runner + .sessionService() + .createSession("test", "xiaofuge") + .blockingGet(); + + URL resource = Thread.currentThread().getContextClassLoader().getResource("dog.png"); + + byte[] bytes; + assert resource != null; + try (InputStream inputStream = resource.openStream()) { + bytes = inputStream.readAllBytes(); + } + + List+
parts = new ArrayList<>(); + parts.add(Part.fromText("这是什么图片")); + parts.add(Part.fromBytes(bytes, MimeTypeUtils.IMAGE_PNG_VALUE)); + + Content content = Content.builder().role("user").parts(parts).build(); + + Flowable events = runner.runAsync("xiaofuge", session.id(), + content + ); + + System.out.print("\nAgent > "); + events.blockingForEach(event -> System.out.println(event.stringifyContent())); + } + +} +``` + +- 效果;运行结果依然是识别不了,告诉我要上传图片,它才能识别。 +- 猜想;这说明单独按照官网案例构建 Agent 并测试依然不行,再细化验证。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-17\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260-service.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-17\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260-service.md" new file mode 100644 index 000000000..fdf87ec66 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-17\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260-service.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第2-17节:会话服务接口实现-service +pay: https://t.zsxq.com/lxqLY +--- + +# 《AI Agent 脚手架》第2-17节:会话服务接口实现-service + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/vLd8O](https://t.zsxq.com/vLd8O) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在智能体完成装配以后,接下来我们要做的就是提供标准的会话服务接口能力,使用智能体。这包括了,所装配智能体的列表(agentId)、会话的创建、消息的处理(同步/异步)。 + +## 二、流程设计 + +如图,会话接口服务所在分层; + +++ +- 首先,在 Agent 装配后,是要对外提供服务,服务由 trigger 分层下的 http 接口提供。这个 trigger 也就是 mvc 分层里的 controller,但因为在微服务下,接口、消息、定时任务,都是一种触发行为。触发可以理解为,别人打你,可以用拳头,可以用石头,还分可以榔头,这些都可以抽象为一种名称,触发。所以在 ddd 分层下,增加了 trigger 触发器层。 +- 之后,这一节我们先来实现 service 服务层,也就是在 domain 领域下,agent 里除了做装配实现,还要做一层会话处理。在 service 实现后,后面就是包装 trigger 层的对外接口。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-18\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260-trigger.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-18\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260-trigger.md" new file mode 100644 index 000000000..61a2e5ca2 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-18\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\256\236\347\216\260-trigger.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第2-18节:会话服务接口实现-trigger +pay: https://t.zsxq.com/IY7j3 +--- + +# 《AI Agent 脚手架》第2-18节:会话服务接口实现-trigger + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/leFf4](https://t.zsxq.com/leFf4) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +对 domain 领域层的 service 服务,进行 trigger 包装,提供 http 接口能力。这样,后续就可以包装页面到调用接口,完整整个会话服务的操作。 + +## 二、流程设计 + +如图,会话接口服务所在分层; + +++ +- 如图,这一节主要是完成 trigger http 接口部分的能力处理,对外提供;`智能体列表`、`创建会话 session`、`发起会话(流式/非流式)` +- 注意,在实际业务开发中,接口的提供方式比较多的,也有可能提供 rpc 接口,还有可能对接口进行扩展,包装更多业务流程进去。那么这个时候,可以考虑增加 case 编排层(一个新的module模块),处理复杂流程业务。case 层的能力,主要就是分摊 trigger 层下的压力,让对外的接口层,更加轻量,只是做一些包装即可。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-19\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\257\271\346\216\245-ui.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-19\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\257\271\346\216\245-ui.md" new file mode 100644 index 000000000..d2a1a11ce --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-19\350\212\202\357\274\232\344\274\232\350\257\235\346\234\215\345\212\241\346\216\245\345\217\243\345\257\271\346\216\245-ui.md" @@ -0,0 +1,38 @@ +--- +title: 【更】第2-19节:会话服务接口对接-ui +pay: https://t.zsxq.com/gd2Ue +--- + +# 《AI Agent 脚手架》第2-19节:会话服务接口对接-ui + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/38RBe](https://t.zsxq.com/38RBe) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +开发脚手架接口对接 UI,简单展示服务端能力。 + +在业务场景中,使用 AI Agent 脚手架,构建项目后所提供的服务接口,一般是附带着业务应用场景能力的。这些提供的能力接口,可以对接到客服、巡检、数据、量化、风控等各类场景使用。 + +## 二、对接效果 + +这里小傅哥选择使用了 AI IDE 工具,设计 UI 界面,我们可以描述对接话术,让 AI 帮我们设计一套页面。`关于页面设计的话术提示词,我已经放到工程下。` + +### 1. 登录页 + +++ +- 登录页,有一个演示账号,可以填充登录。 + +### 2. 对话页 + ++
++ +- 对话,可以填写信息,发送请求。在一个会话ID下,它是可以记录历史上下文信息的。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-1\350\212\202\357\274\232\345\267\245\347\250\213\345\210\235\345\247\213\345\214\226\345\210\233\345\273\272.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-1\350\212\202\357\274\232\345\267\245\347\250\213\345\210\235\345\247\213\345\214\226\345\210\233\345\273\272.md" new file mode 100644 index 000000000..5fef2d62e --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-1\350\212\202\357\274\232\345\267\245\347\250\213\345\210\235\345\247\213\345\214\226\345\210\233\345\273\272.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第2-1节:工程初始化创建 +pay: https://t.zsxq.com/6z3Q1 +--- + +# 《AI Agent 脚手架》第2-1节:工程初始化创建 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/OxC6a](https://t.zsxq.com/OxC6a) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +搭建 AI Agent Scaffold 脚手架项目工程,并 push 代码到课程仓库,以及演示关于 Git 使用,方便后续学习使用。 + +## 二、环境配置 + +- JDK 17 +- Maven 3.8.x - [Maven 教程](https://bugstack.cn/md/road-map/maven.html) +- IntelliJ IDEA 社区版(免费) [IntelliJ IDEA 教程](https://bugstack.cn/md/road-map/intellij-idea.html) +- Git - 安装后会配置到 IntellJ IDEA 这样才能向服务端推送或者拉取代码。学习后可以知道怎么拉取、提交和比对代码。Git 教程:[https://bugstack.cn/md/road-map/git.html](https://bugstack.cn/md/road-map/git.html) + +++ +>相关软件,在星球课程入口,编程环境中提供了下载链接。编程环境:[https://t.zsxq.com/19Rnk98M0](https://t.zsxq.com/19Rnk98M0) - 提供了已经配置好镜像的 maven 方便直接使用。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-20\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-skills.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-20\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-skills.md" new file mode 100644 index 000000000..d11452c49 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-20\350\212\202\357\274\232\345\242\236\345\274\272\350\243\205\351\205\215-skills.md" @@ -0,0 +1,34 @@ +--- +title: 【更】第2-20节:增强装配-skills +pay: https://t.zsxq.com/7uVom +--- + +# 《AI Agent 脚手架》第2-20节:增强装配-skills + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/7uVom](https://t.zsxq.com/7uVom) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +为对话模型(ChatModelNode)的装配,添加 skills 技能配置,允许用户使用 resource 资源和映射的 path 路径的方式,在构建 AI Agent 智能体时,完成装配。 + +skill 是什么?它像是一本技能书📚,把一阳指(mcp/py/shell/js)和狮吼功(prompt)合成了一整招。缩短了从用户把提示词发给AI客户端,进行分析,决策,再到 mcp 执行的过程,让诉求直达结果,token 减少了,幻觉减少了! + +随着 LLM 大模型能力的不断提升,并与 RAG、MCP、Skill 的结合,使得 Agent 智能体与完整的计算机环境(Computer/Phone)交互成为可能。这个过程中,一方面不断产生新的技术方案,一方面又不断的优化设计。就像 Skill 的出现,它不是替代 MCP,而是更准确的使用 MCP 能力。 + +## 二、技术介绍(skills 和 prompt + mcp) + +如图,演示了一段 skill 的编写案例; + +++ +- 场景:案例中体现的是,对电脑性能检测后,用一段下达命令的方式,告知用户如何优化电脑性能。 +- 重点:如果不使用 skill,则需要描述一大段话术,让 ai 自己完成对用户场景诉求的分析,并按照步骤来调用对应的各个 mcp 服务(没有 skill 则需要把各类内容,都包装为 mcp 服务)。这个过程是比较消耗 token 的,也可能有不小的幻觉。现在有了 skill,我们可以适当的完整的写一段诉求文档,文档里嵌入可执行的脚本/mcp服务,让执行更可靠。 +- 用途:那都有哪些场景可以写 skill 技能书呢?🤔 如;互联网公司里的系统巡检,在接收到报警日志后,拿到一个报警的系统和接口信息,之后用 skill 技能书,分别采集出对应的系统配置、上线日志、数据库/缓存情况、运营操作记录、全链路监控上的接口耗时情况等。之后在根据我们日常排查问题的时候经验,编写过程步骤,这样会更加准确。 + +>所以,不是 skill、mcp 谁替代谁,而是 skill 对 mcp 进行增强,让 ai 执行时更加可靠。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-2\350\212\202\357\274\232Api\345\212\237\350\203\275\346\265\213\350\257\225.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-2\350\212\202\357\274\232Api\345\212\237\350\203\275\346\265\213\350\257\225.md" new file mode 100644 index 000000000..f19a2cb7e --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-2\350\212\202\357\274\232Api\345\212\237\350\203\275\346\265\213\350\257\225.md" @@ -0,0 +1,44 @@ +--- +title: 【更】第2-2节:Api功能测试 +pay: https://t.zsxq.com/uTPE2 +--- + +# 《AI Agent 脚手架》第2-2节:Api功能测试 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/q2Zug](https://t.zsxq.com/q2Zug) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过功能测试代码,使用 `Spring AI`、`LangChain4J`、`Google ADK` 框架对接 AI 服务,完成功能验证。为后续做 AI Agent 智能体脚手架做准备。 + +## 二、框架介绍 + +### 1. Spring AI + +官网:[https://docs.spring.io/spring-ai/reference/1.0/index.html](https://docs.spring.io/spring-ai/reference/1.0/index.html) + +Spring AI 项目旨在简化集成人工智能功能的应用程序的开发,避免不必要的复杂性。 + +该项目从 LangChain 和 LlamaIndex 等知名的 Python 项目中汲取灵感,但 Spring AI 并非这些项目的直接移植。该项目创立的初衷是,下一代生成式人工智能应用不仅面向 Python 开发者,还将广泛应用于多种编程语言。 + +> 在使用体验下 Spring AI 可以更好的结合 Spring 整个框架,整个接口的定义形式和使用方式,会更符合你对于 Spring 整体的使用习惯。 + +### 2. LangChain4J + +官网:[https://docs.langchain4j.info/](https://docs.langchain4j.info/) + +LangChain4j 的目标是简化将 LLM 集成到 Java 应用程序中的过程。 + +LangChain4j 始于 2023 年初 ChatGPT 热潮期间。 我们注意到与众多 Python 和 JavaScript LLM 库和框架相比,缺少 Java 对应物, 我们必须解决这个问题! 虽然我们的名字中有"LangChain",但该项目是 LangChain、Haystack、 LlamaIndex 和更广泛社区的想法和概念的融合,并加入了我们自己的创新。 + +### 3. Google ADK + +官网:[https://google.github.io/adk-docs/get-started/java/#example](https://google.github.io/adk-docs/get-started/java/#example) + +代理开发工具包 (ADK) 是一个灵活且模块化的框架,用于开发和部署 AI 代理 。ADK 针对 Gemini 和 Google 生态系统进行了优化,但它与模型和部署方式无关,并且是为……而构建的。 与其他框架的兼容性 。ADK 的设计宗旨是让代理开发更像软件开发,使开发人员能够更轻松地创建、部署和编排从简单任务到复杂工作流程的各种代理架构。 + +> 在使用体验上 Google ADK 自身是可以完整构建全部智能体的,但它又兼容了 Spring AI、LangChain4j 两个框架,让这2个框架负责 AI 对接,而 Google ADK 负责 Agent 的编排和插件的处理,这样使用起来非常不错。 diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-3\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\351\205\215\347\275\256\350\241\250\350\256\276\350\256\241.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-3\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\351\205\215\347\275\256\350\241\250\350\256\276\350\256\241.md" new file mode 100644 index 000000000..cd82e542a --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-3\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\351\205\215\347\275\256\350\241\250\350\256\276\350\256\241.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第2-3节:智能体配置表设计 +pay: https://t.zsxq.com/hCtFC +--- + +# 《AI Agent 脚手架》第2-3节:智能体配置表设计 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/bHRBx](https://t.zsxq.com/bHRBx) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +定义使用工程 YML 文件方式,配置的通用的智能体配置表。允许用户在使用脚手架创建完成智能体后工程后,通过 YML 配置出自己需要的智能体,在结合业务场景做对应的衔接开发。 + +如果,你在思考把 YML 的配置表抽取到数据库中实现,那么就是另外一套项目[《DeepSeek RAG、MCP、Ai Agent 智能体》](https://t.zsxq.com/GwNZp) 通过前端页面拖拉拽的方式进行配置使用。感兴趣也可以扩展学习。 + +## 二、流程设计 + +如图,智能体配置表结构; + +++ +- 首先,一个智能体配置所需的最基本信息包括;应用名称、智能体描述、智能体模块,主要的组件类配置都在智能体模块下,AiApi 负责对接 AI 接口,ChatModel 负责模型创建(也会把 AiApi 对接),之后还要创建出 MCP 工具。 +- 之后,就是对于单一智能体(Agent)的构建,这里可以顺序的创建出很多的智能体,之后到 AgentWorkflow 进行编排,构建出一个完整的智能体。**这部分映射了【第2-2节:系统架构设计】中的流程设计以及 YML 设计** \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-4\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\347\273\223\346\236\204\345\214\226\345\256\232\344\271\211.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-4\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\347\273\223\346\236\204\345\214\226\345\256\232\344\271\211.md" new file mode 100644 index 000000000..c37aec914 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-4\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\347\273\223\346\236\204\345\214\226\345\256\232\344\271\211.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第2-4节:装配域结构化定义 +pay: https://t.zsxq.com/pwR4K +--- + +# 《AI Agent 脚手架》第2-4节:装配域结构化定义 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/3GFbQ](https://t.zsxq.com/3GFbQ) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过`单一职责`、`规则树(组合模式)`、`工厂`、`上下文对象`、`泛型`等设计模式手段,结合领域驱动设计思想,定义智能体装配服务结构。 + +## 二、流程设计 + +如图,智能体装配结构设计; + +++ +- 首先,最上面的是规则树(组合模式)的设计模块框架,用于各项节点流转实现,如;RootNode、AiApiNode、ChatModelNode 等。 +- 之后,定义了单一职责的 IArmoryService 装配服务接口,并通过工厂管理节点衔接服务,以及定义上下文对象。这个上下文对象,会在各个节点间记录数据并流转使用。 + +> 本节小傅哥先带着大家把功能实现框架结构定义出来,让大家厘清关于这样的框架结构设计(这是一个非常通用的手段)。之后在进行各个节点的编码实现。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-5\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AiApiNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-5\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AiApiNode.md" new file mode 100644 index 000000000..b46113981 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-5\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AiApiNode.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第2-5节:装配域节点-AiApiNode +pay: https://t.zsxq.com/wetnI +--- + +# 《AI Agent 脚手架》第2-5节:装配域节点-AiApiNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/D3LGP](https://t.zsxq.com/D3LGP) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +从本节装配 AI Agent 智能体各个节点开始,每一节都只负责一小部分独立内容的实现,方便大家可以在回顾的时候,直接找到对应章节进行查看。 + +这一节装配第一个节点 AiApiNode,它的目的是和 AI 接口,建立请求连接。 + +## 二、流程设计 + +如图,智能体装配中 AiApiNode 部分; + +++ +AiApiNode 节点的装配,使用的是 Spring AI 框架提供的构建方法。在咱们课程前面也讲解过 LangChain4j,后面如果你想锻炼,也可以更换下,完全都是可以到 Agent 装配的时候做兼容的。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-6\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-ChatModelNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-6\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-ChatModelNode.md" new file mode 100644 index 000000000..b738c7cc5 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-6\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-ChatModelNode.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第2-6节:装配域节点-ChatModelNode +pay: https://t.zsxq.com/mnTej +--- + +# 《AI Agent 脚手架》第2-6节:装配域节点-ChatModelNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/X0HRO](https://t.zsxq.com/X0HRO) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +这一节从 AiApiNode 节点流转 ChatModelNode 模型对话节点的实例化操作,以及实现 ChatModelNode 装配操作。 + +## 二、流程设计 + +如图,智能体装配中 ChatModelNode 部分; + +++ +- 首先,这一个节点是从 AiApiNode 处理完流程,流转过来的节点。节点的流转是在 doApply 处理完成后,执行 router 路由方法。路由方法会调用当前实现类的 get 方法,获取下一个要执行节点。通过这样的方式分离逻辑区和流转区,可以让代码更好维护。 +- 之后,到了 ChatModelNode 使用 Spring AI 处理模型构建。构建前还需要从上下文获取 AiApiNode 中关于 OpenAiApi 实例化对象,用于填充到 ChatModel 实例化中。 +- 此外,ChatModelNode 还要构建关于 MCP 的构建,这里是把 MCP 填充到模型中使用,这一套都是基于 Spring AI 框架处理的。当然,除了可以使用 Spring AI 也可以使用 langchain4j、google adk 来处理关于 mcp 的部分。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-7\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AgentNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-7\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AgentNode.md" new file mode 100644 index 000000000..9d5236a05 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-7\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AgentNode.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第2-7节:装配域节点-AgentNode +pay: https://t.zsxq.com/908Fo +--- + +# 《AI Agent 脚手架》第2-7节:装配域节点-AgentNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/PFBNl](https://t.zsxq.com/PFBNl) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +这一节从 ChatModelNode 节点流转 AgentNode 节点,做智能体 LlmAgent 的实例化操作,以及实现 AgentNode 装配操作。 + +## 二、流程设计 + +如图,智能体装配中,AgentNode 部分; + +++ +- 首先,AgentNode 节点是由 ChatModelNode 节点流转过来的,每个节点的流转都是类似的操作,处理完业务功能后,则路由到下一个节点继续完成其他业务。 +- 之后,AgentNode 是一个多 LlmAgent 装配的过程,我们在配置智能体的时候,有一些复杂的场景则要多个 LlmAgent 分别做不同的事情,来完成一个整体的流程。所以这类的智能体是多个 LlmAgent 配置。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-8\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AgentWorkflowNode.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-8\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AgentWorkflowNode.md" new file mode 100644 index 000000000..60bf9e157 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-8\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-AgentWorkflowNode.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第2-8节:装配域节点-AgentWorkflowNode +pay: https://t.zsxq.com/3mjk1 +--- + +# 《AI Agent 脚手架》第2-8节:装配域节点-AgentWorkflowNode + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/3EdmN](https://t.zsxq.com/3EdmN) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在 AiApi、ChatModel、Agent 装配完成后,接下来要进入到智能体工作流编排的操作了,他们的组合可能是 LoopAgent 把几个 LlmAgent 作为子 Agent,也有可能是 ParallelAgent 把几个 LlmAgent 作为并行,最后又会被 SequentialAgent 串行使用。 + +正是因为这块能有多重组合,所以,我们才需要有一个流转判断器的节点,让这些节点的执行可以串联起来。 + +## 二、流程设计 + +如图,智能体装配中,AgentWorkflowNode 部分; + +++ +- 首先,这一节重点设计关于 AgentWorkflowNode 到其他3个节点节点的流转操作,包括;LoopAgent、ParallelAgentNode、SequentialAgentNode,并最终由 SequentialAgentNode 作为结束,也就是最后是一个序列化的执行。 +- 注意,LoopAgent、ParallelAgentNode、SequentialAgentNode 这三个节点,本节只关注他们的流转操作,后续在做具体的节点功能实现。 +- 另外,还有一种可能,就是单一智能体 LlmAgent 直接作为结束,没有配置 SequentialAgentNode 包装一层序列化执行,后续在扩展这部分。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-9\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-Loop\343\200\201Parallel\343\200\201Sequential.md" "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-9\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-Loop\343\200\201Parallel\343\200\201Sequential.md" new file mode 100644 index 000000000..4c8f4ef6a --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-2/\347\254\2542-9\350\212\202\357\274\232\350\243\205\351\205\215\345\237\237\350\212\202\347\202\271-Loop\343\200\201Parallel\343\200\201Sequential.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第2-9节:装配域节点-Loop、Parallel、Sequential +pay: https://t.zsxq.com/t29lj +--- + +# 《AI Agent 脚手架》第2-9节:装配域节点-Loop、Parallel、Sequential + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/6NKGA](https://t.zsxq.com/6NKGA) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +从 AgentWorkflowNode 开始,要进入 LoopAgent、ParallelAgent、SequentialAgent,这几个节点都是类似的,我们一起来处理下。 + +## 二、流程设计 + +如图,智能体装配中,LoopAgentNode、ParallelAgentNode、SequentialAgentNode 部分; + +++ +- LoopAgentNode - 处理循环操作,如一个用户请求,要进行分析、执行、检测,也可以是一段git提交的代码,进行 diff 获取差异,检索代码匹配召回、做出执行review计划,后面在依次执行分析。这些都是可以做循环处理的。 +- ParallelAgentNode - 处理并行操作,如我们有一些场景,需要同步并行的一起完成数据处理任务,多条链路一起完成数据的获取、分析和决策,这样可以对复杂的流程显著的提高执行效率。 +- SequentialAgentNode - 处理串行操作,主要用于编排子智能体,和 loop 循环、parallel 并行,组合出复杂的智能体流程。当然,你也可以使用 loop 组合 sequence 或者 parallel 等处理过程。 diff --git "a/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-1\350\212\202\357\274\232Maven\350\204\232\346\211\213\346\236\266\351\205\215\347\275\256.md" "b/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-1\350\212\202\357\274\232Maven\350\204\232\346\211\213\346\236\266\351\205\215\347\275\256.md" new file mode 100644 index 000000000..d21e779af --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-1\350\212\202\357\274\232Maven\350\204\232\346\211\213\346\236\266\351\205\215\347\275\256.md" @@ -0,0 +1,34 @@ +--- +title: 【更】第3-1节:Maven脚手架配置 +pay: https://t.zsxq.com/jnqmk +--- + +# 《AI Agent 脚手架》第3-1节:Maven脚手架配置 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/EwCTb](https://t.zsxq.com/EwCTb) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +对 ai-agent-scaffold 脚手架工程配置 maven-archetype-plugin,生成工程脚手架。以及通过命令使用脚手架(jar)创建出新的工程。 + +脚手架的目的就在于此,我们使用一套通用的代码,按照不同的工程使用新的工程名、包名、版本,来构建一套具有相同基础能力的新的项目。 + +简单来说,maven-archetype-plugin 是 Maven 世界里的“项目模板生成器”。 + +如果把开发一个项目比作盖房子,这个插件的作用就是为你提供一套图纸和预制框架。你不需要每次都从零开始挖地基、垒砖头,只需要选好模板,它就会自动帮你把标准的目录结构和基础配置(pom.xml)搭建好。 + +## 二、流程设计 + +如图,从工程使用 maven 构建脚手架到使用的过程; + +++ +- 左侧,对现有工程使用 maven-archetype-plugin 插件,构建工程脚手架。将当前的工程打包成一个可复用的 Archetype 模板。 +- 中间,打包好的脚手架,可以在本地直接使用,也可以发布jar到私服,让大家都可以使用。私服部分,后续在做处理。 +- 右侧,使用方可以基于命令,或者 IntelliJ IDEA 配置 Maven 脚手架的方式,创建和启动工程。这一节,我们先通过命令的方式使用。 diff --git "a/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-2\350\212\202\357\274\232\344\270\212\344\274\240jar\345\210\260maven\344\273\223\345\272\223.md" "b/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-2\350\212\202\357\274\232\344\270\212\344\274\240jar\345\210\260maven\344\273\223\345\272\223.md" new file mode 100644 index 000000000..6f3bb6717 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-2\350\212\202\357\274\232\344\270\212\344\274\240jar\345\210\260maven\344\273\223\345\272\223.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-2节:上传jar到maven仓库 +pay: https://t.zsxq.com/GHNso +--- + +# 《AI Agent 脚手架》第3-2节:上传jar到maven仓库 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/6xBLn](https://t.zsxq.com/6xBLn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +发布脚手架工程 Jar 包到阿里云 Maven 私有制品库。 + +在公司里,这块的目的在于,我们设计一款通用的脚手架,让公司里的伙伴都可以使用。那么公司里会把这样的脚手架jar,推送到公司内的私服仓库,之后公司内的用户配置了私服 Maven 地址,就可以使用了。 + +注意,可以检索下 Maven 私服搭建,面试也可能会问,企业里应该怎么做。 + +## 二、流程设计 + +如图,把 jar 发布到 maven 私服仓库; + +++ +- 在整个大流程中,我们要上传jar到maven私服仓库,这部分阿里云有提供,可以申请使用。另外,可以尝试检索下 Maven 私服搭建和使用。 +- 这一部分会使用到 IntelliJ IDEA Maven Deploy + Maven Settings.xml 配置阿里云私服。 diff --git "a/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-3\350\212\202\357\274\232\351\203\250\347\275\262\350\204\232\346\211\213\346\236\266\347\275\221\351\241\265.md" "b/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-3\350\212\202\357\274\232\351\203\250\347\275\262\350\204\232\346\211\213\346\236\266\347\275\221\351\241\265.md" new file mode 100644 index 000000000..023a3d9ba --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-3/\347\254\2543-3\350\212\202\357\274\232\351\203\250\347\275\262\350\204\232\346\211\213\346\236\266\347\275\221\351\241\265.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-3节:部署脚手架网页 +pay: https://t.zsxq.com/J3YHa +--- + +# 《AI Agent 脚手架》第3-3节:部署脚手架网页 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/UBTWu](https://t.zsxq.com/UBTWu) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过 Nginx 部署网页,把 archetype-catalog.xml 放到网页文件夹下,以便于可以通过 http 配置地址,使用脚手架。 + +这样做的目的,是为了提供一个公用的地址,让所有的用户配置地址后,都可以使用这套脚手架。 + +## 二、流程设计 + +如图,部署网页版后用户使用流程; + +++ +- 当你打开 [https://repo.maven.apache.org/maven2/]([https://repo.maven.apache.org/maven2/) 公用脚手架你会发现,在最后面有一个 `archetype-catalog.xml` 文件,也就是这个文件约定了可以使用的脚手架。那么我们就可以依次方式,配置一个自己的网页,在网页下放自己的 `archetype-catalog.xml` 文件,这样我们就可以使用自己实现的脚手架了。 +- 当我们把脚手架这样设计后,所有使用这个网页版的用户,就都可以直接配置使用了。注意使用的过程中,网页版的脚手架配置后,会拉取私服仓库的脚手架jar包。 diff --git "a/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-0\350\212\202\357\274\232ai + draw.io \344\272\247\345\223\201\350\256\276\350\256\241.md" "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-0\350\212\202\357\274\232ai + draw.io \344\272\247\345\223\201\350\256\276\350\256\241.md" new file mode 100644 index 000000000..21afc1d5b --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-0\350\212\202\357\274\232ai + draw.io \344\272\247\345\223\201\350\256\276\350\256\241.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第4-0节:ai + draw.io 产品设计 +pay: https://t.zsxq.com/AAwjy +--- + +# 《AI Agent 场景应用 - ai draw.io》第4-0节:ai + draw.io 产品设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/035hj](https://t.zsxq.com/035hj) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +基于 AI Agent 智能体脚手架,在 draw.io 场景,使用 react 开发一套 ai + draw.io 智能绘图功能场景。 + +当前章节的这套场景功能会比较轻量,不会结合toc用户诉求。但当你越来越多的熟练星球的各个项目以后,你可以在 ai + draw.io 的功能上,添加公众号扫码登录、微信支付购买使用额度 + 拼团购买、数据库记录个人绘图信息、分享绘图数据在统一平台、其他用户可以查看和收藏,以及使用后有抽奖、积分、兑换营销能力等。这些功能在星球的其他项目都有体现,可以陆续学习后扩展补充。 + +## 二、产品效果 + +如图,ai + draw.io 使用 ai agent 脚手架,所能实现的效果; + +++ +- 首先,需要结合 [react-drawio](https://github.com/marcveens/react-drawio) 插件,把 draw.io 嵌入到 react 程序里。在 react-drawio 的插件里,提供了相关的 API 操作,这可以让我们把 ai 生成的 xml 文件,让 draw.io 渲染出来。也可以读取到 draw.io 上的内容,再发给 ai 进行分析和调整。 +- 之后,是 ai agent 脚手架开发的程序,编写智能体提示词,让其可以以 xml 的格式返回。当然这部分也可以做一些限定,比如返回的数据是一个带有类型和内容的对象,如果类型 type 是对话,那么可以进行多次交流,如果返回类型是 xml,那么则直接渲染。目前的案例程序,会先直接返回 xml 直接渲染进来。 +- 最后,我们做这类内容,我们先有一个简单的清晰的流程和实现方案,能把整个流程串联起来。当你做的透彻以后,就可以继续扩展迭代功能了。 diff --git "a/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-1\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\345\267\245\347\250\213\346\220\255\345\273\272.md" "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-1\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\345\267\245\347\250\213\346\220\255\345\273\272.md" new file mode 100644 index 000000000..48d967c17 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-1\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\345\267\245\347\250\213\346\220\255\345\273\272.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第4-1节:初始化工程搭建 +pay: https://t.zsxq.com/PDeYZ +--- + +# 《AI Agent 场景应用 - ai draw.io》第4-1节:初始化工程搭建 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/KiliX](https://t.zsxq.com/KiliX) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +初始化搭建 ai draw.io 前端工程,因为 draw.io 的开发插件是 React 语言的,所以我们也要基于 React 语言构建工程。 + +>这部分前端的内容,会使用即可。如果感兴趣,也可以在 TypeScript 官网学习下,它的语言结构也比较清晰,甚至和我们学习的 Java 是有类似的地方的。 + +本节初始化工程搭建开发后,就可以基于 AI IDE 工具,来完成后续的开发了。这部分对后端程序员是比较友好的。当然找工作,一般后端岗位是不会问前端的,所以你可以仅仅是当做使用即可。 + +## 二、开发环境 + +- Node.js v20+ - [https://nodejs.org/zh-cn](https://nodejs.org/zh-cn) - 下载安装即可。 +- WebStorm 2023.1 - 因为自带了开发前端的工具,所以非常好用。星球课程入口,编程环境,软件下载。里面提供了安装包。地址:[https://drive.weixin.qq.com/s?k=ACMA4AfQABU0svnJ27](https://drive.weixin.qq.com/s?k=ACMA4AfQABU0svnJ27) +- 源地址设置;`npm config set registry https://registry.npmmirror.com` - 安装好环境后,设置下源地址。否则在后面构建项目会很慢。 +- TypeScript01:[https://www.runoob.com/typescript/ts-tutorial.html](https://www.runoob.com/typescript/ts-tutorial.html) - 课程资料,简单的菜鸟入门教程。学习之后也能看懂 TypeScript 代码。所有的面向对象语言代码,基本是通用的。 +- TypeScript02:[https://typescript.bootcss.com/namespaces.html](https://typescript.bootcss.com/namespaces.html) - 课程资料,简单的菜鸟入门教程。学习之后也能看懂 TypeScript 代码。所有的面向对象语言代码,基本是通用的。 diff --git "a/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-2\350\212\202\357\274\232\345\234\250\351\241\265\351\235\242\345\265\214\345\205\245draw.io\347\273\204\344\273\266\345\222\214\345\257\271\350\257\235\346\241\206.md" "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-2\350\212\202\357\274\232\345\234\250\351\241\265\351\235\242\345\265\214\345\205\245draw.io\347\273\204\344\273\266\345\222\214\345\257\271\350\257\235\346\241\206.md" new file mode 100644 index 000000000..98b916dcc --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-2\350\212\202\357\274\232\345\234\250\351\241\265\351\235\242\345\265\214\345\205\245draw.io\347\273\204\344\273\266\345\222\214\345\257\271\350\257\235\346\241\206.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第4-2节:在页面嵌入draw.io组件和对话框 +pay: https://t.zsxq.com/JoT4f +--- + +# 《AI Agent 场景应用 - ai draw.io》第4-2节:在页面嵌入draw.io组件和对话框 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wtWx6](https://t.zsxq.com/wtWx6) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在 React 前端工程中,嵌入 draw.io 组件。以及在整个页面的右侧放入一个对话框,用于后续与服务端的 ai 接口进行对话。 + +这部分的实现,会使用到 ai ide 工具来处理,你常用的任何一款工具都可以。 + +## 二、流程设计 + +如图,前端页面交互的流程设计; + +++ +- 这是一个简单的交互,引入 react-drawio 到初始页面,并在右侧设置一个对话框。 diff --git "a/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-3\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223API\346\216\245\345\217\243\345\257\271\346\216\245.md" "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-3\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223API\346\216\245\345\217\243\345\257\271\346\216\245.md" new file mode 100644 index 000000000..0edb53933 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-3\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223API\346\216\245\345\217\243\345\257\271\346\216\245.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第4-3节:智能体API接口对接 +pay: https://t.zsxq.com/hrQVL +--- + +# 《AI Agent 场景应用 - ai draw.io》第4-3节:智能体API接口对接 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/RnvaG](https://t.zsxq.com/RnvaG) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过脚手架创建 AI Agent 智能体服务端工程,并配置用于绘制 draw.io 流程图的专属提示词。之后在前端工程对接智能体 API 服务接口,包括;创建会话 SessionID、调用对话接口进行绘图(这部分会限制智能体以 drawio 格式返回结果)。 + +## 二、流程设计 + +如图,前端页面与服务端交互的UML流程设计; + +++ +- 首先,从用户发起,打开页面开始,则从服务端的智能体列表加载接口,返回智能体列表。 +- 之后,选择智能体进行对话,这个过程要先创建会话ID。也就是所有的本次的交互,会有一个会话ID进行,这样在对话的过程中会记录上下文,输出的结果也会更加准确。 +- 最后,服务端返回智能体结果,是以 draw.io xml 的方式的方式返回的,之后渲染到 draw.io 面板上。 diff --git "a/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-4\350\212\202\357\274\232AI+\347\224\250\346\210\267+DrawIO\357\274\214\344\272\244\344\272\222\345\274\217\347\224\273\345\233\276.md" "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-4\350\212\202\357\274\232AI+\347\224\250\346\210\267+DrawIO\357\274\214\344\272\244\344\272\222\345\274\217\347\224\273\345\233\276.md" new file mode 100644 index 000000000..ed9ecd276 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-4\350\212\202\357\274\232AI+\347\224\250\346\210\267+DrawIO\357\274\214\344\272\244\344\272\222\345\274\217\347\224\273\345\233\276.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第4-4节:AI+用户+DrawIO,交互式画图 +pay: https://t.zsxq.com/BLDCn +--- + +# 《AI Agent 场景应用 - ai draw.io》第4-4节:AI+用户+DrawIO,交互式画图 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[待更新](#) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +增强服务端 ai agent 智能体配置,以分析,绘制,检查的流程处理 draw.io 的图的制作,如果用户信息不准确的时候,则返回给前端让用户补全信息。 + +此外,对于前端的使用也做一些优化处理,包括;增加对话列表页、保存用户绘图信息到浏览器、交互式完成绘图操作、提供案例绘图、携带历史绘图等。 + +## 二、流程设计 + +如图,AI 交互式绘图流程设计; + +++ +- 首先,第一个改造点是服务端的智能体流程配置,让 ai agent 对用户的请求进行分析、绘制、检查,如果用户提供的信息不全则让用户继续补充,如果全面则可以直接绘制。那么这个时候,就要给前端返回一个 json 结构,并按照不同的类型返回数据。 +- 之后,因为服务端智能体返回的不再是一个 draw.io 的 xml,所以要对 agent 智能体返回的结果,进行序列化成对象,再返回给前端。前端拿到结果后要对不同的类型的结果,反馈给用户(user)、渲染到 draw.io 页面(xml)。 +- 此外,除了结果的渲染,对前端的对话操作,增加一个历史记录页,保存 draw.io 的绘图内容到浏览器里。这样刷新页面也可以看到历史的画图。 +- 注意,你还可以再此基础上,增加更多的功能。如,学习了星球里的小型支付,那么可以把扫码登录、支付购买额度,对接进来。也可以把大营销的积分,兑换,抽奖对接进来。这些内容,都是可以衔接起来的。 diff --git "a/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-5\350\212\202\357\274\232ai-draw-io\357\274\214\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262.md" "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-5\350\212\202\357\274\232ai-draw-io\357\274\214\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262.md" new file mode 100644 index 000000000..25002cfd5 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-4/\347\254\2544-5\350\212\202\357\274\232ai-draw-io\357\274\214\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262.md" @@ -0,0 +1,34 @@ +--- +title: 【更】第4-5节:ai-draw-io,云服务器部署 +pay: https://t.zsxq.com/5h1K1 +--- + +# 《AI Agent 场景应用 - ai draw.io》第4-5节:ai-draw-io,云服务器部署 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/UaVxl](https://t.zsxq.com/UaVxl) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在云服务器(2c4g)部署 ai-draw-io 前后端项目,后端提供智能体能力,前端提供绘图操作。本次构建的镜像,小傅哥提供了动态更换前端访问服务的IP配置,在不进行构建镜像时,也可以直接使用。 + +>注意,ai-draw-io 绘图操作,模型配置的越好,效果也越好。gpt-5.1 比 gpt-4.1 绘制的效果更好。 + +## 二、部署过程 + +如图,部署过程步骤流程; + +++ +- 首先,你需要一台2c4g云服务器(安装 Ubuntu 24),推荐购买 [https://618.gaga.plus](https://618.gaga.plus) - 腾讯云暂时有买1年送3个月,可以配和 [https://bugstack.cn/md/road-map/ssl-httpsok.html](https://bugstack.cn/md/road-map/ssl-httpsok.html) 申请免费 ssl(自动续期)适合后续有域名的时候使用。 +- 之后,在你购买了一台云服务器后,你可以使用小傅哥提供的一键安装脚本,把云服务器部署好 Docker 环境 + Portainer 管理面板。安装脚本:[https://gitcode.com/Yao__Shun__Yu/xfg-dev-tech-docker-install](https://gitcode.com/Yao__Shun__Yu/xfg-dev-tech-docker-install) +- 然后,这里还有项目的部署教程,这里是小傅哥录制好的视频,教你如何部署项目。教程:[https://t.zsxq.com/iDuCt](https://t.zsxq.com/iDuCt) - `你可以做为补充学习,本课程也会带着你部署项目。` +- 另外,这里还有一个本地对项目构建好镜像后推送到阿里云docker镜像库,方便大家上传和拉取。其实也可以推送到官网 docker hub,但会需要代理。教程(阿里云docker镜像使用):[https://t.zsxq.com/XdoWr](https://t.zsxq.com/XdoWr) 阿里云镜像库地址:[https://cr.console.aliyun.com/cn-hangzhou/instance/credentials](https://cr.console.aliyun.com/cn-hangzhou/instance/credentials) +- 注意,提前在云服务器安全组开放端口;`9000-docker 管理面板`、`8091-后端接口`、`3000-前端页面` + +> 综上,所有的云服务器操作,在星球「码农会锁」都提供好了学习教程,可以参考总地址:[https://t.zsxq.com/19osWS4qj](https://t.zsxq.com/19osWS4qj) diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-1\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\345\267\245\347\250\213\346\220\255\345\273\272.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-1\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\345\267\245\347\250\213\346\220\255\345\273\272.md" new file mode 100644 index 000000000..783ab8a03 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-1\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\345\267\245\347\250\213\346\220\255\345\273\272.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第5-1节:初始化工程搭建 +pay: https://t.zsxq.com/ELrPx +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-1节:初始化工程搭建 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/dx4wS](https://t.zsxq.com/dx4wS) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +本节初始搭建 MobileOpenClaw - `智能体手机`,服务端工程和安卓网关工程。服务端基于 AI Agent Scaffold 脚手架创建,用于智能体决策部分。安卓作为网关终端,设计接收智能体下发的指令,以及完成一些列动作,如;`启动应用`、`点击指定坐标`、`输入文本`、`滑动屏幕`、`长按`、`双击`、`请求人工接管(登录/验证码)`等。 + +++ +> 整个 MobileOpenClaw - 智能体手机,使用的是`安卓`开发的手机端 apk 应用,它可以拿到更高的权限,方便做工程开发测试。 + +## 二、开发环境 + +- JDK 17、Maven 3.8.x、SpringBoot 3.4.3 ~ 4.1.0-M1、Spring AI 1.1.0-M3 ~ 2.0.0-M2、Google ADK +- IntelliJ IDEA CE 2023+ +- Android Studio - 官网(下载):[https://developer.android.com/studio?hl=zh-cn#get-android-studio](https://developer.android.com/studio?hl=zh-cn#get-android-studio) 星球(下载):[https://t.zsxq.com/19Rnk98M0](https://t.zsxq.com/19Rnk98M0) `首次安装时间会比较长` diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-2\350\212\202\357\274\232\346\211\213\346\234\272\347\275\221\345\205\263\345\212\250\344\275\234\350\260\203\345\272\246\350\256\276\350\256\241.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-2\350\212\202\357\274\232\346\211\213\346\234\272\347\275\221\345\205\263\345\212\250\344\275\234\350\260\203\345\272\246\350\256\276\350\256\241.md" new file mode 100644 index 000000000..14bc1e690 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-2\350\212\202\357\274\232\346\211\213\346\234\272\347\275\221\345\205\263\345\212\250\344\275\234\350\260\203\345\272\246\350\256\276\350\256\241.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第5-2节:手机网关动作调度设计 +pay: https://t.zsxq.com/ELrPx +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-2节:手机网关动作调度设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/GdwGE](https://t.zsxq.com/GdwGE) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +初步设计安卓手机端网关服务,通过接收指令,完成一系列动作调度。动作调度指令,由服务端开启一个 socket server,之后由手机端 socket client 连接,并接收指令驱动手机动作。包括;打开、点击、首屏、截图、输入等。 + +后续这套网关调度,由AI Agent 智能体根据用户的诉求,在一些列规划分析后,指令下达。让手机端完成用户诉求。 + +## 二、流程设计 + +如图,通信设备网关调度指令设计; + +++ +- 首先,核心的内容是右侧的安卓端,开发一系列控制手机设备的指令动作。之后这些指令动作由 socket 客户端接收 socket 服务端下发的指令完成操作。这里的想法也就是让手机端成为一个指令执行器,具体操作都是由服务端控制,这样就可以满足后续 AI 操作手机的目的。 +- 之后,本节的服务端是编写一个 Socket Server 的测试代码,让手机端连接,之后由服务端下发指令进行测试验证。 diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-3\350\212\202\357\274\232\346\234\215\345\212\241\347\253\257\347\275\221\347\273\234\351\200\232\344\277\241\350\256\276\350\256\241(Netty).md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-3\350\212\202\357\274\232\346\234\215\345\212\241\347\253\257\347\275\221\347\273\234\351\200\232\344\277\241\350\256\276\350\256\241(Netty).md" new file mode 100644 index 000000000..e1956f74a --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-3\350\212\202\357\274\232\346\234\215\345\212\241\347\253\257\347\275\221\347\273\234\351\200\232\344\277\241\350\256\276\350\256\241(Netty).md" @@ -0,0 +1,31 @@ +--- +title: 【更】第5-3节:服务端网络通信设计(Netty) +pay: https://t.zsxq.com/IB8jJ +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-3节:服务端网络通信设计(Netty) + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/UUvY7](https://t.zsxq.com/UUvY7) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +引入 Netty 框架,设计服务端 Socket Server 通信模型 + Future 等待响应方式获取客户端(手机)反馈结果。 + +这样设计的目的就是为了整个流程设计,从用户端发起请求,到后续章节AI分析决策产生指令,再通过 Socket 服务下发到手机端完成一些列的操作动作。 + +## 二、流程设计 + +如图,从服务端下发指令到客户端(手机)的流程设计; + +++ +- 首先,要为整个通信设计一个 Socket 通信模型,以便于服务端和客户端,保持信息数据交互。那么这里在领域层添加了一套 MobileClawService 的服务。 +- 之后,整个通信服务的处理,是由基础设施层完成的,发送给手机端指令后,还需要一个等待,用于达到同步响应的效果。否则 socket 通信是异步的,再从其他入口返回来就不好处理了。 + +> 关于 Netty 这里有一些基础案例教程可以学习[《Netty 基础教程》](https://bugstack.cn/md/netty/base/2019-07-30-netty%E6%A1%88%E4%BE%8B%EF%BC%8Cnetty4.1%E5%9F%BA%E7%A1%80%E5%85%A5%E9%97%A8%E7%AF%87%E9%9B%B6%E3%80%8A%E5%88%9D%E5%85%A5JavaIO%E4%B9%8B%E9%97%A8BIO%E3%80%81NIO%E3%80%81AIO%E5%AE%9E%E6%88%98%E7%BB%83%E4%B9%A0%E3%80%8B.html) diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-4\350\212\202\357\274\232\345\210\235\346\255\245\351\200\232\350\277\207\346\231\272\350\203\275\344\275\223\357\274\214\346\223\215\344\275\234\346\211\213\346\234\272\350\256\276\345\244\207.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-4\350\212\202\357\274\232\345\210\235\346\255\245\351\200\232\350\277\207\346\231\272\350\203\275\344\275\223\357\274\214\346\223\215\344\275\234\346\211\213\346\234\272\350\256\276\345\244\207.md" new file mode 100644 index 000000000..2fbee856a --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-4\350\212\202\357\274\232\345\210\235\346\255\245\351\200\232\350\277\207\346\231\272\350\203\275\344\275\223\357\274\214\346\223\215\344\275\234\346\211\213\346\234\272\350\256\276\345\244\207.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第5-4节:初步通过智能体,操作手机设备 +pay: https://t.zsxq.com/O4m6n +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-4节:初步通过智能体,操作手机设备 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/dqpLb](https://t.zsxq.com/dqpLb) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +初步配置 AI Agent 智能体,分析用户意图,操作手机使用。以及搭配前端操作页面,实时渲染手机当前屏幕最新结果。让用户可以可视化的方式看到手机的动作变化。 + +>可扩展点;将来你可以在智能体功能上对接微信公众号,通过手机端微信通过文字或者语音的方式,操作这台放在家中手机设备完成一些任务的处理。 + +## 二、流程设计 + +如图,从前端用户请求 -> 智能体意图分析和执行 -> 安卓设备指令应答,流程设计; + +++ +- 首先,我们先来初步的添加一个智能体配置,以及提供一个页面来串联从用户发起到智能体分析、决策、执行,再传递指令给安卓端的一个操作流程。 +- 之后,整个智能体的操作(轮训处理和拿到决策结果),目前先直接放到 trigger 里执行,后续在细化拆分到编排层。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-5\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\267\245\344\275\234\346\265\201\350\256\276\350\256\241.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-5\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\267\245\344\275\234\346\265\201\350\256\276\350\256\241.md" new file mode 100644 index 000000000..c05931c0b --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-5\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\267\245\344\275\234\346\265\201\350\256\276\350\256\241.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第5-5节:智能体工作流设计 +pay: https://t.zsxq.com/v7M6t +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-5节:智能体工作流设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/dqpLb](https://t.zsxq.com/dqpLb) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过增加 case 层,分摊 trigger 触发器层,对智能体接口(`AgentServiceController#chat`)流程实现中的复杂逻辑处理。这种设计手段,在复杂的业务流程工程实现里是非常场景,我们经过会通过包的职责,来划分功能单元,让整个结构在复杂业务的迭代中,可以保持易于扩展和维护。 + +## 二、流程设计 + +如图,从 trigger 触发器层的功能实现到 case 编排层的设计; + +++ +- 首先,一个大的方向,是把图中,上部分 5-4节中的 trigger 内实现的流程,迁移到 5-5 节中 编排层进行处理。以此降低 trigger 层的逻辑功能复杂度。 +- 之后,通过编排逻辑模块,按照功能职责划分不同的类,来实现各个功能逻辑。也就是以前一堆的编排,拆分出不同的逻辑单元,以后看到类就能知道它在做什么。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-6\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\274\202\346\255\245\345\223\215\345\272\224\345\261\225\347\244\272\346\211\247\350\241\214\350\277\207\347\250\213.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-6\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\274\202\346\255\245\345\223\215\345\272\224\345\261\225\347\244\272\346\211\247\350\241\214\350\277\207\347\250\213.md" new file mode 100644 index 000000000..79126b0a7 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-6\350\212\202\357\274\232\346\231\272\350\203\275\344\275\223\345\274\202\346\255\245\345\223\215\345\272\224\345\261\225\347\244\272\346\211\247\350\241\214\350\277\207\347\250\213.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第5-6节:异步结果响应 +pay: https://t.zsxq.com/PfpTF +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-6节:异步结果响应 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/l1RLL](https://t.zsxq.com/l1RLL) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +修改智能体对话(web控制手机)请求为异步响应式接口,实时反馈到用户端(web)当前的执行动作。那么,这里要把 `Response` 调整为 `ResponseBodyEmitter` + +>**`ResponseBodyEmitter`** 是 Spring Framework(具体来说是 Spring Web MVC)中用于处理异步 HTTP 请求的一个核心类。它的主要作用是**允许服务端在一个 HTTP 请求的生命周期内,异步地、多次向客户端发送数据**。 + +## 二、流程设计 + +如图,在智能体处理流程中添加 ResponseBodyEmitter 异步响应设计; + + ++ +- 在整个接口调用流程中,穿插进入 ResponseBodyEmitter 进行异步结果的响应处理。 +- 这部分没有逻辑的变动,只是把过程数据渲染回去。如果你还想有一些其他的渲染,也可以通过这样的方式处理。 \ No newline at end of file diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-7\350\212\202\357\274\232\344\275\277\347\224\250AutoGLM-Phone-9B\346\236\204\345\273\272\346\211\213\346\234\272\346\231\272\350\203\275\344\275\223.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-7\350\212\202\357\274\232\344\275\277\347\224\250AutoGLM-Phone-9B\346\236\204\345\273\272\346\211\213\346\234\272\346\231\272\350\203\275\344\275\223.md" new file mode 100644 index 000000000..d5f937f01 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-7\350\212\202\357\274\232\344\275\277\347\224\250AutoGLM-Phone-9B\346\236\204\345\273\272\346\211\213\346\234\272\346\231\272\350\203\275\344\275\223.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第5-7节:使用AutoGLM-Phone-9B构建手机智能体 +pay: https://t.zsxq.com/6qOqE +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-7节:使用AutoGLM-Phone-9B构建手机智能体 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/06kx8](https://t.zsxq.com/06kx8) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +引入智谱发布的 autoglm-phone-9b 专属模型,构建手机智能体。专属模型对手机上的内容操作有更为全面流程控制,比通用视觉模型在处理用户动作时会更加准确。目前这套模型可以使用官网(限时免费 [autoglm-phone](https://docs.bigmodel.cn/cn/guide/models/vlm/autoglm-phone)),也可以在 24G * 2 显卡[自己部署](https://bugstack.cn/md/algorithm/model/autoglm-phone-agent.html)。所以,如果你考虑的是将来在一些场景使用,成本相对也是很低的。 + +## 二、流程设计 + +如图,通过 autoglm-phone-9b 专属模型,构建手机智能体设计; + +++ +- 首先,我们把之前的通用模型的实现,定义为 flow 我们要自己编写流程。把专属的手机模型定义为 auto,因为他提供了默认的一些专属特性,可以减少我们流程化上的操作。 +- 之后,对照来看,autoglm-phone-9b 模型,会为我们返回具体的手机的操作指令,如点击、打开、滑动、双击、回到主屏幕等。这部分内容在智谱官网访问也有说明 [AutoGLM-Phone](https://docs.bigmodel.cn/cn/guide/models/vlm/autoglm-phone) +- 那么,现在需要我们改动的内容,主要是围绕着特定官网的给的智能体 prompt 提示词,编写智能体处理过程,与网关通信完成一些列的流程操作。 diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-8\350\212\202\357\274\232\345\244\232\347\211\210\346\234\254\345\256\211\345\215\223\347\211\210\346\234\254\347\255\226\347\225\245\346\224\257\346\214\201.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-8\350\212\202\357\274\232\345\244\232\347\211\210\346\234\254\345\256\211\345\215\223\347\211\210\346\234\254\347\255\226\347\225\245\346\224\257\346\214\201.md" new file mode 100644 index 000000000..21d970242 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-8\350\212\202\357\274\232\345\244\232\347\211\210\346\234\254\345\256\211\345\215\223\347\211\210\346\234\254\347\255\226\347\225\245\346\224\257\346\214\201.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第5-8节:多版本安卓版本策略支持 +pay: https://t.zsxq.com/kpgKo +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-8节:多版本安卓版本策略支持 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/kpgKo](https://t.zsxq.com/kpgKo) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +安卓端的网关终端接收 AI Agent 智能体,通过 Socket 下发指令,完成一系列操作动作。但在一些安卓设备测试中发现,不同的版本安卓它的 API 也是有差异的,如低版本的截图方法在高版本中就没法支持。因此我们需要做一些策略化的处理,自动检测安卓版本,选择不同的 API 进行处理。 + +> 本节的代码调整主要在安卓端(Kotlin),这部分代码直接使用就可以。如果看了不少 Kotlin 语言,也可以编写实现。 + +## 二、流程设计 + +如图,关于安卓端的API策略设计; + +++ +- 首先,安卓网关终端的改动主要在于api策略这部分的处理,按照不同的 api 版本来处理。这部分是使用 AI IDE 工具实现的内容。AI 对于非业务的复杂串联的,开发单一工具的会比较容易。很适合有编程思维,但对某个类型的语言,没有太多开发的伙伴。 +- 另外,如果你有安卓设备测试,还可能还有一些其他截屏的限制,这部分后面还要引入录屏截取一帧的操作。 diff --git "a/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-9\350\212\202\357\274\232\344\274\232\350\257\235\344\270\212\344\270\213\346\226\207\347\273\206\345\214\226\345\244\204\347\220\206.md" "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-9\350\212\202\357\274\232\344\274\232\350\257\235\344\270\212\344\270\213\346\226\207\347\273\206\345\214\226\345\244\204\347\220\206.md" new file mode 100644 index 000000000..835785d82 --- /dev/null +++ "b/docs/md/project/ai-agent-scaffold/part-5/\347\254\2545-9\350\212\202\357\274\232\344\274\232\350\257\235\344\270\212\344\270\213\346\226\207\347\273\206\345\214\226\345\244\204\347\220\206.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第5-9节:会话上下文细化处理 +pay: https://t.zsxq.com/eSEVg +--- + +# 《AI Agent 场景应用 - MobileOpenClaw》第5-9节:会话上下文细化处理 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/kpgKo](https://t.zsxq.com/kpgKo) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +本章要解决2个场景问题;一个是智能体服务端,上下文对话内容超长报错。另外一个是安卓网关端,新版本的安卓API,会限制在隐藏当前app后对其他应用的截屏。 + +## 二、设计方案 + +### 1. 上下文超长 + +首先是 autoglm-phone 模型的上下文token限制 `You requested a total of 26891 tokens: 25867`,因此不能把过多的历史信息都在每次对话的发送给模型。 + +这里一种可以通过 `InMemoryMemoryService` 的方式,自己实现一个记忆上下文,每次只是记录用户请求和最后N条模型处理结果数据。 + +也可以使用另外一种方式是 `MySpringAI` 我们有在前面开发阶段自己实现了一个类,这个类会处理历史信息到模型请求里。因此可以从集合里遍历,拿到必要的信息来处理。 + +### 2. 录屏取一帧 + +鉴于测试验证中发现,不少新版安卓的设备,不限制在我们应用隐藏后,截图打开的应用的。因此这部分我们采用开启视频录制,之后在需要的时候,直接取一帧视频作为截图使用即可。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-0\350\212\202\357\274\232AiAgent \351\241\271\347\233\256\344\273\213\347\273\215\345\222\214\347\263\273\347\273\237\346\274\224\347\244\272.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-0\350\212\202\357\274\232AiAgent \351\241\271\347\233\256\344\273\213\347\273\215\345\222\214\347\263\273\347\273\237\346\274\224\347\244\272.md" new file mode 100644 index 000000000..a2309535b --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-0\350\212\202\357\274\232AiAgent \351\241\271\347\233\256\344\273\213\347\273\215\345\222\214\347\263\273\347\273\237\346\274\224\347\244\272.md" @@ -0,0 +1,124 @@ +--- +title: 【更】第3-0节:Ai Agent 项目介绍和系统演示 +lock: no +--- + +# 《Ai Agent》第3-0节:Ai Agent 项目介绍和系统演示 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/DcL2p](https://t.zsxq.com/DcL2p) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +**25年3月初**,小傅哥,带着大家开启了 DeepSeek RAG、MCP 项目,随后兴起 MCP 服务提供的热潮,包括;支付宝、百度、高德,等等大厂开启了 MCP 服务计划。直至现在,市面上已经有了场景非常丰富的 MCP 服务。**那些第一波跟着小傅哥学习的伙伴,早早的让简历上多了一笔 MCP 服务开发和使用的经验!** + +++ +**接下来,小傅哥将带着小伙伴,再往前多走一步!** + +RAG 教了,MCP 搞了,那么现在是时候,实现一套自动化的 Ai Agent 服务了。 + +如图,以通过数据库表动态配置的手段,完成相关物料的加载,包括;`模型(gpt-4.1/deepseek)`、`客户端`、`对话预设`、`执行规划(Planning)`、`顾问(记忆、RAG、日志)`、`工具(MCP`)等,在把单个 Client 串联,完成整个 Agent 调用链。这样一个 Agent 调用链可以以对话形式使用或通过 Agent 动态任务自动执行。 + ++
++ +这套项目,小傅哥为它干了`1.87万`行代码(前后端),`14张`数据库表,全程动态化构建模块 Bean 对象,预热装配 Agent 服务。达到随用随配,自主组建出想要的各类的 Agent 功能服务。就以现在的丰富的 MCP 市场来可以说是,广阔天地,大有可为!在这套项目架构下,可以扩展出非常多的东西。 + +接下来,小傅哥就给大家,细致的介绍下这套项目,以及截图演示运行效果。 + +> 🧧 文末提供了全套 AI、RAG、MCP、Agent 项目、开发教程以及工程源码。此外还有非常多的互联网大厂项目(17个),都可以一并获取学习。 + +## 一、项目演示 + +这套项目的功能非常强大,全部都以 Agent 方式进行通信。所有的 Agent 都可以动态化配置,解耦的非常强👍🏻。接下来,小傅哥给大家演示下使用效果。 + +### 1. 前端页面 + ++
++ +- 首先,我为智能对话体(MCP)配置了联网、CSDN自动发帖、文件操作服务。 +- 之后,我们可以通过预设的提示词模板,来调用对应的 MCP 服务,也可以多个 MCP 一起调用。如联网检索文章、生成解答,发布到论坛,在把文章名称记录到本地文件。这一系列操作都是可以的。 +- MCP 服务平台; + + - https://mcpfound.cc/ + - https://mcp.so/ + - https://sai.baidu.com/mcp + +> 结合知识库、MCP、提示词规划、上下文记忆,可以有非常多的场景可以玩。后续小傅哥还会继续分享可玩场景。 + +### 2. 后台页面 + +#### 2.1 配置智能体(动态预热) + ++
++ +#### 2.2 动态任务 + ++
++ +- 系统会自动的把任务加载到系统内执行,完成智能体的调用。 +- 有了这个操作,你配置好的智能体,他就可以连续24小时的工作了。除了自动发文章,你可以配置出各种东西。比如特朗普推特、黄金、股票价格,每天早上出一个文件,邮件方式推送给自己。兼职美滋滋。 + +#### 2.3 MCP管理 + ++
++ +- 市面上有非常的多的 MCP 服务,我们可以选择的这些服务来组装出我们的智能体。 +- 系统支持配置 stdio、sse,两种方式。无论是自己开发的 MCP 还是市面的都可以使用。(课程中有教大家,基于 Spring AI 怎么开发 MCP 服务) + +## 二、系统设计 + +### 1. 功能流程 + ++
++ +- 如图,从上往下,以任务或会话方式,调用 agent 为目标,串联各个 client。形成内部处理 a2a 流程。 +- 之后,对于 client 则由系统都动态的方式创建 bean 对象。运营在 ai agent 后台配置相关数据即可。 + +### 2. 库表设计 + ++
++ +如图,为整个系统对应的数据库表信息; + +- ai_agent_task_schedule,智能体任务调度配置表 +- ai_agent,AI智能体配置表 +- ai_agent_client,智能体-客户端关联表 +- ai_client,AI客户端配置表 +- 模型配置组;ai_client_model、ai_client_model_config、ai_client_model_tool_config +- 工具配置组;ai_client_tool_config、ai_client_tool_mcp +- 顾问配置组;ai_client_advisor、ai_client_advisor_config +- 提示词配置;ai_client_system_prompt、ai_client_system_prompt_config +- 知识库配置;ai_rag_order + +### 3. 系统工程 + ++
++ +- 如图,为整个系统的工程结构,分为 api、app、domain、infrastructure、trigger、types,六边形架构。(现在各个互联网都在落地 DDD,因为 DDD 比最早出来的几年,已经有了非常明确的规范)相关资料;[https://bugstack.cn/md/road-map/ddd-guide-01.html](https://bugstack.cn/md/road-map/ddd-guide-01.html) +- Domain 核心领域层,处理 Agent 的预热、对话、知识库、任务的操作。后续 Agent 相关都维护到这个领域包下。 +- Trigger 触发器层,负责对外提供接口,让外部来调用。当有一些纯 crud 操作的流程时,这个架构下,会在 trigger 层直接调用基础设施层提供数据,而不需要在经过 domain 领域层,重复封装对象。 + +**注意** ai-agent-station 全套代码,可以直接获取后学习(持续更新最新方案)。之后课程会单独起一个 ai-agent-station-study 工程,带着大家从0到1学习。 + diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-10\350\212\202\357\274\232Agent\346\211\247\350\241\214\351\223\276\350\267\257\345\210\206\346\236\220.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-10\350\212\202\357\274\232Agent\346\211\247\350\241\214\351\223\276\350\267\257\345\210\206\346\236\220.md" new file mode 100644 index 000000000..db231e6be --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-10\350\212\202\357\274\232Agent\346\211\247\350\241\214\351\223\276\350\267\257\345\210\206\346\236\220.md" @@ -0,0 +1,38 @@ +--- +title: 【更】第3-10节:Agent执行链路分析 +pay: https://t.zsxq.com/bxh8h +--- + +# 《Ai Agent》第3-10节:Agent执行链路分析 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/ty1Yy](https://t.zsxq.com/ty1Yy) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过现有实现的动态化构建 Ai API、Model、Client、Tool(MCP)、Advisor(记忆、RAG)、Prompt,完成 Ai Agent 服务处理。 + +最早 OpenAi 出来时,我们只是对 Ai 单向询问(含上下文记忆)和提供问题结果。后来开始有了 RAG 知识库,可以让我们每次的提问结合知识库获取更全面的内容。再到后来开始有了 MCP 服务协议,让 AI 具备了调用外部服务的能力。 + +那么,到这再往后开始有了 Ai Agent 的概念,也就是让 Ai 具备环境感知能力、自主决策并执行行动,直至完成最终的结果。 + +这也就是我们目前在使用一些 Ai Agent 的时候,进行一些问题提问的时候,他会根据环境(询问)状态制定行动计划,调用各种工具和API执行具体任务,并在多轮交互中维持上下文状态,输出最终的结果。这也是我们要做的事情。 + +鉴于,整个 Ai Agent 的复杂性,我们不能一上来就直接去编码,这样很多伙伴会比较晕。所以我们先来完成 Agent 单元测试,在结合我们动态实例化的各项服务,处理 Agent 循环制定行动计划和执行多轮会话。 + +## 二、流程设计 + +如图,不同方案实现的 Agent 流程; + +++ +Ai Agent 的处理过程也是分为几类的,用于适应不同的场景使用; + +1. 固定N个步骤,这类的一般是配置工作流的,提高任务执行的准确性。如,一些检索资料、发送帖子、处理通知等。 +2. 顺序循环调用,配置 Agent 要执行的多个 Client 端,以此顺序执行。适合一些简单的任务关系,并已经分配好的动作,类似于1的方式。 +3. 智能动态决策,这类是目前市面提供给大家使用的 Agent 比较常见的实现方式,它会动态的规划执行动作,完成行动步骤,观察执行结果,判断完成状态和步骤。并最终给出结果。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-11\350\212\202\357\274\232Agent\346\211\247\350\241\214\351\223\276\350\267\257\350\256\276\350\256\241.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-11\350\212\202\357\274\232Agent\346\211\247\350\241\214\351\223\276\350\267\257\350\256\276\350\256\241.md" new file mode 100644 index 000000000..ef358d38c --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-11\350\212\202\357\274\232Agent\346\211\247\350\241\214\351\223\276\350\267\257\350\256\276\350\256\241.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第3-11节:Agent执行链路设计 +pay: https://t.zsxq.com/eSLoH +--- + +# 《Ai Agent》第3-11节:Agent执行链路设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/hNFqE](https://t.zsxq.com/hNFqE) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +将上一节对 Ai Agent 执行链路的分析,以及对应的 AutoAgentTest 测试代码,使用规则树设计可执行链路节点。 + +本节是其中的一个 Ai Agent Auto 自动执行策略,后续还要把其他的 Ai Agent 执行策略也加入进来实现。 + +## 二、流程设计 + +如图,Auto Ai Agent 动态多轮会话执行流程图; + +++ +- 首先,给入口保留一个多策略选择,以适应我们不同场景的多类型 Agent 选择使用,后续会在 agent 配置表增加策略选择属性来区分调用。本节我们先处理一个 AutoAgent 的实现。 +- 之后,进入到关键地方,在上一节 AutoAgentTest 章节,设计了一套自动化 Agent 执行方法,通过 for 循环处理。这里我们通过规则树,分多个多个节点步骤执行,节点间可循环调用,增强整体的灵活性。 +- 最后,以用户提问到所有的步骤执行完成后,进入到结束环节,产生结果。如果你上一节已经高透彻,那么到这里其实会更加容易理解对于节点的拆分。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-12\350\212\202\357\274\232Agent\346\234\215\345\212\241\346\216\245\345\217\243\345\222\214UI\345\257\271\346\216\245.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-12\350\212\202\357\274\232Agent\346\234\215\345\212\241\346\216\245\345\217\243\345\222\214UI\345\257\271\346\216\245.md" new file mode 100644 index 000000000..ceef27a8d --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-12\350\212\202\357\274\232Agent\346\234\215\345\212\241\346\216\245\345\217\243\345\222\214UI\345\257\271\346\216\245.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-12节:Agent服务接口和UI对接 +pay: https://t.zsxq.com/T0H6n +--- + +# 《Ai Agent》第3-12节:Agent服务接口和UI对接 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/eaqbx](https://t.zsxq.com/eaqbx) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +以实现 Ai Auto Agent Server-Sent Events (SSE) 流式响应接口为目的,设计 SSE 异步响应结果对象,对 Step 1~4 步骤的过程数据进行异步流式响应返回。开发好接口后,与Ai实现的前端UI界面进行对接。 + +像是 Ai(Cursor、trae.ai) 对于前端这样没有太多复杂的流程代码,可以很好的实现出来。这对于后端工程师想做一些前端UI产品化的东西,就变得容易的很了! + +## 二、对接效果 + +如图,流式响应(SSE)接口对接UI效果; + +++ +- 首先,小傅哥对 **Auto Agent - 自动智能对话体** 进行了数据库表(初始数据)和服务启动时自动装配 Ai Agent 所需的各项配置(客户端、模型、API、MCP等)。以便于可以在接口请求服务时,调用 Auto Agent 智能体。 +- 之后,用于就可以对智能体进行提问,所有的提问信息,会进入到服务端的 Step 1~4 步骤,并进行循环分析、执行、检测,以及最终输出结果。 + +> 接下来,小傅哥带着大家看看 Auto Agent 服务接口和对接是如何处理的。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-13\350\212\202\357\274\214Agent-ELK\346\227\245\345\277\227\345\210\206\346\236\220\345\234\272\346\231\257.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-13\350\212\202\357\274\214Agent-ELK\346\227\245\345\277\227\345\210\206\346\236\220\345\234\272\346\231\257.md" new file mode 100644 index 000000000..bdea85b3c --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-13\350\212\202\357\274\214Agent-ELK\346\227\245\345\277\227\345\210\206\346\236\220\345\234\272\346\231\257.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-13节,Agent-ELK日志分析场景 +pay: https://t.zsxq.com/agZ9E +--- + +# 《Ai Agent》第3-13节,Agent-ELK日志分析场景 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/kMjAw](https://t.zsxq.com/kMjAw) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +增加 Agent-ELK 日志分析的实际应用场景,通过 Agent 根据用户诉求,自主分析、规划、执行和输出结果,来帮助我们对日志检索的提效。 + +ELK(或自研) 是各个互联网公司中都有的一套分布式日志设备,以便于研发在遇到线上系统报警和运营反馈事故问题时,快速检索日志。但往往这种检索的日志的方式都是非常耗时的,所以增加 Agent 方式来辅助提效是非常有必要的。 + +注意;面试往往就是需要这样的实际应用场景,而不是坦克大战、贪吃蛇、图书管理系统等一些不着边际的项目(适合练手但不适合写简历)。 + +## 二、功能流程 + +如图,Agent-ELK 的设计使用流程图; + +++ +- 首先,虚线框内为模拟的系统的应用日志,部署一套 ELK 之后通过脚本把日志数据写入到 ELK。你也可以通过这套教程实际部署一套 ELK [https://bugstack.cn/md/road-map/elk.html](https://bugstack.cn/md/road-map/elk.html) 另外像星球项目,拼团、大营销等也都有 ELK 分布式日志的对接使用。 +- 之后,要为这套场景增加一套新的 Ai Agent 描述话术,在执行 ELK 日志分析的时候,我们先手动选择出要使用的 Ai Agent 服务。这样它就可以以 ELK 对应的 Prompt 话术分析方式使用了。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-14\350\212\202\357\274\214Agent-Prometheus\347\233\221\346\216\247\345\210\206\346\236\220\345\234\272\346\231\257.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-14\350\212\202\357\274\214Agent-Prometheus\347\233\221\346\216\247\345\210\206\346\236\220\345\234\272\346\231\257.md" new file mode 100644 index 000000000..790b7709c --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-14\350\212\202\357\274\214Agent-Prometheus\347\233\221\346\216\247\345\210\206\346\236\220\345\234\272\346\231\257.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-14节,Agent-Prometheus监控分析场景 +pay: https://t.zsxq.com/8BfkE +--- + +# 《Ai Agent》第3-14节,Agent-Prometheus监控分析场景 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/ymfSm](https://t.zsxq.com/ymfSm) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +上一节我们做了 Ai Agent ELK,这一节扩展增加 Prometheus(普罗米修斯监控) 监控系统,让 Ai Agent 具备智能监控问题分析场景。这种场景东西是在公司里非常重要的,且有实际使用用途的东西。 + +本节基于的是 Ai MCP Prometheus + Agent Prompt(分阶段提示词),来完成自动化分析、规划、执行、检测、输出的智能监控系统。 + +## 二、功能流程 + +如图,Agent-Prometheus 的设计使用流程图; + +++ +- 首先,虚线框为模拟的系统监控日志脚本(含运行程序),部署的一套普罗米修斯监控系统。你可以通过这套教程来部署一套普罗米修斯监控 [https://bugstack.cn/md/road-map/grafana.html](https://bugstack.cn/md/road-map/grafana.html) 星球的拼团、大营销、openai应用都有这样的监控系统使用。 +- 之后,要为这套场景增加一套新的 Ai Agent 执行话术,另外还要配置一套对应的 RAG 知识库,来增强分析能力。 diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-15\350\212\202\357\274\232FlowAgent\346\211\247\350\241\214\351\223\276\350\267\257\345\210\206\346\236\220.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-15\350\212\202\357\274\232FlowAgent\346\211\247\350\241\214\351\223\276\350\267\257\345\210\206\346\236\220.md" new file mode 100644 index 000000000..8c10a272a --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-15\350\212\202\357\274\232FlowAgent\346\211\247\350\241\214\351\223\276\350\267\257\345\210\206\346\236\220.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-15节:AgentFlow执行链路分析 +pay: https://t.zsxq.com/Ht0o1 +--- + +# 《Ai Agent》第3-15节:AgentFlow执行链路分析 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/u9tjH](https://t.zsxq.com/u9tjH) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +为了打开 Agent 的实现思路,本章我们再增加一种新的 Auto Agent 设计,这种设计方式以通过用户的提问和当前 Agent 配置的 MCP 工具集合,进行执行步骤的规划设计。之后在通过执行步骤按照拆分的步骤顺序号,依次进行执行。有点类似于 [manus](https://manus.im/) 的过程。 + +## 二、流程设计 + +如图,多种 Ai Agent 执行设计流程图; + +++ +Ai Agent 的处理过程也是分为几类的,用于适应不同的场景使用; + +1. 固定N个步骤,这类的一般是配置工作流的,提高任务执行的准确性。如,一些检索资料、发送帖子、处理通知等。 +2. 顺序循环调用,配置 Agent 要执行的多个 Client 端,以此顺序执行。适合一些简单的任务关系,并已经分配好的动作,类似于1的方式。 +3. 智能动态决策,这类是目前市面提供给大家使用的 Agent 比较常见的实现方式,它会动态的规划执行动作,完成行动步骤,观察执行结果,判断完成状态和步骤。并最终给出结果。 +4. 【新增】规划分析决策,根据用户输入的信息诉求,以及配置的 MCP 的能力,进行步骤规划。之后把步骤拆分出 1、2、3 具体要做什么,在依次执行这些步骤。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-16\350\212\202\357\274\232FlowAgent\346\211\247\350\241\214\351\223\276\350\267\257\350\256\276\350\256\241.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-16\350\212\202\357\274\232FlowAgent\346\211\247\350\241\214\351\223\276\350\267\257\350\256\276\350\256\241.md" new file mode 100644 index 000000000..e3beecfb2 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-16\350\212\202\357\274\232FlowAgent\346\211\247\350\241\214\351\223\276\350\267\257\350\256\276\350\256\241.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第3-16节:FlowAgent执行链路设计 +pay: https://t.zsxq.com/Htptt +--- + +# 《Ai Agent》第3-16节:FlowAgent执行链路设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/J68sk](https://t.zsxq.com/J68sk) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在 3-11 节的时候,我们做过一个这样的事情。针对于测试阶段的 Agent Test 代码,使用设计模式拆分出各个执行步骤,便于理解和维护。这一节我们同样需要把上一节分析的 FlowAgent 测试代码,按照模块化的流程进行拆分。 + +## 二、流程设计 + +如图,Flow Ai Agent 动态步骤分析执行流程图; + +++ +- 首先,新增加一个 Agent 执行策略,流程步骤拆分执行。这个过程其实比上一 AutoAgent 要简单一些。 +- 之后,分贝设计出 Step1 工具分析、Step2 动作规划、Step3 拆分步骤、Step4 执行节点(循环执行),这四个步骤就是 FlowAgentTest.test_agent 里的步骤。 +- 最后,响应结果。后续章节会使用 sse 将结果响应到前端,这里我们暂时增加了判null操作,先不需要发送 sse 数据。 diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-17\350\212\202\357\274\232\345\242\236\345\212\240\350\260\203\345\272\246\345\231\250\347\255\226\347\225\245\346\211\247\350\241\214Agent\351\223\276\350\267\257.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-17\350\212\202\357\274\232\345\242\236\345\212\240\350\260\203\345\272\246\345\231\250\347\255\226\347\225\245\346\211\247\350\241\214Agent\351\223\276\350\267\257.md" new file mode 100644 index 000000000..0b3a12d46 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-17\350\212\202\357\274\232\345\242\236\345\212\240\350\260\203\345\272\246\345\231\250\347\255\226\347\225\245\346\211\247\350\241\214Agent\351\223\276\350\267\257.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第3-17节:增加调度器策略执行Agent链路 +pay: https://t.zsxq.com/ayQWR +--- + +# 《Ai Agent》第3-17节:增加调度器策略执行Agent链路 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/44qnU](https://t.zsxq.com/44qnU) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +从ui页面开始,增加 ai agent 分类选择使用。因为这里有不同类型的 ai agent,所以要对调用的过程增加一个策略调度器,按照不同类型的 ai agent 选择不同的执行策略。 + +## 二、流程设计 + +如图,Ai Agent 策略调度器执行过程; + +++ +- 首先,我们实现的 ai agent 有多种类型,所以在选择场景选择的时候,要根据不同的场景获取到走那种类型的 ai agent 执行策略。 +- 之后,这里我们就把 AutoAgent、FlowAgent 都放到调度器里执行,另外要在数据库表 ai_agent 中增加一个 strategy 执行策略配置,这样用户提问时候传入的 agent id 就可以获取到对应的策略了。 +- 最后,本节还有一点关于页面 UI 的完善,每次对话,会把对话消息存储到历史对话中。这部分前端的东西使用 ai 开发工具处理的。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-18\350\212\202\357\274\232\345\212\250\346\200\201\346\211\247\350\241\214\346\231\272\350\203\275\344\275\223\344\273\273\345\212\241.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-18\350\212\202\357\274\232\345\212\250\346\200\201\346\211\247\350\241\214\346\231\272\350\203\275\344\275\223\344\273\273\345\212\241.md" new file mode 100644 index 000000000..c4ac6c6bc --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-18\350\212\202\357\274\232\345\212\250\346\200\201\346\211\247\350\241\214\346\231\272\350\203\275\344\275\223\344\273\273\345\212\241.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-18节:动态执行智能体任务 +pay: https://t.zsxq.com/8yPe5 +--- + +# 《Ai Agent》第3-18节:动态执行智能体任务 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/j116r](https://t.zsxq.com/j116r) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +本节首先新增一个基于数据库固定配置步骤的简单循环执行智能体策略。随后,结合数据库中配置的智能体定时执行参数,以及工程中引入的扳手工程动态任务组件,实现对智能体动态任务的调度与执行。 + +那么,这里有一个前置学习,《通用技术组件 - 🔧扳手工程》第5节:任务调度组件 [https://t.zsxq.com/bLkoF](https://t.zsxq.com/bLkoF) - 需要先完成下,之后就可以在智能体项目中使用了。 + +## 二、功能流程 + +如图,Ai Agent 动态任务执行过程; + +++ +- 首先,我们在项目中引入了扳手工程的任务调度组件。在调度组件内,配置检索出数据库表内可执行的任务以及对应的参数,之后由定时任务管理。 +- 之后,本节我们又增加了一个新的简单的 Agent 执行策略,依次循环数据库 Agent 配置的客户端。这个场景很适合工作流编排,把固定要执行的客户端,依次写入到数据库配置,就可以按照固定步骤执行了。这也是咱们在早期分析 Agent 执行方式的一种。 diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-19\350\212\202\357\274\232\346\213\226\346\213\211\346\213\275\347\274\226\346\216\222\346\225\260\346\215\256\345\255\230\345\202\250.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-19\350\212\202\357\274\232\346\213\226\346\213\211\346\213\275\347\274\226\346\216\222\346\225\260\346\215\256\345\255\230\345\202\250.md" new file mode 100644 index 000000000..6e06b11c7 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-19\350\212\202\357\274\232\346\213\226\346\213\211\346\213\275\347\274\226\346\216\222\346\225\260\346\215\256\345\255\230\345\202\250.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-19节:拖拉拽编排数据存储 +pay: https://t.zsxq.com/kPbFh +--- + +# 《Ai Agent》第3-19节:拖拉拽编排数据存储 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/oxIZg](https://t.zsxq.com/oxIZg) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +通过 [flowgram.ai](https://flowgram.ai/) 框架,实现项目中 Ai Agent 拖拉拽编排能力,增强使用的易用性。 + +这部分拖拉拽主要完成的就是一个 ai agent 所需的,client、prompt、advisor、model(api)的串联使用。通过拖拉拽方式替代 ai_client_config 中需要手动维护的数据关系链。 + +本节我们先来完成拖拉拽的页面搭建和数据存储处理。提示,对于后端开发人员,不非得学习前端代码,只要能用起来就可以。面试中往往主要考察项目完整性,但不会对后端人员必须会写前端。所以,如果你不会前端代码,也不用太担心。 + +## 二、实现效果 + +如图,是通过拖拉拽实现的 Ai Agent 编排效果; + +++ +- 创建过程中,Agent 是用户本次新创建的智能体,这个智能体所需用到的Client、以及 Client 所需的 Advisor、Prompt、Model、MCP 则可以通过拖拉拽的方式进行串联编排。 +- 对于这些节点所拉取的数据,则是从服务端接口进行获取的。如,Client 客户端获取可用数据,Model 获取模型,之后链接的 MCP 工具可以自由组合。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-1\350\212\202\357\274\232Ai Agent \344\270\232\345\212\241\346\265\201\347\250\213\343\200\201\347\263\273\347\273\237\346\236\266\346\236\204\343\200\201\345\272\223\350\241\250\350\256\276\350\256\241\350\257\264\346\230\216.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-1\350\212\202\357\274\232Ai Agent \344\270\232\345\212\241\346\265\201\347\250\213\343\200\201\347\263\273\347\273\237\346\236\266\346\236\204\343\200\201\345\272\223\350\241\250\350\256\276\350\256\241\350\257\264\346\230\216.md" new file mode 100644 index 000000000..1b041207e --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-1\350\212\202\357\274\232Ai Agent \344\270\232\345\212\241\346\265\201\347\250\213\343\200\201\347\263\273\347\273\237\346\236\266\346\236\204\343\200\201\345\272\223\350\241\250\350\256\276\350\256\241\350\257\264\346\230\216.md" @@ -0,0 +1,32 @@ +--- +title: 【更】第3-1节,Ai Agent 业务流程、系统架构、库表设计说明 +pay: https://t.zsxq.com/qUYx0 +--- + +# 《Ai Agent》第3-1节,Ai Agent 业务流程、系统架构、库表设计说明 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/DcL2p](https://t.zsxq.com/DcL2p) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +了解 Ai Agent 构建元素,以 Spring AI 硬编码创建 Agent 过程,分析各个模块用途,并以此设计拆分元素和对应的库表设计。 + +经过本节我们可以了解到,怎么把这些硬编码的过程,以配置数据库表的方式,动态化构建。有了动态化的构建,也就可以按需配置出各种 Agent 服务来满足我们的业务诉求。尤其是现在 MCP 如火如荼的发展,有一套自动化的 Agent 是非常重要的。 + +> 第3-0节,介绍和演示中,涉及了本节的部分内容。本节主要站在开发视角,来讲解如何架构和开发系统。 + +## 二、Agent 介绍 + +AI 智能体是使用 AI 来实现目标并代表用户完成任务的软件系统。其表现出了推理、规划和记忆能力,并且具有一定的自主性,能够自主学习、适应和做出决定。 + +这些功能在很大程度上得益于生成式 AI 和 AI 基础模型的多模态功能。AI 智能体可以同时处理文本、语音、视频、音频、代码等多模态信息;可以进行对话、推理、学习和决策。它们可以随着时间的推移不断学习,并简化事务和业务流程。智能体可以与其他智能体协作,来协调和执行更复杂的工作流。 + +++ +>Spring AI 框架,支持大语言模型构建 AI Agent 实现。AI Agent是整合多种技术手段的智能实体 ,其实现依赖于 Tools、MCP、Memory、RAG(Retrieval 增强检索生成) 等技术组件,但不是非得依赖全部组件才叫 AI Agent。 diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-20\350\212\202\357\274\232Agent\347\256\241\347\220\206\345\220\216\345\217\260\345\256\236\347\216\260.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-20\350\212\202\357\274\232Agent\347\256\241\347\220\206\345\220\216\345\217\260\345\256\236\347\216\260.md" new file mode 100644 index 000000000..b88505970 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-20\350\212\202\357\274\232Agent\347\256\241\347\220\206\345\220\216\345\217\260\345\256\236\347\216\260.md" @@ -0,0 +1,78 @@ +--- +title: 【更】第3-20节:Agent管理后台实现 +pay: https://t.zsxq.com/5Sdfr +--- + +# 《Ai Agent》第3-20节:Agent管理后台实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/z0jRV](https://t.zsxq.com/z0jRV) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +设计实现一套 Ai Agent 管理后台页面,允许用户通过管理后台实现 Ai Agent 的资源配置和拖拉拽方式维护 Ai Agent 智能体。 +第 +本章节没有复杂的逻辑实现,都是 CRUD 操作,把原本在数据库中手动处理的过程,以更符合运营使用方式提供用户使用。所以,本节你只需要了解、看懂,可以跟着继续迭代你想要的内容即可。 + +## 二、实现效果 + +这是一套完整的 Ai Agent 智能体管理后台,包括了所有资源的配置(model、client、mcp、advisor、prompt),以及拖拉拽编排的方式完成 Ai Agent 智能体的构建。 + +以下的截图内容和使用,会在本节课程的视频里演示。也包括如何运行使用。 + +### 1. 登录界面 + +++ +- 这一部分在数据库表增加了 admin_user 表,有配置登录账号和密码,可以简单做校验。 + +### 2. 管理界面 + ++
++ +- 管理后台目前提供了,代理管理(拖拉拽编排方式配置智能体),资源管理(model、client、mcp、advisor、prompt) +- 数据分析、系统设置,是样例,你可以继续扩展你所需要的内容。 + +### 3. 代理管理 + +#### 3.1 代理列表 + ++
++ +- 这里的代理列表,就是通过拖拉拽配置的智能体。可以点击【查看】看到明细,也可以【新建】,还可以删除。 +- 点击【加载】则是调用服务端,把数据加载到 Spring 容器,之后就可以使用了。 + +#### 3.2 代理配置 + ++
++ +- 当你点击一个代理配置,则会展示出拖拉拽的数据到页面上。这部分会从数据库读取,之后展示出来,全部可视化。 +- 如果你点击了Save则会做出一份新的,之后对于旧的,你可以自己手动删除。 + +### 4. 资源管理 + ++
++ +- 资源管理下,是配置一个智能体所需的各项资源信息,你可以在这里进行维护。如,MCP 工具管理。 + +### 5. 页面使用 + ++
++ +- 配置后的智能体,可以在智能体选择里进行获取使用。之后进行提问。 +- 效果还不错,这里小傅哥验证了配置的智能体进行提问。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-21\350\212\202\357\274\232\345\234\250\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262\344\270\212\347\272\277.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-21\350\212\202\357\274\232\345\234\250\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262\344\270\212\347\272\277.md" new file mode 100644 index 000000000..13f92fbfb --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-21\350\212\202\357\274\232\345\234\250\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262\344\270\212\347\272\277.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-21节:在云服务器部署上线 +pay: https://t.zsxq.com/HO8sx +--- + +# 《Ai Agent》第3-21节:在云服务器部署上线 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wfgDS](https://t.zsxq.com/wfgDS) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在云服务器(2c4g)部署 Ai Agent 前端页面(html)、管理页面(react)、后端服务(java)、基础环境(MySql、PG向量库)。 + +## 二、部署过程 + +如图,为本次的部署过程 + +++ +- 推荐2c4g云服务器购买,[http://618.gaga.plus/](http://618.gaga.plus/) 选个便宜的购买就可以。 +- 本次会进行本地构建镜像,之后 push 到阿里云私有个人镜像库(免费的可以申请)。这个可以代替 Docker Hub 作为代理使用。教程;[https://t.zsxq.com/XdoWr](https://t.zsxq.com/XdoWr) +- 云服务器部署教程:[https://t.zsxq.com/19osWS4qj](https://t.zsxq.com/19osWS4qj) - 需要云服务器安装 Docker、Portainer,以及配置镜像地址 [https://t.zsxq.com/2DGGY](https://t.zsxq.com/2DGGY) +- 记得在云服务器安全组开放端口 9000(Portainer)、8099(服务端)、3002(管理端)、8899(mysql管理端) 等你需要对外的端口。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-2\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\351\241\271\347\233\256\345\267\245\347\250\213.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-2\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\351\241\271\347\233\256\345\267\245\347\250\213.md" new file mode 100644 index 000000000..3c637aeb3 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-2\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\351\241\271\347\233\256\345\267\245\347\250\213.md" @@ -0,0 +1,60 @@ +--- +title: 【更】第3-2节:初始化项目工程 +pay: https://t.zsxq.com/3B4vv +--- + +# 《Ai Agent》第3-2节:初始化项目工程 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/K9NWT](https://t.zsxq.com/K9NWT) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +很多小伙伴可能都接触过一些入门级项目,简单地使用 IntelliJ IDEA 创建和开发。但在互联网公司中,如何规范地创建和管理一个新项目,往往缺乏清晰的认知。毕竟公司里有大量新项目需要启动,不可能让每个团队、每个人都随意创建风格各异的工程,这样会大幅增加后续维护和协作的难度。因此,建立统一的工具链和标准化流程显得尤为重要。 + +所以,跟着小傅哥学习,不仅仅是完成一个项目的开发,更是以互联网大型企业的标准化流程和规范,来设计、开发和实现功能,帮助大家掌握更专业、更高效的开发方法。 + +## 一、本章诉求 + +教会小伙伴使用统一的标准脚手架初始化创建项目工程,并了解工程模块的分层用途。 + +课程会循序渐进的从0到1,逐步带着大家完成项目的开发。开局只有一把 IntelliJ IDEA,完成项目后你可以学习到;业务、架构、设计、方案、配置、部署(Linux、Docker)等各项知识。 + +## 二、如何开始 + +### 1. 前置学习 + +小伙伴在学习的时候,可以依照课程的方式进行创建项目、变更配置、启动测试。这里有一些前置学习,包括:Git、Maven、Docker、脚手架,课程已经准备好了,可以刷下;**磨刀不误砍柴工,基础刷完更轻松!** + +- Git:[https://bugstack.cn/md/road-map/git.html](https://bugstack.cn/md/road-map/git.html) +- Maven:[https://bugstack.cn/md/road-map/maven.html](https://bugstack.cn/md/road-map/maven.html) +- Docker [https://bugstack.cn/md/road-map/docker-what.html](https://bugstack.cn/md/road-map/docker-what.html) +- 脚手架:[https://bugstack.cn/md/road-map/ddd-archetype-maven.html](https://bugstack.cn/md/road-map/ddd-archetype-maven.html) + +> 另外课程会使用 Java JDK 17、Maven 3.8.x,软件已经提供好,可以直接下载;[https://t.zsxq.com/19Rnk98M0](https://t.zsxq.com/19Rnk98M0) - `附件内含有配置好阿里云镜像的 Maven` + +### 2. 开始学习 + +1. 你需要通过 git clone 命令,或者 IntelliJ IDEA 自动的检出工程方式,把项目工程检出到本地。关于如何使用Git检出项目,在前置学习里提供了教程。 +2. 检出代码后,你可以通过 IntelliJ IDEA 打开项目,并按照每一节最开始说明的本节对应的代码分支,把工程代码切换到对应的这一节。 +3. 接下来你可以通过课程的视频和小册以及提供的代码进行学习,并跟随课程每节要完成的内容,一步步操作。过程中可以参考课程的代码进行学习。如果自己的代码运行出问题的时候,可以运行课程的代码验证是环境问题还是个人代码问题。**另外注意运行课程代码,要修改对应的环境为你的本地环境,mysql、redis等** +4. 对于课程中每节涉及的库表,会放到工程 docs/dev-ops mysql 下。你可以每节学习创建一个新的库名称,之后导入。但要记得在工程 app/application-dev.yml 文件中修改对应的库名称。 + +### 3. 环境安装 + +课程提供了使用 Docker 部署 MySQL、Redis 环境的脚本。因为使用 Docker 可以随时方便卸载,不会污染本地电脑的本机环境。而且后续部署 Linux 云服务器也会非常顺手。 + +关于环境的安装; + +++ +1. Windows + wsl2,本地使用 powershell 切换到工程文件夹,执行 `docker-comopse -f docker-compose-environment-aliyun.yml up -d` +2. Mac 电脑的适配性会更好,直接点击这里的绿色箭头即可安装。 +3. 如果本机配置有问题,也可以选择使用云服务器。课程中有云服务器的操作教程,部署起来更方便。云服务器教程:[https://bugstack.cn/md/road-map/linux.html](https://bugstack.cn/md/road-map/linux.html) + +> 环境安装后就可以使用 MySql、Redis 链接工具使用了,也可以手动更新库表。 diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-3\350\212\202\357\274\232AiAgent\346\265\213\350\257\225\346\241\210\344\276\213.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-3\350\212\202\357\274\232AiAgent\346\265\213\350\257\225\346\241\210\344\276\213.md" new file mode 100644 index 000000000..ee56458cf --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-3\350\212\202\357\274\232AiAgent\346\265\213\350\257\225\346\241\210\344\276\213.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-3节:Ai Agent 测试案例 +pay: https://t.zsxq.com/JFnzV +--- + +# 《Ai Agent》第3-3节:Ai Agent 测试案例 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/jI0BD](https://t.zsxq.com/jI0BD) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在项目中引入 Spring Ai 1.0.0 框架,通过编写测试案例的方式,了解 Ai Agent 的工作模式。 + +**那为什么要这么做呢?** + +通常对于软件设计的解决方案,我们都有一个这样共识,那就是目标结果驱动,最先搭建可运行的最小执行单元。因为软件设计原则,[康威定律](https://zh.wikipedia.org/wiki/%E5%BA%B7%E5%A8%81%E5%AE%9A%E5%BE%8B),也提到,`大的系统组织总是比小系统更倾向于分解`。当场景问题被拆解的越小以后,也就越容易被理解和处理。所以,我们要优先通过案例的方式,验证 Ai Agent 的工作模型和可执行方案。再通过这些案例,设计详细的流程和库表细节。 + +## 二、功能流程 + +如图,为整个 Ai Agent 的工作模型; + +++ +- 概念:**Ai Agent 是整合多种技术手段的智能实体** ,其实现依赖于 Tools、MCP、Memory、RAG(Retrieval-Augmented Generation,检索增强生成) 等技术组件构建的智能体。并且每一个 Agent Client 又可以被连接通信,增强其 Agent 智能体能力。 +- 方案:这里我们基于 Spring AI 框架,通过编码的方式把模型、关键词、顾问角色、工具,放入到 LLM 客户端,构建 LLM 对话智能体。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-4\350\212\202\357\274\232\346\240\271\346\215\256AiAgent\346\241\210\344\276\213\357\274\214\350\256\276\350\256\241\345\272\223\350\241\250.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-4\350\212\202\357\274\232\346\240\271\346\215\256AiAgent\346\241\210\344\276\213\357\274\214\350\256\276\350\256\241\345\272\223\350\241\250.md" new file mode 100644 index 000000000..be57bd6c3 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-4\350\212\202\357\274\232\346\240\271\346\215\256AiAgent\346\241\210\344\276\213\357\274\214\350\256\276\350\256\241\345\272\223\350\241\250.md" @@ -0,0 +1,39 @@ +--- +title: 【更】第3-4节:根据AiAgent案例,设计库表 +pay: https://t.zsxq.com/0tZhc +--- + +# 《Ai Agent》第3-4节:根据AiAgent案例,设计库表 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/Tx438](https://t.zsxq.com/Tx438) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +根据 Ai Agent 的代码案例,设计用于解耦,硬编码流程的库表。在后续的代码开发中,根据库表配置的 Ai Agent 流程所需的,模型、提示词、顾问、工具等,动态实例化出 Ai Agent 服务。 + +## 二、拆分设计 + +如图,为对应的Ai Agent 案例代码,映射出要拆分的库表设计; + +++ +首先,整个代码构建的整个 Ai Agent 最小化单元服务,我们可以根据这样的服务信息设计出库表结构。 + +- 第一步,从上到下,OpenAiApi 是最基础单元结构,可以被多个 OpenAiChatModel 使用,它可以被拆分出第一张表。 +- 第二步,构建 OpenAiChatModel,这个阶段,需要 openAiApi、model对话模型、tool mcp 工具。其中`model对话模型`时一种固定固定资源,可以直接放到 ai_client_model 模型中,而 openAiApi、mcp 工具,都属于复杂配置,则需要额外的外部关联来衔接。也就是后面的 ai_client_config 配置,用于配置衔接关系。 +- 第三步,ChatClient 对话客户端,这部分的实例化过程都是和外部其他的资源关联,本身表设计只要有一个客户端的唯一id和客户端的描述介绍即可。 +- 第四步,给 mcp 增加一个表,mcp 服务是非常重要的,有 mcp 才有 agent 服务。mcp 的启动有 stido、sse 两种方式,每种方式都有对应的配置文件 json 数据。 +- 第五步,defaultSystem 系统提示词,需要单独拆分出来。提示词等于智能体的大脑,也有人说,其实 Ai Agent 就是 prompt 的堆叠,所以写提示词是很重要的。 +- 第六步,advisor 顾问角色,在 Spring Ai 框架中,以顾问的方式,访问记忆上下文,知识库资源,所以这部分也要单独设计库表。 +- 第七步,设计一个 ai_client_config,用于配置;api、model、client、prompt、mcp、advisor的衔接关系。 +- 第八步,设计 ai_agent、ai_agent_flow_config,也就是一个 ai agent,是可以连续调用多个 ai client 客户端的。 +- 第九步,设计 ai_agent_stask_schedule 任务,这是一种触达手段,可以把配置好的任务,让 task 定时执行,如自动发帖、系统异常巡检、舆情风险检测、系统配置变更、运营活动报表等。 +- 第十步,ai_client_rag_order,是知识库表,用于上传知识库做一个记录,这样顾问角色就可以访问知识库内容了。 + +注意;chat_client 客户端的初始化过程中,也可以增加 mcp 服务,这部分在 chat_model 模型构建中,也可以增加 mcp,选择在 chat_model 增加即可。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-5\350\212\202\357\274\232\345\244\232\346\225\260\346\215\256\346\272\220\345\222\214Mapper\351\205\215\347\275\256.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-5\350\212\202\357\274\232\345\244\232\346\225\260\346\215\256\346\272\220\345\222\214Mapper\351\205\215\347\275\256.md" new file mode 100644 index 000000000..b3427644d --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-5\350\212\202\357\274\232\345\244\232\346\225\260\346\215\256\346\272\220\345\222\214Mapper\351\205\215\347\275\256.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第3-5节:多数据源和Mapper配置 +pay: https://t.zsxq.com/099am +--- + +# 《Ai Agent》第3-5节:多数据源和Mapper配置 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/eYn4R](https://t.zsxq.com/eYn4R) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +为应用程序配置pgvector(向量库)、mysql(业务库)两套数据源,同时基于库表,编写基础设施层 Mapper 操作。 + +对于数据库表的 Mapper 编写,是一种固定的结构化代码,可以通过 MyBatis 工具生成,也可以使用 AI 编码工具处理。不过对于新人学习来说,更建议在这个阶段,通过手动的方式进行配置编写,这样可以更熟悉库表的设计和字段的理解。尤其是报错后,还可以基于报错排查错误增加编程经验。 + +## 二、功能流程 + +如图,两个数据源的配置和使用; + +++ +- 首先,为了让应用程序具备多数据源链接,则需要增加一个扩展的 DataSourceConfig 配置类,来自己实现数据源的加载。这部分会替代原本配置到 yml 文件中,由 Spring 加载数据源的过程。 +- 之后,根据不同类型的数据源,注入到 AI 向量库使用场景和 MyBatis 业务使用场景中。这个过程类似于星球中 DB-Router 路由组件的课程。可以参考:[https://bugstack.cn/md/road-map/db-router.html](https://bugstack.cn/md/road-map/db-router.html) + diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-6\350\212\202\357\274\232\346\225\260\346\215\256\345\212\240\350\275\275\346\250\241\345\236\213\350\256\276\350\256\241.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-6\350\212\202\357\274\232\346\225\260\346\215\256\345\212\240\350\275\275\346\250\241\345\236\213\350\256\276\350\256\241.md" new file mode 100644 index 000000000..da40342cb --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-6\350\212\202\357\274\232\346\225\260\346\215\256\345\212\240\350\275\275\346\250\241\345\236\213\350\256\276\350\256\241.md" @@ -0,0 +1,33 @@ +--- +title: 【更】第3-6节:数据加载模型设计 +pay: https://t.zsxq.com/zrK3n +--- + +# 《Ai Agent》第3-6节:数据加载模型设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/USaZS](https://t.zsxq.com/USaZS) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在关于 Ai Agent 的功能实现中,有一个非常重要处理步骤,就是要想办法动态的实例化来自于用户配置的;API、对话模型、MCP、顾问角色以及提示词等。这也就是我们前面为什么要基于 ai agent case 案例,把代码抽象出库表配置。 + +好,那么到这一节,还要思考,怎么让程序来加载和实例化 Ai Agent 所需的各项组件。如,客户端的实例化、对话模型的实例化等。 + +注意;本节会引入星球组件项目《扳手工程》,通用设计模式框架。可以前置学习:[第2节:责任链和规则树通用模型框架](https://t.zsxq.com/o7IBm) + +## 二、功能流程 + +如图,Ai Agent 实现过程,数据加载策略设计; + +++ +- 首先,整个 Ai Agent 的实例化过程,就是各项组件的创建和组装的过程。那么,为了让整体的实现代码更易于维护,我们可以把这样的创建过程,通过规则树的方式进行串联实现。而这部分需要的规则树,是不需要重复建设的,因为星球里的[《扳手工程组件项目》](https://t.zsxq.com/o7IBm),已经把这类的共性内容,凝练成了通用的组件,各个业务系统引用使用即可。所以,这部分建议刷下[《扳手工程组件项目》](https://t.zsxq.com/o7IBm),来看[第2节:责任链和规则树通用模型框架](https://t.zsxq.com/veRkQ) +- 之后,本节我们先把目标缩小到关于数据加载部分,因为后续所有的 Ai Agent 组件实例化的过程,都是需要基础数据的提供。所以组装数据就显得尤为重要了。 + + diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-7\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\256\242\346\210\267\347\253\257API.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-7\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\256\242\346\210\267\347\253\257API.md" new file mode 100644 index 000000000..7ca83a2bd --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-7\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\256\242\346\210\267\347\253\257API.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-7节:动态实例化客户端API +pay: https://t.zsxq.com/RdjkP +--- + +# 《Ai Agent》第3-7节:动态实例化客户端API + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/4r5r4](https://t.zsxq.com/4r5r4) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +完善数据加载操作,动态实例化`客户端API`(ai_client_api)并注册到 Spring 容器。 + +这是整个 armory 动态装配 Ai Agent 节点的第一步,涉及到了数据的获取,对象的创建和 Spring 容器的 Bean 对象注册。能看懂本节的操作,基本后续一直到整个 Ai Agent 构建也就都可以看懂了。 + +## 二、功能流程 + +如图,客户端API实例化过程设计; + +++ +- 首先,整个 AI Agent 的实例化过程,就是各项组件的创建和组装的过程。为了让整体的实现代码更易于维护,我们把这样的创建过程,通过 规则树的方式 进行串联实现。这种设计模式的优势在于:模块化设计、易于扩展、代码复用度高。 +- 之后,从开始节点看,依次执行,数据构建节点、API构建节点。在 API 构建的过程中,会检查上下文中是否存在已经从数据库获取的数据,之后依次循环构建并注册到 Spring 容器。 diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-8\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\257\271\350\257\235\346\250\241\345\236\213.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-8\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\257\271\350\257\235\346\250\241\345\236\213.md" new file mode 100644 index 000000000..161eba5e9 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-8\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\257\271\350\257\235\346\250\241\345\236\213.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第3-8节:动态实例化对话模型 +pay: https://t.zsxq.com/zv79l +--- + +# 《Ai Agent》第3-8节:动态实例化对话模型 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/4r5r4](https://t.zsxq.com/4r5r4) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +整个 ChatModel 对话模型,所需的元素包括;ai api、tool mcp 两块内容。那么本节我们就分别通过不同的 Node 节点实现这些元素的实例化和 ChatModel 构建。 + +## 二、功能流程 + +如图,ai api、tool mcp、model,实例化过程; + +++ +- 首先,如图 RootNode 负责数据加载,将构建节点元素的数据依次加载到内存中(写入到上下文里) +- 之后,除了上一节完成的 API 节点处理后,开始创建 MCP 服务的创建,之后是 ChatModel 对话模块的创建。因为 ChatModel 创建的时候会需要用到的 api、mcp 两个元素。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/agent/\347\254\2543-9\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\257\271\350\257\235\345\256\242\346\210\267\347\253\257.md" "b/docs/md/project/ai-knowledge/agent/\347\254\2543-9\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\257\271\350\257\235\345\256\242\346\210\267\347\253\257.md" new file mode 100644 index 000000000..92f9ac939 --- /dev/null +++ "b/docs/md/project/ai-knowledge/agent/\347\254\2543-9\350\212\202\357\274\232\345\212\250\346\200\201\345\256\236\344\276\213\345\214\226\345\257\271\350\257\235\345\256\242\346\210\267\347\253\257.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第3-9节:实例化对话客户端 +pay: https://t.zsxq.com/VcM68 +--- + +# 《Ai Agent》第3-9节:实例化对话客户端 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/bePzF](https://t.zsxq.com/bePzF) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +经过前面一系列的准备工作,包括;api、mcp、model,本节我们要进行 advisor 顾问角色的实例化,之后进行 ChatClient 对话客户端的实例化。 + +## 二、功能流程 + +如图,整体 ChatClient 客户端实例化过程; + +++ +- 首先,以构建 AiClientNode 的对话客户端为目的,已经完成了相关的元素实例化步骤。本节这里要处理的是,顾问角色的构建,以及构建 AiClientNode 节点。 +- 之后,AiClientNode 的构建,是关联了其他各项元素的,所以在构建时,需要在 AiClientNode 节点,从 Spring 容器通过 getBean 的方式,检索到对应的各项元素。 +- 注意,ai_client_system_prompt 系统提示词,需要修改为 Map 结构数据。这样更方便我们从数据里获取,哪些是属于当前 AiClientNode 构建时所需的元素。 \ No newline at end of file diff --git a/docs/md/project/ai-knowledge/ai-knowledge.md b/docs/md/project/ai-knowledge/ai-knowledge.md new file mode 100644 index 000000000..c98deb917 --- /dev/null +++ b/docs/md/project/ai-knowledge/ai-knowledge.md @@ -0,0 +1,324 @@ +--- +title: AI Agent 拖拉拽 + 动态配置 +lock: no +--- + +# 《AI Agent 拖拉拽 + 动态配置(RAG、MCP、Prompt)》 - 解析文档&Git仓库代码&AI工作流 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + + + +大家好,我是技术UP主小傅哥。 + +刚上周,老板说:`”把咱们招聘里也加一条,具备AI应用开发能力的优先!“`。是呀,现在越来越多的企业都在用AI开发能力提效了,如;聊天软件增加一键唯独信息归档提取、工作文档资料携AI对话分析、工程SQL语句脚本辅运营自动完成数据处理、代码编写用AI完成自动评审等等。这些都是在AI的基础上在构建应用,以后也会越来越多!所以,具备AI应用开发能力,也是每个工程师最应该具备的基础能力了。 + +并且用不了多久,各大互联网企业都将大量的推进落地,自有 [MCP](https://github.com/modelcontextprotocol) 服务的实现,用于增强企业 AI 应用的提效能力。因为 [MCP](https://github.com/modelcontextprotocol) 的加入,可以让你;一条命令`帮研发`,调用应用系统日志、排查系统CPU负载、自主选择是否调度数据库信息。也可以一条命令`帮运营`,搞定复杂的SQL执行、导出报表、分析数据、完成促活营销券的自动化配置上架。这就是 [MCP](https://github.com/modelcontextprotocol) 的魅力!👍🏻 + +++ +**那么牛,MCP 是什么?** + +专业的术语 `MCP = Model Context Protocol` 模型上下文协议,可实现应用与外部数据源和工具之间的无缝集成。无论您是构建 AI 驱动的 IDE、增强聊天界面还是创建自定义 AI 工作流,MCP 都提供了一种标准化的方式来连接他们所需的上下文。 + +`来吧,上图!让你看看它是啥!` + ++
++ +- 首先,站在用户的使用视角,研发或者运营,可以通过话术描述,完成系列的 AI 工作流,并拿到最终的结果。这就是 MCP 最终为你提供的服务。 +- 那么,你可以想象,在日常的工作中,运营、研发、产品、测试等,都有非常多的重复非创作性的工作,占用了大量的时间成本。尤其是研发,写写代码,就有运营过来,帮我查个问题吧,小嘚嘚。但如果有这样的借助于 MCP 实现的 AI 工作流,就可以完成80%以上的工作量。 +- 之后,站在技术的实现视角,MCP 是一个标准结构框架,你可以按照它(Spring AI)提供的 SDK 开发方式,完成本地化 API 的接入开发。让 AI 有明确的方式调用各类 API 服务接口。如果没有 MCP 这会是一件很麻烦的事情。 + +**跟着小傅哥学习,从不走偏!😄** + +- 2022年底,ChatGPT 开始火爆。 +- 2023年2月,小傅哥,开启了第一个基于AI的项目,ChatGPT AI 问答助手项目。让所有伙伴,都能学习到 AI 如何开发应用。 +- 2023年4月,启动OpenAI(ChatGPT/ChatGLM)微服务应用体系构建大型项目,让大家可以用微信登录、微信支付/蓝兔支付,构建自己的可对外付费提供服务的 OpenAI。这一年上车学习的伙伴,很多做了自己的 AI 产品,除了提高编程技能,又小赚了一辆宝马。 +- 2024年7月,结合企业诉求,开启 OpenAI + Github Acitons,实现代码自动化评审。这一年,不少伙伴在自己的公司中都有落地,个人也得到了述职晋升。 +- 2025年3月,咱们再起启航,基于 Ollama 部署 DeepSeek,开发 RAG 知识库,解析文档和Git仓库代码。这个东西,将是企业中构建自己知识库的又一项非常重要的事情。有了知识库,AI 代码的自动评审,会更加精准,也可以辅助分析需求等。 + +那么,接下来小傅哥就细致的介绍下,本次开启的新项目,可以让大家学习到哪些知识,掌握哪些技术。 + +> Spring AI MCP 与 24年末发布,学习此 AI 应用开发项目,你将是第一批具备 Java AI 应用实战开发能力的人。竞争力,嘎嘎滴! + +## 一、能学到啥 + +这是一套综合`前后端 + Dev-Ops`,基于 Spring Ai 框架实现,Ai Agent 智能体。耗时7个多月,38节课程(`视频`+`文档`),从 RAG 到 MCP,再实现出互联网企业级,可编排的 Ai Agent 智能体,现已全部开发完成 + 部署上线。💐 + +该项目是结合当下最火的 Ollama、DeepSeek、SpringAI 等技术构建的 RAG 知识库实现。从前端到后端到 dev-ops 的全栈式功能手把手实现。 + +- 前端,基于 AI 工具,设计前端对话页面,完成 HTML、JS、TailwindCSS 的编码工作。 +- 前端,配置跨域服务接口,前后端分离实现 UI + 服务端接口对接。 +- 后端,构建双层架构,直接面向需求编码。让学习伙伴更轻松完成 RAG 知识库核心知识的学习。 +- 后端,基于 Spring AI 完成 DeepSeek、OpenAI 双模型的策略对接,处理文本向量的解析和存储。 +- 后端,使用 postgresql 存储切割文本向量数据,完成知识库的解析和存储。 +- 后端,处理多样文本`(.md、.sql、.txt、.word...)`的解析储存以及Git克隆代码库遍历切割存储。 +- 后端,使用 Redis 存储知识库标签,用于检索展示使用。 +- 后端,基于 Flux 编写流式会话接口,以及增加知识库检索功能。 +- 运维,基于 Docker 部署 Ollama 环境,完成 DeepSeek 大模型配置。 +- 运维,使用 Linux、Docker、Nginx 完成项目的打包、构建、上线! + +虽然,知识库都有很多现成的工具。但研发的能力不是在于功能应用,而是具备这样的开发技能储备,在有需要的时候,可以举手🙋🏻♀️”我会,我来做!“ + +> 此项目,全程视频手把手操作 + 全部的小册文档,你可以轻松上手学会这样一个项目! + +## 二、项目介绍 + +这是一套基于 Ollama DeepSeek 大模型构建的增强 RAG 知识库检索项目,在这套项目上,实现了除普通文档知识解析外,增加了 Git 代码库的拉取和解析,并提供操作接口。为工程师做项目开发时,`需求分析`、`研发设计`、`辅助编码`、`代码评审`、`风险评估`、`上线检测`等,做工程交付提效。 + ++
++ +### 第1期,RAG 我们做了什么 + +在 《DeepSeek RAG 增强知识库》第1阶段,基于 Spring AI 0.8.1 开发了一套可以上传文件和Git仓库进行解析、切割、存储,到使用向量库完成 AI 的知识库问答系统。并最终通过 Docker 部署上线。 + +#### 1. 对话页面 + ++
++ +- 这是全程视频手把手,带着大家通过AI工具,完成的UI设计实现课程会演示这个操作),实现的一款非常简单漂亮的UI效果。 +- 我们可以结合知识库,进行更加有效的提问。像是公司中,会把知识库提供出一个标准接口,给其他各个AI应用平台提供能力。 + +#### 2. 上传知识 + ++
++ +- 上传知识,可以解析不同类型的知识库。 +- 除了课程提供的文档库、代码库,你可以增加其他的知识库,如;网页的解析,与网页内容对话。让我们的UI,增加一个侧边栏,读取当前网页内容,分析对话。这样在公司中的一些工程的日志,错误分析时,可以更快的处理。 + +#### 3. 解析知识 - 后台日志 + ++
++ +- 上传知识后,可以看到日志信息。 +- 一套工程作为知识库是非常具有开发价值的,在我们做提问的时候就不需要,人工的去分析工程,而是直接使用了。 + +### 第2期,MCP 我们要做什么 + +与第2期相比,第1期可以称之为小试牛刀,让小伙伴们以最快、最快的往事,积累,运用 Spring AI 框架,开发自己的 RAG 知识库。~~也是方便有些死鬼,早点写到简历上~~ + +到了第2期,你就开始吃上细糠了,小傅哥会带着你升级 Spring AI 框架为 1.0.0-M6 最新版本,多模型配置和操作 PG 向量库,使用 GPU 搭建响应速度更好的 Ollama DeepSeek 大模型(秒级处理),以及对接官网 DeepSeek 的大模型和统一 one-api 对接方式。 + +但这还只是开始,随着基础框架的升级完成,我们将进入 MCP 服务的开发实现。通过 AI 指令,完成 AI 工作流,调度各项 MCP 处理我们的任务作业。如图,举例操作; + ++
++ +- 基于 MCP 服务的开发和对接,通过 AI 工作流指令,完成数据的采集和存放动作。💡 聪明的小伙伴以及开始联想,基于这样的 AI 开发,可以替代很多的日常工作啦。**没想到吧,也把自己替代了** 但仍然,蠢蠢欲动(我不做,别人也做呀)!~~实现后,晋升又有的讲啦!简历也有东西写啦!~~ +- 有了 MCP 后,相当于把我们需要;在一个网页操作数据库查询数据、打开另外一个网页看天气预报,再手动的创建个文件把以上的信息获取后,复制粘贴到文件里。这一些列操作,都让 AI 通过 MCP 模型上下文协议进行处理。也就是 AI 可以调用后台接口啦! + +### 第3期,Agent 我们要做什么 + +RAG 教了,MCP 搞了,那么现在是时候,实现一套自动化的 Ai Agent 服务了。 + +如图,以通过数据库表动态配置的手段,完成相关物料的加载,包括;`模型(gpt-4.1/deepseek)`、`客户端`、`对话预设`、`执行规划(Planning)`、`顾问(记忆、RAG、日志)`、`工具(MCP`)等,在把单个 Client 串联,完成整个 Agent 调用链。这样一个 Agent 调用链可以以对话形式使用或通过 Agent 动态任务自动执行。 + ++
++ +本项目分为,用户端、管理端和服务端,服务端统一提供接口能力,管理端维护 AI Agent 智能体配置、用户端提供使用服务。 + +#### 1. 登录界面 + ++
++ +- 这一部分在数据库表增加了 admin_user 表,有配置登录账号和密码,可以简单做校验。 + +#### 2. 管理界面 + ++
++ +- 管理后台目前提供了,代理管理(拖拉拽编排方式配置智能体),资源管理(model、client、mcp、advisor、prompt) +- 数据分析、系统设置,是样例,你可以继续扩展你所需要的内容。 + +#### 3. 代理管理 + +##### 3.1 代理列表 + ++
++ +- 这里的代理列表,就是通过拖拉拽配置的智能体。可以点击【查看】看到明细,也可以【新建】,还可以删除。 +- 点击【加载】则是调用服务端,把数据加载到 Spring 容器,之后就可以使用了。 + +##### 3.2 代理配置 + ++
++ +- 当你点击一个代理配置,则会展示出拖拉拽的数据到页面上。这部分会从数据库读取,之后展示出来,全部可视化。 +- 如果你点击了Save则会做出一份新的,之后对于旧的,你可以自己手动删除。 + +#### 4. 资源管理 + ++
++ +- 资源管理下,是配置一个智能体所需的各项资源信息,你可以在这里进行维护。如,MCP 工具管理。 + +#### 5. 页面使用 + +##### 5.1 对话交流 + ++
++ +##### 5.2 场景解析 + ++
++ +##### 5.3 监控分析 + ++
++ +- 配置后的智能体,可以在智能体选择里进行获取使用。之后进行提问。 +- 效果还不错,这里小傅哥验证了配置的智能体进行提问。 + +## 三、关于系统设计 + +本套系统设计,也是花费了非常大的心思。 + +### 1. 执行流程 + ++
++ +在整个 Ai Agent 的实现中,小傅哥带着大家分析设计了4种方案,包括;固定执行的、循环执行的、智能分析决策的还有一个按照步骤规划的。这些流程都有适合于自己业务场景使用。在代码中也都有不同方案的实现,之后通过用户选择后进行动态化的策略调度。 + +### 2. 核心动作 + +#### 2.1 数据装配 + ++
++ +- 首先,以构建 AiClientNode 的对话客户端为目的,已经完成了相关的元素实例化步骤。本节这里要处理的是,顾问角色的构建,以及构建 AiClientNode 节点。 +- 之后,AiClientNode 的构建,是关联了其他各项元素的,所以在构建时,需要在 AiClientNode 节点,从 Spring 容器通过 getBean 的方式,检索到对应的各项元素。 + +#### 2.2 动态调度 + ++
++ +- 这里会根据用户的请求,进行策略路由,找到所需的 Ai Agent 执行策略进行处理。这里小傅哥也有意加入不同的策略,让大家可以看到很多的 Ai Agent 设计思路。 + +#### 2.3 执行策略(01) + ++
++ +- 以程序启动为开始,进行自动化装配。这个过程我们先把一些想预先启动的数据库中的 agent 配置所需的 client 客户端进行服务初始化。之后写入到 Spring 容器,方便在执行 Agent 时进行使用。`前面有伙伴问,为什么把实例化的对象写入到 Spring 容器,这里就是原因` +- 客户端(UI),进行 POST 接口请求,这个过程需要封装一个 SSE 流式响应的接口,让 Step 1~4 各个执行步骤,把过程信息写入到流式接口。这里要注意,需要给接口返回的**对象**添加上对应的类型(什么步骤、什么节点、什么过程),以便于反馈给用户 Agent 在做什么。 + +#### 2.4 执行策略(02) + ++
++ +- 这是其中的一种 Ai Agent 执行策略方式,通过用户的提问进行分析、规划、列出执行步骤,之后依次执行。 +- 所有的这些实现都有相应的代码,带着大家使用规则树框架清晰的实现出来。 + +## 四、课程目录 + +### 1. 课程目录 + +**第1阶段** spring-ai v0.8.1 - RAG 静态知识库(本阶段,需要配置附件的 setting.xml) + +- 第1节:关于 AI RAG 知识库项目介绍 +- 第2节:初始化知识库工程&提交代码 +- 第3节:Ollama DeepSeek 流式应答接口... +- 第4节:Ollama DeepSeek 流式应答页面... +- 第5节:Ollama RAG 知识库上传、解析和验证 +- 第6节:Ollama RAG 知识库接口服务实现 +- 第7节:基于AI工具,设计知识库UI和接口对接 +- 第8节:Git仓库代码库解析到知识库 +- 第9节:扩展OpenAI模型对接,以及完整AI对接 +- 第10节:云服务器部署知识库(Docker、Ngin... + +**第2阶段** spring-ai v1.0.0 - MCP 动态知识库 + +- 第11节:吃上细糠,升级SpringAI框架 +- 第12节:康庄大道,上手 AI MCP 工作... +- 第13节,道山学海,实现MCP自动发帖服务(... +- 第14节,海纳百川,上线MCP自动发帖服务 +- 第15节,川流不息,实现MCP微信公众号消息通知服务 +- 第16节:息息相通,MCP 服务部署上线(sse 模式) + +**第3阶段** spring-ai v1.0.0 - Ai Agent 进行中「如果着急面试,可以直接做3阶段,完成到13节很够面试啦」 + +- 第3-0节:Ai Agent 项目介绍和系统演示【最初版本,含完整代码】 +- 第3-1节,Ai Agent 业务流程、系统架构、库表设计说明 +- 第3-2节:初始化项目工程 +- 第3-3节:Ai Agent 测试案例 +- 第3-4节:根据 Ai Agent 案例,设计库表 +- 第3-5节:多数据源和Mapper配置 +- 第3-6节:数据加载模型设计 +- 第3-7节:动态实例化客户端API +- 第3-8节:动态实例化对话模型 +- 第3-9节:实例化对话客户端 +- 第3-10节:Agent执行链路分析 +- 第3-11节:Agent执行链路设计 +- 第3-12节:Agent服务接口和UI对接(第一版AutoAgent效果) +- 第3-13节,Agent-ELK日志分析场景 +- 第3-14节,Agent-Prometheus监控分析场景 +- 第3-15节:AgentFlow执行链路分析(扩展思路) +- 第3-16节:FlowAgent执行链路设计(扩展思路) +- 第3-17节:增加调度器策略执行Agent链路 +- 第3-18节:动态执行智能体任务 +- 第3-19节:拖拉拽编排数据存储 +- 第3-20节:Agent管理后台实现 +- 第3-21节:在云服务器部署上线 + +### 2. 编程环境 + +- JDK 17 ~ 21 +- Postgresql +- SpringBoot 3.2.3 - Spring AI 0.8.1 ~ 1.0.0+ +- Redis +- Docker +- Ollama + DeepSeek + GPU - +- RAG、MCP、Function Call + +课程包括文档 + 小册,全程视频带着做。课程地址:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +> 综上,你可以看到此套项目的完整的介绍,这些也都是企业里非常实用的技能积累。有希望提高自己的编程能力和面试材料的,可以马上加入学习。 + +--- + +课程包括;视频、小册、1 对 1 答疑解惑、专属VIP项目交流群,并且提供简历编写模板结构的一条龙🐲服务。让你学习后,直接拉开与还在玩具项目其他人的差距,面试脱颖而出提高竞争力!!! + diff --git a/docs/md/project/ai-knowledge/ext/ai-agent-auto.md b/docs/md/project/ai-knowledge/ext/ai-agent-auto.md new file mode 100644 index 000000000..95cbe407e --- /dev/null +++ b/docs/md/project/ai-knowledge/ext/ai-agent-auto.md @@ -0,0 +1,137 @@ +--- +title: Ai Agent VS 字节扣子? +lock: no +--- + +# Ai Agent VS 字节扣子? + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +**媲美Dify,堪比扣子?🤔** 哈哈哈,经过哐哐的一顿卷,小傅哥这套 Ai Agent 项目,已经做出一版智能对话体(对接UI),在单一方面的功能体验上,确实可以和市面的 Ai Agent 产品握握手啦 🤝!效果很是不错,本文提供了视频和截图。 + +++ +**什么是 Ai Agent?** + +做的越多理解的也越透彻,Ai Agent 更像是对人的行为的理解。一个人再有力气,也没法一天完全一年全部的工作,而是需要我们把这些工作,做好规划、定好目标、完成执行、结果检查,循序渐进的执行再到最终交付。 + +那么,Ai Agent 也是一样的,Ai Token 提升的在高(等于人的力气),也没法一次做完所有事情。所以在结合了 `Prompt(提示词)`、`Advisor(记忆、RAG)`、`Tool(MCP)`,也可以把一整个大任务,细分为独立的小块,每一块做好规划、执行、审查和交付。所以 Ai Agent 再趋向一个人的行为。 + +**跟着小傅哥,吃上一碗细糠!** 可能你也做过一些学习的项目,但往往这些项目都是一些功能逻辑的叠加和 CRUD 的拼装 + 好看一些的脸面(UI)。但是跟着小傅哥学习,给你的就不只是一个项目,还会带着你做架构,搞设计,用优雅的方式进行编码,深度积累编程思维和编码能力。 + +>🧧 文末已提供整套 Ai Agent 实战项目的全套代码 + 各个分支章节的文档(含视频),学习起来非常爽! + +## 一、先上效果 - 堪比扣子! + +😂 做的多了,也做的久了。我发现,Ai Agent 所有模块架构好后,剩下的就是 Prompt 提示词质量的对比。**Prompt = Ai Agent 大脑!** 目前小傅哥演示的这套自研的 Ai Agent 就是反复优化 Prompt 的结果。 + +### 1. 对话场景 - 通用场景 + +#### 1.1 截图效果 + ++
++ +左侧是AI思考执行过程,右侧是最终执行结果。通过我们的提问,AI Agent 进行`分析`、`规划`、`执行`、`监督`,再到最终的结果产生。有了这样的步骤,最终的总结阶段数据就会更加准确。 + +#### 1.2 视频效果(对比扣子) + +视频:[https://www.bilibili.com/video/BV1VYbczDER6](https://www.bilibili.com/video/BV1VYbczDER6) + +### 2. 日志分析 - ELK 辅助提效(公司里非常需要这样的场景) + +#### 2.1 采集分析 + ++
++ +如图,是一个系统日志 ELK + Ai Agent 的运行简图,通过 MCP 服务的对接,让 Ai Agent 具备检索日志的能力,再结合分析话术,以此来完成日志的自动化分析。 + +#### 2.2 数据案例 + ++
++ +在互联网公司中,都会有一套类似 ELK 的分布式日志系统,之后各个应用会上报数据。研发在接收到系统报警和运营反馈线上问题的时候,研发就需要进入到 ELK 查看系统日志的情况,以此分析线上问题。 + +#### 2.3 智能分析 + ++
++ +通过 Ai Agent 分析 ELK 应用系统分布式日志,自动排除出限流用户的相关信息,来辅助研发日常工作提效。 + +## 二、系统设计 - 这是一个正经项目! + +Ai Agent 会的模型架构会趋向稳定并形成标准,之后便是 Prompt + MCP + Client 多链路动态执行迭代和优化。所以,把架构定义好,具备强扩展性是非常有必要的,也是程序员👨🏻💻工作价值的体现。—— 堆功能只等于 demo 案例,驾驭架构解决复杂问题才是核心价值体现! + +### 1. 库表设计 + ++
++ ++
++ +- 这里小傅哥设计了一套非常灵活的 Ai Agent 库表结构,满足动态配置各项资源,再由程序动态化的随时加载和使用。 +- 有了这样的库表,我们就可以按需配置出多种使用类型的 Ai Agent,之后对话或者 Job 任务方式执行使用。 + +### 2. 数据加载 + +如图,整体 ChatClient 客户端实例化过程; + ++
++ +- 首先,以构建 AiClientNode 的对话客户端为目的,已经完成了相关的元素实例化步骤。本节这里要处理的是,顾问角色的构建,以及构建 AiClientNode 节点。 +- 之后,AiClientNode 的构建,是关联了其他各项元素的,所以在构建时,需要在 AiClientNode 节点,从 Spring 容器通过 getBean 的方式,检索到对应的各项元素。 +- 注意,ai_client_system_prompt 系统提示词,需要修改为 Map 结构数据。这样更方便我们从数据里获取,哪些是属于当前 AiClientNode 构建时所需的元素。 + +### 3. 执行分析 + +如图,不同方案实现的 Agent 流程; + ++
++ +Ai Agent 的处理过程也是分为几类的,用于适应不同的场景使用; + +1. 固定N个步骤,这类的一般是配置工作流的,提高任务执行的准确性。如,一些检索资料、发送帖子、处理通知等。 +2. 顺序循环调用,配置 Agent 要执行的多个 Client 端,以此顺序执行。适合一些简单的任务关系,并已经分配好的动作,类似于1的方式。 +3. 智能动态决策,这类是目前市面提供给大家使用的 Agent 比较常见的实现方式,它会动态的规划执行动作,完成行动步骤,观察执行结果,判断完成状态和步骤。并最终给出结果。 + +### 4. 功能架构 + +如图,从Agent服务的装配到接口调用和响应的关系图; + ++
++ +- 以程序启动为开始,进行自动化装配。这个过程我们先把一些想预先启动的数据库中的 agent 配置所需的 client 客户端进行服务初始化。之后写入到 Spring 容器,方便在执行 Agent 时进行使用。`前面有伙伴问,为什么把实例化的对象写入到 Spring 容器,这里就是原因` +- 客户端(UI),进行 POST 接口请求,这个过程需要封装一个 SSE 流式响应的接口,让 Step 1~4 各个执行步骤,把过程信息写入到流式接口。这里要注意,需要给接口返回的**对象**添加上对应的类型(什么步骤、什么节点、什么过程),以便于反馈给用户 Agent 在做什么。 + +## 三、课程目录 + +整个课程分3个阶段讲解,包括;RAG、MCP,之后进入 Agent 阶段的学习。前面打好基础,后面进入应用。哪怕是小白,也可以跟着一起实战起来,而且每个阶段都有部署运行效果,越学越爽。 + +项目地址:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + ++
+\ No newline at end of file diff --git a/docs/md/project/ai-knowledge/ext/ai-agent-flowgram.md b/docs/md/project/ai-knowledge/ext/ai-agent-flowgram.md new file mode 100644 index 000000000..b65d81c23 --- /dev/null +++ b/docs/md/project/ai-knowledge/ext/ai-agent-flowgram.md @@ -0,0 +1,84 @@ +--- +title: 有方案了,让自研 Ai Agent 可视化编排! +lock: no +--- + +# 有方案了,让自研 Ai Agent 可视化编排! + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +每当一项新技术问世,市场上总会涌现出一批基于该技术的热门项目。以 AI 技术为例,紧随其后便出现了 `n8n`、`dify`、`coze` 等各类相关应用产品(当然,他们很优秀)。 + +然而,随着技术逐渐成熟和稳定,这些通用的解决方案往往会逐渐淡出市场。为什么呢?这是因为,各个企业下场后,都开始基于自身的业务,在细分领域,做自己的 Ai Agent 服务啦!所以,什么才是最重要的呢? + +++ +**什么才是最重要的呢?** + +从研发的角度来看,最关键的是;学习业务场景经验、积累技术架构方案、落地应用项目能力。相比市场上层出不穷、功能纷繁复杂的各类产品,真正有价值的是对技术本质的持续储备。只有具备扎实的技术功底,形成闭环的技术体系,才能自身核心价值能力。 + +有了这样的能力积累,你可以在任何一个公司,任何一个场景,架构出一套最为符合的业务系统。所以,你的能力也等同于你的级别和薪资。 + +所以,对于最火的 Ai Agent 不要只是会用就行了,拿个项目过来,部署上就觉得可以了。你要做的,是把全套的业务弄透彻,实现的方案搞下来,怎么编码整明白。好啦,开冲,今天给这套 Ai Agent 加上可视化编排方案。 + +> 🧧 文末提供了全套 AI、RAG、MCP、Agent 项目、开发教程以及工程源码。此外还有非常多的互联网大厂项目(17个),都可以一并获取学习。 + +## 一、拖拉拽效果 + +鉴于整个 Ai Agent 的配置,需要一大堆东西,如;执行频次任务、客户端串联、模型选择、顾问角色知识库、MCP 工具、提示词等,有一套可视化拖拉拽配置的前端页面,就显得非常有必要了。 + +因此小傅哥调研了不少具备图形化编排能力的前端组件,发现一套 [flowgram.ai(官网有文档,可直接阅读)](https://flowgram.ai/) 可以很好的满足当前 Ai Agent 编排能力。😄 并且上手不困难,效果还不错。 + ++
++ +- 首先,我们要基于 [flowgram.ai](https://flowgram.ai/) 框架,开发自己需要的 Node 节点(后面会有代码说明,方便伙伴扩展)。这里增加了;task、agent、client、too-mcp、model。 +- 之后,在页面点击添加节点,并选择好每个节点,应该配置的属性信息,以及连接节点关系。 +- 最后,点击保存,他会给你一个json 对象,按照对象的结构,创建服务端接口即可接收和保存。(相关保存操作,会在后续课程中添加,如果有诉求可以先把前端代码下载下去,对照json开发接口即可) + +> 本套全段代码 [ai-agent-station-front](#) 已经添加到课程中,可以进入获取。地址:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +## 二、怎么添加节点 + +### 1. 下载前端工程 + +首先,你要下载 [ai-agent-station-front](https://gitcode.net/KnowledgePlanet/ai-agent-station-front) 到本地使用 trae.ai 打开。如果没有提示你,要自己手动执行 npm install 初始化工程。 + ++
++ +- 首先,[flowgram.ai](https://flowgram.ai/) 官网提供了各种案例,可以下载一个进行扩展。这里小傅哥就是下载好的一个,之后添加我们需要的节点。 +- 之后,docs 下的 ai-agent-station.sql 为的是让 ai 可以使用,自动创建 node 节点的(下文有演示)。 +- 另外,这里的代码,对于稍微有些 react 编码基础的伙伴,是可以非常方便看懂的。后端工程师,如果不懂也没关系,让 ai 来解答以及操作。 + +### 2. Ai 编码,添加节点 + ++
++ +- 首先,下载一份国际版 trae.ai,这里有使用文档。[https://bugstack.cn/md/road-map/trae.html](https://bugstack.cn/md/road-map/trae.html) 使用 cursor 也可以,其实这东西,重要的就是好用的模型。 +- 之后,nodes 下是各种节点,我们可以拖拽一份让 ai 编码参考。并告诉ai,以哪个库表信息来编写新的节点。(有时候可能有问题,如果有问题,可以手动修改下) + +## 三、点击保存,查看json + ++
++ ++
++ +- 点击保存,就可以拿到节点和链接的关系数据了。这份数据是可以和数据库对应上。 +- 后续课程从0到1的实现过程中,会和后端接口联动,存储数据。现在你也可以先下载前端代码,尝试编码。 + diff --git a/docs/md/project/ai-knowledge/ext/ai-agent-job.md b/docs/md/project/ai-knowledge/ext/ai-agent-job.md new file mode 100644 index 000000000..01634d737 --- /dev/null +++ b/docs/md/project/ai-knowledge/ext/ai-agent-job.md @@ -0,0 +1,97 @@ +--- +title: 阶段性总结,Ai Agent 的重要性 +lock: no +--- + +# 阶段性总结,Ai Agent 的重要性 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +还好,还好早早的就开始了 AI 应用技术的储备,让我吃了互联网职场的第一碗创新类应用的技术饭。 + +其实从最早 OpenAI 发布 ChatGPT 开始,我就开始使用其接口陆续开发了应用,2022年年尾-开发智能问答助手、2023年年初-OpenAI应用项目(可支付买额度对话)、2023年终-OpenAI 代码自动评审。 + +可以说,在 AI 应用类开发这条路上,我一直走的很快也很靠前。甚至,我也思考怎么让 AI 识别接口,具备调用能力,而不是就只是做一些对话类操作。直至2024年他来啦! + +2024年11月份,Anthropic 公司推出了 MCP(Model Context Protocol,模型上下文协议)开放标准协议(JSON-RPC 2.0),其核心目标是通过提供一个标准化的接口,使AI模型能够无缝地访问本地和远程资源。 + +如果没有 MCP 可以说就没有 AI Agent 智能体,也不会有现在那么多的结合于 AI 来为工作提效的场景。 + +所以,当我看到 AI MCP 那一刻,我是很兴奋。也在 AI MCP 协议出了不久,立马筹备新的 AI Agent 项目,让大家都能学习到这一技术。而且我也早早的告诉过大家 **用不了多久,各大互联网企业都将大量的推进落地,自有 MCP 服务的实现,用于增强企业 AI 应用的提效能力。** 随后,我们看到了阿里支付宝 MCP、高德地图 MCP、百度搜索 MCP,等等各类 MCP 服务如雨后春笋一般。再往后各个公司推出了各种的 Ai Agent 能力,因为 AI 可以调用 MCP 服务,真正的帮我们做一些事情。 + +现在,公司里随便一个功能服务接口(RPC、HTTP),都可以通过简单配置走 MCP 网关转换为 MCP 协议接口能力,让 AI Agent 通过配置即可完成调用。也就是说,通过配置接口 + Prompt 提示词,既可以承接绝对部分日常工作,如;客诉排查、日志分析、监控巡检、文档评审、单测开发等等。 + +老板总说,我需要的不只是 AI 开发能力的人才,而且他还要懂得业务,具备应用项目落地能力。这样才能为我们企业的场景提效,而不是天马行空。所以,想学 AI 的伙伴来说,不要只是一头扎入到 AI 里,也要多积累业务场景经验。 + +## 一、市面的开源资料 + +**86.5k Star!** 关注 Ai Agent 实现的人超级多,也都知道这是一个热门方向。项目:[https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools](https://github.com/x1xhlol/system-prompts-and-models-of-ai-tools) + +++ +这是一款开源系统提示词项目,包含了市面的热门产品 Trae、Cursor、Claude、v0 等20多款 Ai Agent 项目的提示词 + MCP Tool。非常适合需要做 Ai Agent 项目的伙伴借鉴使用。 + +小傅哥还复制下来 Trae.ai 提示词(不过可能不是最新版)的内容进行本地验证,配置百度搜索 MCP 服务 + 本地文件处理。经过提问后,可以在本地创建出对应的文件夹内容,如果在结合进去 Shell 脚本能力,会更好。如果想要更好的效果,可以完全配置出一套 Trae 所需的工具服务组,那么效果会更好。 + ++
++ +目前 Ai Agent 的开发实现,主要为;`分析`、`规划`、`执行`、`验证`,以及在这个过程中循环检测执行,对结果进行确认校验继续分析。可能将来也会由 OpenAI 主导,设计一套 Ai Agent 框架结构组件,那么 Ai Agent 的开发门口将更低也会更通用(目前就有不少这样的 Auto Agent 框架)。 + +## 二、也快接近尾声啦 + +2025年3月3日,小傅哥带着大家从 RAG 开始,之后进入 MCP,后来又做到 Ai Agent,持续了半年多。这块也快收尾了,核心功能都已经完成,陆续的开始做一些收尾的章节。 + ++
++ +- RAG 10节、MCP 6节、Ai Agent 18节(还有待更新的),目前整体34节,后续整体都做完预计到40节,10.1假期后差不多。 + +## 三、总结下项目内容 + +### 1. 页面效果 + ++
++ +- 如图,用户可以自己选择一个对话场景的智能体,之后后端会根据用户的请求进行动态化策略调度。 +- 目前,已经添加的场景有;CSDN发帖 + 通知(同类小红书也可以做)、智能对话分析、ELK日志检索分析、智能监控分析服务。只要你学习了这套系统,就可以设计出你所需要的 Ai Agent 使用场景。 + +### 2. 执行流程 + ++
++ +在整个 Ai Agent 的实现中,小傅哥带着大家分析设计了4种方案,包括;固定执行的、循环执行的、智能分析决策的还有一个按照步骤规划的。这些流程都有适合于自己业务场景使用。在代码中也都有不同方案的实现,之后通过用户选择后进行动态化的策略调度。 + +### 3. 核心动作 + +#### 3.1 动态调度 + ++
++这里会根据用户的请求,进行策略路由,找到所需的 Ai Agent 执行策略进行处理。这里小傅哥也有意加入不同的策略,让大家可以看到很多的 Ai Agent 设计思路。 + +#### 3.2 执行策略 + ++
++ +- 这是其中的一种 Ai Agent 执行策略方式,通过用户的提问进行分析、规划、列出执行步骤,之后依次执行。 +- 所有的这些实现都有相应的代码,带着大家使用规则树框架清晰的实现出来。 + +好啦,欢迎感兴趣的伙伴一起加入学习,小傅哥的社群,有非常多的实战项目,涵盖;业务、组件、框架、源码、开源、创新等,让你加入后,就等同于加入一个互联网大厂的核心项目组,各项信息都能全部接触到,甚至包括产品 PRD 文档。**因为小傅哥就是大厂架构师,所以也是按照一个我所在的核心的组的方式来给大家建设与之匹配的资料内容。** + diff --git a/docs/md/project/ai-knowledge/ext/ai-agent-mcp-auth.md b/docs/md/project/ai-knowledge/ext/ai-agent-mcp-auth.md new file mode 100644 index 000000000..381acbf09 --- /dev/null +++ b/docs/md/project/ai-knowledge/ext/ai-agent-mcp-auth.md @@ -0,0 +1,450 @@ +--- +title: 给 MCP 服务加上安全认证! +lock: no +--- + +# 给 MCP 服务加上安全认证! + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +刚刚过去两个月,市面的 MCP 服务,如雨后春笋一般不断涌现出来,包括;`百度`、`高德`、`网盘`、`支付宝`。这些 MCP 服务,可以让我们基于 Spring AI 框架构建的 Agent 具备非常丰富的使用功能。同时这也说明,程序员👨🏻💻,应该具备开发 MCP 服务的能力,Spring AI 让 Java 再次牛逼! + +++ +>关于 RAG、MCP、Agent 是什么,这里小傅哥已经编写过了全套的教程,可以进入学习;[https://bugstack.cn/md/project/ai-knowledge/ai-knowledge.html](https://bugstack.cn/md/project/ai-knowledge/ai-knowledge.html) + +本节小傅哥主要给大家分享,关于市面上这些标准的带有验证权限的 MCP 服务,怎么使用 Spring AI 进行对接。同时我们自己开发的 MCP 服务,怎么加上权限校验。 + +## 一、举例,对接高德地图 MCP + +高德地图 MCP Server; + +```java +{ + "mcpServers": { + "amap-amap-sse": { + "url": "https://mcp.amap.com/sse?key=您在高德官网上申请的key" + } + } +} +``` + +- 官网:[https://lbs.amap.com/api/mcp-server/gettingstarted](https://lbs.amap.com/api/mcp-server/gettingstarted) - `官网提供了创建对接 Key` + +### 1. 代码使用示例 + +```java +@Configuration +public class McpConfig { + + @Bean + public List+
mcpClientTransport() { + McpClientTransport transport = HttpClientSseClientTransport + .builder("https://mcp.amap.com") + .sseEndpoint("/sse?key= ") + .objectMapper(new ObjectMapper()) + .build(); + + return Collections.singletonList(new NamedClientMcpTransport("amap", transport)); + } + +} +``` + +- 对接时,需要设定 sseEndpoint 如果不设定个,Spring AI 默认是对 builder 的 baseUrl 值添加 `/sse` 的。 +- 所以,如果你要对接外部带有验证权限的 MCP 服务,需要手动设置下 sseEndpoint 值。 + +### 2. 项目中的配置 + +小傅哥,带着大家做的 Ai Agent,也支持了外部的这些带有权限校验的 MCP 服务。你可以,以多种方式进行配置。如; + +```java +{ + "baseUri":"https://mcp.amap.com", + "sseEndpoint":"/sse?key=801aabf79ed0ff78603cfe85****" +} +``` + +```java +{ + "baseUri":"https://mcp.amap.com", + "sseEndpoint":"/sse?key=801aabf79ed0ff78603cfe85****" +} +``` + +- 以上两种配置方式,在 ai-agent-station 都做了兼容处理。以下是兼容代码,学习这部分项目的伙伴,可以直接阅读课程代码。 + +```java +@Slf4j +@Component +public class AiClientToolMcpNode extends AbstractArmorySupport { + + // ... 省略部分代码 + + protected McpSyncClient createMcpSyncClient(AiClientToolMcpVO aiClientToolMcpVO) { + String transportType = aiClientToolMcpVO.getTransportType(); + + switch (transportType) { + case "sse" -> { + AiClientToolMcpVO.TransportConfigSse transportConfigSse = aiClientToolMcpVO.getTransportConfigSse(); + // http://127.0.0.1:9999/sse?apikey=DElk89iu8Ehhnbu + String originalBaseUri = transportConfigSse.getBaseUri(); + String baseUri; + String sseEndpoint; + + int queryParamStartIndex = originalBaseUri.indexOf("sse"); + if (queryParamStartIndex != -1) { + baseUri = originalBaseUri.substring(0, queryParamStartIndex - 1); + sseEndpoint = originalBaseUri.substring(queryParamStartIndex - 1); + } else { + baseUri = originalBaseUri; + sseEndpoint = transportConfigSse.getSseEndpoint(); + } + + sseEndpoint = StringUtils.isBlank(sseEndpoint) ? "/sse" : sseEndpoint; + + HttpClientSseClientTransport sseClientTransport = HttpClientSseClientTransport + .builder(baseUri) // 使用截取后的 baseUri + .sseEndpoint(sseEndpoint) // 使用截取或默认的 sseEndpoint + .build(); + + McpSyncClient mcpSyncClient = McpClient.sync(sseClientTransport).requestTimeout(Duration.ofMinutes(aiClientToolMcpVO.getRequestTimeout())).build(); + var init_sse = mcpSyncClient.initialize(); + log.info("Tool SSE MCP Initialized {}", init_sse); + return mcpSyncClient; + } + case "stdio" -> { + AiClientToolMcpVO.TransportConfigStdio transportConfigStdio = aiClientToolMcpVO.getTransportConfigStdio(); + Map stdioMap = transportConfigStdio.getStdio(); + AiClientToolMcpVO.TransportConfigStdio.Stdio stdio = stdioMap.get(aiClientToolMcpVO.getMcpName()); + + // https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem + var stdioParams = ServerParameters.builder(stdio.getCommand()) + .args(stdio.getArgs()) + .build(); + var mcpClient = McpClient.sync(new StdioClientTransport(stdioParams)) + .requestTimeout(Duration.ofSeconds(aiClientToolMcpVO.getRequestTimeout())).build(); + var init_stdio = mcpClient.initialize(); + log.info("Tool Stdio MCP Initialized {}", init_stdio); + return mcpClient; + } + } + + throw new RuntimeException("err! transportType " + transportType + " not exist!"); + } + +} +``` + +- 以上代码,是为了自动化构建 MCP 服务的,其中 case sse 的部分,会对 url 进行拆分,如果本身 url 配置了校验权限,则不会从另外一个参数获取,否则从另外参数拼接。这样就可以很好的扩展用户配置时的多样性问题了。 + +>以上是关于带有权限校验的 MCP 服务配置的问题,接下来,我们要说下怎么自己开发一个带有权限校验 + +## 二、实现,带有权限校验的 MCP 服务 + +首先,Spring AI 是有意提供基于自家的 OAuth2 框架,完成 MCP 服务的多样性权限校验的。不过目前提供的方案能用,但不算成熟。 + + ++ +官网:[https://spring.io/blog/2025/05/19/spring-ai-mcp-client-oauth2](https://spring.io/blog/2025/05/19/spring-ai-mcp-client-oauth2) + +### 1. 基于 OAuth2 认证 + +#### 1.1 工程结构 + ++
++ +- 工程:[https://gitcode.net/KnowledgePlanet/mcp-server-auth](https://gitcode.net/KnowledgePlanet/mcp-server-auth) - `面向于学习 ai-agent-station 的伙伴` +- 使用 OAuth2 基于 Spring MVC 的方式到也简单,知道添加配置即可。 + +#### 1.2 所需的 POM 文件 + +```pom ++
+ + +org.springframework.boot +spring-boot-starter-oauth2-resource-server ++ + +org.springframework.boot +spring-boot-starter-oauth2-authorization-server ++ +``` + +#### 1.3 测试验证 + +```java +@Slf4j +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, properties = "server.shutdown=immediate") +public class ApiTest { + + @LocalServerPort + private int port; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Test + public void test_access_token() throws IOException, InterruptedException { + String token = obtainAccessToken(); + log.info("token:{}", token); + // eyJraWQiOiJiMWQ0MGIxNi1hOTYzLTQ2NmYtYTVkOC02NGRjMzg0ODljYWEiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJtY3AtY2xpZW50IiwiYXVkIjoibWNwLWNsaWVudCIsIm5iZiI6MTc0ODA1MTc1NiwiaXNzIjoiaHR0cDovL2xvY2FsaG9zdDo1ODA5OCIsImV4cCI6MTc0ODA1MjA1NiwiaWF0IjoxNzQ4MDUxNzU2LCJqdGkiOiI5NjY4ZmZkMi0wNjQ2LTRiNmItODQ4Ni1jYzk3ZjMxNTdmOTEifQ.CG4GYai_NYkmfcqmNi-_HYG06Kan04uNSsC2ivn_eC9Ra6xMKYTs9KIT7k5lKxSFRUOPI7K0zJNVvNXrrIe0iFl-csrG2vGukNTGTPMxtUi2hheBMRbnvjvuojW4DeOEE8UOpdA6uow67ucwcymTlDXE-k7OjRZeyp7UdVz2WyoDFQhLB6ihLbDSj5puAZxfNocirRzo36gmW243aW9f1gugPUcpND-oobc2q8xyBG2cX2AlGXUSS-v9PLjHr2W2smFTKHHGwu7FpMMBnJLUT5gZD0llIg6yqro91nFaAFOpGHXjRZYgVjkRlzxx08Zuquva9PbStxbUl2j8hI43_Q + + var client = HttpClient.newHttpClient(); + + var request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:" + port + "/sse")) + .header("Accept", "text/event-stream") + .header("Authorization", "Bearer " + token) + .GET() + .build(); + + var responseCode = new AtomicInteger(-1); + var sseRequest = client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream()).thenApply(response -> { + responseCode.set(response.statusCode()); + if (response.statusCode() == 200) { + log.info("response:{}", JSON.toJSONString(response)); + return response; + } + else { + throw new RuntimeException("Failed to connect to SSE endpoint: " + response.statusCode()); + } + }); + + await().atMost(Duration.ofSeconds(1)).until(sseRequest::isDone); + assertThat(sseRequest).isCompleted(); + assertThat(responseCode).hasValue(200); + } + + private String obtainAccessToken() throws IOException, InterruptedException { + var client = HttpClient.newHttpClient(); + + var clearTextCredentials = "mcp-client:secret".getBytes(StandardCharsets.UTF_8); + var credentials = new String(Base64.getUrlEncoder().encode(clearTextCredentials)); + var request = HttpRequest.newBuilder() + .uri(URI.create("http://localhost:" + port + "/oauth2/token")) + .header("Authorization", "Basic " + credentials) + .header("Content-Type", "application/x-www-form-urlencoded") + .POST(ofString("grant_type=client_credentials")) + .build(); + + var rawResponse = client.send(request, HttpResponse.BodyHandlers.ofString()).body(); + + Maporg.springframework.ai +spring-ai-starter-mcp-server-webmvc +response = objectMapper.readValue(rawResponse, Map.class); + return response.get("access_token"); + } + +} +``` + +- 加上 OAuth2 以后,就需要获取并设置 accessToken 才能访问 sse 服务了。 + +### 2. 基于网关实现 + +其实我们到不非得依赖于 Spring OAuth2 往 MCP 服务里在添加一些其他的东西。倒不如直接走网关,让网关来管理权限,MCP 服务只做服务的事情就好。 + +这里我们基于 Nginx 来配置验证功能,当然你可以在学习本节的案例后,配置任何其他的网关来管理你的 MCP 服务。 + +注意,这里的前置条件为你已经跟着小傅哥,至少完成了一个 MCP 服务。课程;[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +当我们有了一套基于 sse 形式访问的 mcp 后,我们是可以给这套 mcp 基于 nginx 转发的形式进行访问后面真实的 mcp 服务的。在转发的过程中,拿到用户在地址 `http://127.0.0.1:9999/sse?apikey=DElk89iu8Ehhnbu` mcp 服务后面拼接的 apikey,并对 apikey 进行验证。 + +#### 2.1 配置工程 + + ++ +- 在 ai-agent-station 项目下,提供了 dev-ops-v2 配置 mcp 服务转发和验证能力。 +- 注意,部署的时候,要把 mcp.localhost.conf 转发的 mcp 服务的地址,更换为你的地址。 +- 另外,每一个 mcp.localhost.conf 还可以配置域名,这样就达到了高德地图 mcp 访问的效果。举例;`https://fatie.mcp.bugstack.cn/sse/apikey=*******` + +#### 2.2 服务转发&校验 + +```java +# 可以负载服务 +upstream backend_servers { + server 192.168.1.108:8101; +} + +server { + listen 80; + + server_name 192.168.1.104; # 修改为你的实际服务器 IP 或域名【域名需要备案】 + + location /sse { + # 验证apikey参数,这个apikey也可以对接服务端接口来处理。 + if ($arg_apikey != "DElk89iu8Ehhnbu") { + return 403; # 如果apikey不正确,返回403禁止访问 + } + + # 重写URL,去掉apikey参数 + rewrite ^(/sse/)\?apikey=.* $1 break; + + proxy_pass http://backend_servers; # 将请求代理到上游服务器组 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + chunked_transfer_encoding off; + proxy_buffering off; + proxy_cache off; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /mcp/message { + proxy_pass http://backend_servers; # 将请求代理到上游服务器组 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + +} +``` + +- 特别注意,mcp 服务是有2个步骤的,一个是 sse 访问,还有一个 mcp/message 的处理。我们只需要对 sse 的请求进行验证即可。 +- `/sse` 请求路径,需要会提取 apikey 与 nginx 配置的值进行对比,如果不正确则会返回一个 403 禁止访问,通过则放行。 +- 之后重写 url 地址,让转发到本身 mcp 的地址是干净的。从 `http://127.0.0.1:9999/sse?apikey=DElk89iu8Ehhnbu` 验证转发后为 `http://192.168.1.108:8101/sse` + +#### 2.3 功能验证 + +首先,要确保你的 mcp 服务是可以使用的。如,访问;`http://192.168.1.108:8101/sse` 可以获得到结果。 + ++
++- 如图,验证成功。我们可以通过转发的方式进行验证和使用。 +- 另外,有了转发和验证,你原本的服务,sse 8101 就不用对外了。只有你的网关(nginx)可以访问即可。这样就可以控制权限了。 + +#### 2.4 动态验证 + +那么,目前我们配置的nginx 转发这不是一个固定的权限账号吗,怎么让不同的接入方都申请一个秘钥key来使用呢?这里我们需要使用到 nginx 的 auth 认证模块。 + +```java +# 可以负载服务 +upstream backend_servers { + server 192.168.1.108:8101; +} + +server { + listen 80; + + server_name 192.168.1.104; # 修改为你的实际服务器 IP 或域名【域名需要备案】 + + location /sse { + auth_request /auth; + + # 重写URL,去掉apikey参数 + rewrite ^(/sse/)\?apikey=.* $1 break; + + proxy_pass http://backend_servers; # 将请求代理到上游服务器组 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + + chunked_transfer_encoding off; + proxy_buffering off; + proxy_cache off; + proxy_set_header X-Forwarded-For $remote_addr; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /mcp/message { + proxy_pass http://backend_servers; # 将请求代理到上游服务器组 + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location = /auth { + # 发送子请求到HTTP服务,验证客户端的凭据,返回响应码 + internal; + # 设置参数 + set $query ''; + if ($request_uri ~* "[^\?]+\?(.*)$") { + set $query $1; + } + # 验证成功,返回200 OK + proxy_pass http://207.246.123.*:8090/auth/token?$query; + # 发送原始请求 + proxy_pass_request_body off; + # 清空 Content-Type + proxy_set_header Content-Type ""; + } + +} + +``` + +- 在访问 `/sse` 的时候,增加 auth 认证,auth 来访问本地一个 http 接口。你可以是 SpringBoot 实现的接口。这个接口负责验证你的秘钥是否正确。同时你的 SpringBoot 服务还可以提供出一个创建秘钥的平台,让接入方使用。 +- 其实类似这样的场景,使用功能更加丰富的 api 网关都是自带的,或者 github 一些专门为 mcp 做网关服务的也都有。 + +## 三、增强,学习 rag、mcp、agent + +小傅哥,已经为你准备好了一套 AI RAG、MCP、Agent 实践编程课程,使用 Java + Spring AI 框架,增强自己的 AI 应用开发能力,迅速囤积编程技能,满足各个公司招聘时对AI应用类开发的要求!如下,课程目录,全程文档小册 + 视频带着你从0到1学习。 + +#### **第1期 RAG Spring AI 0.8.1 - 完结** + +1. 【更】AI RAG 知识库,项目介绍&需求分析&环境说明 +2. 【更】初始化知识库工程&部署模型&提交代码 +3. 【更】Ollama DeepSeek 流式应答接口实现 +4. 【更】Ollama DeepSeek 流式应答页面对接 +5. 【更】Ollama RAG 知识库上传、解析和验证 +6. 【更】Ollama RAG 知识库接口服务实现 +7. 【更】基于AI工具,设计前端UI和接口对接 +8. 【更】Git仓库代码库解析到知识库并完善UI对接 +9. 【更】扩展OpenAI模型对接,以及完整AI对接 +10. 【更】云服务器部署知识库(Docker、Nginx) + +#### **第2期 MCP Spring AI 1.0.0 - 完结** + +1. 【更】吃上细糠,升级SpringAI框架 +2. 【更】康庄大道,上手 AI MCP 工作流 +3. 【更】道山学海,实现MCP自动发帖服务(stdio) +4. 【更】海纳百川,上线MCP自动发帖服务 +5. 【更】川流不息,实现MCP微信公众号消息通知服务 +6. 【更】息息相通,MCP 服务部署上线(sse 模式) + +#### 第3期 Agent Spring AI 1.0.0 - 进行中【全套源码和部署已提供】 + +1. 第3-0节,AiAgent项目介绍和系统演示 +2. 第3-1节,Ai Agent 业务流程、系统架构、库表设计说明 +3. 第3-2节,初始化工程和库表dao等,提交代码,讲解代码库使用 +4. 第3-3节,硬编码方式讲解 Ai Agent 构建,为后续拆分做准备 +5. 第3-4节,引入扳手工程,规则模型,整体设计Agent预热装配 +6. 第3-5节,规则节点,RootNode 异步加载数据 +7. 第3-6节,规则节点,AiClientToolMcpNode 工具MCP服务构建 +8. 第3-7节,规则节点,AiClientAdvisorNode 顾问角色服务构建 +9. 第3-8节,规则节点,AiClientModelNode 模型构建 bean 对象 +10. 第3-9节,规则节点,AiClientNode 客户端构建 +11. 第3-10节,Agent 服务预热和对话接口封装,使用验证 +12. 第3-11节,知识库接口封装和使用 +13. 第3-12节,智能体动态任务构建 +14. 第3-13节,Admin 管理端 API 接口讲解(CRUD) +15. 第3-14节,Ai Agent 对话与 UI 页面对接 +16. 第3-15节,构建镜像,上线云服务器 +17. 第3-16节,Agent 场景玩法分享 +18. ... 更多内容,随着课程开始逐步更新。 + +课程详细介绍:[https://mp.weixin.qq.com/s/j_G32TDfM_l-S76Wo0zPXw](https://mp.weixin.qq.com/s/j_G32TDfM_l-S76Wo0zPXw) + diff --git a/docs/md/project/ai-knowledge/ext/ai-agent-notes.md b/docs/md/project/ai-knowledge/ext/ai-agent-notes.md new file mode 100644 index 000000000..970b543dc --- /dev/null +++ b/docs/md/project/ai-knowledge/ext/ai-agent-notes.md @@ -0,0 +1,84 @@ +--- +title: Ai Agent 新项目,你要的简历模板来啦! +lock: no +--- + +# Ai Agent 新项目,你要的简历模板来啦! + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +**简历怎么写?简历怎么写?简历怎么写?** 这群死鬼,一直催小傅哥,想让小傅哥把饭🍚喂嘴里。没办法,兄弟们着急秋招写简历了,让自己写总是感觉慌,不知道从哪下手。好啦,它来了,它来了,行了吧! + +++ +**你就说吧,各个大厂都在做,它能不重要?** + +Dify、Coze、Claude,京东还开源了 JoyAgent,市面上互联网大厂做的 Ai Agent 产品可以说是如雨后春笋一般,越来越多了。Ai Agent 也成了互联网标配的业务场景,为各个应用业务提效,所以结于业务场景来看,Ai Agent 是有战略意义的。 + +所以,你想面试互联网类公司,在简历上多一笔关于 Ai 类的场景实现,总是能匹配到公司里更多的部门岗位。尤其是具备一些 Ai Agent 开发能力的,在现在看来,可以说是非常亮眼的存在。就趁现在吧,该让自己的简历增强下啦!🌶 + +>接下来,我会站在一个求职者的角度进行项目介绍和简历内容展示。可以作为你的参考。 + +## 一、运行效果 + +先看一眼系统架构和运行效果,之后我们对项目进行介绍和简历编写。—— 面试时,可能也会有面试官看你的项目运行效果,你可以把项目上线,也可以写一个技术博客文章,来介绍你做的项目。 + ++
++ ++
++ ++
++ +- 更多可查看,[关于 Ai Agent 项目介绍](https://mp.weixin.qq.com/s/S3UJY0aWbulQ2OZH9XVYmw) + +## 二、项目介绍 + +面试官您好,本套 Ai Agent 综合智能体项目,主要为业务应用系统提效而构建,包括;需求文档分析、代码评审(可结合 openai 代码自动评审)、文档资料编写(+消息通知)、ELK 日志检索 + 普罗米修斯监控的智能 Ai Agent 分析等功能。 + +整套项目,抽象设计拆分了 Ai Agent 执行过程所需的各项组件(Advisor、Prompt、MCP)能力到数据库表中,使其具备自由配置编排组装的特性。以此方式可结合应用中实际场景诉求,编排类似 Diff 和智能分析 Coze 能力,达到需要什么场景就配置什么场景的 Ai Auto Agent。 + +该项目,在架构设计上使用了 DDD 分层架构进行设计,运用了组合模式的规则引擎构建执行链路,并结合工厂、策略、责任链等方式来处理具体流程细节(多种组合方式的Ai Agent执行过程),以此解耦系统功能的实现。这样就可以更加灵活方便的迭代各类扩展性诉求。 + +## 三、简历模板 + +**注意**:🙅🏻♀️不要直接复制粘贴简历模板内容,以此结构和描述方式,可以用你的个人第1学习视角来描述。包括;学习过程中的积累、检索的同类资料,以及对课程的扩展等多方面内容来编写简历。以下简历涵盖了课程 1~3 阶段内容; + +- 项目名称:`Ai Agent 综合应用提效智能体`/`Ai Agent 智能巡检系统`/`Ai Agent 可编排服务系统` - 基于你的实际场景/目的,修改项目名称 +- 项目架构:微服务架构、DDD 领域驱动四色模型、前后端分离设计、Agent 设计模式 +- 核心技术:Spring AI(RAG、MCP、Advisor)、SpringBoot、MyBatis、MySQL、PGVector、Redis、React、flowgram.ai、Nginx、Docker +- 项目描述:本项目是一套面向业务应用系统提效的综合智能体(Ai Agent)解决方案,支持将执行过程中的各项能力(如Advisor、Prompt、MCP)抽象并存储于数据库,实现自由配置和灵活编排。用户可根据实际业务场景,动态组合和调整智能分析、代码评审、日志检索等功能模块,打造定制化的Ai Auto Agent,从而显著提升开发设计、编码、运维效率。 +- 核心职责: + - 以产品(PRD)服务诉求和多方面调研评审,设计出具有可编排能力的 Ai Agent 服务架构。并以 DDD 领域驱动建模,构建系统架构。 + - 拆解 Ai Agent 执行过程所需的能力组件,包括;Advisor 顾问角色记忆上下文和访问RAG知识库、Tool(Function Call、MCP)调用服务端(推文、通知、ELK、普罗米修斯监控等)、Prompt(提示词)、Model(对话模型)、Api(使用 one-api/自研sdk组件,统一转换其他各个模型为 openai 格式) + - 设计通用对话分析模型,完成 Ai Agent 执行过程中所需的,问题分析、自主规划、精准执行、内容判罚(循环执行),直至输出最终结果。—— Ai Agent 可对不同步骤配置不同的 Model + MCP + Prompt 能力。并对执行过程中,通过 Advisor 顾问角色访问知识库和存储上下文数据。 + - 实现 MCP 服务能力,以 stdio/sse 方式,开发,公众号通知 MCP、推文 MCP(可以是内部的文档化服务)、ELK-MCP、普罗米修斯-MCP等。以及使用 MCP 服务平台,检索公用能力 https://sai.baidu.com/zh/(本地文件、Github、搜索引擎),统一配置使用。—— 数据库设计了多类型 MCP 服务的配置操作。 + - 设计通用 MCP Nginx Token 校验能力(也可以设计 MCP-GateWay),以配置化方式进行鉴权使用。增强 MCP 调用过程中,数据传输安全性。 + - 基于 Spring TaskScheduler 扩展实现,智能体任务调度服务,可自动化完成日常系统巡检(客诉、报警)产生 html 格式报告文档。也可以基于报警监听消息,触发巡检动作(公司内,报警信息有 MQ 消息)。 + - 提供 RAG 知识库能力,可自主上传文件 + 解析工程代码库,并对知识库设有标签为 Ai Agent Advisor 访问 RAG 提供数据使用能力,增强准确性。—— 解析的代码库,可以为 openai 代码自动评审,增强评审能力。 + - 设计一键 Ai Agent 预热能力,动态化注入 Spring 容器。支持运营配置服务,随时调整、变更、上线,方便运营配置和使用。 + - 基于 Racet + flowgram.ai 框架,为 Ai Agent 服务提供拖拉拽编排能力,增强运营使用体验。 + +> 此套 Ai Agent 以为企业/平台/系统,上线3个月以来,主动巡检解决数十次系统隐患问题和运营配置错误情况,以及撰写了上万篇有效文档 + 提炼技术关键信息对新人辅导。后续还会继续配置更多方面的 Ai Agent 服务能力,为企业提效。 + +## 四、课程目录 + +整个课程分3个阶段讲解,包括;RAG、MCP,之后进入 Agent 阶段的学习。前面打好基础,后面进入应用。哪怕是小白,也可以跟着一起实战起来,而且每个阶段都有部署运行效果,越学越爽。 + +项目地址:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + ++
+\ No newline at end of file diff --git a/docs/md/project/ai-knowledge/none.md b/docs/md/project/ai-knowledge/none.md new file mode 100644 index 000000000..f64218b2f --- /dev/null +++ b/docs/md/project/ai-knowledge/none.md @@ -0,0 +1,15 @@ +--- +title: 新章节,编写中 +lock: no +--- + +# 新章节,编写中 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、前言 + +... 新章节,编写中 \ No newline at end of file diff --git a/docs/md/project/ai-knowledge/notes.md b/docs/md/project/ai-knowledge/notes.md new file mode 100644 index 000000000..a85043fcf --- /dev/null +++ b/docs/md/project/ai-knowledge/notes.md @@ -0,0 +1,133 @@ +--- +title: 面试:技能、简历、问题汇总 +lock: no +--- + +# 《Ai Agent》,关于面试中的技能、简历、问题汇总 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +此部分主要用于向读者提供星球项目之一的《Ai Agent》项目如何体现到简历中,包括;专业技能、项目经验。 + +## 一、项目介绍 + +面试官您好,本套 Ai Agent 综合智能体项目,主要为业务应用系统提效而构建,包括;需求文档分析、代码评审(可结合 openai 代码自动评审)、文档资料编写(+消息通知)、ELK 日志检索 + 普罗米修斯监控的智能 Ai Agent 分析等功能。 + +整套项目,抽象设计拆分了 Ai Agent 执行过程所需的各项组件(Advisor、Prompt、MCP)能力到数据库表中,使其具备自由配置编排组装的特性。以此方式可结合应用中实际场景诉求,编排类似 Diff 和智能分析 Coze 能力,达到需要什么场景就配置什么场景的 Ai Auto Agent。 + +该项目,在架构设计上使用了 DDD 分层架构进行设计,运用了组合模式的规则引擎构建执行链路,并结合工厂、策略、责任链等方式来处理具体流程细节(多种组合方式的Ai Agent执行过程),以此解耦系统功能的实现。这样就可以更加灵活方便的迭代各类扩展性诉求。 + +## 二、简历模板 + +**注意**:🙅🏻♀️不要直接复制粘贴简历模板内容,以此结构和描述方式,可以用你的个人第1学习视角来描述。包括;学习过程中的积累、检索的同类资料,以及对课程的扩展等多方面内容来编写简历。以下简历涵盖了课程 1~3 阶段内容; + +- 项目名称:`Ai Agent 综合应用提效智能体`/`Ai Agent 智能巡检系统`/`Ai Agent 可编排服务系统` - 基于你的实际场景/目的,修改项目名称 +- 项目架构:微服务架构、DDD 领域驱动四色模型、前后端分离设计、Agent 设计模式 +- 核心技术:Spring AI(RAG、MCP、Advisor)、SpringBoot、MyBatis、MySQL、PGVector、Redis、React、flowgram.ai、Nginx、Docker +- 项目描述:本项目是一套面向业务应用系统提效的综合智能体(Ai Agent)解决方案,支持将执行过程中的各项能力(如Advisor、Prompt、MCP)抽象并存储于数据库,实现自由配置和灵活编排。用户可根据实际业务场景,动态组合和调整智能分析、代码评审、日志检索等功能模块,打造定制化的Ai Auto Agent,从而显著提升开发设计、编码、运维效率。 +- 核心职责: + - 以产品(PRD)服务诉求和多方面调研评审,设计出具有可编排能力的 Ai Agent 服务架构。并以 DDD 领域驱动建模,构建系统架构。 + - 拆解 Ai Agent 执行过程所需的能力组件,包括;Advisor 顾问角色记忆上下文和访问RAG知识库、Tool(Function Call、MCP)调用服务端(推文、通知、ELK、普罗米修斯监控等)、Prompt(提示词)、Model(对话模型)、Api(使用 one-api/自研sdk组件,统一转换其他各个模型为 openai 格式) + - 设计通用对话分析模型,完成 Ai Agent 执行过程中所需的,问题分析、自主规划、精准执行、内容判罚(循环执行),直至输出最终结果。—— Ai Agent 可对不同步骤配置不同的 Model + MCP + Prompt 能力。并对执行过程中,通过 Advisor 顾问角色访问知识库和存储上下文数据。 + - 实现 MCP 服务能力,以 stdio/sse 方式,开发,公众号通知 MCP、推文 MCP(可以是内部的文档化服务)、ELK-MCP、普罗米修斯-MCP等。以及使用 MCP 服务平台,检索公用能力 https://sai.baidu.com/zh/(本地文件、Github、搜索引擎),统一配置使用。—— 数据库设计了多类型 MCP 服务的配置操作。 + - 设计通用 MCP Nginx Token 校验能力(也可以设计 MCP-GateWay),以配置化方式进行鉴权使用。增强 MCP 调用过程中,数据传输安全性。 + - 基于 Spring TaskScheduler 扩展实现,智能体任务调度服务,可自动化完成日常系统巡检(客诉、报警)产生 html 格式报告文档。也可以基于报警监听消息,触发巡检动作(公司内,报警信息有 MQ 消息)。 + - 提供 RAG 知识库能力,可自主上传文件 + 解析工程代码库,并对知识库设有标签为 Ai Agent Advisor 访问 RAG 提供数据使用能力,增强准确性。—— 解析的代码库,可以为 openai 代码自动评审,增强评审能力。 + - 设计一键 Ai Agent 预热能力,动态化注入 Spring 容器。支持运营配置服务,随时调整、变更、上线,方便运营配置和使用。 + - 基于 React + flowgram.ai 框架,为 Ai Agent 服务提供拖拉拽编排能力,增强运营使用体验。 + +> 此套 Ai Agent 以为企业/平台/系统,上线3个月以来,主动巡检解决数十次系统隐患问题和运营配置错误情况,以及撰写了上万篇有效文档 + 提炼技术关键信息对新人辅导。后续还会继续配置更多方面的 Ai Agent 服务能力,为企业提效。 + +## 三、面试问题 + +### 1. 你们项目采用了DDD领域驱动设计,能简单介绍一下你们的四色模型是如何划分的? + +**回答**:我们项目严格按照DDD四色模型进行架构设计。首先是**值对象**层,主要包含AiClientVO、AiClientAdvisorVO等核心业务对象,承载业务状态和标识;**值对象(Value Object)**层包含各种配置信息如AiClientSystemPromptVO、AiClientModelVO等,保证数据的不可变性;**领域服务(Domain Service)**层实现了复杂的业务逻辑,如AiClientNode、AiClientAdvisorNode等节点服务,负责AI Agent的组装和编排;**聚合根(Aggregate Root)**则通过ExecuteCommandEntity等实体来管理整个AI Agent的生命周期。这种设计让我们的业务逻辑更加清晰,各层职责分明,便于维护和扩展。 + +### 2. 你们的微服务架构是如何设计的,各个模块之间是如何协作的? + +**回答**:我们采用了标准的DDD分层架构,分为六个核心模块:api层定义对外接口契约,app层作为应用启动入口和配置中心,domain层包含核心业务逻辑和领域模型,trigger层处理HTTP请求和事件触发,infrastructure层负责数据持久化和外部服务调用,types层定义通用类型和枚举。各模块通过依赖注入和事件驱动进行协作,domain层作为核心不依赖任何外部模块,infrastructure层实现domain层定义的接口,trigger层调用domain层的服务。这种设计保证了业务逻辑的纯净性和系统的可测试性。 + +### 3. Agent设计模式在你们项目中是如何体现的? + +**回答**:我们的Agent设计模式主要体现在多层次的智能体架构设计上。首先是**策略模式**的应用,通过IExecuteStrategy接口定义执行策略,AutoAgentExecuteStrategy实现自动执行逻辑;其次是**责任链模式**的核心应用,我们设计了四步执行链:RootNode→Step1AnalyzerNode(任务分析)→Step2PrecisionExecutorNode(精准执行)→Step3QualitySupervisorNode(质量监督)→Step4LogExecutionSummaryNode(执行总结),每个节点继承AbstractExecuteAutoSupport并实现特定的业务逻辑;再次是**工厂模式**,通过DefaultAutoAgentExecuteStrategyFactory创建执行策略处理器,管理DynamicContext动态上下文;最后是**模板方法模式**,AbstractExecuteAutoSupport定义了执行模板,各个Step节点实现具体的doApply方法。这种设计实现了"问题分析→自主规划→精准执行→质量监督"的完整AI Agent执行循环,每个步骤都可以独立配置不同的ChatClient、Prompt和Advisor,真正实现了智能体的可编排和可扩展。 + +### 4. Spring AI中的Advisor顾问角色是如何设计和实现的? + +**回答**:Advisor顾问角色是我们AI Agent的核心能力之一,主要负责上下文记忆和知识库访问。我们实现了两种主要的Advisor:PromptChatMemory用于维护对话历史,通过maxMessages参数控制记忆长度;RagAnswerAdvisor用于访问向量知识库,通过topK和filterExpression参数控制检索精度。在实现上,我们继承了Spring AI的BaseAdvisor,重写了aroundCall方法来拦截对话请求,在请求前注入相关上下文信息,在响应后更新记忆状态。这种设计让AI Agent具备了持续学习和知识积累的能力,大大提升了对话的准确性和连贯性。 + +### 5. RAG知识库的分词和向量化是如何设计的? + +**回答**:我们的RAG知识库基于PGVector实现,使用OpenAI的Embedding模型进行向量化。在分词策略上,我们使用TokenTextSplitter按照token数量进行智能分割,既保证了语义的完整性又控制了向量的维度。向量存储采用1536维的向量空间,支持余弦相似度检索。在数据预处理阶段,我们会对上传的文档进行清洗和标准化,提取关键信息并添加元数据标签,这些标签可以用于后续的过滤检索。检索时通过SearchRequest配置topK参数控制返回结果数量,通过filterExpression进行精确过滤,确保检索结果的相关性和准确性。 + +### 6. MCP协议的设计理念和实现方式是什么? + +**回答**:MCP(Model Context Protocol)是我们实现工具调用的核心协议,它定义了AI模型与外部工具之间的标准化通信接口。我们支持两种通信方式:stdio模式适用于本地工具调用,通过标准输入输出进行通信;sse模式适用于远程服务调用,通过Server-Sent Events实现实时通信。在实现上,我们为每个MCP服务定义了标准的Function接口,使用@Tool注解标记可调用的方法,通过MethodToolCallbackProvider将Java方法暴露为MCP工具。比如微信通知MCP通过WeiXinNoticeService提供消息推送能力,CSDN发帖MCP提供自动发布文章的能力。这种设计让AI Agent能够调用各种外部服务,大大扩展了智能体的能力边界。 + +### 7. 你们是如何实现AI Agent的动态编排和热部署的? + +**回答**:我们通过Spring的动态Bean注册机制实现了AI Agent的热部署能力。核心思路是将AI Agent的各个组件(Model、Prompt、Advisor、MCP)抽象为可配置的Bean,存储在数据库中。当配置发生变化时,通过ArmoryCommandEntity触发重新装配流程,使用DefaultArmoryStrategyFactory的策略模式动态创建新的组件实例,然后通过registerBean方法将新组件注册到Spring容器中。整个过程采用责任链模式,依次执行AiClientApiNode、AiClientModelNode、AiClientAdvisorNode、AiClientNode等节点,确保组件的正确装配顺序。这种设计让我们能够在不重启服务的情况下,动态调整AI Agent的能力配置,大大提升了系统的灵活性和运维效率。 + +### 8. 智能体任务调度服务是如何设计的,如何实现自动化巡检? + +**回答**:我们基于Spring TaskScheduler扩展实现了智能体任务调度服务,支持定时和事件驱动两种触发方式。定时巡检通过Cron表达式配置执行周期,自动收集系统指标、日志信息、告警数据等,然后调用专门的巡检Agent进行智能分析,最终生成HTML格式的巡检报告。事件驱动巡检则监听MQ消息,当收到告警信息时立即触发相应的巡检动作。在实现上,我们为每种巡检场景配置了专门的Agent,比如性能巡检Agent配置了Prometheus MCP工具,日志巡检Agent配置了ELK MCP工具。巡检结果会通过微信公众号MCP自动推送给相关人员,实现了从发现问题到通知处理的全自动化流程。 + +### 9. 你们的MCP服务是如何保证安全性的? + +**回答**:我们设计了通用的MCP Nginx Token校验机制来保证数据传输安全性。首先在Nginx层配置了统一的鉴权模块,所有MCP请求都需要携带有效的Token才能通过;Token采用JWT格式,包含用户身份、权限范围、过期时间等信息;在应用层,我们为每个MCP服务配置了独立的访问密钥,支持定期轮换;对于敏感操作如数据库访问、文件操作等,还增加了二次验证机制。此外,我们还实现了请求频率限制、IP白名单、操作审计日志等安全措施。在数据传输过程中,所有敏感信息都进行了加密处理,确保即使在网络传输过程中被截获也无法直接使用。 + +### 10. 前端的拖拽编排功能是如何实现的? + +**回答**:我们基于React和flowgram.ai框架实现了AI Agent的可视化编排功能。前端采用节点式的流程图设计,每个节点代表一个AI Agent组件,用户可以通过拖拽的方式组合不同的Model、Prompt、Advisor、MCP组件。在技术实现上,我们使用React Flow作为基础图形引擎,自定义了各种组件节点的渲染逻辑;通过Context API管理全局状态,实时同步编排配置;使用WebSocket与后端保持连接,支持实时预览和调试。当用户完成编排后,前端会将配置信息序列化为JSON格式发送给后端,后端解析配置并动态创建对应的AI Agent实例。这种设计让非技术人员也能够轻松配置和使用AI Agent,大大降低了使用门槛。 + +### 11. 在实现多模型适配时遇到了什么挑战,是如何解决的? + +**回答**:最大的挑战是不同AI模型的API格式和调用方式差异很大,直接适配会导致代码耦合度过高。我们的解决方案是引入one-api服务作为统一的模型网关,将所有第三方模型的API统一转换为OpenAI格式。在系统内部,我们只需要适配OpenAI的接口规范,通过配置不同的baseUrl和apiKey就能接入各种模型。同时我们还自研了SDK组件,封装了模型调用的通用逻辑,包括重试机制、超时处理、错误码转换等。这种设计不仅简化了开发复杂度,还提升了系统的稳定性和可扩展性,当需要接入新模型时只需要在one-api层配置即可。 + +### 12. 大规模并发场景下,AI Agent的性能是如何保证的? + +**回答**:我们从多个维度进行了性能优化。首先是连接池管理,为每个模型API配置了独立的连接池,避免相互影响;其次是异步处理,所有AI调用都采用异步方式,通过ResponseBodyEmitter实现流式响应,用户可以实时看到AI的思考过程;然后是缓存策略,对于相同的问题我们会缓存AI的回答,减少重复计算;在资源调度上,我们使用自定义的线程池进行任务分发,根据任务类型和优先级进行智能调度。此外,我们还实现了熔断降级机制,当某个模型服务不可用时自动切换到备用模型,保证服务的高可用性。通过这些优化,我们的系统能够支持数千并发用户同时使用。 + +### 13. 如何保证AI Agent执行过程中的数据一致性? + +**回答**:我们采用了事件驱动架构来保证数据一致性。每个AI Agent的执行过程被拆分为多个步骤,每个步骤完成后都会发布相应的事件,下一个步骤监听事件后开始执行。在数据库层面,我们使用了分布式事务来保证跨服务的数据一致性,关键操作都包装在事务中执行。对于长时间运行的AI任务,我们实现了断点续传机制,将执行状态持久化到数据库,即使服务重启也能从断点继续执行。同时我们还建立了完善的监控和告警机制,实时监控AI Agent的执行状态,一旦发现异常立即进行人工干预。这种设计确保了即使在复杂的业务场景下,数据的一致性和完整性也能得到保证。 + +### 14. 这个AI Agent系统给公司带来了什么实际价值? + +**回答**:我们的AI Agent系统在多个方面为公司创造了显著价值。在开发效率方面,代码评审Agent将人工评审时间从平均2小时缩短到15分钟,准确率达到95%以上;在运维效率方面,智能巡检Agent实现了7×24小时自动监控,故障发现时间从小时级缩短到分钟级,运维人员的重复性工作减少了80%;在内容创作方面,文章生成Agent帮助技术团队每月自动产出50+篇高质量技术文章,大大提升了公司的技术影响力。更重要的是,这套系统的可编排特性让我们能够快速响应新的业务需求,从需求提出到Agent上线的周期从原来的2周缩短到2天,大大提升了业务响应速度。 + +### 15. 在项目推广过程中遇到了什么阻力,是如何解决的? + +**回答**:最大的阻力来自于用户对AI准确性的担忧和使用习惯的改变。为了解决这个问题,我们采用了渐进式推广策略。首先选择了代码评审这个相对低风险的场景进行试点,通过大量的测试数据证明AI的准确性;然后我们设计了人机协作的工作模式,AI负责初步分析,人工负责最终决策,让用户逐步建立信任;在用户体验方面,我们提供了详细的操作文档和培训视频,还建立了用户反馈机制,根据用户建议持续优化产品功能。经过3个月的推广,用户接受度从最初的30%提升到了85%,现在已经成为团队日常工作的重要工具。 + +### 16. 未来你们计划如何进一步优化和扩展这个系统? + +**回答**:我们有几个重要的优化方向。首先是增强AI Agent的自主学习能力,通过强化学习让Agent能够从历史执行结果中学习,不断优化自己的决策策略;其次是扩展更多的业务场景,比如客服机器人、数据分析助手、项目管理助手等;在技术架构方面,我们计划引入更先进的向量数据库和图数据库,提升知识检索的准确性和效率;在用户体验方面,我们正在开发移动端应用,让用户能够随时随地使用AI Agent服务。同时我们也在探索多模态AI的应用,让Agent能够处理图片、音频、视频等多种类型的数据,进一步扩展应用场景。预计在未来一年内,我们的AI Agent系统将覆盖公司80%以上的业务流程。 + +### 17. 在设计通用对话分析模型时,你们是如何处理问题分析、自主规划、精准执行这个循环的? + +**回答**:我们设计了一个四阶段的执行循环:问题分析、自主规划、精准执行、内容判罚。在问题分析阶段,AI Agent首先理解用户意图,提取关键信息和上下文;自主规划阶段,Agent根据可用的工具和知识库制定执行计划,选择最优的执行路径;精准执行阶段,按照计划调用相应的MCP工具和Advisor,获取执行结果;内容判罚阶段,Agent评估执行结果是否满足用户需求,如果不满足则重新进入规划阶段。整个过程中,我们为每个阶段配置了不同的Model、MCP、Prompt组合,比如规划阶段使用逻辑推理能力强的模型,执行阶段使用工具调用能力强的模型。这种设计让AI Agent具备了类似人类的思考和执行能力。 + +### 18. 你们的向量数据库检索性能是如何优化的? + +**回答**:我们从多个层面优化了向量检索性能。在索引层面,PGVector使用了HNSW(Hierarchical Navigable Small World)算法构建高效的向量索引,支持近似最近邻搜索;在查询优化方面,我们实现了查询缓存机制,对于相似的查询直接返回缓存结果;在数据分片方面,我们按照业务领域对向量数据进行分片存储,减少检索范围;在并发控制方面,我们使用了连接池和异步查询,提升并发处理能力。此外,我们还实现了智能的预加载机制,根据用户的历史查询模式预先加载可能需要的向量数据到内存中。通过这些优化,我们的向量检索响应时间从原来的500ms优化到了50ms以内,同时支持千级并发查询。 + +### 19. 在实现MCP服务的过程中,stdio和sse两种模式各有什么优缺点? + +**回答**:stdio模式的优点是实现简单,适合本地工具调用,通信开销小,调试方便;缺点是只能用于本地服务,不支持远程调用,扩展性有限。sse模式的优点是支持远程调用,可以跨网络部署,支持实时双向通信,扩展性强;缺点是实现复杂度高,需要处理网络异常和重连机制,通信开销相对较大。在实际应用中,我们根据具体场景选择合适的模式:对于文件系统操作、本地命令执行等场景使用stdio模式;对于微信通知、CSDN发帖、远程API调用等场景使用sse模式。为了统一开发体验,我们封装了通用的MCP客户端,屏蔽了底层通信细节,开发者只需要关注业务逻辑即可。 + +### 20. 你们是如何保证AI Agent在复杂业务场景下的稳定性的? + +**回答**:我们建立了多层次的稳定性保障机制。在架构层面,采用微服务设计,单个服务的故障不会影响整个系统;在服务层面,实现了熔断降级机制,当某个依赖服务不可用时自动切换到备用方案;在数据层面,建立了完善的备份和恢复机制,关键数据都有多副本保护;在监控层面,实现了全链路监控,从请求接入到响应输出的每个环节都有详细的监控指标;在异常处理方面,我们为每种可能的异常场景都设计了对应的处理策略,包括重试、降级、人工介入等。此外,我们还建立了完善的测试体系,包括单元测试、集成测试、压力测试、混沌工程测试等,确保系统在各种极端情况下都能稳定运行。通过这些措施,我们的系统可用性达到了99.9%以上。 + +> 随着课程进展和大家面试遇到的问题,持续更新这部分内容。 + +### 21. AI Agent采用的是什么agent设计模式。以autoagent那套执行链路来说 + +链接:[https://t.zsxq.com/pqrtB](https://t.zsxq.com/pqrtB) + +课程里视频也讲到的,链路的执行分为4类,有固定模式,规划模式,步骤模型等。通过为 ai agent 配置可执行客户端链路,动态规划、执行步骤、审查结果(循环验证)、总结输出来完成。在整个执行过程中,使用到了,提示词prompt、顾问角色访问知识库和记忆上下文、mcp 工具调用等,来完成整个请求会话。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/promotion/AI MCP \345\206\215\350\277\231\344\271\210\347\224\250\344\270\213\345\216\273\357\274\214\345\217\257\345\260\261\350\246\201\342\200\235\345\210\233\344\270\232\342\200\234\345\217\230\347\216\260\344\272\206\345\221\200\357\274\201.md" "b/docs/md/project/ai-knowledge/promotion/AI MCP \345\206\215\350\277\231\344\271\210\347\224\250\344\270\213\345\216\273\357\274\214\345\217\257\345\260\261\350\246\201\342\200\235\345\210\233\344\270\232\342\200\234\345\217\230\347\216\260\344\272\206\345\221\200\357\274\201.md" new file mode 100644 index 000000000..13aa0851b --- /dev/null +++ "b/docs/md/project/ai-knowledge/promotion/AI MCP \345\206\215\350\277\231\344\271\210\347\224\250\344\270\213\345\216\273\357\274\214\345\217\257\345\260\261\350\246\201\342\200\235\345\210\233\344\270\232\342\200\234\345\217\230\347\216\260\344\272\206\345\221\200\357\274\201.md" @@ -0,0 +1,111 @@ +--- +title: AI MCP 再继续这么用,可就要”创业“变现了呀! +lock: no +--- + +# AI MCP 再继续这么用,可就要”创业“变现了呀! + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +在 [AI MCP 24小时为我”打工“](https://mp.weixin.qq.com/s/sB4EaP6HMtj3VxK-VMD8nQ),两周时间。已产生 `251篇文章`,带来`10万+阅读量`,`涨粉近1000人`!在这么搞下去,不得变现了哇! + +++ +嘿嘿,不过这点点成绩根本挡不住我前进的脚步👣! + +AI MCP 的能力远不止于次,或者更准确的说是 AI Agent 的能力,还有非常多的场景可以运用,开玩笑讲,他会让 Java 再次伟大!这也是为什么 Spring AI 那么快速的迭代自己的框架设计,甚至不惜每次迭代还要推翻之前的结构模型,也要更好的支持未来 AI 工程的开发实现。 + +在有了 AI Agent 后,所有的 tob/toc 服务项目,都应该会变得更加智能,这会包括我们现在使用的各项软件,如;电商、出行、外卖等,也包括研发人员使用的各类技术软件。如果大公司还是牛马般的靠体力卷工时,甚至可能会被小公司的不断创新所掀翻。 + +好啦,那么这篇文章小傅哥会给大家介绍下 AI Agent 以及可运用的场景,帮助大家打开思路! + +>文末提供了 AI RAG&MCP 实战编程项目,可以快速掌握 Spring AI 应用开发能力! + +## 一、什么是 AI Agent + +AI Agent 是整合多种技术手段的智能实体,其实现依赖于 Tools、MCP、Memory、RAG(Retrieval 增强检索生成) 等技术组件。但不是非得依赖全部组件才叫 AI Agent。 + ++
++ +AI Agents 是**系统** ,它通过赋予 **大型语言模型(LLMs)** **访问工具** 和**知识** 来扩展其能力,从而使 **LLMs** 能够**执行操作** 。 + +- **系统** :将 Agents 视为一个由许多组件组成的系统,而不仅仅是单个组件,这一点很重要。在基本层面上,AI Agent 的组件包括: + - **环境** - AI Agent 运行的定义空间。例如,如果我们有一个旅行预订 AI Agent,则环境可以是 AI Agent 用来完成任务的旅行预订系统。 + - **传感器** - 环境具有信息并提供反馈。AI Agents 使用传感器来收集和解释有关环境当前状态的信息。在旅行预订 Agent 示例中,旅行预订系统可以提供诸如酒店可用性或航班价格之类的信息。 + - **执行器** - 一旦 AI Agent 接收到环境的当前状态,对于当前任务,Agent 会确定要执行的操作以更改环境。对于旅行预订 Agent,它可能是为用户预订可用房间。 +- **大型语言模型** - Agents 的概念在 LLMs 创建之前就已存在。使用 LLMs 构建 AI Agents 的优势在于它们能够解释人类语言和数据。这种能力使 LLMs 能够解释环境信息并制定改变环境的计划。 +- **执行操作** - 在 AI Agent 系统之外,LLMs 仅限于根据用户提示生成内容或信息的情况。在 AI Agent 系统内部,LLMs 可以通过解释用户请求并使用其环境中可用的工具来完成任务。 +- **访问工具** - LLM 可以访问哪些工具由 1) 它运行的环境和 2) AI Agent 的开发者定义。对于我们的旅行 Agent 示例,Agent 的工具受预订系统中可用操作的限制,开发者可以将 Agent 的工具访问权限限制为航班。 +- **知识** - 除了环境提供的信息外,AI Agents 还可以从其他系统、服务、工具甚至其他 Agents 中检索知识。在旅行 Agent 示例中,此知识可以是位于客户数据库中的用户旅行偏好信息。 + +我们可以以一个人,作为视角来理解 AI Agent,Memory 记忆是人的大脑,Tools 是人的身体和四肢,Rag 知识库是过往的经验储备,MCP 是我们与外部的连接调用。而整个人就是这个智能体 AI Agent。 + +## 二、AI 智能体的工作原理 + +每个智能体都定义了角色、个性和沟通风格,包括具体指令和可用工具的说明。 + ++
++ +- **角色**:角色是智能体的核心特征,定义了其性格和行为方式。一个定义良好的角色可以帮助智能体在与环境和用户互动时保持一致性。随着时间的推移,智能体会通过经验积累和环境互动不断发展和完善其角色。 +- **记忆**:智能体的记忆系统由短期记忆、长期记忆、共识记忆和情景记忆组成。短期记忆用于处理即时互动,长期记忆存储历史数据和对话,情景记忆记录过去的互动细节,而共识记忆则用于在智能体之间共享信息。通过这些记忆系统,智能体能够回忆过去的互动,适应新情况,保持上下文一致性,并从经验中学习以提高性能。 +- **工具**:工具是智能体用来与环境互动并增强其功能的资源。它们可以是函数或外部资源,帮助智能体访问信息、处理数据或控制外部系统以执行复杂任务。工具根据其界面类型进行分类,包括物理界面、图形界面和基于程序的界面。通过工具学习,智能体能够理解工具的功能及其应用场景,从而有效地使用这些工具。 +- **模型**:大语言模型 (LLM) 是构建 AI 智能体的基础,赋予智能体理解、推理和行动的能力。LLM 作为智能体的“大脑”,使其能够处理和生成语言,而其他组件则支持智能体的推理和行动能力。 + +> https://github.com/google/A2A 多个 Agent 间,可以使用 A2A 协议,完成 Agent 和 Agent 对接。 + +## 三、AI Agent 场景应用 + +### 1. BCP 智能巡检 + ++
++ +- 场景:在日常的互联网toc场景的系统中,每天都会有不同程度的客诉,这些客诉问题需要进行大量的系统排查。 +- 方案:将企业内的各项系统服务,开发出 MCP 服务接口(APIs),并为每个核心业务流程提供排查链路计划。在发生系统报警时,以报警为触达手段,排查系统日志、账户、Redis、Dev-Ops 服务等,给给出综合的解决方案。 +- 其他:不同配置的 Agent 是可以连接通信的,一个 Agent 就是一个配置出来的 ChatClient 对话体。 + +### 2. 工具AI化设计 + ++
++ +- 场景:其实现在除了编程方面,其他很多软件并没有那么快速的接入 AI Agent。如 trae.ai\cursor 都是编程的利器,可以更快速的迭代开发代码。那么同样的 SSH 链接云服务器的工具,也可以通过 AI Agent 进行扩展,提高我们的操作服务器部署软件的效率。 +- 方案:设计 Linux SSH MCP Server 服务,同时提供 SFTP 以及云服务器的对接。再加上 Linux RAG 知识库。这样我们就可以以对话和编码的方式操作服务器。如,部署 JDK,安装 NodeJS,执行系统镜像的构建、推送、拉取、部署等操作。 + +### 3. toc场景AI化 + ++
++ +- 场景:目前的大部分购物操作,都是人工的方式自己在平台检索,之后对于不懂的在进行客服提问,最后去下单。那么这里也可以加入 AI 操作,自主的完成购物、下单,以及将来退货的操作。 +- 方案:为产品提供购物话术 RAG 增强检索能力,以及提供货物、下单、结算、物流的 MCP 服务。用户和 AI 对话过程中,完成货品的组装选择和下单。聊聊天就把东西买好了,还能给提供产品的使用和维护。 + +### 4. AI Agent 编排 + ++
++ +- 当我们有大量的 MCP 服务实现、RAG 知识库沉淀后,会催生出 AI Agent 的编排能力实现。你可以按需组装一套自己的对话 AI Agent。 +- 类似的场景实现:[https://github.com/n8n-io/n8n](https://github.com/n8n-io/n8n) - 付费的。不过很多企业会借助之前的 BPMN 实现的低代码,扩展出 AI Agent 编排实现。 + +```java +docker volume create n8n_data +docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n registry.cn-hangzhou.aliyuncs.com/xfg-studio/n8n:1.88.0 +``` + diff --git "a/docs/md/project/ai-knowledge/promotion/AI MCP \345\267\262\347\273\217\345\270\256\346\210\221\342\200\234\345\271\262\346\264\273\342\200\235\344\272\206\357\274\201.md" "b/docs/md/project/ai-knowledge/promotion/AI MCP \345\267\262\347\273\217\345\270\256\346\210\221\342\200\234\345\271\262\346\264\273\342\200\235\344\272\206\357\274\201.md" new file mode 100644 index 000000000..88403fbe1 --- /dev/null +++ "b/docs/md/project/ai-knowledge/promotion/AI MCP \345\267\262\347\273\217\345\270\256\346\210\221\342\200\234\345\271\262\346\264\273\342\200\235\344\272\206\357\274\201.md" @@ -0,0 +1,119 @@ +--- +title: AI MCP 已经一天24小时,给我“打工”了! +lock: no +--- + +# AI MCP 已经一天24小时,给我“打工”了! + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +一天24篇推文,500+收藏,2.6万+阅读量,我已经让 AI 帮我干活了!这是小傅哥最新实现的一套 `mcp-server-csdn`,完全不需要我上手,就可以定时的执行文章编写和发表。 + +++ ++
++ +只要你配置好对应的话题,AI MCP 就会自动创作文章和发表。虽然单篇流量不一定都高,但架不住我根本没出手呀,走的就是一个量大取胜!**这不是自动发帖,这是自动创业呀😂!简直美滋滋!** + ++
++ +MCP 模型上下文协议,核心的作用就在于通过标准的协议设计,让 AI 可以以通用的方式调用各类服务的接口。所以,我们可以通过 MCP 的实现,让 AI 自动化的完成内容的创作和发表。 + +在这样的一个 CSDN 发文章的模型跑通后,我们就可以大批量的复制,完成不同类内容的创作和发表,也可以以这样的方式对接其他各类内容社区平台。甚至你还可以想到,这东西能辅助我们完成很多工作。 + +以前总有人说,AI 来了,可能会让很多程序员失业。但恰恰相反,不仅不会失业,反而 AI 会让程序员如虎添翼,推进改变其他行业的工作模式。毕竟,没有哪个行业不仅能用 AI,还能懂 AI,还能开发 AI 了! + +接下来,小傅哥就给大家,介绍下这套 MCP 的设计和工作模式。 + +> 🧧 文末提供了全套 AI、RAG、MCP 的开发、使用教程以及工程源码。此外还有非常多的互联网大厂项目,都可以一并获取学习。 + +## 一、MCP 的工作模式 + +MCP 服务,可以以工具 Tools 的形式配置到 AI MCP 客户端。当我们向 AI 发送执行指令后,AI 会携带工具 Tools 信息,一起发送给 AI。之后进行语义分析以及调用 AI MCP 执行业务诉求。 + +你可以把 AI MCP 当成你雇来的员工,你有什么想法就告诉他,让他充当那个跑腿和执行的人。而你只负责下达指令和验收结果。 + ++
++ ++
++ +如图,我们可以给程序设定一套话术描述,让它去做指定类型的文章创作和发表。在 AI 完成内容创作后,会调用 MCP 服务,传递接口入参值,再由 MCP 服务,完成文章的发表。 + +如果,我们希望发布的文章具备当前热点。可以增加一个 MCP 服务,这个服务来检索牛客网最新的求职面试信息,再加上各个大厂招聘要求描述信息等。基于这些信息先获取到面试热点话题,在结合话题与设定的面试场景话术一起生成对应的文章。**MCP 就像是你的员工,你可以交代A员工做什么后,交接给B员工继续处理。** + +## 二、MCP 怎么开发的 + +首先,MCP 是一套标准的模型上下文协议,它不限制非得使用那种语言实现。如;NodeJS、Python、Java,都可以实现 MCP 服务。以 Spring AI 框架举例,Java 工程师可以,以非常简单的使用 Java 代码开发普通的业务逻辑,之后配置上 AI MCP 工具类注解和完成 Bean 对象的实例化即可。 + ++
++ +- 如图,正常的搭建 SpringBoot 应用程序,编写对接 CSDN 发帖接口。之后给服务方法配置上 Tool 工具注解。那么它就会被 Spring AI MCP 注册和使用了。 +- 同时,一个工程里可以有很多的这样的服务和工具。比如你要开发一个各大平台集成的发帖/文章的服务,那么也可以增加其他的对接类在同一个工程里。最终配置上 AI MCP 的注册即可。 + +## 三、MCP 怎么对接的 + +把 Java 开发实现的 MCP 服务端,打包成一个 Jar,把这个 Jar 配置到 MCP 客户端工程里。即可完成 MCP 服务的调用。并且一个 MCP 客户端,也可以对接多套 MCP 服务,这些服务可以以 AI 工作流的形式完成自己的工作。 + ++
++ ++
++ +- 如图,在 SpringBoot 工程中,增加MCP 服务的配置对接。这个时候 AI 对话就那可以拿到 MCP 工具进行对话。并将要执行的信息,通过 MCP 服务工具完成处理。 +- 并且,你可以把 MCP 服务,打包构建镜像部署到(服务器/Nas),让它一天24小时的干活。用不了多久,你就成为某个领域内容的专家了! + +## 四、MCP 怎么学习下? + +小傅哥,已经为你准备好了一套 AI RAG、MCP、Function Call 实践编程课程,使用 Java + Spring AI 框架,增强自己的 AI 应用开发能力,迅速囤积编程技能!如下,课程目录,全程文档小册 + 视频带着你从0到1学习。 + ++
++ +#### 第1期 RAG Spring AI 0.8.1 - 完结 + +1. 【更】AI RAG 知识库,项目介绍&需求分析&环境说明 +2. 【更】初始化知识库工程&部署模型&提交代码 +3. 【更】Ollama DeepSeek 流式应答接口实现 +4. 【更】Ollama DeepSeek 流式应答页面对接 +5. 【更】Ollama RAG 知识库上传、解析和验证 +6. 【更】Ollama RAG 知识库接口服务实现 +7. 【更】基于AI工具,设计前端UI和接口对接 +8. 【更】Git仓库代码库解析到知识库并完善UI对接 +9. 【更】扩展OpenAI模型对接,以及完整AI对接 +10. 【更】云服务器部署知识库(Docker、Nginx) + +#### 第2期 MCP Spring AI 1.0.0 - 开冲 + +1. 【新】AI MCP 项目介绍 +2. 【新】吃上细糠,Spring AI 框架升级 + GPU 部署 AI +3. 【新】康庄大道,上手 AI MCP 工作流.md +4. 【新】道山学海,实现MCP自动发帖服务 +5. 【新】海纳百川,MCP 其他服务实现 +6. 【新】川流不息,官网 DeepSeek + open-api 对接 +7. 【新】息兵罢战,服务接口实现,增强 RAG 知识库 + MCP 服务使用 +8. 【新】应用服务接口与前端页面对接 +9. ... 随课程开发提供,包括后续的云服务部署。 + +> AI RAG&MCP 只是小傅哥社群里众多项目的一个,这里还有非常多的牛皮项目,一次加入都可以学习到。并且,不断的更新迭代新项目,社群嘎嘎活跃! \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\25410\350\212\202\357\274\232\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262\347\237\245\350\257\206\345\272\223\357\274\210Docker\343\200\201Nginx\357\274\211.md" "b/docs/md/project/ai-knowledge/\347\254\25410\350\212\202\357\274\232\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262\347\237\245\350\257\206\345\272\223\357\274\210Docker\343\200\201Nginx\357\274\211.md" new file mode 100644 index 000000000..88ce48c59 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25410\350\212\202\357\274\232\344\272\221\346\234\215\345\212\241\345\231\250\351\203\250\347\275\262\347\237\245\350\257\206\345\272\223\357\274\210Docker\343\200\201Nginx\357\274\211.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第10节:云服务器部署知识库(Docker、Nginx) +pay: https://t.zsxq.com/YUG46 +--- + +# 《DeepSeek RAG 知识库》第10节:云服务器部署知识库(Docker、Nginx) + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/cWfL6](https://t.zsxq.com/cWfL6) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +部署项目到公网云服务器,让小伙伴们学习如何打包部署上线和Linux、Docker、Nginx的操作使用。 + +## 二、部署过程 + +如图,为本次的部署过程; + +++ +- 首先,购买云服务器,之后搭建云环境。[http://618.gaga.plus/](http://618.gaga.plus/) 需要2c4g部署。 +- 之后,我们在本地构建软件镜像,之后推送到 Docker Hub,完成后再把 dev-ops 的脚本通过 sftp 上传到云服务器,执行安装。 +- 最后,记得部署完成后检查各个软件运行日志,以及开通下相关的服务端口。 diff --git "a/docs/md/project/ai-knowledge/\347\254\25411\350\212\202\357\274\232AIMCP\351\203\250\345\210\206\344\273\213\347\273\215.md" "b/docs/md/project/ai-knowledge/\347\254\25411\350\212\202\357\274\232AIMCP\351\203\250\345\210\206\344\273\213\347\273\215.md" new file mode 100644 index 000000000..0af867e4a --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25411\350\212\202\357\274\232AIMCP\351\203\250\345\210\206\344\273\213\347\273\215.md" @@ -0,0 +1,109 @@ +--- +title: DeepSeep MCP 动态知识库 - AI工作流&智能体 +lock: no +--- + +# 《DeepSeep MCP 动态知识库》 - AI工作流&智能体 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +用不了多久,各大互联网企业都将大量的推进落地,自有 [MCP](https://github.com/modelcontextprotocol) 服务的实现,用于增强企业 AI 应用的提效能力。因为 [MCP](https://github.com/modelcontextprotocol) 的加入,可以让你;一条命令`帮研发`,调用应用系统日志、排查系统CPU负载、自主选择是否调度数据库信息。也可以一条命令`帮运营`,搞定复杂的SQL执行、导出报表、分析数据、完成促活营销券的自动化配置上架。这就是 [MCP](https://github.com/modelcontextprotocol) 的魅力!👍🏻 + +++ +**那么牛,MCP 是什么?** + +专业的术语 `MCP = Model Context Protocol` 模型上下文协议,可实现应用与外部数据源和工具之间的无缝集成。无论您是构建 AI 驱动的 IDE、增强聊天界面还是创建自定义 AI 工作流,MCP 都提供了一种标准化的方式来连接他们所需的上下文。 + +`来吧,上图!让你看看它是啥!` + ++
++ +- 首先,站在用户的使用视角,研发或者运营,可以通过话术描述,完成系列的 AI 工作流,并拿到最终的结果。这就是 MCP 最终为你提供的服务。 +- 那么,你可以想象,在日常的工作中,运营、研发、产品、测试等,都有非常多的重复非创作性的工作,占用了大量的时间成本。尤其是研发,写写代码,就有运营过来,帮我查个问题吧,小嘚嘚。但如果有这样的借助于 MCP 实现的 AI 工作流,就可以完成80%以上的工作量。 +- 之后,站在技术的实现视角,MCP 是一个标准结构框架,你可以按照它(Spring AI)提供的 SDK 开发方式,完成本地化 API 的接入开发。让 AI 有明确的方式调用各类 API 服务接口。如果没有 MCP 这会是一件很麻烦的事情。 + +好啦📢,这就是小傅哥即将为你开启的**《DeepSeek RAG 增强知识库》**第2阶段,`MCP 服务开发和对接`。让你具备 AI 开发能力,遥遥领先于还在扣 CRUD 项目的小伙伴,做面试最牛的仔,最职场最靓的人! + +> Spring AI MCP 与 24年末发布,学习此 AI 应用开发项目,你将是第一批具备 Java AI 应用实战开发能力的人。竞争力,嘎嘎滴! + +## 第1期,RAG 我们做了什么 + +在 《DeepSeek RAG 增强知识库》第1阶段,基于 Spring AI 0.8.1 开发了一套可以上传文件和Git仓库进行解析、切割、存储,到使用向量库完成 AI 的知识库问答系统。并最终通过 Docker 部署上线。 + ++
++ +- 基于,RAG 这样的一套知识库,你可以完成文本和代码库的解析。以及自行扩展提供出 RAG 知识库的接口,对接到 OpenAI 代码自动评审(小傅哥社群的另外一个项目),增强代码评审效果。 +- 在这套项目中,可以学习到 Ollama DeepSeek 本地化&云服务部署,以及流式接口的开发、基于 AI 完成页面与知识库对话接口的处理,Linux、Docker 的部署等。小项目不大,但非常锻炼人! + +## 第2期,MCP 我们要做什么 + +与第2期相比,第1期可以称之为小试牛刀,让小伙伴们以最快、最快的往事,积累,运用 Spring AI 框架,开发自己的 RAG 知识库。~~也是方便有些死鬼,早点写到简历上~~ + +到了第2期,你就开始吃上细糠了,小傅哥会带着你升级 Spring AI 框架为 1.0.0-M6 最新版本,多模型配置和操作 PG 向量库,使用 GPU 搭建响应速度更好的 Ollama DeepSeek 大模型(秒级处理),以及对接官网 DeepSeek 的大模型和统一 one-api 对接方式。 + +但这还只是开始,随着基础框架的升级完成,我们将进入 MCP 服务的开发实现。通过 AI 指令,完成 AI 工作流,调度各项 MCP 处理我们的任务作业。如图,举例操作; + ++
++ +- 基于 MCP 服务的开发和对接,通过 AI 工作流指令,完成数据的采集和存放动作。💡 聪明的小伙伴以及开始联想,基于这样的 AI 开发,可以替代很多的日常工作啦。**没想到吧,也把自己替代了** 但仍然,蠢蠢欲动(我不做,别人也做呀)!~~实现后,晋升又有的讲啦!简历也有东西写啦!~~ +- 有了 MCP 后,相当于把我们需要;在一个网页操作数据库查询数据、打开另外一个网页看天气预报,再手动的创建个文件把以上的信息获取后,复制粘贴到文件里。这一些列操作,都让 AI 通过 MCP 模型上下文协议进行处理。也就是 AI 可以调用后台接口啦! + +## 课程目录计划 💐 + +此课程会扩展很多基于 Java 的 AI 开发能力学习,帮助大家积累相关的场景解决方案。在这个过程中你可以最快的掌握最新的技术,早早的提前别人一步。 + ++
++ ++
++ +- 全课程包括文档 + 小册,全程视频手把手带着做。 +- 课程地址:[https://t.zsxq.com/GwNZp](https://t.zsxq.com/GwNZp) - 含全套项目代码和视频。 + +### 第1期 RAG Spring AI 0.8.1 - 完结 + +1. 【更】AI RAG 知识库,项目介绍&需求分析&环境说明 +2. 【更】初始化知识库工程&部署模型&提交代码 +3. 【更】Ollama DeepSeek 流式应答接口实现 +4. 【更】Ollama DeepSeek 流式应答页面对接 +5. 【更】Ollama RAG 知识库上传、解析和验证 +6. 【更】Ollama RAG 知识库接口服务实现 +7. 【更】基于AI工具,设计前端UI和接口对接 +8. 【更】Git仓库代码库解析到知识库并完善UI对接 +9. 【更】扩展OpenAI模型对接,以及完整AI对接 +10. 【更】云服务器部署知识库(Docker、Nginx) + +### 第2期 MCP Spring AI 1.0.0 - 开冲 + +11. 【新】AI MCP 项目介绍 +12. 【新】吃上细糠,Spring AI 框架升级 + GPU 部署 AI +13. 【新】吃上细糠,官网 DeepSeek + open-api 对接 +14. 【新】MCP 服务的应用类演示和使用 +15. 【新】MCP Spring AI 客户端npx调用,以及资源讲解 +16. 【新】MCP Spring AI 服务端webflux实现 +17. 【新】MCP Spring AI 服务端 + 客户端对接使用 +18. 【新】服务接口实现,增强 RAG 知识库 + MCP 服务使用 +19. 【新】应用服务接口与前端页面对接 +20. ... 随课程开发提供,包括后续的云服务部署。 + +课程包括;视频、小册、1 对 1 答疑解惑、专属VIP项目交流群,并且提供简历编写模板结构的一条龙🐲服务。让你学习后,直接拉开与还在玩具项目其他人的差距,面试脱颖而出提高竞争力!!! + +>课程已经开始,早早加入,早早学习。时间、时机,比任何东西都珍贵!晚点学,只能是工具人。但早点学,就是开发工具的人!加入小傅哥的社群,如图的全套实战项目,都可以学习; \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\25411\350\212\202\357\274\232\345\220\203\344\270\212\347\273\206\347\263\240\357\274\214\345\215\207\347\272\247SpringAI\346\241\206\346\236\266.md" "b/docs/md/project/ai-knowledge/\347\254\25411\350\212\202\357\274\232\345\220\203\344\270\212\347\273\206\347\263\240\357\274\214\345\215\207\347\272\247SpringAI\346\241\206\346\236\266.md" new file mode 100644 index 000000000..5413d1ed4 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25411\350\212\202\357\274\232\345\220\203\344\270\212\347\273\206\347\263\240\357\274\214\345\215\207\347\272\247SpringAI\346\241\206\346\236\266.md" @@ -0,0 +1,39 @@ +--- +title: 【更】第11节:吃上细糠,升级SpringAI框架 +pay: https://t.zsxq.com/zT6bl +--- + +# 《DeepSeek RAG&MCP 增强检索知识库系统》第11节:吃上细糠,升级SpringAI框架 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/q5rnP](https://t.zsxq.com/q5rnP) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +升级 Spring AI 框架到 1.0.0-M6 版本,以适应于二阶段 MCP(Model Context Protocol 模型上下文协议)服务开发。 + +## 二、本章诉求 + +本节升级包括; +- 提供,快速的 Ollama DeepSeek 部署,支持 1.5b、7b、30b 模型。服务器小时价格很低,速度非常快。 +- 提供,pgAdmin管理工具部署(Docker+本地软件),用于操作 PG 向量库。 +- 提供,向量库自主创建和多模型配置,满足不同模型的向量库使用。 + +## 三、升级框架 + +### 1. POM 配置 + +```pom ++ +``` + +- Spring AI 目前最新版为 1.0.0-M6,[https://spring.io/projects/spring-ai#learn](https://spring.io/projects/spring-ai#learn) diff --git "a/docs/md/project/ai-knowledge/\347\254\25412\350\212\202\357\274\232\345\272\267\345\272\204\345\244\247\351\201\223\357\274\214\344\270\212\346\211\213 AI MCP \345\267\245\344\275\234\346\265\201.md" "b/docs/md/project/ai-knowledge/\347\254\25412\350\212\202\357\274\232\345\272\267\345\272\204\345\244\247\351\201\223\357\274\214\344\270\212\346\211\213 AI MCP \345\267\245\344\275\234\346\265\201.md" new file mode 100644 index 000000000..df9afd82c --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25412\350\212\202\357\274\232\345\272\267\345\272\204\345\244\247\351\201\223\357\274\214\344\270\212\346\211\213 AI MCP \345\267\245\344\275\234\346\265\201.md" @@ -0,0 +1,23 @@ +--- +title: 【更】第12节:康庄大道,上手 AI MCP 工作流 +pay: https://t.zsxq.com/am5PO +--- + +# 《DeepSeek RAG&MCP 增强检索知识库系统》第12节:康庄大道,上手 AI MCP 工作流 + +作者:小傅哥 +org.springframework.ai +spring-ai-bom +1.0.0-M6 +pom +import +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/GoWka](https://t.zsxq.com/GoWka) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +对接 Spring AI MCP,实现服务端 MCP 和 客户端 MCP,完成功能对接,体验 AI 工作流完成的指令动作。 + +## 二、本节重点 + +本节功能服务包括; +1. 增加,Spring AI MCP 框架接入。 +2. 对接,Spring AI MCP 共用服务端,如;[https://smithery.ai/](https://smithery.ai/)、[https://glama.ai/mcp/servers](https://glama.ai/mcp/servers) +3. 开发,Spring AI MCP 个人客户端,基于 Java 实现客户端。这块是一个独立的新工程组件。 diff --git "a/docs/md/project/ai-knowledge/\347\254\25413\350\212\202\357\274\214\351\201\223\345\261\261\345\255\246\346\265\267\357\274\214\345\256\236\347\216\260MCP\350\207\252\345\212\250\345\217\221\345\270\226\346\234\215\345\212\241.md" "b/docs/md/project/ai-knowledge/\347\254\25413\350\212\202\357\274\214\351\201\223\345\261\261\345\255\246\346\265\267\357\274\214\345\256\236\347\216\260MCP\350\207\252\345\212\250\345\217\221\345\270\226\346\234\215\345\212\241.md" new file mode 100644 index 000000000..0971be32d --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25413\350\212\202\357\274\214\351\201\223\345\261\261\345\255\246\346\265\267\357\274\214\345\256\236\347\216\260MCP\350\207\252\345\212\250\345\217\221\345\270\226\346\234\215\345\212\241.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第13节,道山学海,实现MCP自动发帖服务 +pay: https://t.zsxq.com/WSM3k +--- + +# 《DeepSeek RAG&MCP 增强检索知识库系统》第13节,道山学海,实现MCP自动发帖服务 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/xTjYL](https://t.zsxq.com/xTjYL) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +分析 CSDN 文章发表接口,以 MCP 服务搭建的方式,实现一款 stdio 模式的 CSDN 发帖 MCP 服务。(后续开发 sse 模式) + +**注意**:不限于CSDN,你可以结合本节的学习,在任何一个平台使用它的接口,完成自动发帖服务。如,这里还有一个知识星球的发帖,也可以学习下之后对接实现一个 MCP 服务。地址:[https://bugstack.cn/md/road-map/http.html](https://bugstack.cn/md/road-map/http.html) + +## 二、功能流程 + +如图,实现 CSDN 发帖 MCP 服务流程; + +++ +- 首先,无论你是对接任何的平台,都是需要先获得他的接口服务。这种接口一种是平台提供了专门的对接接口,另外就是没有这样的接口,我们是通过浏览器访问网站,获得的接口。哪这些接口通过代码方式完成请求。 +- 之后,基于得到的接口,封装成可以调用的服务 service,这样 MCP 的入口工具,设定好入参信息,就可以调用底层的接口服务了。 +- 最后,当用户提问时,如果你实现了不止一个 CSDN 发帖的 MCP,也包括如星球发帖。那么你的 AI 工作流,是可以顺序的向这些平台自动发帖。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\25414\350\212\202\357\274\232\346\265\267\347\272\263\347\231\276\345\267\235\357\274\214\344\270\212\347\272\277MCP\350\207\252\345\212\250\345\217\221\345\270\226\346\234\215\345\212\241.md" "b/docs/md/project/ai-knowledge/\347\254\25414\350\212\202\357\274\232\346\265\267\347\272\263\347\231\276\345\267\235\357\274\214\344\270\212\347\272\277MCP\350\207\252\345\212\250\345\217\221\345\270\226\346\234\215\345\212\241.md" new file mode 100644 index 000000000..89fa1fa42 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25414\350\212\202\357\274\232\346\265\267\347\272\263\347\231\276\345\267\235\357\274\214\344\270\212\347\272\277MCP\350\207\252\345\212\250\345\217\221\345\270\226\346\234\215\345\212\241.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第14节,海纳百川,上线MCP自动发帖服务 +pay: https://t.zsxq.com/G5mog +--- + +# 《DeepSeek RAG&MCP 增强检索知识库系统》第14节,海纳百川,上线MCP自动发帖服务 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/W0u4s](https://t.zsxq.com/W0u4s) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +以 Jar 包的形式,打包 MCP 自动发帖服务,并以 stdio 方式引入到项目工程。再通过定时任务触达定时自动发帖。 + +## 二、功能流程 + +如图,以 stdio 方式,构建服务打包上线; + +++ +- 首先,将 mcp-server-csdn 以 maven 命令方式打一个 jar。IntelliJ IDEA 也可以直接通过界面操作打包 Jar(视频里会演示) +- 之后,将 ai-mcp-knowledge 以 maven 命令方式打一个 jar,并执行 Dockerfile 构建出可部署的镜像。注意,这里额外增加一个阿里云 Docker 镜像仓库,为的是让他提供搭理,方便我们云服务器部署的时候,可以快速拉取下来镜像。此外,如果说你以云服务器当做本机一样使用,在云服务器配置好 maven、git、java jdk 17,那么就可以在云服务器直接构建镜像,也就不需要额外拉取了。(`这部分内容在课程入口-编程环境-云服务器操作中有讲解`) +- 最后,通过 docker-compose 脚本配置上线部署。 diff --git "a/docs/md/project/ai-knowledge/\347\254\25415\350\212\202\357\274\232\345\267\235\346\265\201\344\270\215\346\201\257\357\274\214\345\256\236\347\216\260MCP\345\276\256\344\277\241\345\205\254\344\274\227\345\217\267\346\266\210\346\201\257\351\200\232\347\237\245\346\234\215\345\212\241.md" "b/docs/md/project/ai-knowledge/\347\254\25415\350\212\202\357\274\232\345\267\235\346\265\201\344\270\215\346\201\257\357\274\214\345\256\236\347\216\260MCP\345\276\256\344\277\241\345\205\254\344\274\227\345\217\267\346\266\210\346\201\257\351\200\232\347\237\245\346\234\215\345\212\241.md" new file mode 100644 index 000000000..561d77da8 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25415\350\212\202\357\274\232\345\267\235\346\265\201\344\270\215\346\201\257\357\274\214\345\256\236\347\216\260MCP\345\276\256\344\277\241\345\205\254\344\274\227\345\217\267\346\266\210\346\201\257\351\200\232\347\237\245\346\234\215\345\212\241.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第15节,川流不息,实现MCP微信公众号消息通知服务 +pay: https://t.zsxq.com/84IV7 +--- + +# 《DeepSeek RAG&MCP 增强检索知识库系统》第15节,川流不息,实现MCP微信公众号消息通知服务 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/Qlqkr](https://t.zsxq.com/Qlqkr) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +AI MCP 是可以让 AI 以工作流方式进行调用的,为了更好的体现这一点,同时也为了增强整体的自动发帖服务链路。本节我们实现一个微信公众号推送消息的 MCP 服务。 + +这一节暂时会先以 stdio 方式开发,之后下一节部署的时候,会把 CSDN、WeiXin 两个 MCP 服务都以 SSE 方式进行部署。让大家学习到不同的开发方式和部署方式。 + +## 二、功能流程 + +如图,自动发帖后,进行微信公众号,消息推送; + +++ +- 首先,CSDN 自动发帖是上一节实现的内容,本节要实现一个微信公众号推送模板消息的实现。 +- 之后,AI 调用两套 MCP,可以一次会话,也可以使用 ChatMemory 进行记忆完成2次对话处理 MCP 流程。 +- 最终,实现自动发帖后,完成消息通知给我们自己。点击通知信息可进入具体文章。 + diff --git "a/docs/md/project/ai-knowledge/\347\254\25416\350\212\202\357\274\232\346\201\257\346\201\257\347\233\270\351\200\232\357\274\214MCP \346\234\215\345\212\241\351\203\250\347\275\262\344\270\212\347\272\277\357\274\210sse \346\250\241\345\274\217\357\274\211.md" "b/docs/md/project/ai-knowledge/\347\254\25416\350\212\202\357\274\232\346\201\257\346\201\257\347\233\270\351\200\232\357\274\214MCP \346\234\215\345\212\241\351\203\250\347\275\262\344\270\212\347\272\277\357\274\210sse \346\250\241\345\274\217\357\274\211.md" new file mode 100644 index 000000000..7bd661a88 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\25416\350\212\202\357\274\232\346\201\257\346\201\257\347\233\270\351\200\232\357\274\214MCP \346\234\215\345\212\241\351\203\250\347\275\262\344\270\212\347\272\277\357\274\210sse \346\250\241\345\274\217\357\274\211.md" @@ -0,0 +1,32 @@ +--- +title: 【更】第16节:息息相通,MCP 服务部署上线(sse 模式) +pay: https://t.zsxq.com/Qexmh +--- + +# 《DeepSeek RAG&MCP 增强检索知识库系统》第16节:息息相通,MCP 服务部署上线(sse 模式) + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/J6kpc](https://t.zsxq.com/J6kpc) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +调整 mcp-server-csdn、mcp-server-weixin,两个 MCP 部署方式为 SSE 以及增加 Dockerfile 部署脚本。让服务支持以 sse 方式,被 ai-mcp-knowledge 调用。 + +## 二、功能流程 + +如图,以 sse 方式,构建服务打包上线; + +++ +- `SSE` (Server-Sent Events) ,是一种基于 HTTP 的**服务器向客户端单向实时推送数据**的通信技术,常用于实现实时更新功能。 +- 在 Spring AI 框架中,SSE 的实现方式包括 spring-ai-starter-mcp-server-webmvc、spring-ai-starter-mcp-server-webflux 两种框架实现。课程以 webflux 进行使用。 +- SSE 的部署方式,要把每个 mcp 服务,通过 docker 进行部署,提供出可用的接口。之后 ai-mcp-knowledge 工程则配置 sse 方式进行使用。 + +> 接下来我们介绍,如何配置 sse 方式进行对接。这部分主要是配置文件的变化,以及 1.0.0-M6 版本号关于 sse bug 的处理。 + + diff --git "a/docs/md/project/ai-knowledge/\347\254\2541\350\212\202\357\274\232AI RAG \347\237\245\350\257\206\345\272\223\357\274\214\351\241\271\347\233\256\344\273\213\347\273\215.md" "b/docs/md/project/ai-knowledge/\347\254\2541\350\212\202\357\274\232AI RAG \347\237\245\350\257\206\345\272\223\357\274\214\351\241\271\347\233\256\344\273\213\347\273\215.md" new file mode 100644 index 000000000..4ecb2c07a --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2541\350\212\202\357\274\232AI RAG \347\237\245\350\257\206\345\272\223\357\274\214\351\241\271\347\233\256\344\273\213\347\273\215.md" @@ -0,0 +1,50 @@ +--- +title: 【更】第1节:AI RAG 知识库,项目介绍 +pay: https://t.zsxq.com/bV1QU +--- + +# 《DeepSeek RAG 知识库》第1节:AI RAG 知识库,项目介绍 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/ssFF0](https://t.zsxq.com/ssFF0) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +AI 开发能力,几乎已经是每个工程师必备的能力。在我们去看各个公司招聘要求时,经常会看到具备 AI、AIGC、RAG 能力优先。因为这些东西可以帮助企业提效,结合AI增强自身产品能力。所以,学习一下这样的东西是非常重要的! + +在 AI 的使用场景中,我们考虑过;代码评审、需求开发、智能客服、SQL编写、需求分析等。但这些东西的回答,会随着我们发给 AI 的内容来解答,但受到AI对话的上线文字数限制,不太可能把且有的所有资料都一次发给 AI 进行解答。所以这里引出了企业知识库构建的诉求。它就是 RAG! + +RAG(检索增强生成)技术正在重构互联网知识规则,RAG不仅仅是一个简单的知识存储工具,它是一种将检索与生成相结合的智能系统,能够从海量数据中快速提取相关信息,并结合上下文生成精准、连贯的答案。对于互联网公司而言,构建自己的RAG知识库,意味着能够为用户提供更加个性化、专业化的服务,同时也能够在激烈的市场竞争中,建立起独特的技术壁垒。 + +虽然市面有一些开源的 RAG,但深入使用仍不能解决所有的场景问题,尤其是你想自定义业务诉求,解析更多场景,更复杂的知识库时候,它们就显得不合适了。**并且研发人员,自身应该具备 RAG 开发能力。** + +所以,我们来啦!构建一款属于自己的小型的 RAG 知识库,以此掌握 RAG 相关知识,扩宽自己的技术边界。 + +> 此项目小巧轻量,扩展性好,可以快速学习完成,掌握 RAG 知识库搭建和使用。 + +## 一、项目简述 + +基于 Ollama 部署 DeepSeek 大模型,提供 API 接口。运用 Spring AI 框架承接接口实现 RAG 知识库能力。这款 RAG 知识库支持文本解析,以及 Git 代码库的解析。 + +工程结构采取2层架构,轻量化设计,重点在于突出 RAG 功能实现。以此方式,帮助大家更好的理解,除了工程架构外的 RAG 知识库搭建。方便大家快速上手学习。 + +## 二、什么是 RAG + +[RAG:检索增强生成](https://www.promptingguide.ai/zh/techniques/rag) + +它通用语言模型通过微调就可以完成几类常见任务,比如分析情绪和识别命名实体。这些任务不需要额外的背景知识就可以完成。 + +要完成更复杂和知识密集型的任务,可以基于语言模型构建一个系统,访问外部知识源来做到。这样的实现与事实更加一性,生成的答案更可靠,还有助于缓解“幻觉”问题。 + +Meta AI 的研究人员引入了一种叫做检索增强生成(Retrieval Augmented Generation,RAG)的方法来完成这类知识密集型的任务。RAG 把一个信息检索组件和文本生成模型结合在一起。RAG 可以微调,其内部知识的修改方式很高效,不需要对整个模型进行重新训练。 + +RAG 会接受输入并检索出一组相关/支撑的文档,并给出文档的来源(例如维基百科)。这些文档作为上下文和输入的原始提示词组合,送给文本生成器得到最终的输出。这样 RAG 更加适应事实会随时间变化的情况。这非常有用,因为 LLM 的参数化知识是静态的。RAG 让语言模型不用重新训练就能够获取最新的信息,基于检索生成产生可靠的输出。 + +Lewis 等人(2021)提出一个通用的 RAG 微调方法。这种方法使用预训练的 seq2seq 作为参数记忆,用维基百科的密集向量索引作为非参数记忆(使通过神经网络预训练的检索器访问) + ++\ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\2542\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\347\237\245\350\257\206\345\272\223\345\267\245\347\250\213&\346\217\220\344\272\244\344\273\243\347\240\201.md" "b/docs/md/project/ai-knowledge/\347\254\2542\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\347\237\245\350\257\206\345\272\223\345\267\245\347\250\213&\346\217\220\344\272\244\344\273\243\347\240\201.md" new file mode 100644 index 000000000..3b7af907d --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2542\350\212\202\357\274\232\345\210\235\345\247\213\345\214\226\347\237\245\350\257\206\345\272\223\345\267\245\347\250\213&\346\217\220\344\272\244\344\273\243\347\240\201.md" @@ -0,0 +1,39 @@ +--- +title: 【更】第2节:初始化知识库工程&提交代码 +pay: https://t.zsxq.com/VZSnk +--- + +# 《DeepSeek RAG 知识库》第2节:初始化知识库工程&提交代码 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/07kXb](https://t.zsxq.com/07kXb) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +教会小伙伴使用 IntelliJ IDEA 创建多模块工程,并介绍分层模块的用途。以及相关基础环境安装。 + +课程会循序渐进的从0到1,逐步带着大家完成项目的开发。开局只有一把 IntelliJ IDEA,完成项目后你可以学习到;业务、架构、设计、方案、配置、部署(Linux、Docker)等各项知识。 + +## 二、如何开始 + +站在读者视角,该怎么学习呢?这里做个必要说明和前置的知识提供。 + +### 1. 前置学习 + +小伙伴在学习的时候,可以依照课程的方式进行创建项目、变更配置、启动测试。这里有一些前置学习,包括:Git、Maven、Docker,课程已经准备好了,可以刷下; + +- Git:[https://bugstack.cn/md/road-map/git.html](https://bugstack.cn/md/road-map/git.html) +- Maven:[https://bugstack.cn/md/road-map/maven.html](https://bugstack.cn/md/road-map/maven.html) +- Docker:[https://bugstack.cn/md/road-map/docker-what.html](https://bugstack.cn/md/road-map/docker-what.html) - `入门 Docker 必看` +- Docker 镜像:[https://t.zsxq.com/2DGGY](https://t.zsxq.com/2DGGY) + +另外课程会使用 Java JDK 17、Maven 3.8.x,软件已经提供好,可以直接下载;[https://t.zsxq.com/19Rnk98M0](https://t.zsxq.com/19Rnk98M0) - `附件内含有配置好阿里云镜像的 Maven` + +### 2. 开始学习 + +1. 你需要通过 `git clone https://xxx.git` 命令,或者 IntelliJ IDEA 自动的检出工程方式,把项目工程检出到本地。关于如何使用Git检出项目,在前置学习里提供了教程。 +2. 检出代码后,你可以通过 IntelliJ IDEA 打开项目,并按照每一节最开始说明的本节对应的代码分支,把工程代码切换到对应的这一节。 +3. 接下来你可以通过课程的视频和小册以及提供的代码进行学习,并跟随课程每节要完成的内容,一步步操作。过程中可以参考课程的代码进行学习。如果自己的代码运行出问题的时候,可以运行课程的代码验证是环境问题还是个人代码问题。**另外注意运行课程代码,要修改对应的环境为你的本地环境,postgresql、redis等** \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\2543\346\216\245\357\274\232Ollama DeepSeek \346\265\201\345\274\217\345\272\224\347\255\224\346\216\245\345\217\243\345\256\236\347\216\260.md" "b/docs/md/project/ai-knowledge/\347\254\2543\346\216\245\357\274\232Ollama DeepSeek \346\265\201\345\274\217\345\272\224\347\255\224\346\216\245\345\217\243\345\256\236\347\216\260.md" new file mode 100644 index 000000000..a0aff68f5 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2543\346\216\245\357\274\232Ollama DeepSeek \346\265\201\345\274\217\345\272\224\347\255\224\346\216\245\345\217\243\345\256\236\347\216\260.md" @@ -0,0 +1,30 @@ +--- +title: 【更】第3节:Ollama DeepSeek 流式应答接口实现 +pay: https://t.zsxq.com/h5VxZ +--- + +# 《DeepSeek RAG 知识库》第3节:Ollama DeepSeek 流式应答接口实现 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/4DbVB](https://t.zsxq.com/4DbVB) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +引入 Spring AI 框架组件,对接 Ollama DeepSeek 提供服务接口。包括;普通应答接口和流式接口。 + +## 二、技术方案 + +对接 AI 的方式有很多,比如;`AI 官网提供的 SDK`、`自研 SDK 组件`、`one-api 服务类统一包装接口`,其中自研类 SDK 已经在星球 openai 项目对接 chatglm、chatgpt 的时候进行设计,为了差异化学习到不同技术,本项目会采用 Spring AI 框架进行对接。 + +++ +官网:[https://spring.io/projects/spring-ai](https://spring.io/projects/spring-ai) + +Spring AI 支持;OpenAI,Microsoft,Amazon,Google和Ollama,大模型的对接。其他不属于这个范围的,可以通过 [one-api](https://github.com/songquanpeng/one-api) 配置,统一转换为 OpenAI 接口服务格式进行使用。 + + diff --git "a/docs/md/project/ai-knowledge/\347\254\2544\350\212\202\357\274\232Ollama DeepSeek \346\265\201\345\274\217\345\272\224\347\255\224\351\241\265\351\235\242\345\257\271\346\216\245.md" "b/docs/md/project/ai-knowledge/\347\254\2544\350\212\202\357\274\232Ollama DeepSeek \346\265\201\345\274\217\345\272\224\347\255\224\351\241\265\351\235\242\345\257\271\346\216\245.md" new file mode 100644 index 000000000..8797a9c43 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2544\350\212\202\357\274\232Ollama DeepSeek \346\265\201\345\274\217\345\272\224\347\255\224\351\241\265\351\235\242\345\257\271\346\216\245.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第4节:Ollama DeepSeek 流式应答页面对接 +pay: https://t.zsxq.com/PN4lw +--- + +# 《DeepSeek RAG 知识库》第3节:Ollama DeepSeek 流式应答接口实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/f82uj](https://t.zsxq.com/f82uj) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +实现一款简单的UI界面,与服务端 Ollama DeepSeek AI 进行对接。 + +## 二、技术方案 + +自从有了 AI 工具以后,所有以前头疼前端页面开发的后端程序员👨🏻💻,都漏出了友善😊微笑! + +主要我们可以清楚地表达编写页面诉求,AI 工具就可以非常准确且迅速的完成代码的实现。这里我们可以选择的 AI 有很多,包括;OpenAI、DeepSeek、智谱AI等等。 + +- [https://www.deepseek.com/](https://www.deepseek.com/) +- [https://v0.dev/](https://v0.dev/) +- [https://chatglm.cn/](https://chatglm.cn/) +- [https://openai.itedus.cn/](https://openai.itedus.cn/) + +>其他更多也可以网络检索下。总有一款你是可以使用的。 + + diff --git "a/docs/md/project/ai-knowledge/\347\254\2545\350\212\202\357\274\232Ollama RAG \347\237\245\350\257\206\345\272\223\344\270\212\344\274\240\343\200\201\350\247\243\346\236\220\345\222\214\351\252\214\350\257\201.md" "b/docs/md/project/ai-knowledge/\347\254\2545\350\212\202\357\274\232Ollama RAG \347\237\245\350\257\206\345\272\223\344\270\212\344\274\240\343\200\201\350\247\243\346\236\220\345\222\214\351\252\214\350\257\201.md" new file mode 100644 index 000000000..a2521598b --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2545\350\212\202\357\274\232Ollama RAG \347\237\245\350\257\206\345\272\223\344\270\212\344\274\240\343\200\201\350\247\243\346\236\220\345\222\214\351\252\214\350\257\201.md" @@ -0,0 +1,36 @@ +--- +title: 【更】第5节:Ollama RAG 知识库上传、解析和验证 +pay: https://t.zsxq.com/fTK4R +--- + +# 《DeepSeek RAG 知识库》第5节:Ollama RAG 知识库上传、解析和验证 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/PM15B](https://t.zsxq.com/PM15B) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +以大模型向量存储的方式,提交本地文件到知识库。并在 AI 对话中增强检索知识库符合 AI 对话内容的资料,合并提交问题。 + +## 二、技术方案 + +以 Spring AI 提供的向量模型处理框架,将上传文件以 TikaDocumentReader 方式进行解析,再通过 TokenTextSplitter 拆分文件。完成这些操作后,在遍历文档添加标记。标记的作用是为了可以区分不同的知识库内容。完成这些动作后,把这些拆解并打标的文件存储到 postgresql 向量库中。 + +本技术方案旨在利用 Spring AI 提供的向量模型处理框架,对上传的文件进行解析、拆分、标记,并将处理后的数据存储到 PostgreSQL 向量库中。通过这一流程,可以实现对文件内容的高效管理和检索,特别是在需要区分不同知识库内容的场景下。 + +### 1. 技术组件 + +- **Spring AI**: 提供向量模型处理框架,支持文件的解析、拆分和向量化操作。 +- **TikaDocumentReader**: 用于解析上传的文件,支持多种文件格式(如 MD、TXT、SQL 等)。 +- **TokenTextSplitter**: 用于将解析后的文本内容拆分为更小的片段,便于后续处理和存储。 +- **PostgreSQL 向量库**: 用于存储处理后的文本向量数据,支持高效的相似性搜索和检索。 + +### 2. 方案流程 + +#### 2.1 文件上传与解析 + +1. **文件上传**: 用户通过前端界面或 API 上传文件,文件可以是多种格式(如 MD、TXT、SQL 等)。 +2. **文件解析**: 使用 `TikaDocumentReader` 对上传的文件进行解析,提取出文本内容。`TikaDocumentReader` 能够处理多种文件格式,并提取出结构化的文本数据。 \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\2546\350\212\202\357\274\232Ollama RAG \347\237\245\350\257\206\345\272\223\346\216\245\345\217\243\346\234\215\345\212\241\345\256\236\347\216\260.md" "b/docs/md/project/ai-knowledge/\347\254\2546\350\212\202\357\274\232Ollama RAG \347\237\245\350\257\206\345\272\223\346\216\245\345\217\243\346\234\215\345\212\241\345\256\236\347\216\260.md" new file mode 100644 index 000000000..646517066 --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2546\350\212\202\357\274\232Ollama RAG \347\237\245\350\257\206\345\272\223\346\216\245\345\217\243\346\234\215\345\212\241\345\256\236\347\216\260.md" @@ -0,0 +1,34 @@ +--- +title: 【更】第6节:Ollama RAG 知识库接口服务实现 +pay: https://t.zsxq.com/EvnBN +--- + +# 《DeepSeek RAG 知识库》第6节:Ollama RAG 知识库接口服务实现 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/yNiZl](https://t.zsxq.com/yNiZl) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +以上一节知识库的测试案例,将这部分功能以接口方式提供。包括;知识库的上传、选择和使用。 + +## 二、技术方案 + +知识库的上传和使用是明确的,但选择哪个知识库是需要把对应的知识库记录起来。这里我们选择 Redis 列表进行记录。如果是公司里大型的知识库,还需要使用 MySQL 数据库进行存储。 + +## 三、功能实现 + +### 1. 工程结构 + +### 2. 引入组件 + +```java ++ +``` \ No newline at end of file diff --git "a/docs/md/project/ai-knowledge/\347\254\2547\350\212\202\357\274\232\345\237\272\344\272\216AI\345\267\245\345\205\267\357\274\214\350\256\276\350\256\241\347\237\245\350\257\206\345\272\223UI\345\222\214\346\216\245\345\217\243\345\257\271\346\216\245.md" "b/docs/md/project/ai-knowledge/\347\254\2547\350\212\202\357\274\232\345\237\272\344\272\216AI\345\267\245\345\205\267\357\274\214\350\256\276\350\256\241\347\237\245\350\257\206\345\272\223UI\345\222\214\346\216\245\345\217\243\345\257\271\346\216\245.md" new file mode 100644 index 000000000..974f043ea --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2547\350\212\202\357\274\232\345\237\272\344\272\216AI\345\267\245\345\205\267\357\274\214\350\256\276\350\256\241\347\237\245\350\257\206\345\272\223UI\345\222\214\346\216\245\345\217\243\345\257\271\346\216\245.md" @@ -0,0 +1,35 @@ +--- +title: 【更】第7节:基于AI工具,设计知识库UI和接口对接 +pay: https://t.zsxq.com/Jc7fE +--- + +# 《DeepSeek RAG 知识库》第7节:基于AI工具,设计知识库UI和接口对接 + +作者:小傅哥 +org.redisson +redisson-spring-boot-starter +3.44.0 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/BeT7k](https://t.zsxq.com/BeT7k) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +基于我们要实现对话和知识的上传使用,使用AI工具完成UI页面的实现。 + +## 二、技术方案 + +找一个合适的喜欢的AI对话页面,截取上传到 AI 工具,并告知基于这样的 UI 效果完成页面的实现。之后在告诉 AI 处理接口的对接。当然也可以把接口一起交给 AI 工具进行处理。 + +- [https://www.deepseek.com/](https://www.deepseek.com/) +- [https://v0.dev/](https://v0.dev/) +- [https://chatglm.cn/](https://chatglm.cn/) +- [https://openai.itedus.cn/](https://openai.itedus.cn/) + +>其他更多也可以网络检索下。总有一款你是可以使用的。 + +## 三、功能实现 + +### 1. 对话页面 + ++diff --git "a/docs/md/project/ai-knowledge/\347\254\2548\350\212\202\357\274\232Git\344\273\223\345\272\223\344\273\243\347\240\201\345\272\223\350\247\243\346\236\220\345\210\260\347\237\245\350\257\206\345\272\223.md" "b/docs/md/project/ai-knowledge/\347\254\2548\350\212\202\357\274\232Git\344\273\223\345\272\223\344\273\243\347\240\201\345\272\223\350\247\243\346\236\220\345\210\260\347\237\245\350\257\206\345\272\223.md" new file mode 100644 index 000000000..ecf59d99a --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2548\350\212\202\357\274\232Git\344\273\223\345\272\223\344\273\243\347\240\201\345\272\223\350\247\243\346\236\220\345\210\260\347\237\245\350\257\206\345\272\223.md" @@ -0,0 +1,34 @@ +--- +title: 【更】第8节:Git仓库代码库解析到知识库 +pay: https://t.zsxq.com/ByovV +--- + +# 《DeepSeek RAG 知识库》第8节:Git仓库代码库解析到知识库 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/EwqZH](https://t.zsxq.com/EwqZH) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +对知识库的解析进行扩展,增加Git仓库解析。用户填写Git仓库地址和账密,即可拉取代码并上传到知识库,之后就可以基于这套代码进行使用啦。 + +## 二、技术方案 + +引入 JGit 操作库到工程中,用于执行 Git 命令拉取代码仓库。之后对代码库文件进行遍历,依次解析分割上传到向量库中。 + +## 三、功能实现 + +### 1. 工程结构 + +### 2. 引入组件 + +```java ++ +``` diff --git "a/docs/md/project/ai-knowledge/\347\254\2549\350\212\202\357\274\232\346\211\251\345\261\225OpenAI\346\250\241\345\236\213\345\257\271\346\216\245\357\274\214\344\273\245\345\217\212\345\256\214\346\225\264AI\345\257\271\346\216\245.md" "b/docs/md/project/ai-knowledge/\347\254\2549\350\212\202\357\274\232\346\211\251\345\261\225OpenAI\346\250\241\345\236\213\345\257\271\346\216\245\357\274\214\344\273\245\345\217\212\345\256\214\346\225\264AI\345\257\271\346\216\245.md" new file mode 100644 index 000000000..841bf2c1d --- /dev/null +++ "b/docs/md/project/ai-knowledge/\347\254\2549\350\212\202\357\274\232\346\211\251\345\261\225OpenAI\346\250\241\345\236\213\345\257\271\346\216\245\357\274\214\344\273\245\345\217\212\345\256\214\346\225\264AI\345\257\271\346\216\245.md" @@ -0,0 +1,33 @@ +--- +title: 【更】第9节:扩展OpenAI模型对接,以及完整AI对接 +pay: https://t.zsxq.com/YJxRy +--- + +# 《DeepSeek RAG 知识库》第9节:扩展OpenAI模型对接,以及完整AI对接 + +作者:小傅哥 +org.eclipse.jgit +org.eclipse.jgit +5.13.0.202109080827-r +
博客:[https://bugstack.cn](https://bugstack.cn) +
博客:[https://t.zsxq.com/1JLUq](https://t.zsxq.com/1JLUq) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +基于 Spring AI 扩展 OpenAI 模型对接,这样我们就可以使用一些代理的 ChatGPT 接口完成对话了。最终在完成全部接口与页面的对接。 + +## 二、技术方案 + +Spring AI 框架的好处,就是可以以统一的方式直接配置使用各类大模型。像是一些 Spring AI 没有直接对接的大模型,可以基于 one-api 配置转发,用统一 OpenAI 方式进行对接。 + +## 三、功能实现 + +### 1. 工程结构 + +### 2. 引入组件 + +```java ++ +``` \ No newline at end of file diff --git a/docs/md/project/ai-mcp-gateway/ai-mcp-gateway.md b/docs/md/project/ai-mcp-gateway/ai-mcp-gateway.md new file mode 100644 index 000000000..6ac01e671 --- /dev/null +++ b/docs/md/project/ai-mcp-gateway/ai-mcp-gateway.md @@ -0,0 +1,121 @@ +--- +title: AI MCP Gateway 网关服务系统 +lock: no +--- + +# 《AI MCP Gateway 网关服务系统》 - 为各类应用服务接口,便捷转换为MCP服务而设计。 + +作者:小傅哥 +org.springframework.ai +spring-ai-openai-spring-boot-starter +
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/SNsgH](https://t.zsxq.com/SNsgH) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +两年多了,从2023年1月起,小傅哥就开始关注AI、跟进AI,落地 AI 技术相关的场景项目。`做了 AI 问答自动回复助手`、`OpenAI 应用服务(含支付买额度 + OpenAI SDK 开发)`、`OpenAI 代码评审`、`Ai Agent 智能体(RAG、MCP)`,让一众伙伴积累到了丰富的AI应用开发技术,可以满足当下互联网AI应用开发招聘诉求。**那么接下来,关于 AI 小傅哥还要带着大家什么呢?🤔** + +++ +**足够高频,互联网AI应用场景,必备项目!** + +现阶段,众多互联网公司把 AI 作为公司的战略目标,基于 AI 为公司各类场景提效。甚至不少公司要求程序员的编码,AI 占比要有30%以上(来自于某论坛研发分享)。还在各个部门设立 AI 应用创新组。 + +而 AI 的主要提效方式,则是自研实现或基于 Dify 搭建一套 AI Agent 智能体。通过智能体把公司的文档资料转换为 RAG 知识库,再通过 MCP 协议对接各类应用的服务接口。这样我们对 AI Agent 智能体下达命令后,就可以进行分析,规划,执行,直至产出最终的结果。更多关于智能体的实现介绍,可以参考[《AI Agent 智能体设计实现》](https://mp.weixin.qq.com/s/dwsfadYKs7Uy4YvHfLFsVQ) + +**死鬼,重点来啦!** + +公司里为了扩展智能体可提效的场景,就要把现有的公司的各类应用服务接口,`日志的`、`监控的`、`服务的`、`交易的`、`结算的`、`营销的`、`人群的`、`数据的`等等,都要转换为 AI Agent 智能体可识别的 MCP 服务接口。这样就可能有成百上千,成千上完,甚至几十万个接口要做实现。 + +那肯定不能每个接口都写一遍 MCP 服务!所以,对于这样的场景问题,公司里会做一套统一的 MCP Gateway 网关服务系统,其他个各类接口(http、rpc),都可以通过一键配置的方式转换为 MCP 协议类型的接口,被 AI 可以识别和使用。 + ++
++ +而小傅哥这次带着你做的 AI 类项目,就是实现一套这样的 **MCP GateWay 网关服务系统**。小傅哥,会带着你,实现MCP服务,分析 MCP 协议,通过做AI服务代理、网页协议对接、JSON-RPC2标准等方式,把 MCP 协议厘清,之后在手把手的带着你编写响应式的 MCP Gateway 网关能力(鉴权也可以放到网关做)。 + +> 🧧 文末提供了,小傅哥所有编程实战项目获取方式,一次加入即可获得17个已完结的和本次新开展的。 + +## 一、能学到啥 + +该项目是 AI 应用场景下的通用技术服务组件类项目,以解决接口 MCP 协议转换而设计实现。在整个项目中,你可以积累到关于 MCP 协议的深度分析,学习分析协议的技巧和方案,并积累关于设计一个组件解决通用场景问题的能力。 + +- 【前端】基于 html、js、div、css,设计 MCP 协议分析页面。 +- 【前端】基于 html、js、div、css,构建一套服务端管理系统,便于 MCP 协议的录入和使用。 +- 【后端】MCP 协议的分析、理解、运用。掌握 MCP 开发和使用的能力。 +- 【后端】基于 MCP 协议的分析和网关设计诉求,构建网关服务库表。 +- 【后端】运用 DDD 分层架构,设计 MCP 网关服务系统。 +- 【后端】构建AI代理服务,断点调试分析 MCP 协议。 +- 【后端】设计 MCP 分析协议网页服务,链接 MCP 服务,观察 MCP 协议。 +- 【后端】基于 Flux 响应式接口,设计实现 MCP 协议的 sse 连接、initialize 初始化响应、tools 工具的 list 反馈和 call 调用等。 +- 【后端】提供 MCP 协议的动态录入和加载能力,以及提供录入接口组件,便于其他系统可快速录入。 +- 【后端】设计 MCP 网关协议鉴权服务,确保 MCP 服务使用的安全性。 +- 【后端】熟练使用 okhttp3、retrofit2 框架,动态对接 HTTP 服务接口,用于 MCP 协议 toos/call 工具调用。 +- 【后端】扩展学习 rpc 泛化调用,给 MCP 协议提供使用。其实有了这套东西,还可以对接如硬件设备 rs232 串口通信,让 MCP 服务,管理你的硬件设备。 +- 【运维】熟练使用 Docker 在本地和服务端的配置和部署应用,以及在本地构建前后端镜像。 +- 【运维】熟练掌握 Git、GitCode,对工程代码的管理,推送、拉取、切换分支、合并代码等操作。 + +此外,小傅哥对于每个章节还讲解了章节的诉求、流程的设计,之后再到方案实现和功能验证。并在每个章节留有作业让大家练习。当然这还没有完,你知道小傅哥这个架构师画图还是非常牛逼的,所以你还能看到各种画图的技巧,耳濡目染的把这些东西学习成自己的本事!~ + +## 二、项目介绍 + +本项目是 AI Agent 智能体,关于 MCP 协议对接的通用网关服务项目,以解决各类业务接口便捷转换为 MCP 协议而设计实现。通过这样的配置,可以大大的简化从普通http、rpc接口到 MCP 协议的转换操作。这样的项目,也是每个互联网公司在做 AI Agent 智能体时,必备的基础设施项目。 + +### 1. 更新计划 + +本项目目前已经做了基础的筹备和验证,计划于10.26日开始更新课程。整体课程预计在20+节左右。带着你完整的实现一套 AI MCP Gateway 网关服务项目。 + +### 2. 项目资料 + +#### 2.1 协议分析 - 页面 + ++
++ +- 编写了一套网页对接 MCP 服务的页面,把以前直接在 AI Agent 配置 MCP 协议使用的过程,通过页面一步步对接和使用的方式进行展示。 +- 有了这样一个操作过程步骤,你可以更加清晰的了解到 MCP 的执行过程,也能更好的为后续做 MCP 网关服务实现打下基础。 + +#### 2.2 协议分析 - 代理 + ++
++ +- 为了更好的体现出 AI 和 MCP 的交互,这里小傅哥会带着你做一个 AI 的代理接口,来调试观察 MCP 协议的传输。 + +#### 2.3 初始版本 - 案例 + ++
++- 小傅哥这里先做了一个初始的 demo 版本,跑通 MCP 网关,后续会设计整套 DDD 架构,完整整体协议和服务的对接。 + +## 三、课程大纲 + +**不同于网上demo项目。小傅哥带着你做的项目,是一步步,一个个章节的带着大家从0到1的方式,进行分析、设计和开发。是一个纯手把手教大家学习实战技术的项目!** 大家可以先看看课程的大纲,就知道可以学习到哪些东西了。 + +- 第1节:项目功能需求分析 +- 第2节:项目系统架构设计 +- 第3节:MCP 功能服务实现 +- 第4节:AI 服务代理实现 +- 第5节:通过AI 服务代理,分析 MCP 协议 +- 第6节:通过设计网页对接,分析 MCP 协议 +- 第7节:通过 json-rpc2 标准,官网资料,总结 MCP 协议 +- 第8节:设计网关服务端系统,讲解模块关系 +- 第9节:设计拆分领域模型结构 +- 第10节:设计需求服务库表 +- 第11节:网关协议功能编写(1、2、3、4),分步骤设计实现 +- 第12节:网关协议与数据库表对接 +- 第13节:网关协议与http接口对接 +- 第14节:网关协议与rpc接口对接 +- 第15节:网关协议能力管理端编写(1、2、3、4) +- 第16节:MCP 网关服务打包上线 + +随着课程开展,陆续更新课程目录,也会有一些新的内容加入。 + +>课程包括;视频、小册、1 对 1 答疑解惑、专属VIP项目交流群,并且提供简历编写模板结构的一条龙🐲服务。让你学习后,直接拉开与还在玩具项目其他人的差距,面试脱颖而出提高竞争力!! + diff --git a/docs/md/project/ai-mcp-gateway/none.md b/docs/md/project/ai-mcp-gateway/none.md new file mode 100644 index 000000000..f64218b2f --- /dev/null +++ b/docs/md/project/ai-mcp-gateway/none.md @@ -0,0 +1,15 @@ +--- +title: 新章节,编写中 +lock: no +--- + +# 新章节,编写中 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +> 沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、前言 + +... 新章节,编写中 \ No newline at end of file diff --git a/docs/md/project/ai-mcp-gateway/notes.md b/docs/md/project/ai-mcp-gateway/notes.md new file mode 100644 index 000000000..b9f25de0d --- /dev/null +++ b/docs/md/project/ai-mcp-gateway/notes.md @@ -0,0 +1,62 @@ +--- +title: 面试:技能、简历、问题汇总 +lock: no +--- + +# 《AI MCP Gateway 网关服务系统》,关于面试中的技能、简历、问题汇总 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/SNsgH](https://t.zsxq.com/SNsgH) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、项目介绍 + +面试官您好,本套 AI MCP GateWay 网关项目,对标阿里的 higress-ai,以通用方案解决各类业务接口便捷转换为 MCP 协议而设计实现。通过这样的配置,可以大大的简化从普通http、rpc接口到 MCP 协议的转换操作。 + +该项目采用 DDD 领域驱动架构设计,按照 MCP 协议 json-rpc2 标准,构建 AI MCP GateWay 能力服务。因而设计拆分领域模型为;session 域(会话、消息)、协议域(协议、存储)、网关域、鉴权域、LLM(模型测试网关)、管理域(一般公司的大型项目,会单独拆分这个领域为独立系统),来支撑整个服务实现,最终由 case 层编排逻辑,再给 trigger 接口层调用处理。 + +为什么自研?对企业来说,公司需要整合内部完整能力的统一 AI MCP 网关解决方案,随着自身的业务发展而不断迭代处理。在这个过程,就可以快速支撑业务诉求,也可以保证系统的安全和可靠性。如果只是引入外部的,那么可能顺带着要引入一大票的额外系统服务,在遇到一些场景诉求或者问题的时候,也很难做到快速处理。所以我们要自研来实现。另外,对个人来说,我们需要一个技术积累,而不是会用。 + +## 二、简历模板 + +**项目名称**:AI MCP Gateway 统一网关服务系统 + +**项目架构**:DDD 领域驱动设计(六边形架构)、JSON-RPC2 MCP 上下文协议、前后端分离 + +**核心技术**:SpringBoot 3.4、Spring WebFlux、Retrofit 2.9.0 & OkHttp 4.9.3、JDK 17+、MCP(JSON-RPC2) + +**项目介绍**:本项目是 AI Agent 智能体,关于 MCP 协议对接的通用网关服务项目,以解决各类业务接口便捷转换为 MCP 协议而设计实现。通过这样的配置,可以大大的简化从普通http、rpc接口到 MCP 协议的转换操作。这样的项目,也是每个互联网公司在做 AI Agent 智能体时,必备的基础设施项目。 + +**核心职责**: + +>简历的职责,是你需要通过不同方面的举证,表述出自己的能力储备。所以,以下是各个方面的描述案例,你可以按照此方式解决描述你的简历。 + +- 架构设计: + - 以 DDD 领域驱动设计,四色建模分析领域模型,划分出;session 域(会话、消息)、协议域(协议、存储)、网关域、鉴权域、LLM(模型测试网关)、管理域。 + - 采用六边形架构解耦领域逻辑与基础设施,确保系统可扩展性和可维护性 + - 设计基于 Reactor 的响应式编程模型,实现高性能的 SSE (Server-Sent Events) 通信 + +- 设计模式: + - 通过策略模式处理 MCP(JSON-RPC2)消息多场景类型的处理,包括;初始(Initialize)、资源(Resources)、工具(ToolsList)、调用(ToolsCall)的场景,有利于后续其他动作的扩展。 + - 使用组合模式(规则树)在 case 领域层,编排串联 domain 领域服务,让各类场景便于迭代和维护。 + +- 核心领域(不用都写): + - **Session 领域**:设计会话管理核心模型,包括 HandleMessageCommandEntity、SessionConfigVO 等实体,实现会话创建、消息处理、状态管理 + - **Gateway 领域**:构建网关配置模型,包括 GatewayConfigEntity、GatewayToolConfigEntity 等,支持动态网关配置和工具管理 + - **Protocol 领域**:设计 MCP 协议解析和封装机制,实现 JSON-RPC 消息的序列化和反序列化 + - **Admin 领域**:实现管理后台的领域逻辑,支持网关配置、认证管理等核心功能 + - **Domain 层**:定义核心领域接口和值对象,如 ISessionManagementService、IGatewayConfigService 等 + - **Case 层**:实现用例层逻辑,包括 IMcpSessionService、IMcpMessageService 等服务接口 + - **Trigger 层**:开发 HTTP 触发器,实现 MCP 网关的 RESTful API 接口 + - **Infrastructure 层**:构建基础设施适配器,包括数据库访问、Redis 缓存、网关适配器等 + +- 功能方案: + - 基于 Spring WebFlux 和 Reactor 实现响应式编程,支持高并发 SSE 连接 + - 设计 MCP 协议解析器,实现 JSON-RPC 消息的标准化处理 + - 开发网关配置管理系统,支持动态配置更新和热部署 + - 实现会话管理机制,包括会话创建、消息处理、状态同步等功能 + - 设计基于 API Key 的认证机制,确保网关访问安全 + - 实现 Spring Security 集成,支持细粒度权限控制 + - 开发速率限制和会话过期机制,防止滥用和资源浪费 \ No newline at end of file diff --git a/docs/md/project/ai-mcp-gateway/promotion/ai-mcp-gateway-stage-completion.md b/docs/md/project/ai-mcp-gateway/promotion/ai-mcp-gateway-stage-completion.md new file mode 100644 index 000000000..91fed7a22 --- /dev/null +++ b/docs/md/project/ai-mcp-gateway/promotion/ai-mcp-gateway-stage-completion.md @@ -0,0 +1,196 @@ +--- +title: AI MCP 网关,可以写简历啦! +lock: no +--- + +# AI MCP 网关,可以写简历啦! + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/SNsgH](https://t.zsxq.com/SNsgH) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +**都写 AI Agent,怎么拉开差距?** 但现在出去面试,你说简历要是连一点 AI 的都没有,,都不好意思说自己是学技术的。但写完 AI Agent 智能体,又容易被说,你是不就只是会用 API 呀,你有深入了解底层技术吗?了解吗,死鬼! + +++ +**不了解呀,那怎么办!** + +所以,除了做 AI Agent 智能体,小傅哥还带着你深入核心技术的设计与实现,手把手带着你搓一套 AI MCP 网关(各个大厂都在做的东西)。有这样一套东西,再配合 AI Agent 智能体,就把技术深度给拉起来了。`最后写简历效果咋样?` 有伙伴反馈,如下; + ++
++ +企业里为啥看重这个? + +现在虽然是 AI 时代,AI 编码,但能驾驭 AI 的人主要是程序员,能更强的驾驭 AI 编码的,肯定编程经验丰富的。所以,你如果能在核心复杂场景里,提供出对应的技术解决方案,那么肯定是会受到企业招聘青睐的。(没有这方面经验,AI 写出来,你都不敢真的对外上线用起来)。 + +那么,为啥是 AI MCP 网关,在企业里那么重要呢? + +当下互联网toc的业务场景,你会看到你用的购物(天猫、京东)、出行(滴滴)、外卖(美团、饿了吗),都有 AI 场景,这些场景辅助用户完成购物、出行、点餐,极大的增加体验。但本质来说,是 AI 对接了业务系统。怎么对接的呢,方式就是通过 MCP 协议对接,把业务项目的接口(http、rpc)转换为可被 AI 识别的接口,以此方式完成对接。但如果全部手动编码实现,是非常麻烦的。所以 AI MCP Gateway 统一解决这样一个场景问题,是非常有价值的。 + ++
++ ++
++ +扫码加入 AI MCP GateWay 项目学习社群,直接拿到课程,立马开学!(简历模板也都提供好了) + +> MCP 解决接口传输协议,Skills 规范流程执行 SOP 标准。 + +## 一、能学到啥 + +该项目是 AI 应用场景下的通用技术服务组件类项目,以解决接口 MCP 协议转换而设计实现。在整个项目中,你可以积累到关于 MCP 协议的深度分析,学习分析协议的技巧和方案,并积累关于设计一个组件解决通用场景问题的能力。 + +- 【前端】基于 html、js、div、css,设计 MCP 协议分析页面。 +- 【前端】基于 html、js、div、css,构建一套服务端管理系统,便于 MCP 协议的录入和使用。 +- 【后端】MCP 协议的分析、理解、运用。掌握 MCP 开发和使用的能力。 +- 【后端】基于 MCP 协议的分析和网关设计诉求,构建网关服务库表。 +- 【后端】运用 DDD 分层架构,设计 MCP 网关服务系统。 +- 【后端】构建AI代理服务,断点调试分析 MCP 协议。 +- 【后端】设计 MCP 分析协议网页服务,链接 MCP 服务,观察 MCP 协议。 +- 【后端】基于 Flux 响应式接口,设计实现 MCP 协议的 sse 连接、initialize 初始化响应、tools 工具的 list 反馈和 call 调用等。 +- 【后端】提供 MCP 协议的动态录入和加载能力,以及提供录入接口组件,便于其他系统可快速录入。 +- 【后端】设计 MCP 网关协议鉴权服务,确保 MCP 服务使用的安全性。 +- 【后端】熟练使用 okhttp3、retrofit2 框架,动态对接 HTTP 服务接口,用于 MCP 协议 toos/call 工具调用。 +- 【后端】扩展学习 rpc 泛化调用,给 MCP 协议提供使用。其实有了这套东西,还可以对接如硬件设备 rs232 串口通信,让 MCP 服务,管理你的硬件设备。 +- 【运维】熟练使用 Docker 在本地和服务端的配置和部署应用,以及在本地构建前后端镜像。 +- 【运维】熟练掌握 Git、GitCode,对工程代码的管理,推送、拉取、切换分支、合并代码等操作。 + +此外,小傅哥对于每个章节还讲解了章节的诉求、流程的设计,之后再到方案实现和功能验证。并在每个章节留有作业让大家练习。当然这还没有完,你知道小傅哥这个架构师画图还是非常牛逼的,所以你还能看到各种画图的技巧,耳濡目染的把这些东西学习成自己的本事!~ + +## 二、项目演示 + +该项目,已完成一整套的 AI MCP 网关服务能力,并提供了完整的后台 UI 实现。可以基于 Swagger OpenAPI 协议动态导入接口,转换为 AI MCP GateWay 网关协议。配置后,可以直接在网关管理后台,完成接口的使用验证。 + +### 1. 登录页面 + ++
++ +### 2. 网关列表 + ++
++ +### 3. 查看网关 + ++
++ +### 4. 协议配置 + ++
++ +### 5. 网关测试 + ++
++ +## 三、简历模板 + +### 1. 项目介绍 + +面试官您好,本套 AI MCP GateWay 网关项目,对标阿里的 higress-ai,以通用方案解决各类业务接口便捷转换为 MCP 协议而设计实现。通过这样的配置,可以大大的简化从普通http、rpc接口到 MCP 协议的转换操作。 + +该项目采用 DDD 领域驱动架构设计,按照 MCP 协议 json-rpc2 标准,构建 AI MCP GateWay 能力服务。因而设计拆分领域模型为;session 域(会话、消息)、协议域(协议、存储)、网关域、鉴权域、LLM(模型测试网关)、管理域(一般公司的大型项目,会单独拆分这个领域为独立系统),来支撑整个服务实现,最终由 case 层编排逻辑,再给 trigger 接口层调用处理。 + +为什么自研?对企业来说,公司需要整合内部完整能力的统一 AI MCP 网关解决方案,随着自身的业务发展而不断迭代处理。在这个过程,就可以快速支撑业务诉求,也可以保证系统的安全和可靠性。如果只是引入外部的,那么可能顺带着要引入一大票的额外系统服务,在遇到一些场景诉求或者问题的时候,也很难做到快速处理。所以我们要自研来实现。另外,对个人来说,我们需要一个技术积累,而不是会用。 + +### 2. 简历模板 + +**项目名称**:AI MCP Gateway 统一网关服务系统 + +**项目架构**:DDD 领域驱动设计(六边形架构)、JSON-RPC2 MCP 上下文协议、前后端分离 + +**核心技术**:SpringBoot 3.4、Spring WebFlux、Retrofit 2.9.0 & OkHttp 4.9.3、JDK 17+、MCP(JSON-RPC2) + +**项目介绍**:本项目是 AI Agent 智能体,关于 MCP 协议对接的通用网关服务项目,以解决各类业务接口便捷转换为 MCP 协议而设计实现。通过这样的配置,可以大大的简化从普通http、rpc接口到 MCP 协议的转换操作。这样的项目,也是每个互联网公司在做 AI Agent 智能体时,必备的基础设施项目。 + +**核心职责**: + +>简历的职责,是你需要通过不同方面的举证,表述出自己的能力储备。所以,以下是各个方面的描述案例,你可以按照此方式解决描述你的简历。 + +- 架构设计: + - 以 DDD 领域驱动设计,四色建模分析领域模型,划分出;session 域(会话、消息)、协议域(协议、存储)、网关域、鉴权域、LLM(模型测试网关)、管理域。 + - 采用六边形架构解耦领域逻辑与基础设施,确保系统可扩展性和可维护性 + - 设计基于 Reactor 的响应式编程模型,实现高性能的 SSE (Server-Sent Events) 通信 + +- 设计模式: + - 通过策略模式处理 MCP(JSON-RPC2)消息多场景类型的处理,包括;初始(Initialize)、资源(Resources)、工具(ToolsList)、调用(ToolsCall)的场景,有利于后续其他动作的扩展。 + - 使用组合模式(规则树)在 case 领域层,编排串联 domain 领域服务,让各类场景便于迭代和维护。 + +- 核心领域(不用都写): + - **Session 领域**:设计会话管理核心模型,包括 HandleMessageCommandEntity、SessionConfigVO 等实体,实现会话创建、消息处理、状态管理 + - **Gateway 领域**:构建网关配置模型,包括 GatewayConfigEntity、GatewayToolConfigEntity 等,支持动态网关配置和工具管理 + - **Protocol 领域**:设计 MCP 协议解析和封装机制,实现 JSON-RPC 消息的序列化和反序列化 + - **Admin 领域**:实现管理后台的领域逻辑,支持网关配置、认证管理等核心功能 + - **Domain 层**:定义核心领域接口和值对象,如 ISessionManagementService、IGatewayConfigService 等 + - **Case 层**:实现用例层逻辑,包括 IMcpSessionService、IMcpMessageService 等服务接口 + - **Trigger 层**:开发 HTTP 触发器,实现 MCP 网关的 RESTful API 接口 + - **Infrastructure 层**:构建基础设施适配器,包括数据库访问、Redis 缓存、网关适配器等 + +- 功能方案: + - 基于 Spring WebFlux 和 Reactor 实现响应式编程,支持高并发 SSE 连接 + - 设计 MCP 协议解析器,实现 JSON-RPC 消息的标准化处理 + - 开发网关配置管理系统,支持动态配置更新和热部署 + - 实现会话管理机制,包括会话创建、消息处理、状态同步等功能 + - 设计基于 API Key 的认证机制,确保网关访问安全 + - 实现 Spring Security 集成,支持细粒度权限控制 + - 开发速率限制和会话过期机制,防止滥用和资源浪费 + +## 四、项目大纲 + +不同于网上Demo项目,这个项目是一步步,一个个章节的带着大家从0到1的方式,进行分析、设计和开发。是一个纯手把手教大家学习实战技术的项目! 大家可以先看看课程的大纲,就知道可以学习到哪些东西了。 + +**第1部分:系统设计** +- 1:《AI MCP Gateway》第1-1节:网关需求分析 +- 5:《AI MCP Gateway》第1-2节:系统建模设计 +- 11:《AI MCP Gateway》第1-3节:网关协议表 +- 16:《AI MCP Gateway》第1-4节:升级网关库表 + +**第2部分:协议分析** +- 2:《AI MCP Gateway》第2-1节:MCP服务实现(用于后续协议分析) +- 3:《AI MCP Gateway》第2-2节:MCP代理调用 +- 4:《AI MCP Gateway》第2-3节:MCP通信协议(json-rpc2) - 调试 Spri... + +**第3部分:网关实现(完成到26节可以写简历啦)** + +- 6:《AI MCP Gateway》第3-1节:工程初始化创建 +- 7:《AI MCP Gateway》第3-2节:会话管理服务实现 +- 8:《AI MCP Gateway》第3-3节:会话接口编排 +- 9:《AI MCP Gateway》第3-4节:会话消息结构设计 +- 10:《AI MCP Gateway》第3-5节:消息协议处理案例 +- 12:《AI MCP Gateway》第3-6节:基础层数据处理(Dao) +- 13:《AI MCP Gateway》第3-7节:协议消息处理-Initialize +- 14:《AI MCP Gateway》第3-8节:协议消息处理-ToolsList +- 15:《AI MCP Gateway》第3-9节:协议消息处理-ToolsCall +- 17:《AI MCP Gateway》第3-10节:评审库表升级代码 +- 18:《AI MCP Gateway》第3-11节:会话内容编排处理 +- 19:《AI MCP Gateway》第3-12节:鉴权功能领域服务 +- 20:《AI MCP Gateway》第3-13节:鉴权功能编排处理 +- 21:《AI MCP Gateway》第3-14节:解析Swagger标准OpenAPI协议 +- 22:《AI MCP Gateway》第3-15节:协议域-协议解析处理 +- 23:《AI MCP Gateway》第3-16节:协议域-协议存储处理 +- 24:《AI MCP Gateway》第3-17节:网关配置域-配置数据存储(CRUD) +- 25:《AI MCP Gateway》第3-18节:管理端-API功能编排串联 +- 26:《AI MCP Gateway》第3-19节:管理端-API与UI对接 +- 27:《AI MCP Gateway》第3-20节:验证服务,LLM对接测试MCP接口 +- 27:《AI MCP Gateway》第3-21节:验证服务,LLM对接测试MCP页面 + +> 欢迎加入小傅哥👏🏻,一起学习企业真正学习的实战技术!让自己的面试,更具有竞争力。 diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2541-1\350\212\202\357\274\232\347\275\221\345\205\263\351\234\200\346\261\202\345\210\206\346\236\220.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2541-1\350\212\202\357\274\232\347\275\221\345\205\263\351\234\200\346\261\202\345\210\206\346\236\220.md" new file mode 100644 index 000000000..bba7f38a4 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2541-1\350\212\202\357\274\232\347\275\221\345\205\263\351\234\200\346\261\202\345\210\206\346\236\220.md" @@ -0,0 +1,64 @@ +--- +title: 【更】第1-1节:网关需求分析 +pay: https://t.zsxq.com/f6fiZ +--- + +# 《AI MCP Gateway 网关服务系统》第1-1节:网关需求分析 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/i8tV1](https://t.zsxq.com/i8tV1) + +>大家好,我是技术UP主小傅哥。 + +今天是我们 **《AI MCP Gateway 网关服务系统》** 项目学习的第1节课程,小傅哥会带着大家,以互联网公司正规的承接产品需求到开发部署上线的流程,带着大家以第一主人公视角的方式进行学习。这样既可以保证你学习到项目内容,也能了解到公司里正规的开发模式,以后进入到公司也可以很好的融入团队,承接项目需求。加油💪🏻!让我们开启新项目之旅! + +## 一、本章诉求 + +站在产品视角,分析 AI MCP Gateway 网关服务系统,这样一个产品功能需求的背景、诉求和目的。 + +需求是怎么来的呢? + +作为互联网公司里的研发,我们通常都是从业务产品经理那承接需求,评审 PRD 文档,之后研发进行详细设计,给出设计文档在评审,评审通过后开始进入编码开发,以及推进后续的测试和上线。 + +那么,还有一类需求是不需要业务产品经理的,往往是纯技术产品经理或者研发和技术一起驱动的,这类的需求包括,系统的重构、组件的设计、框架的升级等。他们虽然也是需求,但不直接影响到产品经理的业务需求,所以往往由技术产品或者研发推动。 + +所以,像是 AI MCP Gateway 网关服务系统,是附属于 AI 应用开发部门的项目,一般是由 AI 技术产品经理推动,这类产品经理,往往比纯业务产品经理要多一些技术储备的。虽然他们编码不熟练,但对技术是有不错的储备,可以很好的规划和推进技术产品。 + +## 二、项目背景 + +MCP 协议的定义和发布,改变了我们使用 AI 的形态。 + +LLM 大模型第一次以 chatgpt 问世时,就足以震撼到我们。它具备各行各业的知识储备,可以识别人类语言,可以完成逻辑关系推理。在很长一段时间里,我们都是把问题抛给大模型,大模型回答后,我们在根据它的回复,复制粘贴到具体的场景进行处理。 + +但大模型不能无中生有,不能根据你的提问,直接帮你完成最终的处理。如;帮我查询最近一天内数据库账户表写入的数据量,这是做不到的,因为大模型并不能直接连接到我们的数据库或者其他任何服务。 + +在 2023 年前,如果想让大模型和程序代码互动,我们经常做的方式是写提示词,告诉大模型我的程序具备什么样的能力,有什么样的接口格式,你需要分析我的问题,并按照最终的执行给出结构化参数。json 格式为 `{"function":"query_user_account","arguments":{"sc":"渠道值"}}` 之后再根据大模型的结果调用对应的程序方法。不过以上方式执行起来的误差较大,经常是需要慢慢微调提示词。 + +到了 2023年6月,OpenAI 发布 gpt-3.5-turbo-0613 模型,给 API 的调用提供了 Function Calling 的能力,只需要在请求 API 的时候传入 functions 参数,告知大模型本地有哪些函数方法可以被调用使用即可。到了 2023年11月,gpt-3.5-turbo-1106 发布,这回开始支持 tools 函数,我们可以在提问的时候,进行网络检索,天气对接。但是这些功能代码, 都被嵌入到大模型调用中,编写起来耦合在一块,维护起来很麻烦。 + +直至到2024年11月,Anthropic 发布了 MCP 协议,将 tools 的封装单独抽离到独立的服务,这种服务称之为 MCP 服务,然后通过远程协议的模式提供给大模型调用。而 MCP 协议的主要作用是将服务转换为可以被大模型识别的格式结构(后面章节会细分析 MCP 协议)。 + +**MCP 为何重要?** + +- MCP 在构建或与 AI 应用程序或代理集成时减少了开发时间和复杂性。 +- MCP 提供对数据源、工具和应用程序生态系统的访问,这将增强功能并改善最终用户体验。 +- MCP 可产生功能更强大的 AI 应用程序或代理,它们可以在必要时访问您的数据并代表您采取行动。 + +++ +自从有了 MCP 协议以后,市面上开始出现各类的 AI Agent 智能体服务,如被大家熟知的 `Dify`、`Corz`、`Trae.ai/Cursor` 等。这些都是通用的智能体服务,可以解决市面上大部分通用场景问题。 + +到这以后,各个公司开启了自己的 AI Agent 智能体实现,对公司里自身业务场景进行提效。如账户服务、交易订单、计息计罚、还款计划等,做成智能客户和AI运营工具,都可以为企业提效。那么这里就有一个问题,这些接口想被大模型识别,就要开发为 MCP 协议服务,只有 MCP 协议才能被大模型识别的协议,公司里的各项服务要想被大模型调用,就要编写为一个个的 MCP Server 服务端,这个工作量是非常大的。 + ++
++ +所以,为了解决需要把大量接口开发成 MCP 协议服务的工作,我们可以设计一个 MCP 网关服务系统。它的核心工作原理在于,设计实现一套 MCP 协议的统一服务入口,管理和使用动态化注册的 HTTP/RPC 服务接口。MCP 协议的接口会被接入 MCP 服务的大模型,进行调用,核心过程包括;`建立sse连接创建会话ID`、`初始化服务`、`获取 tools 工具列表`、`响应工具调用`。这些内容,小傅哥会在后续的协议分析中带着大家学习。 + +综上,当我们有了一套 MCP 网关以后,就可以把我们各项所需的接口,快速🔜转换为 MCP 协议,配置给 AI Agent 智能体系统进行使用啦。这也是我们本次课程的最终目的。 + + diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2541-2\350\212\202\357\274\232\347\263\273\347\273\237\345\273\272\346\250\241\350\256\276\350\256\241.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2541-2\350\212\202\357\274\232\347\263\273\347\273\237\345\273\272\346\250\241\350\256\276\350\256\241.md" new file mode 100644 index 000000000..2ad3c04f6 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2541-2\350\212\202\357\274\232\347\263\273\347\273\237\345\273\272\346\250\241\350\256\276\350\256\241.md" @@ -0,0 +1,24 @@ +--- +title: 【更】第1-2节:系统建模设计 +pay: https://t.zsxq.com/FKXfD +--- + +# 《AI MCP Gateway 网关服务系统》第1-2节:系统建模设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/74OwC](https://t.zsxq.com/74OwC) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +按照 AI MCP Gateway 网关功能实现诉求,对系统服务进行建模设计。包括;用例图、四色建模拆解、工程模型分析。 + +## 二、架构选型 + +此项目会选择 DDD 领域驱动设计的方式,进行系统建模和功能设计。那为啥选择 DDD 架构呢? + +因为 DDD 架构的四色建模方法可以更好的分析场景需求模型,同时它对应的六边形架构设计,非常合理的划分了微服务的各项单元功能。如;http、redis、mysql等都有自己的分层规划,同时又为领域服务与基础设施层的设计做了依赖倒置(这样的思想在Spring源码中很多),当我们在领域模块中实现服务时,就可以专心于各个模块的内聚服务了。 + +关于 DDD 可以在这部分补充学习;[https://bugstack.cn/md/road-map/ddd-guide-01.html](https://bugstack.cn/md/road-map/ddd-guide-01.html) - `有系列的5节课程` \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2541-3\350\212\202\357\274\232\347\275\221\345\205\263\345\215\217\350\256\256\350\241\250.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2541-3\350\212\202\357\274\232\347\275\221\345\205\263\345\215\217\350\256\256\350\241\250.md" new file mode 100644 index 000000000..1e517dffe --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2541-3\350\212\202\357\274\232\347\275\221\345\205\263\345\215\217\350\256\256\350\241\250.md" @@ -0,0 +1,25 @@ +--- +title: 【更】第1-3节:网关协议表 +pay: https://t.zsxq.com/YwZQE +--- + +# 《AI MCP Gateway 网关服务系统》第1-3节:网关协议表 + +作者:小傅哥 +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/pipVW](https://t.zsxq.com/pipVW) + +## 一、本章诉求 + +设计 AI MCP Gateway 网关服务,所需的核心必备的数据库表。以用于存储,mcp 到 http 的协议转换处理,如,用户通过 sse 请求指定的网关 ID 对应的服务,则可以调用到对应的 http 服务接口。 + +## 二、功能设计 + +如图,库表驱动下的业务; + +++ +- 首先,以用户为入口,进行网关配置,他关心的是权限,以及配置的 http 怎么映射到 mcp 服务。 +- 之后,mcp 服务对应的 http 接口能力和出入参字段,都需要给出对应的描述,这样 ai 调用 mcp 服务,才能拿到工具列表说明以及进行调用。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2541-4\350\212\202\357\274\232\345\215\207\347\272\247\347\275\221\345\205\263\345\272\223\350\241\250.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2541-4\350\212\202\357\274\232\345\215\207\347\272\247\347\275\221\345\205\263\345\272\223\350\241\250.md" new file mode 100644 index 000000000..c2dfe56ee --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2541-4\350\212\202\357\274\232\345\215\207\347\272\247\347\275\221\345\205\263\345\272\223\350\241\250.md" @@ -0,0 +1,25 @@ +--- +title: 【更】第1-4节:升级网关库表 +pay: https://t.zsxq.com/eeZPc +--- + +# 《AI MCP Gateway 网关服务系统》第1-4节:升级网关库表 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/QCvqV](https://t.zsxq.com/QCvqV) + +## 一、本章诉求 + +增强网关库表设计,拆分出工具(tool)、工具协议类型(http),让网关配置可以支持一个网关下多个工具,工具可以绑定和切换到不同的协议上(1:n)。细节上会在 tool 上设计协议类型,以便于扩展支持不同的协议对接。 + +## 二、升级设计 + +如图,从旧版库表升级到新版库表的结构; + +++ +- 旧版的设计中,是有一个 mcp_protocol_registry 协议注册,里面包含了工具描述和 http 接口协议信息。功能理解和编码实现上会比较直观,适合我们最开始让大家上手学习。 +- 新版的设计中,拆分了 tool 工具表,也就是一个网关(mcp_gateway)可以对应多个 tool 表,tool 表可以单独配置对应的协议信息,可以是 http,也可以是其他的。后续扩展的时候增加新的表即可。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2542-1\350\212\202\357\274\232MCP\346\234\215\345\212\241\345\256\236\347\216\260.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2542-1\350\212\202\357\274\232MCP\346\234\215\345\212\241\345\256\236\347\216\260.md" new file mode 100644 index 000000000..f96b7af4d --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2542-1\350\212\202\357\274\232MCP\346\234\215\345\212\241\345\256\236\347\216\260.md" @@ -0,0 +1,46 @@ +--- +title: 【更】第2-1节:MCP服务实现 +pay: https://t.zsxq.com/QdTsG +--- + +# 《AI MCP Gateway 网关服务系统》第2-1节:MCP服务实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/mUHg8](https://t.zsxq.com/mUHg8) + +>大家好,我是技术UP主小傅哥。 + +进入到第二部分开始,小傅哥会带着大家通过各种手段对 MCP 协议进行细致的实践验证的方式进行分析。这部分包括了实现一个 MCP 服务,完成 MCP 服务的对接,通过代理的方式调试对接中 MCP 接口协议的数据,以及通过开发网页测试工具对接协议等。最后在进行 json-rpc2 定义的协议标准讲解。通过这样一套内容串联,你会对 MCP 有非常强的理解,也能为后面做 MCP 网关实现的学习打下良好的基础。 + +## 一、本章诉求 + +基于 Spring AI 框架,实现一个简单的 MCP 服务,为后续做协议的分析和验证进行使用。 + +因为协议分析,主要包括了通信的格式结构,如通信的入参,所以实现这样的一个 MCP 服务,会多增加一些入参类型,便于以后做网关设计时使用。 + +通常来讲,这部分的操作,也可以理解为是技术调研验证阶段。当我们要实现一个大的功能服务时,就要先想办法把复杂的逻辑拆分为独立的细小单元。也就是软件第一设计原则康威定律提到的,问题越小,越容易被理解和处理。所以,当你想在此项目拓展功能,或则自己在公司承接需求的时候,也可以使用这样的方式进行辅助完成系统的详细设计。 + +## 二、协议说明(MCP) + +文档:[https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html](https://docs.spring.io/spring-ai/reference/api/mcp/mcp-server-boot-starter-docs.html) - 可以阅读官网文档,这里就包含了如何实现 MCP 服务,并提供了小案例。 + +```java ++ +``` + +Spring AI MCP(模型上下文协议)服务启动器为在 Spring Boot 应用程序中设置 MCP 服务器提供了自动配置功能。它实现了 MCP 服务器功能与 Spring Boot 自动配置系统的无缝集成。 + +MCP 服务器启动器提供: +- MCP 服务器组件的自动配置 +- 支持同步和异步操作模式 +- 多种传输层选项 +- 灵活的工具、资源和提示规范 +- 更改通知功能 + +Spring AI MCP 框架是对 MCP 协议的实现,可以把我们实现的服务功能,以 MCP 格式进行转换处理。与我们要实现的 AI MCP Gateway 不同的是,Spring AI MCP 固定的框架,每一个 MCP 都要独立完成开发,而 AI MCP Gateway 是一个通用协议转换的服务,只需要配置就可以完成从接口(http/rpc)到 MCP 协议的转换。 + +但为了更好的理解 MCP 协议,我们可以先基于 Spring AI MCP 框架,来实现一个简单的 MCP 并陆续完成对接使用,再到协议分析和设计 AI MCP Gateway 网关服务。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2542-2\350\212\202\357\274\232MCP\344\273\243\347\220\206\350\260\203\347\224\250.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2542-2\350\212\202\357\274\232MCP\344\273\243\347\220\206\350\260\203\347\224\250.md" new file mode 100644 index 000000000..697f8a3ec --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2542-2\350\212\202\357\274\232MCP\344\273\243\347\220\206\350\260\203\347\224\250.md" @@ -0,0 +1,25 @@ +--- +title: 【更】第2-2节:MCP代理调用 +pay: https://t.zsxq.com/OkMLy +--- + +# 《AI MCP Gateway 网关服务系统》第2-2节:MCP代理调用 + +作者:小傅哥 +org.springframework.ai +spring-ai-starter-mcp-server +
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/UAbZd](https://t.zsxq.com/UAbZd) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +实现一个 MCP 客户端,用于对接 MCP 服务端,并通过代理 AI 接口的方式完成调用。该方案旨在调试 AI 调用 MCP 过程中的通信的请求接口协议,便于查看和分析相关数据。 + +## 二、流程设计 + +++ +- 如图,是整个 Ai Client 以 Tools 工具,对接 MCP 的流程结构图。也是 Ai Agent 智能体最基础配置。如果感兴趣 [Ai Agent 项目](https://t.zsxq.com/GwNZp),也可以在星球里学习。 +- 之后,我们要在整个实现过程中,为 Ai 接口,通过 SpringBoot HTTP 方式做一层代理。这样在调用 MCP 的过程中,我们就可以清楚的知道这个过程的协议数据结构了。`代理的方式可以用在很多场景,还有一种是浏览器代理的主动安全扫描技术,甚至你服务器的应用暴漏了数据库密码都可以被扫描出来。` [扩展知识:安全漏洞扫描,他怎么拿到了我的数据库密码?](https://bugstack.cn/md/road-map/13scan-jdumpspider.html) diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2542-3\350\212\202\357\274\232MCP\351\200\232\344\277\241\345\215\217\350\256\256.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2542-3\350\212\202\357\274\232MCP\351\200\232\344\277\241\345\215\217\350\256\256.md" new file mode 100644 index 000000000..ff83dcb39 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2542-3\350\212\202\357\274\232MCP\351\200\232\344\277\241\345\215\217\350\256\256.md" @@ -0,0 +1,39 @@ +--- +title: 【更】第2-3节:MCP通信协议(json-rpc2) +pay: https://t.zsxq.com/9PlXx +--- + +# 《AI MCP Gateway 网关服务系统》第2-3节:MCP通信协议(json-rpc2) - debug 调试 Spring AI 源码 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wwiTt](https://t.zsxq.com/wwiTt) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +学习了解 JSON-RPC 2.0 消息协议定义,并通过工程实践调试(debug)验证的方式,分析 MCP 通信协议过程。 + +## 二、通信协议 + +MCP 等同于为 AI 安装上了手和脚,使其这个 AI 大脑具备了行为能力的执行。所以,25年以来,AI Agent 智能体才得以落地。 + +MCP 定义了一种标准化的通信协议,使客户端和服务器能够以一致且可预测的方式交换消息。这种标准化的定义对整个AI和服务的交互性至关重要。 + +而通信就要有数据的交互格式,MCP 采用的是 JSON-RPC 2.0 协议,作为客户端和服务端之间素有的通信消息格式。JSON-RPC 是一种轻量级的远程过程调用协议,采用 JSON 编码,易于阅读和调试、与编程语言无关,支持在任何编程环境中实现(Java、Python、Go、JS...),且成熟完善,规范明确,适合广泛使用。 + +++ +> 在本节代码工程下,docs/pdf -> JSON-RPC 2.0 Specification.pdf 详细介绍了 json-rpc 2.0 通信协议,可以查阅。也可以阅读它的官网,但打开会卡一些。[https://www.jsonrpc.org/specification](https://www.jsonrpc.org/specification) + +### 1. 调用协议 + ++
++ +- 首先,很多通信协议,也包括业务工程的流程处理,往往第一步是建立一个验证关系,拿到整个后续链路请求的会话ID,之后以会话ID作为全流程的串联关系进行通信。这和图中的 MCP 协议调用过程是一样的。 +- 之后,MCP 客户端和服务端的交互,分为4个步骤;初始化(连接)、发现工具列表(能力)、执行工具调用、断开连接。也就是说 AI 要拿到你配置的工具的 MCP 的能力,这样才能根据你的请求决定调用哪个 MCP 服务,以及处理 MCP 服务返回的结果。 diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-10\350\212\202\357\274\232\350\257\204\345\256\241\345\272\223\350\241\250\345\215\207\347\272\247\344\273\243\347\240\201.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-10\350\212\202\357\274\232\350\257\204\345\256\241\345\272\223\350\241\250\345\215\207\347\272\247\344\273\243\347\240\201.md" new file mode 100644 index 000000000..d92c1ebf5 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-10\350\212\202\357\274\232\350\257\204\345\256\241\345\272\223\350\241\250\345\215\207\347\272\247\344\273\243\347\240\201.md" @@ -0,0 +1,33 @@ +--- +title: 【更】第3-10节:评审库表升级代码 +pay: https://t.zsxq.com/FxVTE +--- + +# 《AI MCP Gateway 网关服务系统》第3-10节:评审库表升级代码 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/PzIhJ](https://t.zsxq.com/PzIhJ) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +针对升级的库表结构,调整工程代码`基础设施层`(dao、po、mapper),重新设计`领域层值对象`,附带调整InitializeHandler、ToolsListHandler、ToolsCallHandler的数据使用。 + +本节是一个很好的练习篇,原有的功能、流程、结构都不变,只是把库表升级,之后针对这些数据的时候重新定义对象。所以,这一节我们采用互联网公司中的代码评审方式来讲解变更信息,你可以在这个过程中,对比代码变化,来编写你的代码。也可以在学习文档和视频后,自己来编写。可能在这个过程中会遇到错误,但这些错误会驱动你深入的debug调试,快速的积累核心知识。这节学习透彻了以后,后面的章节将会非常好学习。 + +git 教程:[https://bugstack.cn/md/road-map/git.html](https://bugstack.cn/md/road-map/git.html) + +## 二、流程设计 + +如图,库表升级对于领域功能的改造; + +++ +- InitializeHandler 旧版是通过网关配置和工具两部分拿到基础信息,新版直接从网关配置拿到即可。 +- ToolsListHandler 旧版从 McpGatewayToolConfigVO 定义的工具和映射,拿到 list 数据,之后做的拆分。新版定义了 McpToolConfigVO - 工具部分、McpToolProtocolConfigVO - 协议部分,有工具引入协议信息。 +- ToolsCallHandler 这部分增强了查询,通过 gatewayId 网关ID、toolName 工具名称,来获取到当前当前要调用的协议信息。这里查询的是 http 协议。如果对接了更多的协议,这部分要做策略处理。 + diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-11\350\212\202\357\274\232\344\274\232\350\257\235\345\206\205\345\256\271\347\274\226\346\216\222\345\244\204\347\220\206.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-11\350\212\202\357\274\232\344\274\232\350\257\235\345\206\205\345\256\271\347\274\226\346\216\222\345\244\204\347\220\206.md" new file mode 100644 index 000000000..31e04239c --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-11\350\212\202\357\274\232\344\274\232\350\257\235\345\206\205\345\256\271\347\274\226\346\216\222\345\244\204\347\220\206.md" @@ -0,0 +1,33 @@ +--- +title: 【更】第3-11节:会话内容编排处理 +pay: https://t.zsxq.com/7Oceg +--- + +# 《AI MCP Gateway 网关服务系统》第3-11节:会话内容编排处理 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/pxAAd](https://t.zsxq.com/pxAAd) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +将目前在 MCP 网关服务接口管理(McpGatewayController)中的 handleMessage 下的逻辑代码,抽取到 case 进行编排处理,减轻 Controller 层的代码压力。 + +++ +这里有一个设计思想,Controller 接口实现的控制器层,在处理复杂逻辑的时候,都会调用很多 Service 服务。无论这个服务是贫血模型的 mvc 架构,还是充血模型的 ddd 架构。那么为了减轻 Controller 的职责,不至于让一个 Controller 的代码逻辑过于繁重,因此引入了 case 编排层。上承接 Controller 层的出入参需求,下处理 domian 领域服务的编排处理。这一层甚至不需要额外的对象包,它可以承接 Controller 的 DTO 对象作为出入参,也可以使用领域层的对象。 + +## 二、流程设计 + +如图,会话消息处理流程设计; + ++
++ +- 首先,这部分的重点在于将原本的会话服务接口下的消息处理,直接调用 domain 领域层的部分,重构迁移到 case 层通过规则树的方式分摊 trigger 触发器下的 Controller 的压力。 +- 之后,这部分的 case 编排和会话 Session 处理的架构设计方案是一致的,使用的是星球「码农会锁」扳手工程下的通用设计模式组件。这部分的设计,只要具备编码式的规则树结构,可以划分职责的方式完成节点的拆分,就都可以作为编排设计工具使用。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-12\350\212\202\357\274\232\351\211\264\346\235\203\345\212\237\350\203\275\351\242\206\345\237\237\346\234\215\345\212\241.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-12\350\212\202\357\274\232\351\211\264\346\235\203\345\212\237\350\203\275\351\242\206\345\237\237\346\234\215\345\212\241.md" new file mode 100644 index 000000000..732cc055d --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-12\350\212\202\357\274\232\351\211\264\346\235\203\345\212\237\350\203\275\351\242\206\345\237\237\346\234\215\345\212\241.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第3-12节:鉴权功能领域服务 +pay: https://t.zsxq.com/gLU35 +--- + +# 《AI MCP Gateway 网关服务系统》第3-12节:鉴权功能领域服务 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/I9dRQ](https://t.zsxq.com/I9dRQ) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +设计 MCP 网关通信过程中的鉴权领域功能,包括;权限注册、请求限流、权限校验,这样3个主要的服务能力。领域层设计好后,就可以让 case 串联逻辑完成权限功能的使用了。 + +## 二、流程设计 + +如图,关于鉴权功能的领域处理; + +++ +- 首先,设计对鉴权领域的功能,校验阶段,判断当前用户传递 api_key 是否为配置的有效key,是否开启认证,是否在有效期。 +- 之后,是注册 api_key 的处理,以及 api_key 的使用限流。数据库表中设计了,速率限制(次/小时) 可以按需设计你的。`这部分值在使用中会转换为多少秒一次,不过程序调用过程中,一般会达到毫秒。所以这个值可以适当放大` \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-13\350\212\202\357\274\232\351\211\264\346\235\203\345\212\237\350\203\275\347\274\226\346\216\222\345\244\204\347\220\206.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-13\350\212\202\357\274\232\351\211\264\346\235\203\345\212\237\350\203\275\347\274\226\346\216\222\345\244\204\347\220\206.md" new file mode 100644 index 000000000..12e169216 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-13\350\212\202\357\274\232\351\211\264\346\235\203\345\212\237\350\203\275\347\274\226\346\216\222\345\244\204\347\220\206.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第3-13节:鉴权功能编排处理 +pay: https://t.zsxq.com/AycUA +--- + +# 《AI MCP Gateway 网关服务系统》第3-13节:鉴权功能编排处理 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wO9Cw](https://t.zsxq.com/wO9Cw) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在 case 的 mcp 模块下,将 auth 鉴权功能,串联到 `session 会话创建`、`message 消息处理中`去。让会话创建的时候可以校验 apiKey 的可用性,以及在消息处理中使用限流控制请求频次。 + +## 二、流程设计 + +如图,将鉴权功能串联到case编排中; + +++ +- 首先,是 api 入参这部分,都需要添加一个 `apiKey` 作为后缀的请求入参。会话请求阶段,是用户配置的请求连接传递进来的,而后续的消息处理部分,是我们在会话阶段把 apiKey 拼接到请求地址里去的。 +- 之后,消息处理阶段,根据请求的 apiKey 做响应的限流处理。`基本你在各个官网申请的 mcp 服务,如百度搜索,都会让你创建一个 apiKey 针对你的这个 key 做一些列的流程处理。包括还会对你请求的数据做一个日志记录。` \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-14\350\212\202\357\274\232\350\247\243\346\236\220Swagger\346\240\207\345\207\206OpenAPI\345\215\217\350\256\256.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-14\350\212\202\357\274\232\350\247\243\346\236\220Swagger\346\240\207\345\207\206OpenAPI\345\215\217\350\256\256.md" new file mode 100644 index 000000000..d168eb169 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-14\350\212\202\357\274\232\350\247\243\346\236\220Swagger\346\240\207\345\207\206OpenAPI\345\215\217\350\256\256.md" @@ -0,0 +1,34 @@ +--- +title: 【更】第3-14节:解析Swagger标准OpenAPI协议 +pay: https://t.zsxq.com/wvb2k +--- + +# 《AI MCP Gateway 网关服务系统》第3-14节:解析Swagger标准OpenAPI协议 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/hTWme](https://t.zsxq.com/hTWme) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在前面章节,我们实现了关于 AI MCP 网关,解决 HTTP 协议向 MCP 协议的转换处理。相关的协议(HTTP)数据存储在数据库表中。那么现在的另外一个问题就是,数据库表里的协议映射数据应该怎么录入进去。 + +这个录入方案也比较多,比如,提供一个页面,让用户自己手动输入相关的协议映射信息。也可以提供一个 SDK 组件,让 HTTP 接口服务端引入,之后自动上报。之后这里还有一种方案,是通过 Swagger 导出标准 OpenAPI 协议接口 json 文件,以文件数据的方式,录入到数据库表中。 + +本节,我们先来处理关于 Swagger 的使用到提供一个工具包把 OpenAPI 的 JSON 转换为我们的设计的库表对应对象的关系。`本节操作转换的工具类包,不非得手动编码,能理解和使用即可`。 + +## 二、工具介绍(Swagger) + +官网:[https://swagger.io/](https://swagger.io/) + +Swagger 是一个开源的API 设计和文档工具,它可以帮助开发人员更快、更简单地设计、构建、文档化和测试 RESTful API。以及可以导出 [OpenAPI](https://openapi.apifox.cn/) 标准的协议接口 JSON 文件。 + +它的接入方式也非常简单,只要在项目工程中引入 Swagger 相关的 POM 文件,在工程启动后就可以访问 Swagger 页面,查看 HTTP 接口服务。如果希望接口描述信息更为准确,也可以在接口和出入参对象(属性)上添加上相关的注解描述。这个描述信息对我们 MCP 协议更为重要。 + +++ +如图,我们需要的就是这份标准的 OpenAPI 接口的 JSON 文件,使用它解析并转换为目前 ai mcp gateway 库表结构中设计的 http 协议和字段映射关系。你可以把这部分的解析,当做一个工具包使用。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-15\350\212\202\357\274\232\345\215\217\350\256\256\345\237\237-\345\215\217\350\256\256\350\247\243\346\236\220\345\244\204\347\220\206.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-15\350\212\202\357\274\232\345\215\217\350\256\256\345\237\237-\345\215\217\350\256\256\350\247\243\346\236\220\345\244\204\347\220\206.md" new file mode 100644 index 000000000..eeb0f4957 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-15\350\212\202\357\274\232\345\215\217\350\256\256\345\237\237-\345\215\217\350\256\256\350\247\243\346\236\220\345\244\204\347\220\206.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-15节:协议域-协议解析处理 +pay: https://t.zsxq.com/dEsG8 +--- + +# 《AI MCP Gateway 网关服务系统》第3-15节:协议域-协议解析处理 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wGt6C](https://t.zsxq.com/wGt6C) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +设计**协议域**,定义分层结构,用于承接协议的解析、存储、使用等场景功能。`在整个 DDD 架构下,我们会不断的思考这些内容的功能域设计,而不是一些单一的原则方法。` + +这一节我们把前面做的解析协议的案例代码,按照协议域的分层结构,拆分编写对应的功能逻辑。 + +## 二、流程设计 + +如图,设计协议域,封装解析逻辑(其他流程后续处理); + +++ +- 首先,划分出【协议域】,增加协议解析、协议存储,对应的单一职责的接口定义。 +- 之后,把上一节的协议解析的案例代码,按照如图所示的结构,拆分设计。这里解析还增加了 rpc 包,是一个示意,如果后续大家做其他场景的接口对应的协议解析,可以都在这个结构下增加策略实现。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-16\350\212\202\357\274\232\345\215\217\350\256\256\345\237\237-\345\215\217\350\256\256\345\255\230\345\202\250\345\244\204\347\220\206.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-16\350\212\202\357\274\232\345\215\217\350\256\256\345\237\237-\345\215\217\350\256\256\345\255\230\345\202\250\345\244\204\347\220\206.md" new file mode 100644 index 000000000..3d4b804c2 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-16\350\212\202\357\274\232\345\215\217\350\256\256\345\237\237-\345\215\217\350\256\256\345\255\230\345\202\250\345\244\204\347\220\206.md" @@ -0,0 +1,27 @@ +--- +title: 【更】第3-16节:协议域-协议存储处理 +pay: https://t.zsxq.com/3kNZE +--- + +# 《AI MCP Gateway 网关服务系统》第3-16节:协议域-协议存储处理 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wGt6C](https://t.zsxq.com/wGt6C) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +在**协议域**添加协议存储服务,以及验证存储后的数据,在 AI MCP 网关,整个流程中完成调用处理。其实这部分的内容,就是在串联流程。协议解析、协议存储,存储后的数据到数据库表中的结构,是否还可以按照约定的方式转换为可以被 MCP 协议识别的结构。之后再继续完成调用的处理。 + +## 二、流程设计 + +如图,从协议解析到协议存储流程设计; + +++ +- 首先,本节的重点是要验证,协议解析 -> 协议存储 -> 协议使用,是否可以完整整个链路调用处理。 +- 所以,在这一节完成协议存储后,我们就要做一个完整的案例,来验证整个数据解析存储和使用是否可以通过。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-17\350\212\202\357\274\232\347\275\221\345\205\263\345\237\237-\351\205\215\347\275\256\346\225\260\346\215\256\345\255\230\345\202\250(CRUD).md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-17\350\212\202\357\274\232\347\275\221\345\205\263\345\237\237-\351\205\215\347\275\256\346\225\260\346\215\256\345\255\230\345\202\250(CRUD).md" new file mode 100644 index 000000000..5c81f45ba --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-17\350\212\202\357\274\232\347\275\221\345\205\263\345\237\237-\351\205\215\347\275\256\346\225\260\346\215\256\345\255\230\345\202\250(CRUD).md" @@ -0,0 +1,28 @@ +--- +title: 【更】第3-17节:网关配置域-配置数据存储(CRUD) +pay: https://t.zsxq.com/BGsjf +--- + +# 《AI MCP Gateway 网关服务系统》第3-17节:网关配置域-配置数据存储(CRUD) + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/wGt6C](https://t.zsxq.com/wGt6C) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +本节我们要新增加一个网关配置域,对网关、工具提供基本的配置操作,也就是 CRUD 的代码从领域层操作数据库的过程。这部分的内容实现,为的就是在后续提供的 AI MCP 网关运营服务上,可以在后台配置出整个网关服务。 + +## 二、流程设计 + +如图,网关配置域功能流程设计; + +++ +- 首先,我们知道的,一整套的 AI MCP 网关配置,包括了,协议的解析存储和使用,之后是鉴权,但最开始是有一个网关的配置的,也就是写入基本的网关配置信息。 +- 那么,为了能完整的串联全部流程,我们这里需要增加下网关配置域,处理网关配置、网关工具配置的内容,一个网关可以挂多个工具,一个工具映射了一个协议(http、rpc等) +- 注意,当前我们先实现了最基本的保存和更新,后续随着运营后台的开发,在陆续补充需要的接口。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-18\350\212\202\357\274\232\347\256\241\347\220\206\347\253\257-API\345\212\237\350\203\275\347\274\226\346\216\222\344\270\262\350\201\224.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-18\350\212\202\357\274\232\347\256\241\347\220\206\347\253\257-API\345\212\237\350\203\275\347\274\226\346\216\222\344\270\262\350\201\224.md" new file mode 100644 index 000000000..fa82c77e4 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-18\350\212\202\357\274\232\347\256\241\347\220\206\347\253\257-API\345\212\237\350\203\275\347\274\226\346\216\222\344\270\262\350\201\224.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-18节:管理端-API功能编排串联 +pay: https://t.zsxq.com/qr9CQ +--- + +# 《AI MCP Gateway 网关服务系统》第3-18节:管理端-API功能编排串联 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/MyLpx](https://t.zsxq.com/MyLpx) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +到本章节往下,我们要为 AI MCP Gateway(网关)提供一个管理端页面,维护网关的配置和验证。如配置网关和工具能力,为工具添加协议。协议来自于 Swagger 导出的 openapi json 文件。这些内容,我们陆续的添加。本节主要串联服务功能接口(看看这样的架构下怎么提供的页面功能),以及提供基础UI页面。 + +注意,关于网关后台的管理页面是使用 AI IDE 工具生成的。建议每个人都生成一套自己的,你只要在对话框中,把服务端的 api 接口拖到对话中,并告诉它在什么位置编写 html 代码,以及对接服务端页面。它就可以帮你完成一套页面。 + +## 二、流程设计 + +如图,从管理端页面到服务端的流程设计; + +++ +- 首先,整个流程为;从前端页面(管理后台)通过 ajax 请求服务端 trigger 层的 http 接口开始,由 case 层分摊 trigger 层串联逻辑部分的流程。这部分流程,调用 domain 领域层处理,也就是完成 CRUD 操作。最终由基础设施层,依赖倒置于 domain 领域层,完成数据的增删改查操作。 +- 之后,本节我们的重点是完成从 trigger 往下的逻辑处理,对于页面端,先少量提供。后续陆续补充各个功能。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-19\350\212\202\357\274\232\347\256\241\347\220\206\347\253\257-API\344\270\216UI\345\257\271\346\216\245.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-19\350\212\202\357\274\232\347\256\241\347\220\206\347\253\257-API\344\270\216UI\345\257\271\346\216\245.md" new file mode 100644 index 000000000..3610e5ced --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-19\350\212\202\357\274\232\347\256\241\347\220\206\347\253\257-API\344\270\216UI\345\257\271\346\216\245.md" @@ -0,0 +1,31 @@ +--- +title: 【更】第3-19节:管理端-API与UI对接 +pay: https://t.zsxq.com/199zh +--- + +# 《AI MCP Gateway 网关服务系统》第3-19节:管理端-API与UI对接 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/JoVrf](https://t.zsxq.com/JoVrf) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +结合网关管理后台(UI)功能,在服务端提供相应的接口能力,与管理后台对接。这些功能主要是 CRUD 做页面管理的增删改查操作。 + +此部分功能使用 AI IDE 工具就可以完成,也很建议学习的伙伴使用 AI IDE 工具(opencode、trae.ai、openclaw(QClaw)),做一套属于自己的管理后台,这样你可以在投递简历的时候发送,也可以在面试的时候演示。 + +>提示,可以在你的 AI IDE 安装技能 [https://github.com/fuzhengwei/xfg-ddd-skills](https://github.com/fuzhengwei/xfg-ddd-skills) 这样处理起来更加准确。 + +## 二、流程设计 + +如图,管理端到服务端接口的设计; + +++ +- 整个这部分的设计实现都是 CRUD,管理端需要什么,就可以配置什么接口,查询、修改、删除即可。 + diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-1\350\212\202\357\274\232\345\267\245\347\250\213\345\210\235\345\247\213\345\214\226\345\210\233\345\273\272.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-1\350\212\202\357\274\232\345\267\245\347\250\213\345\210\235\345\247\213\345\214\226\345\210\233\345\273\272.md" new file mode 100644 index 000000000..e6bb94615 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-1\350\212\202\357\274\232\345\267\245\347\250\213\345\210\235\345\247\213\345\214\226\345\210\233\345\273\272.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-1节:工程初始化创建 +pay: https://t.zsxq.com/xdnB0 +--- + +# 《AI MCP Gateway 网关服务系统》第3-1节:工程初始化创建 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/5PzN8](https://t.zsxq.com/5PzN8) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +搭建 AI MCP Gateway 网关工程,并 push 代码到课程仓库,以及演示关于 Git 使用,方便后续学习使用。 + +## 二、环境配置 + +- JDK 17 +- Maven 3.8.x - [Maven 教程](https://bugstack.cn/md/road-map/maven.html) +- IntelliJ IDEA 社区版(免费) [IntelliJ IDEA 教程](https://bugstack.cn/md/road-map/intellij-idea.html) +- Git - 安装后会配置到 IntellJ IDEA 这样才能向服务端推送或者拉取代码。学习后可以知道怎么拉取、提交和比对代码。Git 教程:https://bugstack.cn/md/road-map/git.html + +++ +>相关软件,在星球课程入口,编程环境中提供了下载链接。编程环境:[https://t.zsxq.com/19Rnk98M0](https://t.zsxq.com/19Rnk98M0) - 提供了已经配置好镜像的 maven 方便直接使用。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-20\350\212\202\357\274\232\351\252\214\350\257\201\346\234\215\345\212\241\357\274\214LLM\345\257\271\346\216\245\346\265\213\350\257\225MCP\346\216\245\345\217\243.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-20\350\212\202\357\274\232\351\252\214\350\257\201\346\234\215\345\212\241\357\274\214LLM\345\257\271\346\216\245\346\265\213\350\257\225MCP\346\216\245\345\217\243.md" new file mode 100644 index 000000000..a2d3a5f76 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-20\350\212\202\357\274\232\351\252\214\350\257\201\346\234\215\345\212\241\357\274\214LLM\345\257\271\346\216\245\346\265\213\350\257\225MCP\346\216\245\345\217\243.md" @@ -0,0 +1,32 @@ +--- +title: 【更】第3-20节:验证服务,LLM对接测试MCP接口 +pay: https://t.zsxq.com/nKjea +--- + +# 《AI MCP Gateway 网关服务系统》第3-20节:验证服务,LLM对接测试MCP接口 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/VV1Bt](https://t.zsxq.com/VV1Bt) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +为了在配置完 AI MCP 网关以后,方便的验证网关服务SSE接口是否正常,我们需要在服务端增加一个简单的 LLM 大模型能力,通过 AI MCP 网关,来调用 MCP 服务。这样就可以非常方便的验证网关能力了。 + +本节我们先来做一下 LLM 的服务接口,把这部分能力在领域层设计实现出来,并包装一个接口服务。后续在结合这个接口服务,在管理后台配套的做一个页面出来。专门验证 MCP 服务能力。 + +>温馨提示,学习学到这了,就要多思考一些扩展。不只是完成课程的从0到1,也要思考从1-100还能做什么。 + +## 二、功能设计 + +如图,LLM 对接 MCP 服务,提供接口能力设计图; + +++ +- 首先,整个操作的核心就是 LLM 服务,这部分内容,咱们在 ai-mcp-gateway-demo-mcp-server-test 工程里,有做过测试验证。现在相当于要把这部分能力迁移过来,放到 domain 领域层,实现 LLM 服务。 +- 之后,这个 LLM 服务的目的,就是可以动态化的构建含有 MCP 服务的对话模型。MCP 的加载,来自于接口层传入的 gatewayId 网关 ID 做动态的加载处理。 +- 注意,因为网关的配置也是不断的动态调整的,所以流程设计上会有一个是否重新加载的操作。重新加载的目的就是把 MCP 动态的刷新配置。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-2\350\212\202\357\274\232\344\274\232\350\257\235\347\256\241\347\220\206\346\234\215\345\212\241\345\256\236\347\216\260.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-2\350\212\202\357\274\232\344\274\232\350\257\235\347\256\241\347\220\206\346\234\215\345\212\241\345\256\236\347\216\260.md" new file mode 100644 index 000000000..ea2d8c14a --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-2\350\212\202\357\274\232\344\274\232\350\257\235\347\256\241\347\220\206\346\234\215\345\212\241\345\256\236\347\216\260.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-2节:会话管理服务实现 +pay: https://t.zsxq.com/c0WoQ +--- + +# 《AI MCP Gateway 网关服务系统》第3-2节:会话管理服务实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/nPibY](https://t.zsxq.com/nPibY) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +从本章节开始,我们会以**第1-2节:系统建模设计**为标准,进行各个模块的逻辑编码实现。包括;协议、鉴权、会话等。这部分内容完成后,在定义 api 接口,以及在 trigger 的 http 下实现接口,以及调用 case 层,处理 domain 领域的编排。整个实现过程是逐步有`骨架`,之后陆续填充完善的过程,你只要跟住理解清楚了,就可以很容易的完成全部编码。 + +**温馨提示**:尽量不要完全对照视频写代码,可以是先看视频,之后对照工程中分支代码变化(前面一节教程有告诉大家怎么对比),之后来实现功能。这样你会注意到更多的细节。 + +## 二、功能设计 + +如图,会话领域服务功能; + +++ +- 首先,我们是把一次连接请求作为一次会话来看。比如数据库查询会话、MyBatis 操作会话、信贷交易会话,会话的作用在于以统一的标识记录用户的操作行为,根据你的会话ID,可以找到你再次过程中所有的行为记录。 +- 那么,在 AI MCP Gateway 中,也是按照 MCP 的协议方式,进行会话请求和消息处理。会话的作用是拿到后续处理消息的请求地址,这个地址是在会话请求阶段进行分配的。`在前面章节进行协议分析的时候,有讲解过 /mcp/message?sessionId= 的获取和使用` \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-3\350\212\202\357\274\232\344\274\232\350\257\235\346\216\245\345\217\243\347\274\226\346\216\222.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-3\350\212\202\357\274\232\344\274\232\350\257\235\346\216\245\345\217\243\347\274\226\346\216\222.md" new file mode 100644 index 000000000..74030075b --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-3\350\212\202\357\274\232\344\274\232\350\257\235\346\216\245\345\217\243\347\274\226\346\216\222.md" @@ -0,0 +1,36 @@ +--- +title: 【更】第3-3节:会话接口编排 +pay: https://t.zsxq.com/Mmuqa +--- + +# 《AI MCP Gateway 网关服务系统》第3-3节:会话接口编排 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/c0ZDk](https://t.zsxq.com/c0ZDk) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +定义 mcp 通信协议会话服务接口,并在 case 层做领域服务的编排,为接口提供服务能力。 + +## 二、功能设计 + +如图,会话服务编排接口; + +++ +- 首先,这一节我们的主要定义并实现 mcp 服务,sse 请求接口,创建会话信息。地址案例:`http://localhost:8777/api-gateway/test10001/mcp/sse?api_key=xxx` + + - test10001 - 是每个MCP网关,申请获得的唯一标识ID + - mcp/sse - 是固定的接口格式,让使用方知道这是 mcp 服务,sse 通信协议。 + - api_key - 是一个服务网路请求时候的安全校验,确保是你申请了唯一的key,才可以访问的。这部分鉴权的操作,会放到后续实现。 + +- 之后,这里我们会看到 trigger 层是实现 MCP 服务接口,接口的实现,需要调用 domain 领域层(domain 是每一个内聚的服务方法)。而为了减轻 trigger 层的编码压力,这里我们引入下 case 层,来处理 trigger 层调用 domain 领域层所做的编排动作。让 trigger 层只负责一个接口的封装操作,如;日志打印、参数校验、对象转换、异常处理、结果封装,而具体的逻辑则有 case 层承接。 + +- 注意,case 层的编排操作,会采用星球中的扳手工程项目下的设计模式框架中的规则树,这个规则树非常适合节点的编排,对于流程的解耦非常有效。 + +> 在互联网大厂中,会有很多这样的解耦设计,架构也不是一成不变的。这些东西都会随着各种业务的迭代,不断的进行演进。所以,做为编码工程师,未来的架构师,都要大量的吸收这些编码设计经验。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-4\350\212\202\357\274\232\344\274\232\350\257\235\346\266\210\346\201\257\347\273\223\346\236\204\350\256\276\350\256\241.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-4\350\212\202\357\274\232\344\274\232\350\257\235\346\266\210\346\201\257\347\273\223\346\236\204\350\256\276\350\256\241.md" new file mode 100644 index 000000000..1dea6c710 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-4\350\212\202\357\274\232\344\274\232\350\257\235\346\266\210\346\201\257\347\273\223\346\236\204\350\256\276\350\256\241.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-4节:会话消息结构设计 +pay: https://t.zsxq.com/02FXE +--- + +# 《AI MCP Gateway 网关服务系统》第3-4节:会话消息结构设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/t0xJC](https://t.zsxq.com/t0xJC) + +>大家好,我是技术UP主小傅哥。 + +## 一、本章诉求 + +增加 MCP 会话通信,处理请求消息的 HTTP 服务入口方法,完成简单的消息请求接收验证。并根据消息信息,设计会话领域层中消息处理策略。 + +## 二、功能设计 + +如图,会话消息响应设计; + +++ +- 首先,这里要设计一个同名接口的不同类型服务,get 用于创建会话服务,建立 sse 连接。而 post 则是处理端点消息,完成会话服务应答。 +- 之后,对于会话消息,我们在前面已经分析过,主要包括;InitializeHandler - 协议握手、ResourcesListHandler - 返回可用资源列表、ToolsCallHandler - 执行指定的工具调用、ToolsListHandler - 返回服务器支持的工具列表。本节我们先把这些策略结构设计出来,方便后续实现具体功能。 +- 重点,本节会先来实现接口和定义整个处理消息的结构,后续再做具体的功能实现,以及服务的编排动作。 +- 此外,本节还会引入 jdk16+ 定义的新语法关键字,**record**、**sealed**、**permits** 来定义对象。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-5\350\212\202\357\274\232\346\266\210\346\201\257\345\215\217\350\256\256\345\244\204\347\220\206\346\241\210\344\276\213.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-5\350\212\202\357\274\232\346\266\210\346\201\257\345\215\217\350\256\256\345\244\204\347\220\206\346\241\210\344\276\213.md" new file mode 100644 index 000000000..4540b8fdc --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-5\350\212\202\357\274\232\346\266\210\346\201\257\345\215\217\350\256\256\345\244\204\347\220\206\346\241\210\344\276\213.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第3-5节:消息协议处理案例 +pay: https://t.zsxq.com/zUvnY +--- + +# 《AI MCP Gateway 网关服务系统》第3-5节:消息协议处理案例 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/kWYZ9](https://t.zsxq.com/kWYZ9) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +整个 MCP 协议的通信调用过程,需要先创建 session 会话,之后通过 handler 接收下发的指令方法,完成整个 MCP 的处理。那么,为了让大家更清楚我们所开发的东西,这里我们要先做一些流程案例,完成整个 MCP 服务的通信过程。后续在把案例的固定的代码,拆分到数据库配置实现。 + +## 二、功能设计 + +如图,会话消息响应设计; + +++ +- 首先,MCP 的通信过程,分为了初始化,后去工具列表,调用工具,以及资源和通知等。这里我们要硬编码返参实现这些方法。 +- 之后,我们这里做一个单词小写转换大写的方法,让 AI 通过 MCP 调用到网关服务。做完这部分,你就能联想到,这里既然也可以硬编码操作,那么也可以调用 http、rpc,甚至是 mq,以及还可以是 rs232 串口通信,控制硬件设备。 +- 注意,这一节的实现,还是从 trigger 触发器的 http 层,直接调用到 domain 领域方法,后续在从 case 层进行串联流程。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-6\350\212\202\357\274\232\345\237\272\347\241\200\345\261\202\346\225\260\346\215\256\345\244\204\347\220\206.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-6\350\212\202\357\274\232\345\237\272\347\241\200\345\261\202\346\225\260\346\215\256\345\244\204\347\220\206.md" new file mode 100644 index 000000000..a50901f92 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-6\350\212\202\357\274\232\345\237\272\347\241\200\345\261\202\346\225\260\346\215\256\345\244\204\347\220\206.md" @@ -0,0 +1,29 @@ +--- +title: 【更】第3-6节:基础层数据处理(Dao) +pay: https://t.zsxq.com/LaFBT +--- + +# 《AI MCP Gateway 网关服务系统》第3-6节:基础层数据处理(Dao) + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/8xnuo](https://t.zsxq.com/8xnuo) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +将 AI MCP Gateway 库表设计,编写到工程中,映射成 PO、DAO、Mapper 文件,以便于后续章节的使用。 + +这一节,小傅哥会演示如何使用 AI IDE 工具,通过 Prompt 描述,来完成这些文件的生成。 + +## 二、结构介绍 + +如图,从领域层到基础设施层(mysql、redis...)的使用方式; + +++ +- 首先,这里有个设计的思想的体现,这类思想也是 Spring、MyBatis 等框架源码中常用的思想,叫做【依赖倒置】。它的设计目标是,让数据使用方,不过渡依赖于提供方。提供方在`升级`、`替换`、`迭代`时候,都不影响使用方。 +- 之后,图里是依赖倒置的具体编码体现,从 domain 领域层,每个会话、鉴权、协议的功能编写时,所需的数据,是通过在 domain 领域层定义接口,之后由infrastructure 基础设施层做具体的功能实现。也就是说,每个功能区需要啥数据,就定义好接口,确定好入参和返回结果的,基础设施层引入 domain 层定义的这个标准接口,做具体的数据封装使用。**也类似于公司的领导,要这,要那,他不关心具体是谁做,最后做好就可以了。** diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-7\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-Initialize.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-7\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-Initialize.md" new file mode 100644 index 000000000..abb8afffe --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-7\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-Initialize.md" @@ -0,0 +1,33 @@ +--- +title: 【更】第3-7节:协议消息处理-Initialize +pay: https://t.zsxq.com/Re6ZW +--- + +# 《AI MCP Gateway 网关服务系统》第3-7节:协议消息处理-Initialize + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/yIOEM](https://t.zsxq.com/yIOEM) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +从本章开始,我们将进入消息协议的处理过程,把原本的硬编码的案例操作,通过网关ID(gatewayId)与数据库配置数据进行关联。 + +今天我们来处理第一个协议消息的处理场景,Initialize 初始化部分。这部分学习时,会附带调试 Spring AI 框架中 modelcontextprotocol 关于协议处理部分的源码,让大家有更多的积累。 + +- [https://github.com/modelcontextprotocol/java-sdk](https://github.com/modelcontextprotocol/java-sdk) +- [https://modelcontextprotocol.io/docs/getting-started/intro](https://modelcontextprotocol.io/docs/getting-started/intro) + +## 二、功能设计 + +如图,Initialize 初始化协议处理; + +++ +- 首先,在 session 会话层的 adapter 下,创建调用基础设施层仓储服务的接口,并由基础设施层做功能实现。再通过依赖倒置的方式用于领域层使用。(这部分对于初次接触 DDD,又没学习过一些源码或者设计知识的伙伴,可能感觉有点绕,不过没关系,在看到课程源码以后,会逐步清晰) +- 然后,从数据库获取的数据,要进行协议转换。也就是把之前固定编码的部分,用数据库获取的数据来动态填充。这部分内容只是初次拿到数据并使用的小试牛刀,并不复杂。不过,我们还会增加对 Spring AI 源码的调试,扩展知识学习。 +- 之后,在我们陆续完成这些 handler 消息的处理后,则会在 case 层陆续做编排,以及验证网关ID和token等。 diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-8\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-ToolsList.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-8\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-ToolsList.md" new file mode 100644 index 000000000..0f81038e7 --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-8\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-ToolsList.md" @@ -0,0 +1,37 @@ +--- +title: 【更】第3-8节:协议消息处理-ToolsList +pay: https://t.zsxq.com/eOpMV +--- + +# 《AI MCP Gateway 网关服务系统》第3-8节:协议消息处理-ToolsList + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/U6Shg](https://t.zsxq.com/U6Shg) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +从 HTTP 接口到 MCP 协议的映射,这里要考虑的是怎么把一个完整请求 http 的接口描述录入到数据库,之后在通过数据库的配置,转换为 MCP 协议结构告诉 AI 客户端 tool/list,也就是这套 HTTP 接口到 MCP 以后所提供工具能力。 + +所以,小傅哥在带着大家实现的过程中,先做了基于 HTTP 接口所需存储的信息,做了库表的设计。之后到这一节,我们要把库表的数据转换为 MCP 协议结构数据。 + +拓展,像是 HTTP 可以做,那么 RPC、MQ、数据库等各类资源,你也可以转换为 MCP 服务协议进行使用。 + +## 二、流程设计 + +如图,Tool/List 工具列表协议处理; + +++ +- 首先,我们要根据网关ID(gatewayId)从数据库中,获取网关配置和http工具字段配置列表,这部分数据相当于是把 HTTP 请求结构体,拆解喽放到数据库表中,之后再查询出来按照 MCP 协议结构组装使用。 +- 然后,是对 buildTools 工具细节的处理,这部分是对元素的拆分和组装。这部分还有一些细节在下面。 + ++
++ +- 之后,映射数据库表 `mcp_protocol_mapping` 拆解字段的父子关系,一个字段以下的另外一个字段,如;`xxxRequest01 -> xxxRequest01.city` 的映射。所以在 buildProperty 的处理过程中要,要做递归循环,一层一层的找到这些内容,并拆解组装使用。 \ No newline at end of file diff --git "a/docs/md/project/ai-mcp-gateway/\347\254\2543-9\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-ToolsCall.md" "b/docs/md/project/ai-mcp-gateway/\347\254\2543-9\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-ToolsCall.md" new file mode 100644 index 000000000..5e4f90eca --- /dev/null +++ "b/docs/md/project/ai-mcp-gateway/\347\254\2543-9\350\212\202\357\274\232\345\215\217\350\256\256\346\266\210\346\201\257\345\244\204\347\220\206-ToolsCall.md" @@ -0,0 +1,28 @@ +--- +title: 【更】第3-9节:协议消息处理-ToolsCall +pay: https://t.zsxq.com/U4Ouo +--- + +# 《AI MCP Gateway 网关服务系统》第3-9节:协议消息处理-ToolsCall + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
视频:[https://t.zsxq.com/Vodcp](https://t.zsxq.com/Vodcp) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +## 一、本章诉求 + +从 AI 客户端,向 AI MCP 发起请求的过程中,小傅哥已经带着大家处理了;InitializeHandler - 初始化、ToolsListHandler - 获取工具列表,接下来再要处理的就是 ToolsCallHandler 的操作了,接收来自 AI 客户端,用户的请求,转换为对应的参数,发起接口请求(这部分我们会调用 http 接口)。 + +## 二、流程设计 + +如图,Tool/Call 工具接口调用协议处理; + +++ +- 首先,从 ToolsCallHandler 入口开始,会接收到 AI 请求接口过程中,发过来的格式化参数信息(根据我们提供的工具列表说明提供过来的)。 +- 之后,根据获取的请求信息,解析请求参数(像是 http 接口分为 post、get,如果以后扩展 rpc 接口,就直接泛化调用,这部分就可以根据你想对接哪些东西来看了)并做协议调用。 +- 注意,当前章节还是gateway -> tool 是 `1:1` 的,这部分后续在做细化处理。我们先用一个简单的结构,把整个流程跑通。有了基础后,在深入的理解拆分会更好理解。 diff --git "a/docs/md/project/big-market/api/\347\254\25410\350\212\202\357\274\232\344\270\215\350\266\205\345\215\226\345\272\223\345\255\230\350\247\204\345\210\231\345\256\236\347\216\260.md" "b/docs/md/project/big-market/api/\347\254\25410\350\212\202\357\274\232\344\270\215\350\266\205\345\215\226\345\272\223\345\255\230\350\247\204\345\210\231\345\256\236\347\216\260.md" new file mode 100644 index 000000000..61ffef6e8 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25410\350\212\202\357\274\232\344\270\215\350\266\205\345\215\226\345\272\223\345\255\230\350\247\204\345\210\231\345\256\236\347\216\260.md" @@ -0,0 +1,40 @@ +--- +title: 第10节:不超卖库存规则实现 +pay: https://t.zsxq.com/17Y1QOlfG +--- + +# 《大营销平台系统设计实现》 - 营销服务 第10节:不超卖库存规则实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:通过模板模式,整合责任链、规则树,定义出抽奖的标准过程。以及让子类做具体调用功能实现。 +- **课程视频**:[https://t.zsxq.com/17kdkJw1C](https://t.zsxq.com/17kdkJw1C) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +当通过抽奖策略计算完用户可获得的奖品ID后,接下来就需要对这一条奖品记录进行**库存**的扣减操作。只有奖品库存扣减成功,才可以获得奖品ID对应的奖品,否则将走到兜底奖品。 + +除此之外,本节还需要对上一节实现的规则树节点;次数锁、兜底奖品,都会完善。 + +## 二、流程设计 + +**首先对于库存集中扣减类的业务流程,是不能直接用数据库表抗的。** + +比如数据库表有一条记录是库存,如果是通过锁这一条表记录更新库存为10、9、8的话,就会出现大量的用户在应用用获得数据库的连接后,等待前一个用户更新完库表记录后释放锁,让下一个用户进入在扣减。 + +这样随着用户参与量的增加,就会有非常多的用户处于等待状态,而等待的用户是持久数据库的连接的,这个连接资源非常宝贵,你占用了应用中其他的请求就进不来,最终导致一个请求要几分钟才能得到响应。【前台的用户越着急,越疯狂点击,直至越来越卡到崩溃】 + +所以,对于这样的秒杀场景,我们一般都是使用 redis 缓存来处理库存,它只要不超卖就可以。但也确保一点,不要用一条key加锁和等待释放的方式来处理,这样的效率依然是很低的。所以我们要尽可能的考虑分摊竞争,达到无锁化才是分布式架构设计的核心。 + +++ +- 如果在前面章节所实现的规则树中,对于库存节点的操作,开发 decr 方式扣减库存。decr 是原子操作,效率非常高。这样要注意,setnx 加锁是一种兜底手段,避免后续有库存的恢复,导致库存从96消耗后又回到了98重复消费。所以对于每个key加锁,98、97、96... 即使有恢复库存也不会导致超卖。【setnx 在 redisson 是用 trySet 实现】 +- 库存消耗完以后,还需要更新库表的数据量。但这会也不能随着用户消耗奖品库存的速率,对数据库表执行扣减操作。所以这里可以通过 Redisson 延迟队列的 + 定时任务的凡是,缓慢消耗队列数据来更新库表数据变化。 diff --git "a/docs/md/project/big-market/api/\347\254\25411\350\212\202\357\274\232\346\212\275\345\245\226API\346\216\245\345\217\243\345\256\236\347\216\260.md" "b/docs/md/project/big-market/api/\347\254\25411\350\212\202\357\274\232\346\212\275\345\245\226API\346\216\245\345\217\243\345\256\236\347\216\260.md" new file mode 100644 index 000000000..25a36d1a3 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25411\350\212\202\357\274\232\346\212\275\345\245\226API\346\216\245\345\217\243\345\256\236\347\216\260.md" @@ -0,0 +1,38 @@ +--- +title: 第11节:抽奖API接口实现 +pay: https://t.zsxq.com/17q94Lwoe +--- + +# 《大营销平台系统设计实现》 - 营销服务 第11节:抽奖API接口实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:新增 big-market-api 模块,定义对外接口标准,并实现出3个抽奖服务接口。以及调整抽奖策略领域实现方式,满足接口单一职责。 +- **课程视频**:[https://t.zsxq.com/17NyL5gvS](https://t.zsxq.com/17NyL5gvS) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +结合着前面两节(13、14) WEB UI 的开发,以及接口的 Mock 让前端调用。我们可以知道服务端应该提供的接口标准。所以我们本节会按照这样的一个接口标准设计服务端的接口,同时在做一些服务端自身的扩展。 + +关于前后端接口的标准定义,小傅哥在视频中提到到,通常在公司做开发时,这部分是由产品和前后端工程师对照着产品PRD文档进行评审后定义的。前端工程师按照标准先进行Mock接口,随着后端工程逐步开发完成后,在进行对接联调。 + +## 二、流程设计 + +在大营销的系统架构设计中,有一个 trigger 模块,专门用于提供触发操作。这里我们把 `HTTP 调用`、`RPC(Dubbo)调用`、`定时任务`、`MQ监听`等动作,都称为触发操作。触发表示通过一种调用方式,调用到领域的服务上。 + +在大营销系统中,会给大家提供出 HTTP 接口,也会在后续提供 RPC 接口。RPC 就像 Dubbo 这样的框架,它的调用方式是需要对外提供接口描述性Jar,调用方拿到 Jar 包,就像本地调用接口一样,使用 RPC 框架,远程的调用到你的服务上。【关于这部分内容,在星球「码农会锁」的课程入口,基础教程中有 Dubbo 知识的案例讲解,小白可以补充学习】 + +那么因为为了让 HTTP 接口、RPC 接口,都能在一个标准下开发,所以本节会增加一个 `big-market-api` 模块,定义出接口信息和出入参对象。以便于分别可以实现本节所需的 HTTP 接口和后续所需的 RPC 接口。【注意;一般在大厂中,我们只需要定义 RPC 接口即可,因为 HTTP\小程序\APP 的接口,都是通过网关来调用的。网关会把 HTTP 请求转换为对应的 RPC 接口。这部分课程在星球中有**API网关**项目可以学习】 + +++ +- 定义 big-market-api 模块,由 big-market-trigger 实现出3个接口;装配策略接口(调用后将抽奖策略装配到缓存)、查询奖品列表、随机抽奖接口。 +- 在 big-market-domain 的抽奖策略新增加 IRaffleAward 策略奖品接口,并调整 IRaffleStock 抽奖库存接口,都直接由子类实现。IRaffleStrategy 抽奖策略接口由抽象类定义抽奖过程【这部分是前面章节实现的】,并有子类实现。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25412\350\212\202\357\274\232\347\224\250\346\210\267\345\217\202\344\270\216\346\212\275\345\245\226\346\264\273\345\212\250\345\272\223\350\241\250\350\256\276\350\256\241.md" "b/docs/md/project/big-market/api/\347\254\25412\350\212\202\357\274\232\347\224\250\346\210\267\345\217\202\344\270\216\346\212\275\345\245\226\346\264\273\345\212\250\345\272\223\350\241\250\350\256\276\350\256\241.md" new file mode 100644 index 000000000..4ebe9abc1 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25412\350\212\202\357\274\232\347\224\250\346\210\267\345\217\202\344\270\216\346\212\275\345\245\226\346\264\273\345\212\250\345\272\223\350\241\250\350\256\276\350\256\241.md" @@ -0,0 +1,37 @@ +--- +title: 第12节:用户参与抽奖活动库表设计 +pay: https://t.zsxq.com/175Y3ypDT +--- + +# 《大营销平台系统设计实现》 - 营销服务 第12节:用户参与抽奖活动库表设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:梳理大营销抽奖业务流程,设计2个配置活动的表和3个用户领取记录的表。 +- **课程视频**:[https://t.zsxq.com/17X4jkyEI](https://t.zsxq.com/17X4jkyEI) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在一个营销场景中,抽奖的流程分为;参与的有效期、整体的预算库存、个人的可参与次数、之后是抽奖策略的计算处理,返回抽奖结果。 + +大营销第1阶段已经完成了抽奖策略的领域模块实现,接下来则需要设计一个外壳,把抽奖策略包装进去。这个外壳就是一个抽奖活动的配置,在活动上有相关的库存、时间、状态,个人在总、日、月分别可进行的参数次数判断。 + +那么在本节我们先来做下抽奖活动库表的设计,分析在这样一个场景中,需要哪些库表和字段才能支持我们的场景诉求。 + +## 二、业务流程 + +以用户参与大营销的抽奖活动为视角,来理解整个抽奖业务流程。 + +++ +- 我们可以把用户参与抽奖理解为商城的一次下单,下单后才具备参与抽奖的资格。而下单的过程中,则需要过滤活动的相关信息以及库存数据。 +- 所有的判断流程做完后开始写入库中,库中则是用户一个互动的次数账户记录。记录着用户可以参与的抽奖次数。同时需要把参与活动的记录写一条订单。 +- 此外为了扩展用户在一些场景中,首次【签到/登录】可以赠送一个抽奖次数外,还可以通过购买、做任务、兑换等方式获得新的抽奖次数。这样用户就可以不断地消耗自己的积分兑换抽奖次数来抽奖了。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25413\350\212\202\357\274\232\345\274\225\345\205\245\345\210\206\345\272\223\345\210\206\350\241\250\350\267\257\347\224\261\347\273\204\344\273\266.md" "b/docs/md/project/big-market/api/\347\254\25413\350\212\202\357\274\232\345\274\225\345\205\245\345\210\206\345\272\223\345\210\206\350\241\250\350\267\257\347\224\261\347\273\204\344\273\266.md" new file mode 100644 index 000000000..481b9c0b8 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25413\350\212\202\357\274\232\345\274\225\345\205\245\345\210\206\345\272\223\345\210\206\350\241\250\350\267\257\347\224\261\347\273\204\344\273\266.md" @@ -0,0 +1,42 @@ +--- +title: 第13节:引入分库分表路由组件 +pay: https://t.zsxq.com/18oeNp26S +--- + +# 《大营销平台系统设计实现》 - 营销服务 第13节:引入分库分表路由组件 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:讲解分库分表路由的作用,并对工程配置路由组件以及测试验证。后续章节将在路由组件的继续上继续开发业务流程。 +- **课程视频**:[https://t.zsxq.com/18MieGCE4](https://t.zsxq.com/18MieGCE4) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +为用户的行为数据,使用路由组件将数据散列到分库分表中。 + +分库分表也是分布式架构中一个非常常用的数据存储方案,通常在公司中创建的系统都是直接创建出带有分库分表的系统架构。因为本身本身分库分表就是一个很成熟的方案,系统的分层和开发的熟练度都非常高。如果早期设计为单库单表的,那么后期再想扩展为分库分表则会有非常大的数据迁移和工程改造成本。 + +那么,分库分表以后,早期需要更多的数据库资源吗?其实并不用的,对于早期上线的系统,如果评估没那么大的体量,则可以使用虚拟机的方案安装数据库,也就是原来1台物理机,装1个数据库,现在则是2台物理机拆分为虚拟机,各个应用互相使用【作为主备】。而你占用的都是虚拟资源。也就是原来1台物理机等于5个虚拟机,现在5个虚拟机被分配到各个物理机上。所以你的分库分表并没有额外占用更多的资源。但这样的设计,业务体量上来以后,扩展只需要调整虚拟机的分配就可以了。 + +## 二、功能流程 + +在大营销的系统设计中,有一个配置库(big_market)和两个分库(big_market_01、big_market_02),我们需要对两个分库进行配置路由操作。达到分库分表的目的,而配置库则是一个单库单表存储活动等配置类信息。分库分表调用流程【如图】 + +++ +- 以用户对数据库的操作为视角,发生用户类的行为操作时【账户、下单、流水】,则会根据用户ID(userId)进行路由,把数据分配到x库y表中。 +- 路由计算的处理,是以配置了 `@DBRouter`注解的 DAO 方法进行路由切面开始。通过获取用户ID(userId)值进行哈希索引计算。哈希值 & 2从n次幂数量的库表 - 1 得到一个值,在根据这个值计算应该分配到哪个库表上去。比如这个是6,分库分表是2库4表,共计8个,那么6就分配到了1库4+2库2个等于6,也就得到了2库2表。 +- 对于计算得到的分库分表值,存入到 ThreaLocal 中,这个东西的目的是可以在一个线程的调用中,可以随时获取值,而不需要通过方法传递。 +- 最后 Spring 在执行数据库操作前,会获取路由。而路由组件则实现了动态路由,从 ThreadLocal 中获取。此外注意,因为还有分表的操作,比如 table 需要为 table_01 这个动作是由 MyBatis Plugin 插件开发实现的。 + +关于数据库路由组件单独录制了课程,更多细节内容可以学习。[数据库分库分表路由组件](https://bugstack.cn/md/road-map/db-router.html) - 这个小组件足够写个简历项目用。 + +此外 [sharding-jdbc](https://bugstack.cn/md/road-map/sharding-jdbc.html) 也可以做分库分表,但直接使用小伙伴们会错过理解分库分表的核心设计,所以我们这里选择使用星球「码农会锁」里的 DB-Router 进行分库分表。 diff --git "a/docs/md/project/big-market/api/\347\254\25414\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\350\256\242\345\215\225\346\265\201\347\250\213\350\256\276\350\256\241.md" "b/docs/md/project/big-market/api/\347\254\25414\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\350\256\242\345\215\225\346\265\201\347\250\213\350\256\276\350\256\241.md" new file mode 100644 index 000000000..bbfa8d339 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25414\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\350\256\242\345\215\225\346\265\201\347\250\213\350\256\276\350\256\241.md" @@ -0,0 +1,35 @@ +--- +title: 第14节:抽奖活动订单流程设计 +pay: https://t.zsxq.com/18CO46Oux +--- + +# 《大营销平台系统设计实现》 - 营销服务 第14节:抽奖活动订单流程设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:解耦活动库存、个人库存为sku活动商品配置。以此方式支持后续用户发生的签到、打卡、支付等方式获得的抽奖次数。本节是对前面库表的再次处理,以此让读者可以学习到中奖的过程是什么样。 +- **课程视频**:[https://t.zsxq.com/18Sr22S5Z](https://t.zsxq.com/18Sr22S5Z) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +本节我们要设计出,用户参与抽奖活动的流程设计,并可以支持后续满足用户通过不同行为来增加自己的抽奖次数。 + +那么站在本节的诉求上,小傅哥将会带着读者对前面所设计的活动库表做一个解耦操作。来满足后续流程中个人可参与抽奖活动次数的变化处理。 + +## 二、功能流程 + +我们可以把抽奖的行为理解为一个下单过程,用户参与抽奖,也等价于商品下单。只不过这个商品的 sku 是活动信息。 + +++ +- 用户的触达行为是后续需要扩展的部分,当我们把大营销结合给其他系统的时候,就可以让支付后的消息推送过来,给用户领取一次抽奖次数。并参与抽奖。【还记得你在商城,或者一些云服务购买后,可以参与抽奖的过程吗?】 +- 在上一节,小傅哥是把活动的可参与库存、用户的库存,都配置到活动本身。那这样就有一个问题,比如不同的场景,所需要在一个活动上给用户分配的抽奖次数不同,那么就不好配置了。所以我们要抽象一下,把活动和个人参与的次数,从活动配置中解耦出来,并通过 sku 商品表的方式配置出这样一组商品信息。 +- 另外,在活动信息表中,还有活动的库存。这里我们把活动的库存也提取出来,放到 sku 上。一个商品的 sku 能下单多少次,由 sku 管理就行了。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25415\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\346\265\201\346\260\264\345\205\245\345\272\223.md" "b/docs/md/project/big-market/api/\347\254\25415\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\346\265\201\346\260\264\345\205\245\345\272\223.md" new file mode 100644 index 000000000..be901a99a --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25415\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\346\265\201\346\260\264\345\205\245\345\272\223.md" @@ -0,0 +1,35 @@ +--- +title: 第15节:抽奖活动流水入库 +pay: https://t.zsxq.com/18mWcNHOp +--- + +# 《大营销平台系统设计实现》 - 营销服务 第15节:抽奖活动流水入库 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:实现抽奖下单对活动账户充值的操作流程,把数据写入到库中,并可以保证幂等性。 +- **课程视频**:[https://t.zsxq.com/18gaoKYEn](https://t.zsxq.com/18gaoKYEn) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在基于活动、次数所组合的活动 sku,用户参与活动就相当于,下单sku给自己的活动账户充值可参与的额度次数。所以本节小傅哥就带着大家,把活动的下单的过程落入到数据库中。 + +本节写库会涉及到分库分表组件切分和开启事务的操作。 + +## 二、功能流程 + +按照上一节我们对活动流程的设计,用户参与抽奖活动就会有一个活动额度账户,而本节则让来实现参与活动对自己的活动额度账户充值的过程。 + +++ +- 本节会先实现出领取活动的框架结构代码,并对数据进行落库操作。(落库的过程会有分库分表下事务的操作) +- 活动日期、活动状态、sku库存校验和扣减,这些都是固定的流程。无论创建多少个活动都会走这样的统一流程,所以这里适合添加一个责任链模式的结构。 +- 因为是分库分表设计,所以库表数据的写入需要确定切分键,并在同一个连接下执行 commit 这样才能把用户的活动账户和订单流程,一起写库。(也就是一个事务的特性) \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25416\350\212\202\357\274\232\345\274\225\345\205\245MQ\345\244\204\347\220\206\346\264\273\345\212\250SKU\345\272\223\345\255\230\344\270\200\350\207\264\346\200\247.md" "b/docs/md/project/big-market/api/\347\254\25416\350\212\202\357\274\232\345\274\225\345\205\245MQ\345\244\204\347\220\206\346\264\273\345\212\250SKU\345\272\223\345\255\230\344\270\200\350\207\264\346\200\247.md" new file mode 100644 index 000000000..441cdea21 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25416\350\212\202\357\274\232\345\274\225\345\205\245MQ\345\244\204\347\220\206\346\264\273\345\212\250SKU\345\272\223\345\255\230\344\270\200\350\207\264\346\200\247.md" @@ -0,0 +1,36 @@ +--- +title: 第16节:引入MQ处理活动SKU库存一致性 +pay: https://t.zsxq.com/188e3DFyj +--- + +# 《大营销平台系统设计实现》 - 营销服务 第16节:引入MQ处理活动SKU库存一致性 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:引入 RabbitMQ 消息组件,在活动SKU库存消耗完毕后,触发消息推送更新库存为最终一致。 +- **课程视频**:[https://t.zsxq.com/18UKKWY9x](https://t.zsxq.com/18UKKWY9x) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +完成活动责任链判断,包括;活动的校验【日期、状态、sku库存】,之后是sku 库存的扣减操作。 之后这里会涉及一个缓存库存和数据库库存一致性问题,是本节要处理的重点。一个手段是之前在策略实现阶段采用的延迟队列做趋势更新,另外一个是本节要引入 RabbitMQ 在库存消耗空以后发送 MQ 消息,直接更新清空最终库存,保持缓存与数据库的一致性。 + +**注意**,可能此时缓存消耗库存阶段有失败丢失,不完全等于数据库真实库存。不过没关系,先保证一个统一库存即可。后续可以扫描统计订单数量,来校准库存。 + +## 二、功能流程 + +完善责任链功能,和库存数据一致性的处理; + +++ +- 第一步;完成责任链的活动校验,时间、状态、库存。 +- 第二步;对库存的扣减,使用 decr + lock 锁的方式(兜底)进行处理。 +- 第三步;做完库存扣减后,发送延迟队列,由任务调度更新趋势库存,满足最终一致。 +- 第四步;库存消耗为0后,发送MQ消息,驱动变更数据库库存为0 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25417\350\212\202\357\274\232\347\224\250\346\210\267\351\242\206\345\217\226\346\264\273\345\212\250\345\272\223\350\241\250\350\256\276\350\256\241.md" "b/docs/md/project/big-market/api/\347\254\25417\350\212\202\357\274\232\347\224\250\346\210\267\351\242\206\345\217\226\346\264\273\345\212\250\345\272\223\350\241\250\350\256\276\350\256\241.md" new file mode 100644 index 000000000..201668154 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25417\350\212\202\357\274\232\347\224\250\346\210\267\351\242\206\345\217\226\346\264\273\345\212\250\345\272\223\350\241\250\350\256\276\350\256\241.md" @@ -0,0 +1,36 @@ +--- +title: 第17节:用于领取活动库表设计 +pay: https://t.zsxq.com/18Hf0vgQV +--- + +# 《大营销平台系统设计实现》 - 营销服务 第17节:用于领取活动库表设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★★☆ +- **本章重点**:分析抽奖业务流程并设计出对应的库表,本节会新增5张库表。 +- **课程视频**:[https://t.zsxq.com/18R7A8BsN](https://t.zsxq.com/18R7A8BsN) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +设计用于,用户参与活动所需的库表。从用户参与活动,扣减个人活动账户次数,创建活动订单。抽奖完成获得奖品ID后,写入中奖记录和task任务表(发mq补偿使用)。之后发送MQ消息,更新中奖记录。 + +这一套流程,需要本节增加6张表。—— 小傅哥给大家的这些设计,都是来自于真实的场景中,而不是随便一张库表就只写 CRUD 。 + +## 二、业务流程 + +从业务流程的模型结构分析,看整个链路所需的库表; + +++ +- 首先,用户抽奖开始,需要领取活动,扣减个人账户额度。生成一个抽奖订单。每个用户都有一个活动账户额度,里面包含了;总可参与次数、月可参与次数、日可参与次数。这样的设计是为了应对复杂的业务需求。那么有这样的表,就不能只是在一个表里扣减额度,因为每天都要扣减额度,但只在一个账户中扣减,日的次数第一天扣减完,第二天相当于回复为原始库存继续扣减。所以这里要生成一个出每日活动账户,当前则在自己的日账户中扣减。而总库存的日,是一种镜像记录,方便查询统计的。 +- 账户,在扣减额度和用户的订单,要在一个事务内完成。但不能和后续的抽奖结果继续做事务,因为抽奖的过程还有很多的操作,而已包括缓存的处理,而他们都不能做事务。所以这部分是分开的。 +- 之后,抽奖策略结果计算完毕后,把奖品ID写入中奖记录表中,同时写一个 task 任务表。任务表是发 MQ 消息的。但在写入完成奖品订单后,则直接发送一个 MQ 消息【发送后更新 task 表状态】,如果发送失败则还有 task 任务表,由 job 任务扫描的方式处理。这样可以尽快的发送 MQ 消息。 +- 最后,接收发送的 MQ 开始发放奖品,本节暂时先不处理奖品的发放。 diff --git "a/docs/md/project/big-market/api/\347\254\25418\350\212\202\357\274\232\351\242\206\345\217\226\346\264\273\345\212\250\346\211\243\345\207\217\350\264\246\346\210\267\351\242\235\345\272\246.md" "b/docs/md/project/big-market/api/\347\254\25418\350\212\202\357\274\232\351\242\206\345\217\226\346\264\273\345\212\250\346\211\243\345\207\217\350\264\246\346\210\267\351\242\235\345\272\246.md" new file mode 100644 index 000000000..fdf28d893 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25418\350\212\202\357\274\232\351\242\206\345\217\226\346\264\273\345\212\250\346\211\243\345\207\217\350\264\246\346\210\267\351\242\235\345\272\246.md" @@ -0,0 +1,36 @@ +--- +title: 第18节:领取活动扣减账户额度 +pay: https://t.zsxq.com/198oqnRQL +--- + +# 《大营销平台系统设计实现》 - 营销服务 第18节:领取活动扣减账户额度 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★★☆ +- **本章重点**:拆分活动领域为额度子域、参与子域、装配子域,完成用户领取活动,创建订单扣减账户(总、月、日)额度。 +- **课程视频**:[https://t.zsxq.com/19FswzbMD](https://t.zsxq.com/19FswzbMD) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +活动领域是一个含有活动部署、活动账户充值、用户参与活动的多个核心子领域组成,也就是一个活动下不只是有一个 service 服务。对于这样的情况,我们需要涉及出不同的子领域来承接这些功能。而不是把所有的功能都平铺到一个模块下。因为平铺写一堆的 service 的方式会让整个逻辑混乱,需求迭代的次数越多,最后的代码也就会越混乱。 + +所以本节我们要在添加扣减额度的需求上,对前面章节实现的活动sku充值,划分下领域。之后在进行新功能的实现。 + +## 二、业务流程 + +用户抽奖的业务流程分为;给自己的活动账户添加额度(购买、兑换、打卡),领取活动(扣减互动账户额度)、执行抽奖策略、抽奖结果落库。本节实现到领取活动部分。 + +在本节实现中先给原有实现额度充值的对象,新增加 quota 额度子领域文件夹,迁移类进去以及调整类名。这样一个活动类下就有 quota、armory 两个子领域了,之后本节在增加一个 partake 参与活动的领域。 + +++ +- 原有的`额度账户`功能只是做文件夹的迁移,不会动原有的功能。 +- 本节主要实现参与活动的领域,本部分主要涉及了接口和抽象类定义流程,以及向库表写入数据。库表的写入是一个聚合对象下的事务操作,涵盖了3个账户表(总、月、日)和一个订单表。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25419\350\212\202\357\274\232\345\206\231\345\205\245\344\270\255\345\245\226\350\256\260\345\275\225\345\222\214\344\273\273\345\212\241\350\241\245\345\201\277\345\217\221\351\200\201.md" "b/docs/md/project/big-market/api/\347\254\25419\350\212\202\357\274\232\345\206\231\345\205\245\344\270\255\345\245\226\350\256\260\345\275\225\345\222\214\344\273\273\345\212\241\350\241\245\345\201\277\345\217\221\351\200\201.md" new file mode 100644 index 000000000..e4deecaeb --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25419\350\212\202\357\274\232\345\206\231\345\205\245\344\270\255\345\245\226\350\256\260\345\275\225\345\222\214\344\273\273\345\212\241\350\241\245\345\201\277\345\217\221\351\200\201.md" @@ -0,0 +1,40 @@ +--- +title: 第19节:写入中奖记录和任务补偿发送MQ +pay: https://t.zsxq.com/198Bt1EL8 +--- + +# 《大营销平台系统设计实现》 - 营销服务 第19节:写入中奖记录和任务补偿发送MQ + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★★☆ +- **本章重点**:使用 task表机制,在写入奖品记录时,一个事务下完成 task mq 消息的写入,并可以通过补偿的方式推送 MQ 消息。 +- **课程视频**:[https://t.zsxq.com/19LcGz8jM](https://t.zsxq.com/19LcGz8jM) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +一整个抽奖过程先从活动账户额度充值、活动参与、抽奖执行【策略】,之后就是中奖记录写入和后续的发奖。那么本节要实现的就是这里的奖品记录写入和异步消息发送。 + +本节会用到 task 任务表,在写入奖品记录的时候,写入一条 task 消息发送任务,作为补偿使用。当 mq 发送失败的时候,则由任务扫描 task 消息进行发送。 + +## 二、业务流程 + +从用户中奖到发奖,通常来说我们会做异步解耦,因为一些奖品的方法并不是都是在抽奖系统,而是各种 RPC/HTTP 接口来发放,这些接口有些时候会有超时的问题,需要重试处理。所以需要数据库写入一条记录,之后记录一个状态。之后奖品真正发放完以后,在更新这个这个状态。 + +这样可以让用户快速指导自己已中奖即可,之后点击详情或者奖品列表进入中查看自己的中奖结果。 + +那么这里的写入记录和发送 MQ 消息,不能用事务解决,事务主要是数据库事务,但 MQ 消息不是数据库事务。所以需要写入一个 task 表,通过任务补偿的方式进行处理。 + +**整体流程如下;** + +++ +- 抽奖、抽奖策略,在前面已经实现完成,本节主要实现的是蓝色部分,写入中奖结果和任务,以及发送MQ消息。 +- 这里我们会先简单的接收消费MQ,后续做消费奖品发放的其他处理。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\2541\350\212\202\357\274\232\346\212\275\345\245\226\347\255\226\347\225\245\351\242\206\345\237\237\345\222\214\345\272\223\350\241\250\350\256\276\350\256\241.md" "b/docs/md/project/big-market/api/\347\254\2541\350\212\202\357\274\232\346\212\275\345\245\226\347\255\226\347\225\245\351\242\206\345\237\237\345\222\214\345\272\223\350\241\250\350\256\276\350\256\241.md" new file mode 100644 index 000000000..660ec401f --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2541\350\212\202\357\274\232\346\212\275\345\245\226\347\255\226\347\225\245\351\242\206\345\237\237\345\222\214\345\272\223\350\241\250\350\256\276\350\256\241.md" @@ -0,0 +1,32 @@ +--- +title: 第1节:抽奖策略领域和库表设计 +pay: https://t.zsxq.com/15rGKOAfA +--- + +# 《大营销平台系统设计实现》 - 营销服务 第1节:抽奖策略领域和库表设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:通过分析抽奖的行为逻辑,设计抽奖策略领域模型和对应的库表结构。 +- **课程视频**:[https://t.zsxq.com/15gLHtPaU](https://t.zsxq.com/15gLHtPaU) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +通过分析大营销平台中抽奖的产品功能,设计抽奖策略模型和库表结构。抽奖策略是抽奖中非常核心功能,尤其是本课程中所体现出的抽奖产品功能,需要更好的库表结构支撑着领域模型的实现。 + +## 二、内容说明 + +本节会通过分析、拆解、抛出问题和解决问题的方式,带着大家一起厘清抽奖策略模型和对应的表结构信息。 + +++ +- 拆解分析整个大营销平台的核心领域,分析领域功能关联关系。 +- 再聚焦到抽奖策略模型中,通过对产品功能的分析,完成领域功能理解和库表的设计。 diff --git "a/docs/md/project/big-market/api/\347\254\25420\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\346\265\201\347\250\213\344\270\262\350\201\224.md" "b/docs/md/project/big-market/api/\347\254\25420\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\346\265\201\347\250\213\344\270\262\350\201\224.md" new file mode 100644 index 000000000..3e6884456 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25420\350\212\202\357\274\232\346\212\275\345\245\226\346\264\273\345\212\250\346\265\201\347\250\213\344\270\262\350\201\224.md" @@ -0,0 +1,39 @@ +--- +title: 第20节:抽奖活动流程串联 +pay: https://t.zsxq.com/19JofVjoa +--- + +# 《大营销平台系统设计实现》 - 营销服务 第20节:抽奖活动流程串联 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:提供抽奖API接口,串联整个抽奖过程的领域模块。 +- **课程视频**:[https://t.zsxq.com/19fVwshWT](https://t.zsxq.com/19fVwshWT) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +到本节以抽奖为流程的各个领域模块已经开发完成,本章我们将串联各个模块提供抽奖API接口。 + +在一些较大规模的系统架构中,DDD 的分层结构中会有一个 case 层,也可以叫 application 层。专门用于对 domain 领域的编排。这一层引入后的优势是为复杂项目提供编排能力,提高领域模块的复用性。但缺点是会额外多出一组对象的转换来防腐,因为开发成本会有所增加。所以这部分要看具体的场景而定,看是否选择增加 case 编排层。 + +## 二、业务流程 + +- 首先,我们在过往的开发中,我们提供了活动装配、策略装配,所以要单独为装配提供好一个接口来使用。 +- 之后,串联抽奖所需的过程模块,从参数校验、参与活动、抽奖策略、存放结果、更新订单,直至最终返回抽奖结果。 + +**整体流程如下** + +++ +- 开发内容1;串联整个抽奖流程,提供 API +- 开发内容2;提供以活动为主导的,预热装配动作 +- 开发内容3;抽奖策略模块中,校验账户额度。【之前的一个策略规则,需要根据已经抽奖次数进行解锁】 +- 开发内容4;存放抽奖结果后,更新用户参与活动时的抽奖单状态为已使用。 diff --git "a/docs/md/project/big-market/api/\347\254\25421\350\212\202\357\274\232\346\264\273\345\212\250\344\277\241\346\201\257API\350\277\255\344\273\243\345\222\214\345\212\237\350\203\275\345\256\214\345\226\204.md" "b/docs/md/project/big-market/api/\347\254\25421\350\212\202\357\274\232\346\264\273\345\212\250\344\277\241\346\201\257API\350\277\255\344\273\243\345\222\214\345\212\237\350\203\275\345\256\214\345\226\204.md" new file mode 100644 index 000000000..137ce8d66 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25421\350\212\202\357\274\232\346\264\273\345\212\250\344\277\241\346\201\257API\350\277\255\344\273\243\345\222\214\345\212\237\350\203\275\345\256\214\345\226\204.md" @@ -0,0 +1,34 @@ +--- +title: 第21节:活动信息API迭代和功能完善 +pay: https://t.zsxq.com/19aanGm3U +--- + +# 《大营销平台系统设计实现》 - 营销服务 第21节:活动信息API迭代和功能完善 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:完善接口功能,增加策略加锁key的过期时间,修复一些bug +- **课程视频**:[https://t.zsxq.com/19wIzfZxN](https://t.zsxq.com/19wIzfZxN) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +扩展查询奖品信息接口【queryRaffleAwardList】,以用户活动为视角进行查询增加返回信息。同时修复Redisson序列化、加锁过期时间问题。 + +## 二、业务流程 + +本节实现功能到不复杂,但涉及的代码量也比较多。因为整个过程要在策略的查询进行扩展,提供用`活动ID+用户ID`进行查询。这样才能查询到活动配置配置的信息,用户的抽奖参与次数,以及扩展查询策略的规则(rule_lock)配置。 + +++ +1. 提供带有活动和用户属性信息判断的抽奖列表数据,满足后续前端展示抽奖列表时可以渲染出奖品是否被加锁并提示用户还需要抽奖几次才能解锁奖品。 +2. 在以活动为开始的抽奖,对抽奖策略加锁的key设置过期时间为活动结束时间。 +3. 完善 Redis 序列化操作,Redisson 添加序列化设置。 +4. 抽奖sku消耗完毕的队列清空,暂时先去掉。因为目前使用的一套队列,避免都清空喽。这部分不会影响到库存的更新。 diff --git "a/docs/md/project/big-market/api/\347\254\25422\350\212\202\357\274\232\347\224\250\346\210\267\350\241\214\344\270\272\350\277\224\345\210\251\345\205\245\350\264\246.md" "b/docs/md/project/big-market/api/\347\254\25422\350\212\202\357\274\232\347\224\250\346\210\267\350\241\214\344\270\272\350\277\224\345\210\251\345\205\245\350\264\246.md" new file mode 100644 index 000000000..ed29991d3 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25422\350\212\202\357\274\232\347\224\250\346\210\267\350\241\214\344\270\272\350\277\224\345\210\251\345\205\245\350\264\246.md" @@ -0,0 +1,36 @@ +--- +title: 第22节:用户行为返利入账 +pay: https://t.zsxq.com/ICv9z +--- + +# 《大营销平台系统设计实现》 - 营销服务 第22节:用户行为返利入账 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:开发用户行为返利功能,实现入账和异步消息发送。 +- **课程视频**:[https://t.zsxq.com/YpuSy](https://t.zsxq.com/YpuSy) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +按照用户行为返利的需求设计,创建相应的库表,开发 rebate 返利领域,提供返利订单创建接口。并在写入订单后发送 MQ 消息。后续则处理奖励入账。 + +## 二、业务流程 + +用户的行为动作返利,是一种日常的活动类型。比如;你在某个平台创建了新账号,就会给你发一堆的开户优惠券,这些都是日常的返利活动。 + +日常的返利会根据用户所完成的行为动作来触达,这包括;打卡、签到、连签、支付、开户、交易、信贷、拉新等各类的动作。我们本节中所涉及的,主要是日常的日历签到行为,并也从功能实现上扩展出各类型的任务,以便于后续扩展。 + +++ +- 一个用户行为可能会给多种奖励,所以在接收到用户信息后,会根据配置组装聚合对象。【聚合的目的就是为了做一个统一的事务】 +- 一个聚合对象中包含了返利的订单实体对象,写入task的实体对象。它们是一个事务入库。 +- 另外是发送MQ消息,在完成入口动作后,会直接发送MQ消息,并且如果发送失败,会有任务兜底。【这样是面试中经常问到的点,如果MQ消息发送失败了,你是怎么处理的。】 + diff --git "a/docs/md/project/big-market/api/\347\254\25423\350\212\202\357\274\232\347\224\250\346\210\267\350\241\214\344\270\272\350\277\224\345\210\251\347\273\223\347\256\227.md" "b/docs/md/project/big-market/api/\347\254\25423\350\212\202\357\274\232\347\224\250\346\210\267\350\241\214\344\270\272\350\277\224\345\210\251\347\273\223\347\256\227.md" new file mode 100644 index 000000000..71c5a62cf --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25423\350\212\202\357\274\232\347\224\250\346\210\267\350\241\214\344\270\272\350\277\224\345\210\251\347\273\223\347\256\227.md" @@ -0,0 +1,33 @@ +--- +title: 第23节:用户行为返利结算 +pay: https://t.zsxq.com/AGmAr +--- + +# 《大营销平台系统设计实现》 - 营销服务 第23节:用户行为返利结算 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:接收异步MQ消息进行结算处理,并提供出日历签到接口,用于后续对接。 +- **课程视频**:[https://t.zsxq.com/8WfLZ](https://t.zsxq.com/8WfLZ) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +上一节对用户的行为根据返利配置进行入账发送MQ消息,这一节将接收MQ消息开始结算返利。这里也就是给用户的活动账户充值。并提供一个日历签到返利的接口,用于后续对接到前端UI使用。 + +## 二、业务流程 + +扩展用户行为流程,增加入账结算; + +++ +- 增加接收MQ消息流程,调用活动账户额度入账接口,增加用户的可抽奖次数。这里包括;总、月、日,账户额度更新。 +- 注意 MQ 消息会有过滤,目前只处理返利是 sku 类型的返利。 +- 最后在提供一个日历签到的接口,便于后续对接到前端页面使用。 diff --git "a/docs/md/project/big-market/api/\347\254\25424\350\212\202\357\274\232\350\247\204\345\210\231\345\256\214\345\226\204\345\222\214\345\272\224\347\224\250\346\216\245\345\217\243\345\256\236\347\216\260.md" "b/docs/md/project/big-market/api/\347\254\25424\350\212\202\357\274\232\350\247\204\345\210\231\345\256\214\345\226\204\345\222\214\345\272\224\347\224\250\346\216\245\345\217\243\345\256\236\347\216\260.md" new file mode 100644 index 000000000..318c1f530 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25424\350\212\202\357\274\232\350\247\204\345\210\231\345\256\214\345\226\204\345\222\214\345\272\224\347\224\250\346\216\245\345\217\243\345\256\236\347\216\260.md" @@ -0,0 +1,33 @@ +--- +title: 第24节:规则完善和应用接口实现 +pay: https://t.zsxq.com/BLn04 +--- + +# 《大营销平台系统设计实现》 - 营销服务 第24节:规则完善和应用接口实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:综合实现抽奖所需渲染UI的接口,包括;活动账户额度、签到&查询、权重范围,以及完善权重规则校验接口 +- **课程视频**:[https://t.zsxq.com/HDir9](https://t.zsxq.com/HDir9) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +完善权重规则的校验,用户的总抽奖次数作为规则权重的比对值,一个活动下抽奖总N次后,可获得必中范围奖品。之后提供出,活动账户额度、签到&查询、权重范围接口,用于前端UI渲染使用。 + +## 二、业务流程 + +如图,来看下要实现的接口内容; + +++ +- 剩余抽奖次数接口,后端会返回;总、日、月,总额度和剩余额度,这样可以满足前端的各类渲染诉求。 +- 点击签到接口和签到结果查询接口,如果今日已签到,则展示灰色并不可签到。 +- 权重规则范围展示接口,告诉用户总计抽奖多少次后,可以必中指定范围奖品。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25425\350\212\202\357\274\232\347\247\257\345\210\206\345\217\221\345\245\226\346\234\215\345\212\241\345\256\236\347\216\260.md" "b/docs/md/project/big-market/api/\347\254\25425\350\212\202\357\274\232\347\247\257\345\210\206\345\217\221\345\245\226\346\234\215\345\212\241\345\256\236\347\216\260.md" new file mode 100644 index 000000000..db2211827 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25425\350\212\202\357\274\232\347\247\257\345\210\206\345\217\221\345\245\226\346\234\215\345\212\241\345\256\236\347\216\260.md" @@ -0,0 +1,37 @@ +--- +title: 第25节:积分发奖服务实现 +pay: https://t.zsxq.com/K8aTS +--- + +# 《大营销平台系统设计实现》 - 营销服务 第25节:积分发奖服务实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:设计用户活动积分流程,创建用户积分表,并开发用户抽奖积分奖品后,完成奖品发放流程,给用户增加积分。 +- **课程视频**:[https://t.zsxq.com/Jfy0B](https://t.zsxq.com/Jfy0B) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +设计用户活动积分流程,创建用户积分表,并开发用户抽奖积分奖品后,完成奖品发放流程,给用户增加积分。用户的积分是一种中间媒介,抽奖可以获取积分奖品,签到可以获取积分奖品,还可以用积分兑换活动抽奖次数。通过这样的方式把整个抽奖流程闭环。 + +## 二、业务流程 + +如图,嵌入的积分场景; + +++ +- 积分的获取目前有4个流程,抽奖中有3个,包括; + 1. 默认抽取到积分奖品。 + 2. 抽取到其他奖品,但无库存时,走积分兜底奖品。 + 3. 配置的黑名单用户,在 0.01 ~ 1 积分,的随机奖品。 + 4. 发起签到,可配置积分奖励,后续实现签到发奖积分流程。 + +- 实现奖品分发服务,发放用户积分奖励,到用户的积分账户表。积分账户表是本节新增加库表。其他奖励后续实现。 diff --git "a/docs/md/project/big-market/api/\347\254\25426\350\212\202\357\274\232\347\247\257\345\210\206\351\242\206\345\237\237\350\260\203\351\242\235\346\234\215\345\212\241.md" "b/docs/md/project/big-market/api/\347\254\25426\350\212\202\357\274\232\347\247\257\345\210\206\351\242\206\345\237\237\350\260\203\351\242\235\346\234\215\345\212\241.md" new file mode 100644 index 000000000..92f6319c6 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25426\350\212\202\357\274\232\347\247\257\345\210\206\351\242\206\345\237\237\350\260\203\351\242\235\346\234\215\345\212\241.md" @@ -0,0 +1,32 @@ +--- +title: 第26节:积分领域调额服务 +pay: https://t.zsxq.com/cXQ61 +--- + +# 《大营销平台系统设计实现》 - 营销服务 第26节:积分领域调额服务 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:增加用户积分领域模块,开发积分调额接口。串联行为发奖动作,发放用户积分奖励。 +- **课程视频**:[https://t.zsxq.com/Vy6oX](https://t.zsxq.com/Vy6oX) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +增加用户积分领域模块,开发积分调额接口。串联行为发奖动作,发放用户积分奖励。这是一整条流程,在设计积分领域模块的时候,要考虑这块模型的功能添加都有哪些,将来可能会存在的接口。如;把对积分账户的增加,抽象为调额。将来使用积分还可以定义出积分消费的接口。我们通过不同的接口做职责的划分。 + +## 二、业务流程 + +如图,增加积分领域模块; + +++ +- 首先,设计、定义和开发出积分领域模块,增加积分调额接口。 +- 之后,对接返利异步消息,完成积分额度的增加。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25427\350\212\202\357\274\232\347\247\257\345\210\206\346\224\257\344\273\230\345\205\221\346\215\242\345\225\206\345\223\201.md" "b/docs/md/project/big-market/api/\347\254\25427\350\212\202\357\274\232\347\247\257\345\210\206\346\224\257\344\273\230\345\205\221\346\215\242\345\225\206\345\223\201.md" new file mode 100644 index 000000000..ea9c676b5 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25427\350\212\202\357\274\232\347\247\257\345\210\206\346\224\257\344\273\230\345\205\221\346\215\242\345\225\206\345\223\201.md" @@ -0,0 +1,35 @@ +--- +title: 第27节:积分支付兑换商品 +pay: https://t.zsxq.com/iBPBR +--- + +# 《大营销平台系统设计实现》 - 营销服务 第27节:积分支付兑换商品 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:开发扣减积分,兑换sku商品,所需的服务模块。让积分的获取、消费,形成逻辑闭环。 +- **课程视频**:[https://t.zsxq.com/3UHYZ](https://t.zsxq.com/3UHYZ) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +开发扣减积分,兑换sku商品,所需的服务模块。让积分的获取、消费,形成逻辑闭环。 + +积分是衔接营销场景中各个功能模块的一个非常重要的手段,如;各项用户的行为 + 抽奖返利积分,积分兑换商品、积分兑换抽奖次数、积分支付抵扣、积分会员等级折扣等。【这些内容在你的日常使用各类互联网产品中,都会遇到的,可以留意下】 + +## 二、业务流程 + +如图,积分兑换商品交易流程; + +++ +- 首先,对 sku 商品库增加积分金额,用于积分支付,而签到兑换类则无需关注金额。 +- 之后,商品下单需要提供出交易策略;无支付交易和有支付交易。 +- 最后,下单完成则进行积分抵扣,以及接收到支付成功消息,进行充值入账。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25428\350\212\202\357\274\232\347\247\257\345\210\206\345\272\224\347\224\250\345\234\272\346\231\257\346\216\245\345\217\243\345\256\236\347\216\260.md" "b/docs/md/project/big-market/api/\347\254\25428\350\212\202\357\274\232\347\247\257\345\210\206\345\272\224\347\224\250\345\234\272\346\231\257\346\216\245\345\217\243\345\256\236\347\216\260.md" new file mode 100644 index 000000000..291bcd807 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25428\350\212\202\357\274\232\347\247\257\345\210\206\345\272\224\347\224\250\345\234\272\346\231\257\346\216\245\345\217\243\345\256\236\347\216\260.md" @@ -0,0 +1,35 @@ +--- +title: 第28节:积分应用场景接口实现 +pay: https://t.zsxq.com/2M4jV +--- + +# 《大营销平台系统设计实现》 - 营销服务 第28节:积分应用场景接口实现 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:以支持积分使用「商品、账户、兑换」对接前端诉求,在本节开发所需的接口。 +- **课程视频**:[https://t.zsxq.com/X3hfU](https://t.zsxq.com/X3hfU) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +以支持积分使用「商品、账户、兑换」对接前端诉求,在本节开发所需的接口。包括;串联前面章节中实现积分模块功能完成积分兑换case(串联的每一个服务都可以当做一个case看待,只不过我们的场景没有那么多,所以在工程搭建中去掉了单独的case模块,减少对象频繁转换)、sku商品查询、用户积分账户额度查询。 + +## 二、业务流程 + +如图,积分接口在前端UI中的使用; + +++ +- 虚线框内为本节要为前端UI开发的接口,两个查询积分和商品,一个是操作兑换的处理。 +- 注意,兑换的操作会对接口进一步完善,创建下单商品时候会返回未支付订单。这是因为从下单到支付是分开的步骤,可能下单完成,但支付的时候金额不足了「多笔下单场景消费积分」,也可能其他异常导致下单失败。这样的场景都需要把未支付的订单查询出来进行支付。 + + + diff --git "a/docs/md/project/big-market/api/\347\254\25429\350\212\202\357\274\232\345\210\206\345\270\203\345\274\217\345\212\250\346\200\201\351\205\215\347\275\256\346\264\273\345\212\250\351\231\215\347\272\247.md" "b/docs/md/project/big-market/api/\347\254\25429\350\212\202\357\274\232\345\210\206\345\270\203\345\274\217\345\212\250\346\200\201\351\205\215\347\275\256\346\264\273\345\212\250\351\231\215\347\272\247.md" new file mode 100644 index 000000000..ef9470f15 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25429\350\212\202\357\274\232\345\210\206\345\270\203\345\274\217\345\212\250\346\200\201\351\205\215\347\275\256\346\264\273\345\212\250\351\231\215\347\272\247.md" @@ -0,0 +1,37 @@ +--- +title: 第29节:分布式动态配置活动降级 +pay: https://t.zsxq.com/mbXeM +--- + +# 《大营销平台系统设计实现》 - 营销服务 第29节:分布式动态配置活动降级 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:基于 Zookeeper 实现分布式动态配置中心服务,用于分布式应用节点系统中的环境属性值变更。 +- **课程视频**:[https://t.zsxq.com/m81oK](https://t.zsxq.com/m81oK) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +基于 Zookeeper 实现分布式动态配置中心服务,用于分布式应用节点系统中的环境属性值变更。这样我们可以让所有分布式系统中,类下的属性值做动态的调整,及时的对系统进行;切量、熔断、降级、黑白名单等用途。 + +在互联网公司中面向C端的应用场景,有非常多的动态配置使用,包括你看到的一些金融场景的额度费率、电商场景的特惠商品、出行场景的促销活动,都会有一些动态配置的使用。那么本节小傅哥就从原理到应用带着大家来实现一下。 + +## 二、业务流程 + +如图,动态配置组件实现方案; + +++ +以Zookeeper为配置中心服务,基于 Zookeeper 的节点监听值变更机制,动态修改应用程序中属性值。 + +- 首先,我们需要定义出一个 Zookeeper 监听的配置路径,一般这个路径在配置中心中是申请的系统使用地址,以确保值的唯一。 +- 之后,每个类对应的属性,需要映射出一个监听的节点。比如;Zookeeper 监听了 `/big-market-dcc/config` 那么类中 a 属性可以是 `/big-market-dcc/config/a` 这对这个路径设置的值,就可以被监听拿到了。 +- 最后,把获取到的监听值,通过 Java 反射操作,把值设置到对应的属性上。这样在 SpringBoot 应用程序中,使用某个类的属性值的时候,就可以动态的获取到变化的属性值了。 diff --git "a/docs/md/project/big-market/api/\347\254\2542\350\212\202\357\274\232\345\237\272\347\241\200\345\261\202\346\214\201\344\271\205\345\214\226\346\225\260\346\215\256.md" "b/docs/md/project/big-market/api/\347\254\2542\350\212\202\357\274\232\345\237\272\347\241\200\345\261\202\346\214\201\344\271\205\345\214\226\346\225\260\346\215\256.md" new file mode 100644 index 000000000..6b926eddc --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2542\350\212\202\357\274\232\345\237\272\347\241\200\345\261\202\346\214\201\344\271\205\345\214\226\346\225\260\346\215\256.md" @@ -0,0 +1,32 @@ +--- +title: 第2节:基础层持久化数据 +pay: https://t.zsxq.com/15Jz9It6s +--- + +# 《大营销平台系统设计实现》 - 营销服务 第2节:基础层持久化数据 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★☆☆☆ +- **本章重点**:学会拉分支、合并、提交,完成 ORM 持久化数据库连接使用。并有一些idea编码技巧。 +- **课程视频**:[https://t.zsxq.com/15syTMVdU](https://t.zsxq.com/15syTMVdU) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在这一章节,我们把前面通过分析、设计的库表落到工程中编写,让工程可以对接到数据库。此外本节还有拉分支、合并、提交的处理。小伙伴在学习的过程也能积累这些技能的使用。 + +## 二、内容说明 + +本节小傅哥会带着通过开发 ORM 部分的基本操作,顺带着教会大家完成分支的拉取、合并、提交。 + +++ +- 分支的拉取是非常重要的操作,千万不要一个 master 直接梭哈到底。尤其是很多伙伴,写代码的时候,一个功能验证通过,但后面的一堆流程开发后,代码跑不了了。也不知道从哪出的问题。 +- 持久化对象、mapper xml 编写,会有一些 idea 操作的技巧。另外像大厂开发中,并不希望研发通过自动生成的代码进行使用,因为自动生成会有很多无用的代码,有时候有些sql的操作,太通用性也不行,容易出事故。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\25430\350\212\202\357\274\232\345\210\206\345\270\203\345\274\217\345\212\250\346\200\201\351\231\220\346\265\201\345\222\214\347\206\224\346\226\255.md" "b/docs/md/project/big-market/api/\347\254\25430\350\212\202\357\274\232\345\210\206\345\270\203\345\274\217\345\212\250\346\200\201\351\231\220\346\265\201\345\222\214\347\206\224\346\226\255.md" new file mode 100644 index 000000000..2508c5038 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25430\350\212\202\357\274\232\345\210\206\345\270\203\345\274\217\345\212\250\346\200\201\351\231\220\346\265\201\345\222\214\347\206\224\346\226\255.md" @@ -0,0 +1,35 @@ +--- +title: 第30节:分布式动态限流和熔断 +pay: https://t.zsxq.com/8HkZf +--- + +# 《大营销平台系统设计实现》 - 营销服务 第30节:分布式动态限流和熔断 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:增加动态黑名单限流组件,通过访问动态限制将限流用户24H存入本地缓存,通过统一 Dcc 全局配置控制使用。 +- **课程视频**:[https://t.zsxq.com/Uklsj](https://t.zsxq.com/Uklsj) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +增加动态黑名单限流组件,通过访问动态限制将限流用户24H存入本地缓存,通过统一 Dcc 全局配置控制使用。并在方法上引入接口超时熔断组件。这两个东西都是分布式架构场景非常常用的手段。也经常在面试中提问,你的接口是如何保证可用性的,有什么手段对频繁访问的用户做出拦截处理。以及超时后的处理。 + +## 二、业务流程 + +如图,限流熔断组件实现方案; + +++ +在上一节通过 Zookeeper 实现的动态配置中心 @DCC 服务下,对新增加 RateLimiter 动态限流黑名单服务提供控制管理。 + +- 首先,因为我们引入切面了,那么上一节 @DCC 直接获取类操作属性的梳理就要考虑代理类的存在了。因为这时候被切面管理的类,在 Spring 中是一个代理对象,而不是原始对象,所以本节还涉及了 DCC 代码的处理。 +- 之后,本节要增加的是 RateLimiter 限流,当一个用户频繁访问超过N次后,则会将这个用户加入黑名单列表,不允许在访问当前服务。直至过了超时时间从黑名单列表移走后才允许访问。 +- 另外,本节还引入了接口超时熔断组件。降级、熔断、限流,这也是一套分布式微服务非常重要的手段。 diff --git "a/docs/md/project/big-market/api/\347\254\25431\350\212\202\357\274\232\345\210\206\345\272\223\345\210\206\350\241\250\346\225\260\346\215\256\345\220\214\346\255\245ES.md" "b/docs/md/project/big-market/api/\347\254\25431\350\212\202\357\274\232\345\210\206\345\272\223\345\210\206\350\241\250\346\225\260\346\215\256\345\220\214\346\255\245ES.md" new file mode 100644 index 000000000..392bca082 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25431\350\212\202\357\274\232\345\210\206\345\272\223\345\210\206\350\241\250\346\225\260\346\215\256\345\220\214\346\255\245ES.md" @@ -0,0 +1,35 @@ +--- +title: 第31节:分库分表数据同步ES +pay: https://t.zsxq.com/wMTQn +--- + +# 《大营销平台系统设计实现》 - 营销服务 第31节:分库分表数据同步ES + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:为分库分表搭建 canal 数据同步 ElasticSearch 文件操作。 +- **课程视频**:[https://t.zsxq.com/5O0SI](https://t.zsxq.com/5O0SI) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +对于C端的场景来说,我们经常会采用分库分表的方案承载数据流量的压力,以用户ID为切分键,让用户的行为数据分散到各个库表中。那么在C端除了给用户提供数据服务以外,还需要给运营提供数据,但分库分表后的数据都已经散列到各个库表了,对于聚合查询就变得复杂,所以我们还需要另外一套方案。就是把分散在各个数据库表的数据,通过使用 canal 组件,基于 binlog 日志,把数据同步到 ElasticSearch 文件服务中再提供使用。 + +## 二、组件介绍 + +++ +canal ,译为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费。 + +早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同步的业务需求,实现方式主要是基于业务 trigger 获取增量变更。从 2010 年开始,业务逐步尝试数据库日志解析获取增量变更进行同步,由此衍生出了大量的数据库增量订阅和消费业务。 + +它的工作原理是,canal 模拟 MySQL slave 的交互协议,伪装自己为 MySQL slave ,向 MySQL master 发送dump 协议。在 MySQL master 收到 dump 请求,开始推送 binary log 给 slave (即 canal ) 这样 canal 再解析 binary log (binlog)进行配置分发,同步到 Elasticsearch 等系统中进行使用。 + +那么有了 canal 就可以把分库分表的数据同步到 Elasticsearch,提供汇总查询和聚合操作,也就不需要把轮训每个分库分表数据了。 diff --git "a/docs/md/project/big-market/api/\347\254\25432\350\212\202\357\274\232ES-ORM\345\244\232\346\225\260\346\215\256\346\272\220\351\205\215\347\275\256\344\275\277\347\224\250.md" "b/docs/md/project/big-market/api/\347\254\25432\350\212\202\357\274\232ES-ORM\345\244\232\346\225\260\346\215\256\346\272\220\351\205\215\347\275\256\344\275\277\347\224\250.md" new file mode 100644 index 000000000..e699a6219 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25432\350\212\202\357\274\232ES-ORM\345\244\232\346\225\260\346\215\256\346\272\220\351\205\215\347\275\256\344\275\277\347\224\250.md" @@ -0,0 +1,32 @@ +--- +title: 第32节:ES-ORM多数据源配置使用 +pay: https://t.zsxq.com/l032Y +--- + +# 《大营销平台系统设计实现》 - 营销服务 第32节:ES-ORM多数据源配置使用 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:为工程提供多数据源配置,可以同时支持操作 MySQL 和 ElasticSearch +- **课程视频**:[https://t.zsxq.com/q1RFi](https://t.zsxq.com/q1RFi) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +首先是目前已经在 MySQL 分库分表使用的基础上,加入了 canal 组件通过 binlog 日志把分库分表的数据同步 ElasticSearch 文件系统,那么接下来我们就需要让应用程序可以从 ElasticSearch 查询数据。也就是如何处理一个应用中多数据源的使用,同时要简化使用。另外因为工程的基础设施层越来越多内容了,我们要一点小的结构调整。 + +## 二、业务流程 + +让一套应用支持多套数据源使用; + +++ +- 分库分表是对C端用户的,所有的C端行为一定是有用户ID的。 +- canal 同步 ElasticSearch 是为了给运营端做数据聚合查询的,一般这类的查询是不做核心业务的,因为同步是有时效性的。 diff --git "a/docs/md/project/big-market/api/\347\254\25433\350\212\202\357\274\232xxl-job\345\210\206\345\270\203\345\274\217\344\273\273\345\212\241\350\260\203\345\272\246.md" "b/docs/md/project/big-market/api/\347\254\25433\350\212\202\357\274\232xxl-job\345\210\206\345\270\203\345\274\217\344\273\273\345\212\241\350\260\203\345\272\246.md" new file mode 100644 index 000000000..b04153e22 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\25433\350\212\202\357\274\232xxl-job\345\210\206\345\270\203\345\274\217\344\273\273\345\212\241\350\260\203\345\272\246.md" @@ -0,0 +1,45 @@ +--- +title: 第33节:xxl-job分布式任务调度 +pay: https://t.zsxq.com/nOA6K +--- + +# 《大营销平台系统设计实现》 - 营销服务 第33节:xxl-job分布式任务调度 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:为工程提供多数据源配置,可以同时支持操作 MySQL 和 ElasticSearch +- **课程视频**:[https://t.zsxq.com/N2eo4](https://t.zsxq.com/N2eo4) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 零、优化调整 + +- fix-240807-xfg-clear-queue-by-sku 分支增加了指定sku的使用,而不是使用一个队列。 +- fix-240608-xfg-decr-zero 优化扣减中0的对比。 +- feat-240809-xfg-zookeeper-enable 增加可对 Zookeeper 关闭的处理,在 yml 中配置(zookeeper.sdk.config.enable)。便于大家在测试时快速启动。 +- dubbo yml 配置,修改为 N/A 屏蔽掉 nacos 注册,便于本地快速测试。 + +## 一、本章诉求 + +增加 xxl-job 分布式任务调度服务,处理大营销中;`发送MQ消息任务队列`、`更新活动sku库存任务`、`更新奖品库存任务`定时任务。同时因为整个大营销是分布式部署,一套 big-market 会被多个应用实例一起部署,那么就会有多个实例上相同的一个任务要执行,这个时候需要增加抢占式锁,避免造成重复执行。重复执行可能导致无效的扫库或者重复发送MQ消息。 + +## 二、业务流程 + +通过xxl-job管理分布式应用任务; + +++ +XXL-JOB 是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。 + +- big-market 01、big-market 02、big-market 03,举例分布式部署,也可以是更多的部署实例。 +- 每个应用实例都是相同的任务,这些任务增加了 redis 分布式锁抢占,避免所有任务都被同时执行。加了锁以后,同一时间只能一个实例上执行任务。 +- 但不能为了只有一个执行而部署一套,部署多套的用途是为了互备,如果一个挂了还有其他的任务可以执行。这个就是分布式架构高可用的设计思路。 + +>**对 xxl-job 学习**:[https://bugstack.cn/md/road-map/quartz.html](https://bugstack.cn/md/road-map/quartz.html) - 小白伙伴可以看下这套内容补充学习任务调度,包括;环境安装、执行器管理、任务配置等。 + diff --git "a/docs/md/project/big-market/api/\347\254\2543\350\212\202\357\274\232\347\255\226\347\225\245\346\246\202\347\216\207\350\243\205\351\205\215\345\244\204\347\220\206.md" "b/docs/md/project/big-market/api/\347\254\2543\350\212\202\357\274\232\347\255\226\347\225\245\346\246\202\347\216\207\350\243\205\351\205\215\345\244\204\347\220\206.md" new file mode 100644 index 000000000..5365cbbbb --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2543\350\212\202\357\274\232\347\255\226\347\225\245\346\246\202\347\216\207\350\243\205\351\205\215\345\244\204\347\220\206.md" @@ -0,0 +1,44 @@ +--- +title: 第3节:策略概率装配处理 +pay: https://t.zsxq.com/153HMmsaI +--- + +# 《大营销平台系统设计实现》 - 营销服务 第3节:策略概率装配处理 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★☆☆☆ +- **本章重点**:通过策略ID检索数据库策略配置,并根据策略配置的概率计算出占比值,初始化到 Redis 服务中。完成简单的随机抽奖。 +- **课程视频**:[https://t.zsxq.com/15px0hyMb](https://t.zsxq.com/15px0hyMb) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +从这一章节开始,小傅哥会带着大家正式进行需求的开发实现。我们会先梳理出业务流程,并不断的实现各个模块流程的功能。这包括本节要实现的抽奖策略的装配,这个过程中会需要用到数据库查询、策略值计算、Redis Map 数据存储。也会在这个过程中体现出 DDD 分层架构下的开发实现方式。 + +## 二、需求介绍 + +### 1. 流程梳理 + +以用户为视角下,先进行整个流程的梳理。【如图】 + +++ +整个过程会包括;抽奖策略、策略奖品、策略规则、奖品发放这些核心流程模块的使用。大家在看这个图的时候,可以配合着库表进行思考。在本节小傅哥会带着大家先实现抽奖策略的装配,用于后续抽奖时进行使用。 + +### 2. 算法说明 + +两种抽奖算法方式; + ++
++ +- 可以根据概率值,来创建出累加的范围。如A是占10个,B的范围就是从10+40到50个,就是B。依次类推。当抽奖活动的随机值,就可以在这些区间内循环对比。 +- 另外一种是存放到Map中,用空间换时间。这样在抽奖的时候,把随机值当索引使用,可以直接获取到对应的奖品结果。本节我们来实现第二种方式。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\2544\350\212\202\357\274\232\347\255\226\347\225\245\346\235\203\351\207\215\346\246\202\347\216\207\350\243\205\351\205\215.md" "b/docs/md/project/big-market/api/\347\254\2544\350\212\202\357\274\232\347\255\226\347\225\245\346\235\203\351\207\215\346\246\202\347\216\207\350\243\205\351\205\215.md" new file mode 100644 index 000000000..2f6a4a712 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2544\350\212\202\357\274\232\347\255\226\347\225\245\346\235\203\351\207\215\346\246\202\347\216\207\350\243\205\351\205\215.md" @@ -0,0 +1,33 @@ +--- +title: 第4节:策略权重概率装配 +pay: https://t.zsxq.com/15sgc1lE4 +--- + +# 《大营销平台系统设计实现》 - 营销服务 第4节:策略权重概率装配 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★☆☆☆ +- **本章重点**:增强抽奖策略装配,实现权重策略的处理。用于满足抽奖中支持不同阶梯所能抽奖范围的处理。 +- **课程视频**:[https://t.zsxq.com/15oWhbN0c](https://t.zsxq.com/15oWhbN0c) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在大营销平台的抽奖子模块中,需要满足用户抽奖N积分后,可中奖范围的设定。也就是说你总共消耗了6000积分抽奖了,那么接下来的抽奖就会有圈定到固定的奖品范围,不会让用户再抽到过低价值的奖品。那么这就需要我们在设计系统实现的时候,处理下不同策略规则权重的概率装配。 + +## 二、流程设计 + +在流程实现中,我们需要结合上一节中的整体概率装配,按照接口单一原则进行拆分出装配和使用。之后在装配接口中重构装配操作,满足对权重策略的装配处理。—— 这里会在实体对象中填充充血方法。 + +++ +- 集合着梳理的系统设计流程,将后续需要用到的权重抽奖规则,进行提前装配处理。 +- 所有装配的数据都会存放到 Redis Map 数据结构下。对于权重的策略装配为策略ID+权重值组合。 +- 最终用户在从装配的工厂中执行抽奖的时候,则可以通过`策略ID抽奖`和`策略ID+权重值组合`的方式抽奖。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\2545\350\212\202\357\274\232\346\212\275\345\245\226\345\211\215\347\275\256\350\247\204\345\210\231\350\277\207\346\273\244.md" "b/docs/md/project/big-market/api/\347\254\2545\350\212\202\357\274\232\346\212\275\345\245\226\345\211\215\347\275\256\350\247\204\345\210\231\350\277\207\346\273\244.md" new file mode 100644 index 000000000..ba7e9271b --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2545\350\212\202\357\274\232\346\212\275\345\245\226\345\211\215\347\275\256\350\247\204\345\210\231\350\277\207\346\273\244.md" @@ -0,0 +1,34 @@ +--- +title: 第5节:抽奖前置规则过滤 +pay: https://t.zsxq.com/16kDhiEHg +--- + +# 《大营销平台系统设计实现》 - 营销服务 第5节:抽奖前置规则过滤 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:实现抽奖前置权重和黑名单规则,在用户抽奖前进行规则过滤。本节会使用到模板模式、策略模式、工厂模式,来实现功能。 +- **课程视频**:[https://t.zsxq.com/16dJZhoR0](https://t.zsxq.com/16dJZhoR0) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在我们的流程设计中,用户执行抽奖时会判断是否已经超过N积分,如果超过N积分则可以在限定范围内进行抽奖。同时如果用户是黑名单范围的羊毛党用户,则只返回固定的奖品ID。 + +这一章节的实现中则会涉及到工厂和策略定义出来的规则模型,并满足后续的规则扩展。再通模板模式定义出抽奖的基本过程,来使用抽奖规则。 + +## 二、流程设计 + +在流程实现中,我们需要按照规则和抽奖,两个部分的功能进行边界拆分。这样可以满足后续功能的扩展添加,不至于影响全部流程的。 + +++ +- 整个规则来说,分为抽奖前、抽奖中、抽奖后,三个阶段执行。本节我们先来处理抽奖前的规则。 +- 在工程分包上,需要添加 rule 来处理抽奖规则,在添加 raffle 处理抽奖过程。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\2546\350\212\202\357\274\232\346\212\275\345\245\226\345\220\216\347\275\256\350\247\204\345\210\231\350\277\207\346\273\244.md" "b/docs/md/project/big-market/api/\347\254\2546\350\212\202\357\274\232\346\212\275\345\245\226\345\220\216\347\275\256\350\247\204\345\210\231\350\277\207\346\273\244.md" new file mode 100644 index 000000000..3d6a4a4e1 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2546\350\212\202\357\274\232\346\212\275\345\245\226\345\220\216\347\275\256\350\247\204\345\210\231\350\277\207\346\273\244.md" @@ -0,0 +1,37 @@ +--- +title: 第6节:抽奖中置规则过滤 +pay: https://t.zsxq.com/16URAPPW6 +--- + +# 《大营销平台系统设计实现》 - 营销服务 第6节:抽奖中置规则过滤 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:添加抽奖中规则过滤,主要为处理用户抽中某个奖品后,但该奖品配置有已抽奖n后解锁的限制条件。 +- **课程视频**:[https://t.zsxq.com/16m3EJA0G](https://t.zsxq.com/16m3EJA0G) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在实际的公司级别的项目中,抽奖是一个非常复杂的营销活动过程,尤其是类似拼多多这样的电商平台,对于抽奖的场景应用更是多样。 + +一般产品在运营一段时间抽奖系统后,就会思考🤔怎么能刺激用户更多的消耗手里的积分。频次更高的参与抽奖。这个时候产品就会从抽奖的行为上下手,比如;一个用户最开始前三次抽奖,能抽奖的范围为1-6个奖品,当抽奖3次后解锁1-7、抽奖6次后解锁1-9这样一个处理。那么用户已经抽奖一次,就会想着在抽奖下好增加抽奖奖品的范围。从而更多的消耗用户积分。 + +所以我们在设计抽奖的系统的时候,要时刻记住松耦合。就像 Spring 源码中拆解一个 Bean 对象为不同阶段一样,我们这里也把抽奖拆解为不同时间段的过程,以用于可以在各个节点添加所需的功能流程。这样的设计也就更加便于后续的功能迭代了。否则一些小卡拉米的设计,会导致每次需求迭代山崩地裂一样。 + +## 二、流程设计 + +在流程实现中,设计出抽奖的前中后置过程,并在每个阶段设计对应的操作规则。当你这样设计以后,你会发现整个抽奖功能实现变得非常灵活好扩展。 + +++ +- 在上一节中,小傅哥已经带着大家实现了规则实现的框架,本节可以继续在已有的规则模型结构加,添加新的规则。不过我们需要标记出规则的前中后标记【DefaultLogicFactory#LogicModel】,便于使用。 +- 本节扩展如图黄色部分「次数过滤」,这个规则的作用是为任何一个奖品配置抽奖抽奖n次后解锁的操作。这个配置就是图中数据库内的配置。 +- 后续在实现图中抽奖后的规则处理。 diff --git "a/docs/md/project/big-market/api/\347\254\2547\350\212\202\357\274\232\350\264\243\344\273\273\351\223\276\346\250\241\345\274\217\345\244\204\347\220\206\346\212\275\345\245\226\350\247\204\345\210\231.md" "b/docs/md/project/big-market/api/\347\254\2547\350\212\202\357\274\232\350\264\243\344\273\273\351\223\276\346\250\241\345\274\217\345\244\204\347\220\206\346\212\275\345\245\226\350\247\204\345\210\231.md" new file mode 100644 index 000000000..0da29fdf8 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2547\350\212\202\357\274\232\350\264\243\344\273\273\351\223\276\346\250\241\345\274\217\345\244\204\347\220\206\346\212\275\345\245\226\350\247\204\345\210\231.md" @@ -0,0 +1,33 @@ +--- +title: 第7节:责任链模式处理抽奖规则 +pay: https://t.zsxq.com/16bYtiXK2 +--- + +# 《大营销平台系统设计实现》 - 营销服务 第7节:责任链模式处理抽奖规则 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:通过责任链模式解耦抽奖规则中的前置规则,让代码流程实现更加清晰。因为黑名单、权重、默认抽奖,以及以后添加的各类抽奖方式。 +- **课程视频**:[https://t.zsxq.com/162mRCX5q](https://t.zsxq.com/162mRCX5q) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +在前面的章节中,我们运用了策略模式、工厂模式、模板模式,来完成抽奖流程的定义和抽奖过程前、中、后,规则的过滤处理。但在我们规则处理的流程中,因为前置规则的校验含带了抽奖的行为处理,这样绑定到规则流程实现中会显得有些臃肿,让规则负责的事情变得更多。所以在本节小傅哥会带着大家使用责任链模式进行优化完善,让整个代码流程变得更加清晰。 + +## 二、流程设计 + +设计前我们需要思考🤔 ,抽奖的前置规则在抽奖中是一个什么行为。其实它可以被抽象为一种策略行为,比如;黑名单抽奖策略、权重抽奖策略、白名单抽奖策略等。而这些策略规则是一种互斥行为,比如走了黑名单规则,就不应该在继续走权重规则了。那么对于这样的情况,责任链的设计就更加合适了。 + +++ +- 抽象原有的抽奖前规则,为责任链处理。 +- 责任链会顺序的将责任节点,通过责任链工厂,从库中读取的到的责任节点进行顺序填充到责任链上。 +- 注意;这样的工厂方式可以更好的根据不同的策略创建出所需的责任链。属于责任链 + 工厂的组合编写方式。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\2548\350\212\202\357\274\232\346\212\275\345\245\226\350\247\204\345\210\231\346\240\221\346\250\241\345\236\213\347\273\223\346\236\204\350\256\276\350\256\241.md" "b/docs/md/project/big-market/api/\347\254\2548\350\212\202\357\274\232\346\212\275\345\245\226\350\247\204\345\210\231\346\240\221\346\250\241\345\236\213\347\273\223\346\236\204\350\256\276\350\256\241.md" new file mode 100644 index 000000000..abea46e07 --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2548\350\212\202\357\274\232\346\212\275\345\245\226\350\247\204\345\210\231\346\240\221\346\250\241\345\236\213\347\273\223\346\236\204\350\256\276\350\256\241.md" @@ -0,0 +1,37 @@ +--- +title: 第8节:抽奖规则树模型结构设计 +pay: https://t.zsxq.com/16IWY84jr +--- + +# 《大营销平台系统设计实现》 - 营销服务 第8节:抽奖规则树模型结构设计 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:针对抽奖中到抽奖后的规则衔接过滤的多样性,使用组合模式的规则树结构设计,根据配置自动完成流程调用。 +- **课程视频**:[https://t.zsxq.com/16ICK8eeS](https://t.zsxq.com/16ICK8eeS) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +本章节需要引入新的设计模式结构,解决先阶段中抽奖策略规则的中、后两部分执行问题。通过组合模式的规则引擎,让过滤节点可以满足一颗二叉树的结构,自由的组合和多分支链路的方式完成流程的处理。 + +## 二、流程设计 + +这里有一个矛盾点需要解决。对于抽奖策略的前置规则过滤是顺序一条链的,有一个成功就可以返回。比如;黑名单抽奖、权重人群抽奖、默认抽奖,总之它只能有一种情况,所以这样的流程是适合责任链的。 + +++ +那么对于抽奖中到抽奖后的规则,它是一个非多分支情况的规则过滤。单独的责任链是不能满足的,如果是拆分开抽奖中规则和抽奖后规则分阶段处理,中间单独写逻辑处理库存操作。那么是可以实现的。但这样的方式始终不够优雅,配置化的内容较低,后续的规则开发仍需要在代码上改造。所以这里小傅哥会带着大家实现一版组合模式的决策树模型设计。 + ++
++ +注意:设计模式是思想,就和学武术练太极一样,理论和实践是两回事。招式要随着场景因地制宜的变化,而不是生搬硬套一些设计模式的案例学习。 \ No newline at end of file diff --git "a/docs/md/project/big-market/api/\347\254\2549\350\212\202\357\274\232\346\250\241\346\235\277\346\250\241\345\274\217\344\270\262\350\201\224\346\212\275\345\245\226\350\247\204\345\210\231.md" "b/docs/md/project/big-market/api/\347\254\2549\350\212\202\357\274\232\346\250\241\346\235\277\346\250\241\345\274\217\344\270\262\350\201\224\346\212\275\345\245\226\350\247\204\345\210\231.md" new file mode 100644 index 000000000..7a4b3268f --- /dev/null +++ "b/docs/md/project/big-market/api/\347\254\2549\350\212\202\357\274\232\346\250\241\346\235\277\346\250\241\345\274\217\344\270\262\350\201\224\346\212\275\345\245\226\350\247\204\345\210\231.md" @@ -0,0 +1,34 @@ +--- +title: 第9节:模板模式串联抽奖规则 +pay: https://t.zsxq.com/16kAD9g7p +--- + +# 《大营销平台系统设计实现》 - 营销服务 第9节:模板模式串联抽奖规则 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +- **本章难度**:★★★☆☆ +- **本章重点**:通过模板模式,整合责任链、规则树,定义出抽奖的标准过程。以及让子类做具体调用功能实现。 +- **课程视频**:[https://t.zsxq.com/xWjte](https://t.zsxq.com/xWjte) + +**版权说明**:©本项目与星球签约合作,受[《中华人民共和国著作权法实施条例》](http://www.gov.cn/zhengce/2020-12/26/content_5573623.htm) 版权法保护,禁止任何理由和任何方式公开(public)源码、资料、视频等内容到Github、Gitee等,违反可追究进一步的法律行动。 + +## 一、本章诉求 + +通过模板模式,把上一节中规则树的结构设计,整合到抽奖过程中。这样整个抽奖策略过程会包括;责任链进行抽奖计算,基于抽奖计算结果对基础抽奖在进行规则树的过滤,最终返回抽奖结果。 + +注意:上一节是做了抽奖规则树的领域模型设计,基于这部分内容的实现本节需要把规则树和数据库关联起来 + +## 二、流程设计 + +业务项目从不是一锤子买卖,而是长周期的软件迭代。所以如果在代码中有非常多的只是配合现在功能实现的代码,那么后续的迭代会非常麻烦。所以我们在这样的功能实现时,是需要非常多的设计考虑,尽可能的拆解出稳定的结构,对于变化的内容从库表配置中读取。 + +++ +- 左侧的业务流程,可以通过抽象类定义的出调用顺序,右侧的具体操作可以放到实现了抽象类的子类来做具体实现。通过这样的方式,我们在后续看代码的时候,也能直接通过抽象类的模板结构直接知道这块的代码在做什么。而要看细节则进入到每个功能实现里去。 +- **重点**:学习编程,要从编码对业务的实现中,提炼出模型结构。这些通用的模型结构可以解决很多同类的问题。 diff --git a/docs/md/project/big-market/big-market.md b/docs/md/project/big-market/big-market.md new file mode 100644 index 000000000..1426052cb --- /dev/null +++ b/docs/md/project/big-market/big-market.md @@ -0,0 +1,153 @@ +--- +title: 大营销平台系统 +lock: no +--- + +# 《大营销平台系统》—— 小傅哥第8个项目,前后端 + Dev-Ops 的全栈式综合编程实战DDD项目! + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/14gswKIeX](https://t.zsxq.com/14gswKIeX) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + + + +大家好,我是技术UP主小傅哥。 + +💐又到了启动新项目的时候,死鬼开心嘛。小傅哥的**星球:码农会锁**,第8个应用级实战项目开启啦!—— 在这之前小傅哥已经完结了7个实战项目,可进入 [https://gaga.plus](https://gaga.plus) 嘎嘎强平台,体验项目。 + +++ +呐,接下来,小傅哥要带着大家做一个什么项目呢?🤔 + +这个新项目,结合小傅哥已经带着大家完成的 OpenAi 大模型应用业务场景,做上层的营销活动。这就像互联网公司中有了电商、外卖、出行等场景一样,在场景之上做营销活动。所以我们的新项目是 **《大营销平台系统》**!因为小傅哥的星球之前做过了一个抽奖,那么这个项目会用新的DDD架构,对抽奖系统进行重构,并扩展出`营销账户`、`用户返利`、`积分兑换`等服务,完成一整套的营销平台功能。💥 + +小傅哥把互联网中真实的场景、架构、实现,拿出来让你成体系化的学习; + ++
++ +**体验地址**:[https://openai.gaga.plus/](https://openai.gaga.plus/) - 左侧Bar,抽奖进入 + +这里抽奖模块通过RPC接口,对接到大营销平台。这里不只是抽奖,还要串联账户、奖品、返利等各项内容。接下来,小傅哥就着重介绍下这套信息项目的重点,让大家可以知道学习到哪些知识,掌握哪些技术。 + +>文末有加入学习方式,还有优惠券可以使用。先到先得! + +## 一、能学到啥 + +在各大互联网公司中,营销平台都是那个流量最大,场景最复杂的系统,也是需求迭代最多还最快系统。在这个部门的研发伙伴,谁身上都是背着“几个事故”锻炼出来的技术。所以,跟着小傅哥学习这样一套系统,是可以学习到非常多的技术。包括;—— `以往的学习,你可能有很多技术栈使用的缺失,甚至也没接触过有高质量的架构和设计模式编码。那么在折腾学习旅程中,这些内容你都将学到。` + ++
++ +- 【前端】熟练使用 React、Typescript 在前端工程中开发营销活动页。 +- 【前端】熟练掌握,跨域接口请求,以及通过浏览器指纹技术实现防刷。 +- 【前端】熟练使用,Ant Design Pro 开发后台运营管理系统。 +- 【后端】熟练搭建 DDD 工程项目、以及 DDD 脚手架搭建项目。并对 DDD 设计方法有清楚的认知。 +- 【后端】熟练掌握 Spring、SpringBoot、MyBatis 等开发框架技术,并对框架源码所提供的扩展接口具备运用能力。 +- 【后端】熟练运用分布式技术栈,包括:Dubbo、RocketMQ、Redis、XXL-JOB、Sharding-JDBC、Nacos等。 +- 【后端】熟练使用多种设计模式、设计原则,对各类场景的方案设计和落地能力,深度提高自身编码思维和开发技术能力。 +- 【后端】深度学习复杂场景的架构设计、编程思维,如果处理系统功能的边界和上下文的维护。—— 这些东西一定是从实践中才能学习到的。 +- 【后端】熟练使用 Mock 单测工具、JMeter 压测工具,增强代码交付质量。 +- 【后端】熟练掌握异常、枚举、错误码的定义和使用,并学习到如何合理打印服务日志,便于问题排查。 +- 【运维】熟练使用 Docker 在本地和服务端的配置和部署应用,以及在本地构建前后端镜像。 +- 【运维】熟练掌握 Git、GitCode,对工程代码的管理,推送、拉取、切换分支、合并代码等操作。 +- 【运维】熟练使用 Nginx 配置转发服务,并能申请ssl配置https服务。 +- 【运维】熟练使用 Grafana 监控系统,对系统的 JVM、磁盘、Tomcat、应用(QPS、响应时间、调用量)完整监控。 + +此外,小傅哥会把系统开发过程中的思考、设计、编码,录制⏺成完整的视频,让大家可以学习到的更多、更细、更深! + +>像这样的营销复杂场景项目,势必会引入相关分布式技术栈的使用。并且营销会根据业务流程拆解出对应的微服务系统,包括;券、活动、拉新、抽奖、积分、兑换、灌券、返利等各个平台,这些微服务间通过 RPC 进行通信。又使用 MQ 解耦、任务补偿,以确保微服务内事务一致性,微服务外最终一致性。 + +## 二、项目介绍 + +本次项目是一个包括 `前后端 + Dev-Ops` 的全栈式综合编程实战项目,基于 React + SpringBoot + 分布式技术栈 + Nginx + Grafana + Docker 云服务,开发、部署、上线、监控的《大营销平台系统》项目。 + +大营销平台项目属于营销组最为核心的项目,承接流量最大、系统设计最复杂、需求迭代最多,也是最容易出事故的组。🤨**在这个组1年的技术成长 = 其他组3年!** + +营销组的项目是最早触达用户的,打开页面、优惠选券、组合支付、积分活动、分享收益、拉新返现等,都是先进入营销系统,完成相关的动作才是商品的选择和支付。你几乎能在购物、出行、金融、音视频娱乐中,都有对应的营销玩法活动。所以这块系统`流量最大`、`需求最多`、`功能最复杂`!—— **每个公司都有营销组在加班!💐** + +抖音、京东、滴滴、拼多多,都有这样的项目; + ++
++ +虽然需求杂,需求多,但这样部门组里的项目是非常锻炼人的。所以小傅哥这次也开启了一个 **《大营销平台项目》** 带着你一起学习复杂的场景架构设计和高级编码落地经验。完全从0到1,手把手的带着你思考、设计、编码,完成项目! + + +### 1. 业务核心流程 + ++
++ + +### 2. 模型设计高质量 + ++
++ +### 3. 系统工程规范化 + ++
++ +### 4. 单一职责抽象化 + ++
++ ++
++ +### 5. 设计模式场景化 + ++
++ +### 6. 项目工程列表 + ++
++ +### 7. 业务监控示例 + ++
++ +- 目前是 OpenAi 业务系统监控,大营销平台系统上线后,会把这部分监控一起添加上。 +- 项目,只有上线 。你才会注意到很多的细节,就像 Tomcat 的最大连接数,如果不开发超时熔断,在接口异常超时等待的情况,就有可能把连接数打满。 + +## 三、项目大纲 + +不同于网上的小Demo项目,这个项目的场景来自于互联网真实业务需求,一个个章节、一步步流程的带着大家从0到1,需求分析、工程设计和代码实现。是一个纯手把手教大家学习实战技术的项目! + ++
++ +课程包括;视频、小册、1 对 1 答疑解惑、专属VIP项目交流群,并且提供简历编写模板结构的一条龙🐲服务。让你学习后,直接拉开与还在玩具项目其他人的差距,面试脱颖而出提高竞争力!!! + +## 四、加入学习 + +**注意**📢,本项目也只是【星球:码农会锁】众多项目中的1个,其他的项目还包括:OpenAi大模型应用项目、API网关、Lottery抽奖、IM通信、SpringBoot Starter 组件开发、IDEA Plugin 插件开发等,并还有开源项目学习。 + +如果大家希望通过做有价值的编程项目,提高自己的编程思维和编码能力,可以加入小傅哥的【星球:码农会锁】。加入后解锁🔓所有往期项目,还可以学习后续新开发的项目。 + +>这样一套项目,放在一些平台售卖,一个至少都是几百上千。但小傅哥的星球,只需要100多,就可以获得全部的学习项目 [https://gaga.plus](https://gaga.plus)! + +[🧧加入学习](https://bugstack.cn/md/zsxq/other/join.html) **加入星球**:下载`星球APP`,从星球【课程入口】进入。里面有完整的学习指引,包括;使用说明、代码仓库、专属项目群、学习路线、往期项目。 + diff --git a/docs/md/project/big-market/ddd.md b/docs/md/project/big-market/ddd.md new file mode 100644 index 000000000..c761a139c --- /dev/null +++ b/docs/md/project/big-market/ddd.md @@ -0,0 +1,216 @@ +--- +title: 架构:DDD 领域驱动设计 +lock: no +--- + +# 架构:DDD 领域驱动设计,战略、战术、战役,落地指引规范。 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) +
课程:[https://t.zsxq.com/14gswKIeX](https://t.zsxq.com/14gswKIeX) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + + + +大家好,我是技术UP主小傅哥。 + +👨🏻💻 经过5.1假期的一顿框框输出,终于完成了[《大营销项目》](https://bugstack.cn/md/project/big-market/big-market.html)第二阶段的开发和上线,体验地址:[https://gaga.plus](https://gaga.plus) 有了这个项目的落地,也终于可以给大家完整的梳理出一套 DDD 落地指引规范。包括;战略、战术、战役,各个阶段都要做什么,`怎么做风暴模型和四色建模`。有了这套东西参考,小白也能目标明确的做 DDD 项目开发啦! + +++ +**我一直讲,要先实践,再理论!** + +编程,偏理科的东西要先上手实践,再做理论理解。因为所有的理论提出,也都是建立有了实践结果后,抽象出来的理论。但你上来就要用理论去反推结果,并不是一件容易的事情。就像不少的 DDD 文章,往往会用一个理论,去讲另外一个理论,这也导致很多没有实践过的小白伙伴,压根不知道讲的是什么。最终觉得 DDD 太难! + +所以在近2年的时间里,小傅哥分享了非常多的 DDD 实践内容,包括;DDD 工程结构&脚手架、各项分布式技术栈在 DDD 结构下的使用、DDD 实战项目&小场景训练。这些内容都可以在 [bugstack.cn](https://bugstack.cn) 学习。 + +接下来,小傅哥会带着你走一遍`研发设计评审`,讲解 DDD 落地项目的全部过程。 + +>文末有对应本项目的 DDD 工程代码地址,理论 + 代码 + 视频,学的嘎嘎透彻! + +## 一、战略、战术、战役 + +首先 DDD 是一种软件设计方法,[Domain-driven design (DDD) is a major software design approach.](https://en.wikipedia.org/wiki/Domain-driven_design) 来自维基百科。软件设计方法涵盖了;范式、模型、框架、方法论,主要活动包括建模、测试、工程、开发、部署、维护。来自维基百科的[软件设计](https://en.wikipedia.org/wiki/Software_design)涵盖信息介绍。 + +在 DDD 领域驱动设计中,常提到`战略`、`战术`,和一少部分会讲到`战役`。这3个词主要讲的是不同的开发阶段所需要完成的事项; + +- 战略 - 建模;领域划分、界限上下文、核心领域 +- 战术 - 架构;工程结构、领域对象、领域服务、领域事件 +- 战役 - 编码;设计原则、设计模式 + +DDD 的战略、战术和战役设计相辅相成,战略提供系统的建模作为宏观指导,战术下面有N个战役,两者则关注具体的实现和编码落地。 + +在维基百科中有不少 DDD 非常好的资料,其中一个是关于事件风暴的,讲解了执行战略设计中风暴模型的步骤。 + ++
++ +>有了这基础认知,接下来我们通过《大营销项目》从需求到设计,一步步了解系统的领域驱动设计。 + +## 二、产品需求 + +### 1. 产品诉求 + +如图,是一个复杂的营销抽奖场景玩法需求,涵盖了;`活动配置`、`签到&奖励`、`活动账户`、`抽奖策略「责任链+规则树」`、`库存扣减`、`抽奖满N次后阶梯抽奖`等。面对这样的复杂系统,非常适合使用 DDD 落地。 + ++
++ +分析需求; + +1. 整体概率相加,总和为1或者分值计算,概率范围千分位 +2. 抽奖为免费抽奖次数 + 用户消耗个人积分抽奖 +3. 抽奖活动可给用户分配可抽奖次数,通过点击签到发放 +4. 活动延伸配置用户库存消耗管理,单独提供表配置各类库存 + 用户可用总库存、用户可用日库存 +5. 部分抽奖规则,需要抽奖n次后解锁,才能有机会抽取 +6. 抽奖完成增加(运气值/积分值/抽奖次数)记录,让用户获得奖品。 +7. 奖品对接,自身的积分、内部系统的奖品 +8. 随机积分,发给你积分。 +9. 黑名单用户抽奖,则给予固定的奖品。 + +### 2. 业务流程 + +依照于产品需求,在产品的 PRD 文档中还会绘制出业务流程图。产品的流程图会比较粗一些,研发后期需要根据产品的 PRD 文档做具体的设计。 + ++
++ +- 产品经理会详细的介绍整个系统的功能流程和需要对接接口文档。 +- 以上就是以用户旅程为维度,从点击签到获得活动账户额度,再到一些列抽奖、抽奖策略、中奖结果和奖品发放的流程。 + +## 三、系统架构 + +如果首次承接的是一个新的系统,还需要对系统进行架构设计,是单体架构还是分布式架构,以及所要用到的技术栈。最好在提供好相关的落地案例和DDD脚手架。—— 没有这些东西,就想说点理论,就让团队用DDD写代码,那就是天方夜谭!*你都没写出DDD代码,兄弟👬🏻哪里去复制!* + +**资料**:—— 详细介绍了 DDD 落地的案例和通用的脚手架。 +- DDD 架构:[https://bugstack.cn/md/road-map/ddd.html](https://bugstack.cn/md/road-map/ddd.html) +- MVC2DDD:[https://bugstack.cn/md/road-map/mvc2ddd.html](https://bugstack.cn/md/road-map/mvc2ddd.html) +- DDD 脚手架:[https://bugstack.cn/md/road-map/ddd-archetype-maven.html](https://bugstack.cn/md/road-map/ddd-archetype-maven.html) + +### 1. 分布式架构 + ++
++ +### 2. 分布式技术 + ++
++ +## 四、战略设计 + +不少伙伴,都讲过不知道怎么开始 DDD,主要是拿到一个需求,不知道从哪下手,也不知道那些领域的模型是怎么弄出来的。好,这次小傅哥就给你整个完整的案例,告诉你如何开始。 + +### 1. 用例图 + +根据业务需求画系统用例图; + ++
++ +- 用例图(英语:use case diagram)是用户与系统交互的最简表示形式,展现了用户和与他相关的用例之间的关系。通过用例图,人们可以获知系统不同种类的用户和用例。用例图也经常和其他图表配合使用。 +- 用例图,也可以等同于是用户故事(英语:User story)(软件开发和项目管理中的常用术语),主旨是以日常语言或商务用语撰写句子,是一段简单的功能表述。以客户或使用者的观点撰写下有价值的功能、引导、框架来与使用者进行互动,进而推动工作进程。可以被认为是一种规格文件,但更精确而言,它代表客户的需求与方向。以该用户故事来反应对象在组织内的其工作职责、范围、需要进行的任务等。用户故事在敏捷开发方法中用来定义系统需要提供的功能和实现需求管理。 +- 尽管用例本身会涉及大量细节和各种可能性,用例图却能提纲挈领地让人了解系统概况。它为“系统做什么”提供了简化了的图形表示,因此被誉为“搭建系统的蓝图”。 + +### 2. 事件风暴定义 + +在使用 DDD 的标准对系统建模前,一堆人要先了解 DDD 的操作手段,这样才能让产品、研发、测试、运营等了解业务的伙伴,都能在同一个语言下完成系统建模。 + ++
++ +- 蓝色 - 决策命令,是用户发起的行为动作,如;开始签到、开始抽奖、查看额度等。 +- 黄色 - 领域事件,过去时态描述。如;签到完成、抽奖完成、奖品发放完成。它所阐述的都是这个领域要完成的终态。 +- 粉色 - 外部系统,如你的系统需要调用外部的接口完成流程。 +- 红色 - 业务流程,用于串联决策命令到领域事件,所实现的业务流程。一些简单的场景则直接有决策命令到领域事件就可以了。 +- 绿色 - 只读模型,做一些读取数据的动作,没有写库的操作。 +- 棕色 - 领域对象,每个决策命令的发起,都是含有一个对应的领域对象。 + +**👩🏻🏫敲黑板** 综上,左下角的示意图。就是一个用户,通过一个策略命令,使用领域对象,通过业务流程,完成2个领域事件,调用1次外部接口个过程。我们在整个 DDD 建模过程中,就是在寻找这些节点。 + +### 3. 寻找领域事件 + +接下来,大量的时间,都是在挖掘领域事件。这个过程就是一堆人头脑风暴的过程,避免错失流程节点。 + ++
++ +- 根据产品 PRD 文档,一起开会梳理有哪些领域事件。其实大多数领域事件一个人都可以想到,只是有些部分小的场景和将来可能产生的事件不一定覆盖全。所以要通过产品、测试、以及团队的架构师,一起讨论。 +- 像是整个大营销的抽奖会包括如图所列举的事件。在列举这个阶段,你用在乎格式。也可以是每个人准备好黄色便签纸,想到一个就贴到黑板上一个,只是穷举完成。—— 实际做DDD中,也是这样用便签纸贴黑板,所以用不同的颜色做区分。 + +### 4. 识别领域角色和对象 + +在确定了领域事件以后,接下来要做的就是通过决策命令串联领域事件,并填充上所需要的领域对象。这块的操作,新手可以分开处理,如先给领域事件添加决策命令、执行用户和领域对象,最后在串联流程。就像 `事件风暴定义` 中的示意一样。 + ++
++ +- 首先,通过用户的行为动作,也就是决策命令,串联到对应的领域事件上。并对复杂的流程提供出红色的业务流程。 +- 之后,为决策命令添加领域对象,每一个领域在整个流程中都起到了至关重要的作用。 + +### 5. 划分领域边界 + +有了识别出来的领域角色的流程,就可以非常容易的划分出领域边界了。先在事件风暴图上圈出领域边界,之后在单独提供领域划分。 + +#### 5.1 圈出领域 + ++
++ +#### 5.2 领域边界 + ++
++ +- 到这步咱们就可以获得整个项目中 DDD 的领域边界划分了。之后再往下就是具体的每个领域对象的详细设计和流程设计。 + +### 6. 研发详细设计 + +#### 6.1 实体对象 + ++
++ +- 你需要对每一个领域对象进行字段的详细设计。并划分出它们的上下文关系。一般在公司中,这部分设计完成,其他人也能对照你的设计进行代码开发。 + +#### 6.2 流程设计 + ++
++ +- 流程设计,就是更详细的设计了。每一步要调用到哪个系统,哪个接口,要执行什么动作就全部都有了。 + +## 五、工程实现 + +DDD 的战略设计做完,划分出领域边界以后。接下来就是要执行战术和战役了。也就是在工程中做编码实现。但一定要懂得设计原则和设计模式,否则写不出好的代码的。 + ++
++ +- 工程实现,就是在确定的框架结构中编码。可以是洋葱架构、整洁架构、菱形架构等等。这部分内容的可以通过实战项目来锻炼,获得编码技巧。 + +## 六、实战项目 + +注意📢,加入小傅哥的【星球:码农会锁】即可获得大营销项目学习,此外还包括:OpenAI 应用、API网关、Lottery抽奖、IM通信、SpringBoot Starter 组件开发、IDEA Plugin 插件开发等,并还有开源项目学习。 + +提示🔓,加入星球即可解锁全部项目,后续的新项目也可以学习。这些内容非常适合提高编程思维和编码能力。与小demo项目不同,这些内容的积累都是面试中的利器! + +> [🧧加入](https://t.zsxq.com/14gswKIeX) 这样成体系的全量项目学习,放在一些平台售卖,至少都要上千块。但小傅哥的星球,只需要100多,就可以获得大厂架构师对你手把手教学 - 项目演示地址。 diff --git a/docs/md/project/big-market/dev-ops/openai_big_market.md b/docs/md/project/big-market/dev-ops/openai_big_market.md new file mode 100644 index 000000000..24d9541ea --- /dev/null +++ b/docs/md/project/big-market/dev-ops/openai_big_market.md @@ -0,0 +1,415 @@ +--- +title: 第4节:课程完结,上线部署教程 +lock: no +--- + +# 《大营销平台系统设计实现》 - 开发运维 第4节:课程完结,上线部署教程 + +作者:小傅哥 ++
博客:[https://bugstack.cn](https://bugstack.cn) + +>沉淀、分享、成长,让自己和他人都能有所收获!😄 + +大家好,我是技术UP主小傅哥。 + +不少小伙伴在面试中总会被提问,你的微服务是哪两套项目对接,你是分布式体现在哪。好像这么一问,平时做的项目既不是微服务,也不是分布式,都不知道怎么回答啦!咋办!?🤔 + +++ +**还是别做玩具项目了!** + +要说这种级别的东西,要不是在公司里真的实践过,要不是跟着小傅哥完完全全的做过。否则还真没有这类经验,很多市面的CRUD项目都是一个个孤岛单体,根本没有微服务对接,也谈不上分布式架构。所有的这类东西,都是真的在职场多年实践,才能一步步带着你学习掌握到! + +这次,我把两套项目完成了微服务对接,分布式架构部署。你可以完全全全的学习到这些东西到底是怎么玩的! + +>上车,这次项目做的很硬核!文末可以获取全部项目课程。 + +## 1. 效果展示 + +这是一次非常庞大的系统开发实践,学习这样一套东西,可以全面的提高个人综合技术实战能力。了解业务、懂得架构、提到思维、锻炼编码。一个个场景的解决方案,一个个设计模式的实践运用。 + ++
++ +- 地址:[https://openai.gaga.plus/](https://openai.gaga.plus/) - 侧边栏,点击兑换、购物、营销。 +- 说明:你可以体验 OpenAI 兑换、抽奖、兑换、签到等各个功能。这些也都各个互联网公司C端场景的产品设计。 + +>接下来是一整套的项目的部署执行过程,公司中大家上线,对于中大型项目和需求,也会列出明确的上线执行步骤。 + +## 2. 部署结构 + +### 2.1 微服务&分布式 + ++
++ +- 微服务:一套 OpenAi chatgpt-data 后端应用,一套 big-market 后端应用,两套微服务。 +- 分布式:Nginx 负载 http,大营销负载 rpc,支持多实例部署,mq 消息解耦流程、xxl-job 任务驱动、redis 缓存预热数据。分库分表、canal 完成数据的分离和聚合。 + +### 2.2 分层部署关系 + ++
++ +- 从底层往上,依次是[服务器(4c16g)](http://618.gaga.plus/)、部署环境、应用环境、上线配置、应用构建、参数配置,之后就是执行应用启动啦。 +- 接下来我们的部署,也会做这些操作。 + +## 3. 环境诉求 + +>为了方便大家完成项目的部署,这里采用了 Linux 服务器直接搭建构建环境的方式进行处理。在以下操作中你可以把 Linux 当做一台本地的电脑进行使用。只不过都是命令方式操作。 + +本节需要在一台服务器上,部署分布式技术栈(nacos、mysql、redis、xxl-job、rabbitmq、Zookeeper等),2套 big-market 大营销后台(rpc 负载)、1套 chatgpt-data 后端、1套 chatgpt-web 前端。 + +1. 推荐 `4c16g` 服务器 3个月:https://618.gaga.plus - `158元(续费同价)`,这个价格比较适合临时做测试验证。【占用在12g+】 +2. docker、portainer - `在 bugstack.cn 路书中有安装教程` +3. jdk 1.8、maven 3.8.8、git,课程提供了安装部署视频 +4. Git使用教程:[https://bugstack.cn/md/road-map/git.html](https://bugstack.cn/md/road-map/git.html) +5. 申请微信公众号测试平台:[https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index](https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index) - 需要申请。 +6. 智谱AI,申请Key:[https://bigmodel.cn/usercenter/apikeys](https://bigmodel.cn/usercenter/apikeys) - OpenAI 项目会使用到 + ++
++ +- 脚本:[https://gitcode.net/KnowledgePlanet/big-market/big-market-dev-ops](https://gitcode.net/KnowledgePlanet/big-market/big-market-dev-ops) +- 说明:这里小傅哥已经分各个阶段给大家提供好了部署脚本,你可以参照使用。在 mysql 包下,已经提供了本次项目部署所需的 sql 初始化文件。 + +**docker 镜像推荐** + +```java +# 清空 /etc/docker/daemon.json 文件,准备写入新内容 +echo >/etc/docker/daemon.json + +# 使用 cat 命令将以下内容写入 /etc/docker/daemon.json 文件 +# 配置 Docker 镜像加速器,使用多个镜像源来提高镜像下载速度 +cat >/etc/docker/daemon.json <+
+ +
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+