智能问答系统全解析:从核心架构到落地实践的技术指南

智能问答系统全解析:从核心架构到落地实践的技术指南

一、安装docker环境

6.Docker Desktop 安装使用教程-CSDN博客

参考上述文档安装Docker Desktop和wsl2

以下为转载内容 ,部分有变动

1.前言

作为开发人员,在日常开发中,我们需要在本地去启动一些服务,如:redis、MySQL等,就需要去下载这些在本地去启动,操作较为繁琐。此时,我们可以使用Docker Desktop,来搭建我们需要的服务,直接在容器中去启动即可。

2.下载 Docker Desktop

docker官网:https://www.docker.com/

17606943060823.安装 Docker Desktop

3.1.配置 Docker Desktop 环境

因为docker desktop 是可以部署在windows 上来运行docker的应用服务的,其基于windows 的 Hyper-V
服务和WSL2内核的Windows上创建一个子系统(linux),从而实现其在windows上运行docker。所以电脑上需要开启Hyper-V
服务,和安装WSL2。

开启 Hyper-V 服务:控制面板—程序—程序和功能—启动或关闭Windows功能 中 勾选【Hyper-V】和【容器】选项。

1760694724250

  • 这个我电脑上没有,我没√(但好像对后续没影响也能用)

1760694738722

  • 这个我电脑上也没有,我没√(但好像对后续没影响也能用)

1760694848625

  • 这个我勾上了

配置完毕后,重启电脑

3.2.安装 wsl2

先去看看自己的电脑命令行,打开 powershell 管理员终端,执行wsl –help 命令看看,有没有 wsl,如果有就不用安装了,直接 wsl --set-default-version 2 设置 wsl2 为默认版本就行了。如果本机没有 wsl,再去安装哦

我们可以从微软官网下载最新版本的wsl2,然后正常打开。

下面这个链接,访问下载,安装更新:

https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi

下载完成后直接双击安装即可

1760695933404

3.3.下载并安装Docker Desktop

我在windows上下载的是 Docker Desktop,下载地址,点进去根据自己的需要去下载,我是下载的Windows版本的。把下载下来的.exe文件双击打开,如下图所示,直接点击OK即可。

1760697963774

3.4打开 Docker Desktop 的问题

1.问题一:wsl 2 installation

打开 docker desktop, 如果出现报错如下,报错意思是:是因为我们还需要进行wsl的下载和配置

在这里插入图片描述

这里我们用两步来解决这个问题:

1.我们先去系统里查看一下有没有启用Windows的Linux子系统,步骤如下:

1
控制面板->程序->程序和功能

在这里插入图片描述

如果没有的话,我们勾选上,重新启动电脑,打开Docker Desktop 。

2.如果还是没有解决的话。原因就剩一个了就是:

1760698516089

我们使用的wsl2版本很旧,因此需要手动更新。进入 Window PowerShll,执行命令 wsl --update

2.问题二:wsl kernel 版本低

如果已经按照过wsl , 打开 docker desktop, 如果出现报错如下,报错意思是:wsl kernel 版本低,需要进行更新。

解决方法:以管理员的身份打开控制台(cmd),并执行命令 wsl –update 进行更新

在这里插入图片描述
在这里插入图片描述

  如上图中提示,wsl 更新成功后,需要对wsl重启后才会更新生效。可以执行 wsl –shutdown 进行关闭wsl (我执行命令后又重启了一下电脑。)

  重启后,再次打开 docker desktop即可

  如果电脑windows 10 的企业版的话,以上的安装部署就完毕了, 但我在安装windows 10 家庭版的时候,报错。网上查的意思是说 docker 必须安装在win10 企业版本,如果想安装在家庭版本上,需要如下操作: 打开注册表编辑器,在“ 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion ” 下找到 EditionID ,数值数据改为Professional即可。

在这里插入图片描述

4.Docker Desktop 配置镜像源

配置镜像源:打开Docker ,找到 设置–docker engine 中,添加如下图所示的镜像源地址。
在这里插入图片描述

选择Docker
Engine,在其中输入(这里使用的是163的源,如果想要使用其他源可以自行设置,github上有个项目:docker_mirror可以自动检测在你的网络环境下那个源是最快的)

作者提示:最好此处配一个阿里云的加速地址!!!。加速地址参考:https://blog.csdn.net/lzb348110175/article/details/132847035docker加速配置

  • 我们用的是:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
{
"builder": {
"gc": {
"defaultKeepStorage": "20GB",
"enabled": true
}
},
"debug": false,
"experimental": false,
"insecure-registries": [],
"registry-mirrors": [
"https://ufe3o0ts.mirror.aliyuncs.com/",
"https://docker.1ms.run/",
"https://docker.xuanyuan.me/",
"https://dislabaiot.xyz/",
"https://docker.sunzishaokao.com/",
"https://hub.rat.dev/",
"https://doublezonline.cloud/",
"https://dislabaiot.xyz/",
"https://xdark.top"
]
}

在这里插入图片描述
一直转转转,等一会就可以了,不转了就可以了
在这里插入图片描述

5.Disk image location路径的修改

操作如下(示例):完成安装后,打开软件,点击右上角的设置,将图2中的红框标注部分的选中给取消,然后按照图3进行路径的修改,再返回图2界面,把红框部分选中,并应用即可。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.验证是否安装成功

代码如下(示例):在左下角的搜索框中,输出PowerShell,打开PowerShell。输入docker
images命令,出现下图所示即表示安装成功。

在这里插入图片描述

7.在Docker中给fastgpt配置:

新建一个项目文件夹,里面新建配置文件:

img

config.json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// 已使用 json5 进行解析,会自动去掉注释,无需手动去除
{
"feConfigs": {
"lafEnv": "https://laf.dev", // laf环境。 https://laf.run (杭州阿里云) ,或者私有化的laf环境。如果使用 Laf openapi 功能,需要最新版的 laf 。
"mcpServerProxyEndpoint": "" // mcp server 代理地址,例如: http://localhost:3005
},
"systemEnv": {
"datasetParseMaxProcess": 10, // 知识库文件解析最大线程数量
"vectorMaxProcess": 10, // 向量处理线程数量
"qaMaxProcess": 10, // 问答拆分线程数量
"vlmMaxProcess": 10, // 图片理解模型最大处理进程
"tokenWorkers": 30, // Token 计算线程保持数,会持续占用内存,不能设置太大。
"hnswEfSearch": 100, // 向量搜索参数,仅对 PG 和 OB 生效。越大,搜索越精确,但是速度越慢。设置为100,有99%+精度。
"hnswMaxScanTuples": 100000, // 向量搜索最大扫描数据量,仅对 PG生效。
"customPdfParse": {
"url": "", // 自定义 PDF 解析服务地址
"key": "", // 自定义 PDF 解析服务密钥
"doc2xKey": "", // doc2x 服务密钥
"price": 0 // PDF 解析服务价格
}
},
"registry-mirrors": [
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"llmModels": [
{
"model": "OpenAI", // 这里的模型需要对应 One API 的模型
"name": "gemma3:27b", // 对外展示的名称
"avatar": "/imgs/model/openai.svg", // 模型的logo
"maxContext": 16000, // 最大上下文
"maxResponse": 4000, // 最大回复
"quoteMaxToken": 13000, // 最大引用内容
"maxTemperature": 1.2, // 最大温度
"charsPointsPrice": 0,
"censor": false,
"vision": false, // 是否支持图片输入
"datasetProcess": true, // 是否设置为知识库处理模型
"usedInClassify": true, // 是否用于问题分类
"usedInExtractFields": true, // 是否用于字段提取
"usedInToolCall": true, // 是否用于工具调用
"usedInQueryExtension": true, // 是否用于问题优化
"toolChoice": true, // 是否支持工具选择
"functionCall": false, // 是否支持函数调用
"customCQPrompt": "", // 自定义文本分类提示词(不支持工具和函数调用的模型
"customExtractPrompt": "", // 自定义内容提取提示词
"defaultSystemChatPrompt": "", // 对话默认携带的系统提示词
"defaultConfig":{} // 请求API时,挟带一些默认配置(比如 GLM4 的 top_p)
}

]

}

docker-compose.yml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
# 数据库的默认账号和密码仅首次运行时设置有效
# 如果修改了账号密码,记得改数据库和项目连接参数,别只改一处~
# 该配置文件只是给快速启动,测试使用。正式使用,记得务必修改账号密码,以及调整合适的知识库参数,共享内存等。
# 如何无法访问 dockerhub 和 git,可以用阿里云(阿里云没有arm包)

version: '3.3'
services:
# Vector DB
pg:
image: pgvector/pgvector:0.8.0-pg15 # docker hub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
container_name: pg
restart: always
# ports: # 生产环境建议不要暴露
# - 5432:5432
networks:
- fastgpt
environment:
# 这里的配置只有首次运行生效。修改后,重启镜像是不会生效的。需要把持久化数据删除再重启,才有效果
- POSTGRES_USER=username
- POSTGRES_PASSWORD=password
- POSTGRES_DB=postgres
volumes:
- ./pg/data:/var/lib/postgresql/data
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'username', '-d', 'postgres']
interval: 5s
timeout: 5s
retries: 10

# 1. MySQL 数据库服务
mysql:
container_name: one-api-mysql # 容器名,便于识别
image: mysql:8.0 # 推荐 8.0 版本(稳定,兼容 one-api)
restart: always # 异常时自动重启
environment:
- MYSQL_ROOT_PASSWORD=751225hzx # 根密码,需与 one-api 的 SQL_DSN 一致
- MYSQL_DATABASE=oneapi # 自动创建名为 oneapi 的数据库,无需手动建库
- MYSQL_CHARSET=utf8mb4 # 字符集(支持 emoji 等特殊字符)
- MYSQL_COLLATION=utf8mb4_unicode_ci
- TZ=Asia/Shanghai # 时区与 one-api 一致
volumes:
# 挂载数据目录到本地,防止容器删除后数据丢失
- ./volumes/mysql/data:/var/lib/mysql
# 可选:挂载自定义配置文件(如调整最大连接数)
# - ./volumes/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
healthcheck:
# 健康检查:确保 MySQL 服务可用后,才允许 one-api 启动
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot", "-ptest2024"]
interval: 10s # 每 10 秒检查一次
timeout: 5s # 超时时间
retries: 5 # 重试 5 次失败则判定为不健康
# 不暴露 3306 端口到公网(仅在内部网络通信),更安全
# ports:
# - "3306:3306"

# 2. one-api 服务(你的原有配置,仅修改 SQL_DSN)
# one-api:
# container_name: one-api
# image: ghcr.io/songquanpeng/one-api:latest
# restart: always
# command: --log-dir /app/logs
# ports:
# - "3001:3000" # 暴露 3000 端口,用于访问 one-api 网页
# volumes:
# - ./volumes/one-api/data:/data
# - ./volumes/one-api/logs:/app/logs
# - ./volumes/data-gym-cache:/tmp/data-gym-cache
# environment:
# # 关键修改:将数据库地址从 111.18.9.111 改为 mysql 容器名(同一网络下可解析)
# - SQL_DSN=root:751225hzx@tcp(mysql:3306)/oneapi
# - SESSION_SECRET=random_string # 建议替换为随机字符串(如用 openssl rand -hex 16 生成)
# # 下面的地址是 Sealos 提供的,务必写上 v1, 两个项目都在 sealos 部署时候,https://xxxx.cloud.sealos.io 可以改用内网地址
# - OPENAI_BASE_URL=https://localhost:3001/v1
# # 下面的 key 是由 One API 提供的令牌
# - CHAT_API_KEY=sk-6ap7qsDokGoiHBYB07B37dE327474f178a625f180d9fDb29

# - TZ=Asia/Shanghai
# depends_on:
# mysql:
# condition: service_healthy # 等待 mysql 健康检查通过后再启动
# healthcheck:
# test:
# [
# "CMD-SHELL",
# "wget -q -O - http://localhost:3000/api/status | grep -o '\"success\":\\s*true' | awk -F: '{print $2}'",
# ]
# interval: 30s
# timeout: 10s
# retries: 3
# DB
mongo:
image: mongo:5.0.18 # dockerhub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/mongo:5.0.18 # 阿里云
# image: mongo:4.4.29 # cpu不支持AVX时候使用
container_name: mongo
restart: always
networks:
- fastgpt
command: mongod --keyFile /data/mongodb.key --replSet rs0
environment:
- MONGO_INITDB_ROOT_USERNAME=myusername
- MONGO_INITDB_ROOT_PASSWORD=mypassword
volumes:
- ./mongo/data:/data/db
entrypoint:
- bash
- -c
- |
openssl rand -base64 128 > /data/mongodb.key
chmod 400 /data/mongodb.key
chown 999:999 /data/mongodb.key
echo 'const isInited = rs.status().ok === 1
if(!isInited){
rs.initiate({
_id: "rs0",
members: [
{ _id: 0, host: "mongo:27017" }
]
})
}' > /data/initReplicaSet.js
# 启动MongoDB服务
exec docker-entrypoint.sh "$$@" &

# 等待MongoDB服务启动
until mongo -u myusername -p mypassword --authenticationDatabase admin --eval "print('waited for connection')"; do
echo "Waiting for MongoDB to start..."
sleep 2
done

# 执行初始化副本集的脚本
mongo -u myusername -p mypassword --authenticationDatabase admin /data/initReplicaSet.js

# 等待docker-entrypoint.sh脚本执行的MongoDB服务进程
wait $$!
redis:
image: redis:7.2-alpine
container_name: redis
networks:
- fastgpt
restart: always
command: |
redis-server --requirepass mypassword --loglevel warning --maxclients 10000 --appendonly yes --save 60 10 --maxmemory 4gb --maxmemory-policy noeviction
healthcheck:
test: ['CMD', 'redis-cli', '-a', 'mypassword', 'ping']
interval: 10s
timeout: 3s
retries: 3
start_period: 30s
volumes:
- ./redis/data:/data
fastgpt-minio:
image: minio/minio:latest
container_name: fastgpt-minio
restart: always
networks:
- fastgpt
ports: # comment out if you do not need to expose the port (in production environment, you should not expose the port)
- '9000:9000'
- '9001:9001'
environment:
- MINIO_ROOT_USER=minioadmin
- MINIO_ROOT_PASSWORD=minioadmin
volumes:
- ./fastgpt-minio:/data
command: server /data --console-address ":9001"
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:9000/minio/health/live']
interval: 30s
timeout: 20s
retries: 3

fastgpt:
container_name: fastgpt
image: ghcr.io/labring/fastgpt:v4.12.4 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt:v4.12.4 # 阿里云
ports:
- 3000:3000
networks:
- fastgpt
depends_on:
- mongo
- sandbox
- pg
restart: always
environment:
# 前端外部可访问的地址,用于自动补全文件资源路径。例如 https:fastgpt.cn,不能填 localhost。这个值可以不填,不填则发给模型的图片会是一个相对路径,而不是全路径,模型可能伪造Host。
- FE_DOMAIN=
# root 密码,用户名为: root。如果需要修改 root 密码,直接修改这个环境变量,并重启即可。
- DEFAULT_ROOT_PSW=1234
# 登录凭证密钥
- TOKEN_KEY=any
# root的密钥,常用于升级时候的初始化请求
- ROOT_KEY=root_key
# 文件阅读加密
- FILE_TOKEN_KEY=filetoken
# 密钥加密key
- AES256_SECRET_KEY=fastgptkey

# plugin 地址
- PLUGIN_BASE_URL=http://fastgpt-plugin:3000
- PLUGIN_TOKEN=xxxxxx
# sandbox 地址
- SANDBOX_URL=http://sandbox:3000
# AI Proxy 的地址,如果配了该地址,优先使用
- AIPROXY_API_ENDPOINT=http://aiproxy:3000
# AI Proxy 的 Admin Token,与 AI Proxy 中的环境变量 ADMIN_KEY
- AIPROXY_API_TOKEN=aiproxy

# 数据库最大连接数
- DB_MAX_LINK=30
# MongoDB 连接参数. 用户名myusername,密码mypassword。
- MONGODB_URI=mongodb://myusername:mypassword@mongo:27017/fastgpt?authSource=admin
# Redis 连接参数
- REDIS_URL=redis://default:mypassword@redis:6379
# 向量库 连接参数
- PG_URL=postgresql://username:password@pg:5432/postgres

# 日志等级: debug, info, warn, error
- LOG_LEVEL=info
- STORE_LOG_LEVEL=warn
# 工作流最大运行次数
- WORKFLOW_MAX_RUN_TIMES=1000
# 批量执行节点,最大输入长度
- WORKFLOW_MAX_LOOP_TIMES=100
# 对话文件过期天数
- CHAT_FILE_EXPIRE_TIME=7
volumes:
- ./config.json:/app/data/config.json
sandbox:
container_name: sandbox
image: ghcr.io/labring/fastgpt-sandbox:v4.12.4 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-sandbox:v4.12.4 # 阿里云
networks:
- fastgpt
restart: always
fastgpt-mcp-server:
container_name: fastgpt-mcp-server
image: ghcr.io/labring/fastgpt-mcp_server:v4.12.4 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-mcp_server:v4.12.4 # 阿里云
ports:
- 3005:3000
networks:
- fastgpt
restart: always
environment:
- FASTGPT_ENDPOINT=http://fastgpt:3000
fastgpt-plugin:
image: ghcr.io/labring/fastgpt-plugin:v0.1.13 # git
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/fastgpt-plugin:v0.1.13 # 阿里云
container_name: fastgpt-plugin
restart: always
networks:
- fastgpt
environment:
- AUTH_TOKEN=xxxxxx # 如果不需要鉴权可以直接去掉这个环境变量

# 改成 minio 可访问地址,例如 http://192.168.2.2:9000/fastgpt-plugins
# 必须指向 Minio 的桶的地址
# 如果 Minio 可以直接通过外网访问,可以不设置这个环境变量
# - MINIO_CUSTOM_ENDPOINT=http://192.168.2.2:9000

- MINIO_ENDPOINT=fastgpt-minio
- MINIO_PORT=9000
- MINIO_USE_SSL=false
- MINIO_ACCESS_KEY=minioadmin
- MINIO_SECRET_KEY=minioadmin
- MINIO_BUCKET=fastgpt-plugins
depends_on:
fastgpt-minio:
condition: service_healthy

# AI Proxy
aiproxy:
image: ghcr.io/labring/aiproxy:v0.3.2
# image: registry.cn-hangzhou.aliyuncs.com/labring/aiproxy:v0.3.2 # 阿里云
container_name: aiproxy
restart: unless-stopped
depends_on:
aiproxy_pg:
condition: service_healthy
networks:
- fastgpt
environment:
# 对应 fastgpt 里的AIPROXY_API_TOKEN
- ADMIN_KEY=aiproxy
# 错误日志详情保存时间(小时)
- LOG_DETAIL_STORAGE_HOURS=1
# 数据库连接地址
- SQL_DSN=postgres://postgres:aiproxy@aiproxy_pg:5432/aiproxy
# 最大重试次数
- RETRY_TIMES=3
# 不需要计费
- BILLING_ENABLED=false
# 不需要严格检测模型
- DISABLE_MODEL_CONFIG=true
healthcheck:
test: ['CMD', 'curl', '-f', 'http://localhost:3000/api/status']
interval: 5s
timeout: 5s
retries: 10
aiproxy_pg:
image: pgvector/pgvector:0.8.0-pg15 # docker hub
# image: registry.cn-hangzhou.aliyuncs.com/fastgpt/pgvector:v0.8.0-pg15 # 阿里云
restart: unless-stopped
container_name: aiproxy_pg
volumes:
- ./aiproxy_pg:/var/lib/postgresql/data
networks:
- fastgpt
environment:
TZ: Asia/Shanghai
POSTGRES_USER: postgres
POSTGRES_DB: aiproxy
POSTGRES_PASSWORD: aiproxy
healthcheck:
test: ['CMD', 'pg_isready', '-U', 'postgres', '-d', 'aiproxy']
interval: 5s
timeout: 5s
retries: 10
# 自定义网络(与services同级,缩进正确)
networks:
fastgpt:
driver: bridge

现在启动docker

启动服务
运行以下命令启动服务:

1
docker-compose up -d

该命令会在后台启动服务,并自动根据 docker-compose.yml 文件中的配置、容器的初始化和启动。

img

8.打开fastgpt

会显示在localhost:3000,打开它,用户名是root,密码在环境变量里面是1234

在里面调用外部语言和索引大模型

img

二、fastgpt搭建知识问答系统

1.连接语言和索引模型

语言模型我们用的是 deepseek-ai/DeepSeek-R1-Distill-Qwen-7B

索引模型我们用的是 BAAI/bge-m3

SiliconCloud(硅基流动): 提供开源模型调用的平台 ,在该平台调用上述模型

模型提供商—>模型配置—>模型参数编辑

2.导入知识库

img

创建进出口知识库,csv文件拖入后,所有状态栏显示“已就绪”,则知识库搭建完成(若遇报错则不断刷新)

img

3.搭建工作流

  • 其中的四个预测模型接口是要在本地运行python代码,根据对应的端口进行填写,我填的是我自己本地跑的端口号
  • 注意填写各个工具的描述

img

img

img

img

如图搭建(用的模型如果是免费的会不稳定,用modelscope也可以试试)

细节:

image-20251017223612471

image-20251017223632293

image-20251017223647175

4.调用这个工作流

创建免登录窗口分享链接

img

  • 这只是在本地能过访问,要想别人能访问,要在一个有公网ip的服务器上面映射此台电脑

三、效果

ai会根据你进行的描述调用合适的工具

cd8941cbc51945d93993d361cbcff251