三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

从Express转向NestJS:规范架构结合LangChain开发AI服务

从Express转向NestJS:规范架构结合LangChain开发AI服务

文章目录

  • 1 为什么放着Express不用,非要折腾NestJS?
    • 1.1 俩框架到底差在哪
  • 2 三分钟搭起你的第一个NestJS项目
    • 2.1 几行命令就完事
  • 3 三个核心概念搞懂,NestJS就入门一半了
    • 3.1 模块:应用里的各个部门
    • 3.2 控制器:专门接请求的前台
    • 3.3 服务:真正埋头干活的打工人
    • 3.4 三者到底是什么关系
  • 4 别手动建文件了,CLI一键生成不香吗
  • 5 管道:数据进来的第一道安检门
    • 5.1 管道+DTO的标准三步走
    • 5.2 全局开启,一劳永逸
  • 6 请求链路上的四道关卡,别再搞混了
    • 6.1 执行顺序先记死
    • 6.2 中间件:最早的门卫大爷
    • 6.3 守卫:查权限的安检员
    • 6.4 拦截器:给结果打包的包装员
    • 6.5 一张表给你捋明白
  • 7 NestJS里的MVC,到底是怎么落地的
  • 8 模块不是只能一配一,别把自己框死
  • 9 接上LangChain,给你的后端装上AI大脑
    • 9.1 先把依赖装了
    • 9.2 注册LangChain模块
    • 9.3 在服务里直接调用AI
    • 9.4 最绝的玩法:把服务方法变成AI工具
  • 10 做AI应用的几个实战建议
  • 11 最后唠两句


P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

1 为什么放着Express不用,非要折腾NestJS?

很多人刚写Node后端,第一个碰的都是Express。

这玩意儿是真自由,文件夹想怎么建就怎么建,代码想堆在哪就堆在哪,写个小demo快得飞起。

可等项目做大、团队人一多,这份自由就成了噩梦。

新人接手项目,找个接口找半小时;改一行代码,牵一发动全身报一堆错。到最后项目成了没人敢碰的烂摊子,谁接谁倒霉。

1.1 俩框架到底差在哪

说白了,Express给你无拘无束的自由,NestJS给你条条框框的规范。

特性Express.jsNestJS
架构风格极简、无固定模式模块化、分层架构
TypeScript支持手动配置半天原生支持,开箱即用
依赖注入自己手动引,引到晕内置DI容器,要啥给啥
代码组织开发者随便造模块系统强制规范
可维护性小项目爽,大项目炸天生适配大型项目

尤其是做AI应用这种逻辑复杂、要长期迭代的项目,规范的架构能帮你少踩80%的坑。

2 三分钟搭起你的第一个NestJS项目

别自己从零搭配置了,纯纯浪费时间。

官方CLI直接给你把所有环境都配好,TS严格模式、编译配置、启动脚本,啥都不用你管。

2.1 几行命令就完事

打开终端,依次敲这几行:

# 安装 NestJS CLInpmi-g@nestjs/cli# 创建项目,开启TS严格模式nest new my-ai-app--strict# 进目录cdmy-ai-app# 启动开发服务npmrun start:dev

完事打开浏览器访问 localhost:3000,看到Hello World就成了。

生成的项目结构也很清晰,入口、根模块、控制器、服务,分的明明白白。

搁以前自己搭Express+TS,光配置文件就得写俩小时,还没写业务呢人先累瘫了。

3 三个核心概念搞懂,NestJS就入门一半了

很多人说NestJS难,其实核心就三样:模块、控制器、服务。

把这仨搞明白,剩下的都是锦上添花的东西。

3.1 模块:应用里的各个部门

你可以把一个模块当成公司里的一个部门。

技术部、运营部、财务部,各管各的事,互不干扰。需要协作的时候,走正规流程对接就行。

每个Nest应用至少有一个根模块,剩下的按功能拆,用户模块、订单模块、AI模块,怎么清晰怎么来。

用@Module()装饰器一标记,里面注册好控制器和服务,一个部门就组建完成了。

3.2 控制器:专门接请求的前台

控制器就是公司的前台接待。

客户(请求)来了,前台先登记一下,看看是来办什么事的,然后转给对应的部门处理。

它只管路由转发和返回结果,绝对不写业务逻辑。

很多新手图省事,把所有代码全堆控制器里,一个文件上千行,美其名曰“简单”,等后期维护的时候哭都来不及。

至于参数怎么拿,记住三个常用装饰器就行:

  • @Param():拿URL路径里的参数,比如/users/123里的123
  • @Query():拿问号后面的参数,比如?page=1里的page
  • @Body():拿请求体里的JSON数据

别再三个东西傻傻分不清楚,写接口全靠蒙了。

3.3 服务:真正埋头干活的打工人

前台把单子递进来,真正干活的是服务层。

所有的业务逻辑、数据处理、数据库操作,全写在服务里。

用@Injectable()装饰器标记一下,就可以通过依赖注入直接塞给控制器用。

搁以前写Express,文件之间互相导入,A引B,B引C,改个路径半片文件全爆红。

现在有了依赖注入,你需要什么服务,直接声明就行,容器自动给你送过来,省心多了。

3.4 三者到底是什么关系

一句话总结:模块管着控制器和服务,控制器收请求,服务干脏活累活,靠依赖注入串起来。

就像一个部门里,部门经理管着前台和办事员,前台接客户,办事员处理业务,各司其职,不乱套。

4 别手动建文件了,CLI一键生成不香吗

我见过不少新手,加个功能就自己新建文件,写完还得去模块里注册,经常漏这漏那,跑起来报错找半天。

听我的,但凡加新功能,直接用CLI生成,又快又规范。

# 生成用户模块nest g moduleusers# 生成用户控制器nest g controllerusers# 生成用户服务nest gserviceusers# 一键生成完整CRUD(模块+控制器+服务全齐)nest g resource products

命令一敲,文件自动建,依赖自动注册,连测试文件都给你备好。

省下来的时间摸鱼不好吗,非要跟自己较劲手动写。

5 管道:数据进来的第一道安检门

管道这东西,说穿了就是两个作用:验证数据,转换格式。

就像地铁站的安检,违禁品直接拦下来,行李尺寸不对的给你调整一下,合格了才能进去。

5.1 管道+DTO的标准三步走

最常用的玩法,就是配合DTO做参数校验。

第一步,先装依赖:

npminstallclass-validator class-transformer

第二步,写DTO类,给每个字段贴好校验规则。

什么不能为空、邮箱格式、年龄下限,全写在里面,还能自定义错误提示。

第三步,控制器里直接用,参数进来自动校验,不合格直接返回错误,根本进不了业务逻辑。

5.2 全局开启,一劳永逸

嫌每个接口都加太麻烦?直接在入口文件开全局管道。

配上自动类型转换、自动剔除多余字段、遇到非法字段直接报错,所有接口自动生效。

尤其是做AI应用,这玩意儿简直是省钱神器。

你想啊,要是没校验,空消息、乱码、超长文本全往大模型发,一天下来API额度烧没了,账单出来心都在滴血。

管道往这一放,不合格的请求全拦在外面,省下来的都是真金白银。

6 请求链路上的四道关卡,别再搞混了

很多人学NestJS,最头疼的就是中间件、守卫、拦截器、管道这四个东西。

执行顺序记不住,各自干啥的分不清,面试一问直接卡壳。

6.1 执行顺序先记死

先把顺序背下来,后面理解起来就快了:

请求进来 → 中间件 → 守卫 → 拦截器前置 → 管道 → 控制器 → 服务 → 拦截器后置 → 返回响应

就像你去政府办事,先过门口保安,再查身份证,再领号填表,然后窗口办事,最后拿单子走人。

6.2 中间件:最早的门卫大爷

中间件是最先接触到请求的。

记日志、配CORS、解析原始请求体,这些粗活都是它干。

就像小区门口的大爷,你刚进小区,他先瞅你一眼,记下来你几点进来的,别的不管。

6.3 守卫:查权限的安检员

守卫管的是权限。

你有没有登录、有没有API Key、有没有资格访问这个接口,都是它说了算。

没权限?直接给你拦在外面,连业务逻辑的边都碰不着。

就像地铁安检,没票或者带了违禁品,直接不让你进。

6.4 拦截器:给结果打包的包装员

拦截器是前后都能管。

请求进来的时候,可以改改请求数据;业务处理完了,可以给返回结果统一包个格式、记个耗时、做个缓存。

就像快递站,你寄的东西过来,给你套个盒子贴个快递单,整整齐齐再发出去。

6.5 一张表给你捋明白

特性中间件守卫管道拦截器
执行顺序第一个第二个第四个第三个,全程包裹
核心职责原始请求处理权限身份校验数据验证转换响应映射缓存
能不能碰DTO不行,只能拿原始数据不行,一般只看请求头专门管DTO能拿到最终结果
常用装饰器configure注册@UseGuards()@UsePipes()@UseInterceptors()

对着表多看两遍,再也不会搞混了。

7 NestJS里的MVC,到底是怎么落地的

NestJS虽然不是严格的经典MVC,但分层的思路是一模一样的。

说白了就是各干各的,别啥都往一块堆。

层级干啥活
Controller层收请求、转路由、返回结果
Service层写业务逻辑、调外部接口、编排流程
DTO/Entity层定义数据结构、写校验规则
Repository层数据库增删改查,ORM来搞定

从上到下一层层调用,谁也不越界。以后改需求,找对应的层改就行,不会牵一发动全身。

别再把所有逻辑全写控制器里了,一时省事,后期全是债。

8 模块不是只能一配一,别把自己框死

很多新手有个误区:一个模块必须配一个控制器一个服务。

哪有这么死板的规定。

一个模块里可以放好多个控制器、好多个服务,怎么合理怎么来。

一个控制器也可以注入好多个服务,需要啥功能就用啥。

甚至有的模块根本不需要控制器,就纯提供工具服务,导出给别的模块用就行。

比如做AI功能,一个AI模块里可以放聊天控制器、文档控制器,再配LangChain服务、向量服务、Prompt服务。

按功能领域划分模块,而不是死磕一一对应,代码结构才会清爽。

9 接上LangChain,给你的后端装上AI大脑

前面的基础打牢了,现在就可以接入AI能力了。

搭配LangChain,不用自己吭哧吭哧封装大模型接口,直接就能用。

9.1 先把依赖装了

npminstallnestjs-langchain langchain @langchain/openai

9.2 注册LangChain模块

在根模块里注册一下,配好大模型的配置和系统提示词。

跟注册其他模块一模一样,没什么额外的学习成本。

9.3 在服务里直接调用AI

注入LangChainService,直接调用run方法就能发请求。

想做RAG带上下文问答?自己拼好Prompt传进去就行,简单得很。

9.4 最绝的玩法:把服务方法变成AI工具

这是我觉得最惊艳的功能。

给你的服务方法加个@Tool()装饰器,写好描述,这个方法就变成AI可以自动调用的工具了。

比如你写个加法方法、写个查天气的方法,注册进去之后,用户问相关的问题,AI会自己判断要不要调用这个工具。

相当于给AI配了个工具箱,需要什么自己拿,不用你写一堆if else判断。

10 做AI应用的几个实战建议

最后给大家几个实用建议,都是踩坑踩出来的经验。

第一,接口一定要加保护。API Key校验加上,限流加上,不然被人恶意刷接口,账单分分钟爆炸。

第二,用户输入一定要校验。问题长度、参数范围,都给限制好,别啥乱七八糟的都往大模型发,烧的都是钱。

第三,返回格式统一一下。所有接口都用一样的结构,前端对接也舒服,后期加字段也好加。

第四,分层一定要清晰。控制器只管路由,服务写业务,数据层管持久化,别混在一起。不然后期加功能、改bug,有你头疼的。

11 最后唠两句

其实NestJS没大家想的那么难,核心就是一套规范的架构思路。

把模块、控制器、服务这三个核心搞懂,把请求链路的顺序理清楚,剩下的都是边用边学的东西。

再结合LangChain,你就能搭出结构清晰、好维护的AI应用了。

想进阶的话,可以再深入研究LangChain的Chain、Agent、向量数据库,做做RAG实战,搞搞流式输出,再补补单元测试。

技术这东西,基础打牢了,往上搭东西都快。

祝大家写代码少出bug,AI账单月月省钱。

P.S. 目前国内还是很缺AI人才的,希望更多人能真正加入到AI行业,共同促进行业进步,增强我国的AI竞争力。想要系统学习AI知识的朋友可以看看我精心打磨的教程 http://blog.csdn.net/jiangjunshow,教程通俗易懂,高中生都能看懂,还有各种段子风趣幽默,从深度学习基础原理到各领域实战应用都有讲解,我22年的AI积累全在里面了。注意,教程仅限真正想入门AI的朋友,否则看看零散的博文就够了。

← 返回列表