系列文章目录
揭秘Node+Langchain技术组合的魔法(一)快速开始
揭秘Node+Langchain技术组合的魔法(五)RAG2
文章目录
前言
在之前的两篇文章中,我们共同探索了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;
四、效果截图
总结
以上就是今天要讲的内容,因为文章总是被爬取,可能接下来的文章将会粉丝可见