系统要求:macOS(Intel 或 Apple Silicon 均支持) 已有环境:Node.js、pnpm 需要安装:Docker Desktop
一、安装 Docker Desktop
Docker Desktop 是 macOS 上运行 Docker 容器的官方工具,本项目用它启动 PostgreSQL + pgvector 数据库,不需要在本机手动安装 PostgreSQL。
1.1 下载
访问 https://www.docker.com/products/docker-desktop/,点击"Download for Mac"。
页面会提示选择芯片类型:
- Mac 搭载 M1 / M2 / M3 / M4 芯片 → 选 Apple Silicon
- Mac 搭载 Intel 芯片 → 选 Intel Chip
不确定芯片类型:点击左上角苹果图标 → "关于本机",处理器一栏写 Apple M 开头的是 Apple Silicon,写 Intel 的是 Intel。
1.2 安装
下载完成后双击 .dmg 文件,把 Docker 图标拖到 Applications 文件夹,打开 Docker Desktop,等待顶部菜单栏的鲸鱼图标停止动画,变成静止状态,表示 Docker 已经启动完成。
首次启动会弹出引导窗口,直接关闭即可,不需要登录账号。
1.3 验证安装
打开终端(Terminal)执行:
docker --version
输出类似 Docker version 27.x.x 表示安装成功。
docker ps
输出空表格(没有报错)表示 Docker 正在运行。
1.4 Docker 基本概念(结合本项目)
镜像(Image):类似安装包,pgvector/pgvector:pg16 是一个包含 PostgreSQL 16 和 pgvector 扩展的镜像,第一次使用时会自动从网上下载。
容器(Container):镜像运行起来后的实例,相当于一个独立运行的数据库服务。本项目创建的容器叫 pgvector-jisu。
端口映射(-p):把容器内部的端口暴露给宿主机。-p 5432:5432 表示宿主机的 5432 端口对应容器内的 5432 端口,Node.js 通过 localhost:5432 就能连到容器里的 PostgreSQL。
环境变量(-e):传给容器的配置,相当于设置数据库的用户名、密码、数据库名。
常用命令速查:
docker ps # 查看正在运行的容器
docker ps -a # 查看所有容器(含已停止的)
docker start 容器名 # 启动已有容器
docker stop 容器名 # 停止容器
docker logs 容器名 # 查看容器日志
docker rm 容器名 # 删除容器(数据会丢失)
二、启动 PostgreSQL + pgvector
2.1 创建并启动容器
打开终端,执行以下命令(只需执行一次,以后用 docker start 启动):
docker run -d \
--name pgvector-jisu \
-e POSTGRES_USER=postgres \
-e POSTGRES_PASSWORD=postgres123 \
-e POSTGRES_DB=jisu_ai \
-p 5432:5432 \
-v pgvector-jisu-data:/var/lib/postgresql/data \
pgvector/pgvector:pg16
参数说明:
| 参数 | 含义 |
|---|---|
-d |
后台运行,不占用终端 |
--name pgvector-jisu |
容器命名,方便后续管理 |
-e POSTGRES_USER=postgres |
数据库用户名 |
-e POSTGRES_PASSWORD=postgres123 |
数据库密码(和 .env 保持一致) |
-e POSTGRES_DB=jisu_ai |
数据库名(和 .env 保持一致) |
-p 5432:5432 |
端口映射,本机 5432 → 容器 5432 |
-v pgvector-jisu-data:/var/lib/postgresql/data |
数据持久化,容器删除后数据不丢失 |
pgvector/pgvector:pg16 |
镜像名,pg16 表示 PostgreSQL 16 版本 |
首次执行会下载镜像,大约 100MB,需要等待 1~2 分钟(取决于网速)。
2.2 验证容器运行状态
docker ps
看到 pgvector-jisu 行、状态列显示 Up 表示容器正在运行。
2.3 开启 vector 扩展
pgvector 扩展需要手动开启一次:
docker exec -it pgvector-jisu \
psql -U postgres -d jisu_ai \
-c "CREATE EXTENSION IF NOT EXISTS vector;"
输出 CREATE EXTENSION 表示成功。
2.4 验证扩展已开启(可选)
docker exec -it pgvector-jisu \
psql -U postgres -d jisu_ai \
-c "SELECT extname FROM pg_extension WHERE extname = 'vector';"
输出有 vector 行表示扩展已启用。
2.5 日常启停
电脑重启后 Docker Desktop 默认不会自动启动容器,每次需要使用时手动启动:
# 先确认 Docker Desktop 已启动(菜单栏有鲸鱼图标)
# 启动容器
docker start pgvector-jisu
# 不用了可以停止(节省内存)
docker stop pgvector-jisu
也可以在 Docker Desktop 的 Containers 界面里点击播放按钮启动。
三、配置 API Key
3.1 获取 DeepSeek API Key
- 访问 https://platform.deepseek.com
- 注册并登录
- 左侧菜单点击"API keys"→"创建 API key"
- 复制 Key,格式为
sk-开头的长字符串
3.2 获取智谱 AI API Key(Embedding 用)
- 访问 https://open.bigmodel.cn
- 注册并登录
- 右上角点击头像→"API keys"→"添加新的 API key"
- 复制生成的 Key
3.3 写入 .env 文件
进入项目的 server 目录,复制模板并填写:
cd jisu-ai-customer/server
cp .env.example .env
用任意编辑器打开 server/.env,把两个 Key 填进去:
# ─── 对话模型(DeepSeek,所有功能必填)────────────────────────────
DEEPSEEK_API_KEY=sk-你的DeepSeekKey
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
MODEL_NAME=deepseek-chat
PORT=3000
# ─── Embedding 模型(RAG 功能必填,二选一)───────────────────────
# 方式一:智谱 AI(推荐)https://open.bigmodel.cn
ZHIPU_API_KEY=你的智谱AIKey
# 方式二:阿里云百炼 https://bailian.console.aliyun.com
# DASHSCOPE_API_KEY=你的百炼APIKey
# ─── PostgreSQL(RAG 功能必填)───────────────────────────────────
PG_HOST=localhost
PG_PORT=5432
PG_USER=postgres
PG_PASSWORD=postgres123
PG_DATABASE=jisu_ai
注意事项:
- Key 前后不能有空格
.env文件不要提交到 Git,已在.gitignore中排除- PG_PASSWORD 和 PG_DATABASE 必须与第二节创建容器时用的一致
四、安装项目依赖
4.1 后端依赖
cd jisu-ai-customer/server
pnpm install
安装完成后 node_modules/ 目录出现,共安装约 20 个依赖包。
4.2 前端依赖
cd jisu-ai-customer/client
pnpm install
五、知识库入库(只需执行一次)
RAG 功能需要提前把知识库文档向量化并存入数据库。这一步只需要执行一次,知识库内容有更新时重新执行。
确认 pgvector 容器已在运行后执行:
cd jisu-ai-customer/server
pnpm ingest
等价于 node src/scripts/ingest.js。
正常输出:
开始处理文档...
切分完成,共 12 个片段
入库完成
如果报错,检查:
docker ps确认 pgvector-jisu 容器在运行.env里 PG_* 配置是否正确.env里 ZHIPU_API_KEY 是否填写
六、启动项目
需要同时开两个终端窗口。
终端 1:启动后端
cd jisu-ai-customer/server
pnpm dev
正常输出:
极速购 AI 客服服务已启动:http://localhost:3000
nodemon 会监听文件变化,修改代码后自动重启,不需要手动重启。
终端 2:启动前端
cd jisu-ai-customer/client
pnpm dev
正常输出:
VITE v5.x.x ready in xxx ms
➜ Local: http://localhost:5173/
打开浏览器
访问 http://localhost:5173,顶部导航栏有四个入口:
| 入口 | 地址 | 功能 |
|---|---|---|
| 基础对话 | http://localhost:5173/ | 第一章,流式客服对话 |
| 订单查询 | http://localhost:5173/agent | 第二章,Agent 查询订单和物流 |
| 知识库 | http://localhost:5173/rag | 第三章,RAG 商品和售后问答 |
| 智能中枢 | http://localhost:5173/graph | 第四章,多 Agent 自动路由 |
七、功能测试用例
基础对话(/)
你好
如何申请退款?
快递迟迟不到怎么办?
订单查询(/agent)
帮我查一下订单 ORD-001 的状态
订单 ORD-001 快递到哪里了?
我的用户 ID 是 U-100,有哪些订单?
内置测试数据:
- ORD-001(已发货,顺丰 SF1234567890,用户 U-100)
- ORD-002(待付款,用户 U-100)
- ORD-003(已完成,京东物流,用户 U-101)
知识库问答(/rag)
蓝牙耳机 X1 Pro 续航多少小时?
商品可以退货吗?退款流程是什么?
机械键盘 K200 有哪些轴体可选?
买了东西有质量问题怎么处理?
智能中枢(/graph)
订单 ORD-001 发货了吗? → 自动路由到订单查询
退款需要多少天? → 自动路由到知识库
蓝牙耳机多少钱? → 自动路由到知识库
你好,我想了解一下 → 自动路由到通用对话
前端会显示工作流执行路径:意图识别 → 具体模块 → 整理回答。
八、常见问题
docker: command not found
Docker Desktop 没有启动,或者安装不完整。打开 Docker Desktop 应用,等待鲸鱼图标稳定后重试。
Error: connect ECONNREFUSED 127.0.0.1:5432
PostgreSQL 容器没有运行。执行 docker start pgvector-jisu 启动容器。
Error: password authentication failed for user "postgres"
.env 里的 PG_PASSWORD 和创建容器时用的 -e POSTGRES_PASSWORD 不一致。确认两处都是 postgres123。
Error: 401 Unauthorized
DeepSeek API Key 填写有误,或 Key 已过期。检查 server/.env 里的 DEEPSEEK_API_KEY,确认没有多余空格,且 Key 未失效。
知识库问答回答内容不准或说"没有相关信息"
先确认入库成功:
docker exec -it pgvector-jisu \
psql -U postgres -d jisu_ai \
-c "SELECT count(*) FROM knowledge_embeddings;"
输出 count > 0 表示数据已入库。如果为 0,重新执行 pnpm ingest。
ingest 执行报 Embedding API 错误
检查 server/.env 里的 ZHIPU_API_KEY 是否正确填写,以及 server/src/models/embedding.js 里的 baseURL 和 modelName 是否和智谱 AI 匹配。
切换到阿里云百炼 Embedding
- 打开
server/src/models/embedding.js,注释掉方式一,取消注释方式二 - 在
server/.env里填写DASHSCOPE_API_KEY - 清空旧的向量数据并重新入库:
docker exec -it pgvector-jisu \
psql -U postgres -d jisu_ai \
-c "TRUNCATE knowledge_embeddings;"
pnpm ingest
九、项目目录结构
jisu-ai-customer/
├── server/ # Node.js + Express 后端
│ ├── .env.example # 环境变量模板(复制为 .env 并填写)
│ ├── .gitignore
│ ├── package.json
│ └── src/
│ ├── index.js # 服务入口,注册所有路由
│ ├── models/
│ │ ├── deepseek.js # DeepSeek 对话模型封装
│ │ └── embedding.js # Embedding 模型封装(智谱/百炼)
│ ├── prompts/
│ │ └── customer-service.js # 客服 Prompt 模板
│ ├── chains/
│ │ ├── basic-chat.js # 基础对话 Chain(第一章)
│ │ └── rag-chain.js # RAG Chain(第三章)
│ ├── tools/
│ │ └── order-tools.js # 订单查询工具(第二章)
│ ├── agents/
│ │ └── customer-agent.js # 订单 Agent(第二章)
│ ├── graphs/ # LangGraph 工作流(第四章)
│ │ ├── state.js
│ │ ├── customer-graph.js
│ │ └── nodes/
│ │ ├── intent-router.js
│ │ ├── order-agent.js
│ │ ├── rag-node.js
│ │ ├── general-chat.js
│ │ └── answer-synthesizer.js
│ ├── data/
│ │ ├── mock.js # 模拟订单数据
│ │ └── knowledge/ # 知识库文档
│ │ ├── products.md
│ │ └── policies.md
│ ├── db/
│ │ └── postgres.js # pg 连接池
│ ├── scripts/
│ │ └── ingest.js # 知识库入库脚本
│ └── routes/
│ ├── chat.js # POST /api/chat/stream
│ ├── agent.js # POST /api/agent/stream
│ ├── rag.js # POST /api/rag/query
│ └── graph.js # POST /api/graph/stream
│
└── client/ # Vue3 前端
├── index.html
├── vite.config.js
├── package.json
└── src/
├── main.js
├── App.vue # 全局导航栏
├── router/
│ └── index.js # 四个页面路由
├── composables/
│ ├── useChat.js
│ ├── useAgent.js
│ ├── useRag.js
│ └── useGraph.js
└── views/
├── ChatView.vue
├── AgentView.vue
├── RagView.vue
└── GraphView.vue
十、快速启动清单
每次开发时,按以下顺序操作:
# 1. 启动 Docker Desktop(打开应用,等鲸鱼图标稳定)
# 2. 启动数据库容器
docker start pgvector-jisu
# 3. 终端 1:启动后端
cd jisu-ai-customer/server
pnpm dev
# 4. 终端 2:启动前端
cd jisu-ai-customer/client
pnpm dev
# 5. 浏览器访问
open http://localhost:5173
知识库入库只需要首次运行时执行一次:
cd jisu-ai-customer/server
pnpm ingest