当我写了一个简单的demo复刻了培训机构卖5000+的AI项目

674 阅读6分钟

引言

前几天在刷抖音的时候看到了一个培训机构xx课堂,在宣传他们新的课程,经典的宣传话术,前沿技术,企业真实项目,于是我就加了他们的宣传群,他们会在群里发一些截图,基本上是这个项目的一些运行截图,和功能展示点,下面的截图就是他们的宣传话术

b43525913f974f2472d155777967c7d.jpg

加上之前他发的一些运行截图和官网的宣传话术,我发现这个就是一个用langchin框架实现了AI模块,有rag和一些比如function calling这样功能的一个网盘项目。

由于最近看了一下Spring ai alibaba框架,发现是可以写一个简单的demo复刻一下的,就开始了我的复刻,由于笔者的水平有限,时间有限(其实是懒哈哈),就写了一些简单的可以实现的功能。

demo

一,存储模块

因为这是一个网盘项目,这种网盘类的项目,在gitee和github上都有很多开源的网盘项目,各种语言实现的都有,比如qiwen-file: 【奇文网盘】基于Spring Boot 2 + VUE CLI@3框架开发的分布式文件管理系统--后台 所以断点续传,大文件分片上传这样的功能我就先没实现,因为我打算先写个demo,然后写这篇文章 所以这块就是使用minio作为对象存储,实现了一个拖拽上传,提供了下载,删除这些常规接口

存储.png

存储.png

存储.png

二,AI模块

AI模块我主要是通过Spring ai alibaba框架,调用通义大模型来实现的,实现了简单的流式对话,一些通过预定义prompt实现的功能,这个地方可以用现在比较火的mcp,也可以用tool callback,function calling,后面我也打算优化一下。然后rag部分也是偷了个懒,VectorStore那个地方当时实在没弄懂,后面继续优化

1,流式接口

Spring ai alibaba 封装了一个chatclient,可以用几行代码就实现一个流式接口调用

 @RequestMapping(value = "generate_stream",method = RequestMethod.GET)
    public Flux<ChatResponse> generateStream(@RequestParam String message){
        return this.chatClient.prompt()
                .user(message)
                .stream()
                .chatResponse();
    }

流式对话页面.png

2,简单的AI工具和RAG

这两个地方其实都是偷懒了,没有用toolback包装,也没有用向量数据库存储,全用的提示词哈哈

2.1 自然语言查询系统

自然语言查询.png

这个其实实现也不是很难,没有用很复杂的包装,然后让大模型去调用,而是直接写了一段提示词,和前端透传的message拼接,放到chatclientprompt里面,而且我参考了一些智能BI工具,发现这些工具都对安全性做了一定的约束,像这样的查询,限制了只能使用select,就是只能读数据,不能进行数据的修改,并且对大模型的返回的语句进行了严格的校验,我这里知识简单的过滤一下,因为考虑到后面还要继续优化。

      String prompt = "建表语句:DROP TABLE IF EXISTS `file_reo`;\n"
            + "CREATE TABLE `file_reo`  (\n"
            + "  `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',\n"
            + "  `file_name` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '文件名',\n"
            + "  `file_type` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '文件类型',\n"
            + "  `tag` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '标签(文本,图片,视频,压缩文件,回收站)',\n"
            + "  `file_url` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NULL DEFAULT NULL COMMENT '文件存储链接',\n"
            + "  `date` date NULL DEFAULT NULL COMMENT '上传日期',\n"
            + "  PRIMARY KEY (`id` DESC) USING BTREE\n"
            + ") ENGINE = InnoDB AUTO_INCREMENT = 20 CHARACTER SET = utf8mb3 COLLATE = utf8mb3_general_ci ROW_FORMAT = Dynamic;\n"
            + "\n"
            + "SET FOREIGN_KEY_CHECKS = 1;"
            + "把这段自然语言转换为 SQL 查询(只允许 SELECT):\n问题:" + question + "\nSQL:"
            + "参考上面的建表语句和我的示例:我想查询有多少张图片,查询:select * from file_reo where tag = '图片'"
            + "最后只返回sql就可以";
        String content = chatClient.prompt()
            .user(prompt)
            .call()
            .content();

        content = content.replaceAll("(?s)```sql\\s*(.*?)\\s*```", "$1").trim();

        log.info("生成的sql:{}", content);
        
        return IDynamicSqlMapper.executeSelect(content);

2.2 CSDN发帖(内容AI生成)

这个其实做掘金和其他平台都类似,获取一下发文章的接口,然后在放文章之前用AI生成文章,放到传输的参数中,就可以实现用AI发帖,后面加上定时任务,就可以实现自动的发帖

这里我给AI输入要写文章的关键词,让他写一篇关于MCP协议的文章

对话界面.png

生成的文章.png

其实这个功能目前也就只是能演示,由于我在提示词中限制了AI的输出(现在ai输出的数据太多的话会有一个奇怪的报错),也有可能这功能不适合这样生硬的加提示词的方式来实现,并且生成的文章还是有一点问题

3,知识库(其实可以说是提示词仓库哈哈)

这个地方由于一开始用这个框架做rag的方案没弄明白,就想了一种折中的方案,用户只能上传文本,上传的文本会生成一个txt文档存储在minio中,使用的时候,会读取这个文件,然后转换成prompt让ai使用,这样问题还是有,比如你文件中的文字不能太多,不过可以勉强用~

可以先进行知识库的上传

知识库上传.png

选择上传的知识库,让ai根据知识库进行回答

ai回答.png

以上便是这个简单的demo所实现的全部功能,仓库链接贴在下面了(代码写得很烂不要喷我hh) github:一个简单的智能网盘demo

一点感想

其实这个东西就是一个demo,大概也就一个学校大作业水平,虽然学校的大作业不会用新的技术(点名批评某校别抱着jsp不撒手了,都成传家宝了)

但是为什么我想写这篇文章呢,其实是看到现在畸形的就业环境,大部分人其实都不喜欢计算机,但是为了就业去想高考一样,或者拿着高昂的学费去参加各种培训班(写这个demo主要就是为了diss培训班的过度包装)

最近在看刘未鹏大佬的博客,其中一篇怎么花两年面试一个人 大佬自己的网站现在进不去了,这个贴的是博客园上的,这篇写在2011年的文章,即便现在看也非常值得学习(这才是写博客的意义!!!)这里面几乎点明了一个应届生该怎么样成长,这样免费的资料,难道不比培训班喂到嘴里强?

或许这个时代是浮躁的,但是我们不能让时代的悲哀成为我们的悲哀,别把codeing当成一场考试,去享受这个过程吧!

介绍一下自己

我叫等闲,高考语文考了131,最后还是学了计算机,想成为一名技术人文主义者,做一名真正的软件开发工程师,共勉!