前端开发者玩转AI编程:揭秘Node+Langchain技术组合的魔法(三)

系列文章目录

揭秘Node+Langchain技术组合的魔法(一)快速开始

揭秘Node+Langchain技术组合的魔法(二)提示词

揭秘Node+Langchain技术组合的魔法(三)工程化

揭秘Node+Langchain技术组合的魔法(四)RAG

揭秘Node+Langchain技术组合的魔法(五)RAG2


文章目录

系列文章目录

前言

一、技术框架

二、框架搭建步骤

1.  安装 express 脚手架

2.  初始化项目 

3.  修改启动方式为热启动

4.  安装 dotenv 依赖

5.  安装 eslint 代码检查工具

6.  安装 langchain 依赖

 三、三层架构搭建步骤

1.整体结构

2.路由层

 3.Controllers层

4.Services层

四、效果截图

总结


前言

在之前的两篇文章中,我们共同探索了Node+Langchain技术组合的环境搭建和快速上手示例。然而,技术的深度探索远不止于此,真实的开发之路更是充满挑战。虽然不乏一些敏锐的开发者能够凭借初步的介绍便迅速搭建出自己的项目,但为了帮助更多前端小伙伴更好地掌握这一技术,本文将从前端工程化的视角,详细讲解如何构建一个基于Express的工程项目。

本文将深入浅出,力求让每一位新手都能跟随步骤,逐步理解并掌握Node+Langchain技术的精髓。让我们一起,揭开工程化开发的神秘面纱,探索前端与AI编程结合的无限可能


一、技术框架

node + express + langchain

二、框架搭建步骤

1.  安装 express 脚手架

npm install express-generator -g

2.  初始化项目 

因为项目是纯后端服务,所以不需要模板引擎

express --view=null langchain-node-kit

3.  修改启动方式为热启动

npm install nodemon -D

    修改 package.json 文件,将 start 命令修改为 nodemon ./bin/www

"scripts": {
    "start": "nodemon ./bin/www",
 }

4.  安装 dotenv 依赖

npm install dotenv -D

    在根目录下创建 .env 文件,添加配置代码

ENV="development"

PORT=3009
OLLAMA_BASE_URL="http://localhost:11434"
OLLAMA_MAIN_MODEL="deepseek-r1:8b"

5.  安装 eslint 代码检查工具

 npm install eslint -D

  执行初始化命令

npx eslint --init

  根据提示下一步即可,然后修改 eslint.config.mjs 文件,设置运行环境为 node

{languageOptions: { globals: globals.node }}

  然后在 package.json 中添加以下代码

"scripts": {
      "lint": "eslint ."
 }

6.  安装 langchain 依赖

npm i @langchain/core @langchain/community @langchain/ollama langchain

 三、三层架构搭建步骤

✨此处三层架构是指【路由层,Controller层,Services层】

1.整体结构

├─bin                          # 项目启动脚本目录
│  └─www                      # 项目入口文件
├─controllers                  # 控制器目录,处理业务逻辑
├─core                        # 核心功能目录
│  ├─rag                      # RAG(检索增强生成)相关功能
│  │  ├─data                  # RAG数据存储目录
│  │  └─index.js             # RAG功能入口文件
│  └─vectorStore             # 向量存储相关功能
│     ├─data                  # 向量数据存储目录
│     └─index.js             # 向量存储功能入口文件
├─public                      # 静态资源目录
│  ├─images                   # 图片资源
│  ├─javascripts              # JavaScript文件
│  └─stylesheets             # CSS样式文件
├─routes                      # 路由目录
│  ├─index.js                # 主路由文件
│  └─modules                  # 模块化路由目录
│     ├─chat.js              # 聊天相关路由
│     ├─embedding.js         # 文本嵌入相关路由
│     └─model.js             # 模型相关路由
├─services                    # 服务层目录
├─utils                       # 工具函数目录
│  └─resultWrapper.js        # 响应结果包装器
├─views                       # 视图目录(前后端分离,暂未使用)
├─.env                        # 环境变量配置文件
├─.gitignore                  # Git忽略文件配置
├─.npmrc                      # NPM配置文件
├─app.js                      # Express应用主文件
├─eslint.config.mjs           # ESLint配置文件
├─package.json                # 项目依赖配置文件
└─README.md                   # 项目说明文档

2.路由层

路由层使用动态路由(示例):

const fs = require('fs');
const path = require('path');

const routerArray = [];

fs
  .readdirSync(__dirname + '/modules')
  .filter(file => {
    return (
      file.indexOf('.') !== 0 &&
      file.slice(-3) === '.js' &&
      file.indexOf('.test.js') === -1
    );
  })
  .forEach(file => {
    const router = require(path.join(__dirname,'modules',  file));
    routerArray.push(router);
  });

module.exports = routerArray;

然后再 models文件中添加chat.js文件(routes\modules\chat.js)

const express = require('express');
const ChatController = require('../../controllers/chatController');

const router = express.Router();

// 基础聊天接口
router.post('/chat', ChatController.chat);

// 基于检索增强生成(RAG)的聊天接口
router.post('/ragChat', ChatController.ragChat);

module.exports = router;

 3.Controllers层

在controllers文件夹中创建chatController.js(controllers\chatController.js)

const chatService = require('../services/chatService');

class ChatController {
  static async chat(req, res) {
    try {
      const { message } = req.body;
      
      if (!message) {
        return res.status(400).json({ error: '消息内容不能为空' });
      }

      const response = await chatService.chat(message);
      res.json(response);
    } catch (error) {
      res.status(500).json({ error: '服务器内部错误' });
    }
  }
}

module.exports = ChatController;

4.Services层

在 services文件夹中创建chatService.js(services\chatService.js)

const { Ollama } = require('@langchain/ollama');
const { StringOutputParser } = require('@langchain/core/output_parsers');
//返回结果包装器(可以按照自己的格式封装)
const ResultWrapper = require('../utils/resultWrapper');

// 初始化 Ollama 模型
const ollama = new Ollama({
  baseUrl: process.env.OLLAMA_BASE_URL || 'http://localhost:11434',
  model: process.env.OLLAMA_MAIN_MODEL || "deepseek-r1:8b",
  temperature: 0.7, // 控制输出的随机性
});

// 创建输出解析器
const outputParser = new StringOutputParser();

class ChatService {
  static COLLECTION_NAME = 'documents';
  static async chat(message) {
    try {
      const response = await ollama
        .pipe(outputParser)
        .invoke(message);
      
      return ResultWrapper.success(response);
    } catch (error) {
      return ResultWrapper.error(error.message);
    }
  }
}

module.exports = ChatService;

四、效果截图


总结

以上就是今天要讲的内容,因为文章总是被爬取,可能接下来的文章将会粉丝可见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿儿本无心

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值