[AI知识库/向量] 基于RAGFlow知识库引擎构建企业级AI客服/助手(暨:RAGFlow 安装部署与使用指南)
0 序
- 核心结论:可以直接基于RAGFlow + LLM + 重排序模型构建企业级AI客服、智能助手、Bot助手,也可将 RAGFlow 集成到各类 AI Agent / Workflow 应用程序(如:Dify、LangChain、Spring AI等)中,做进一步的增强。
欢迎评论、交流。
- 核心结论:基于RAGFlow知识库引擎的私有化方案的适用群体:企业
- 整套方案需要有一定的技术背景方可驾驭、运维(对非技术人员,相对吃力)
- 且RAGFlow对硬件资源的要求相对较大(最低规格:4Core、16GB、50GB Disk)。故: 不适用于【个人知识库】场景,仅适用于【企业级知识库】。
- 如果无力、无心自己部署,也可使用 RAGFlow 官方部署的云服务体验一下:
https://cloud.ragflow.io/ (弊端:只能在GUI体验,但无法调用API)
- RAGFlow 最精彩的功能特性,可直接阅读本篇第1章:主流程体验
本篇侧重于实操、动手,对于IT技术人员相对友好。
无力操作的非技术人员,也没关系,了解其构建过程,对于了解了解基于知识库的企业级AI客服的技术方案也有裨益。
- 对 RAGFlow 是什么,不了解的,可以参见:
1 RAGFlow 主流程体验篇
Step1 安装 Docker / Docker Compose 环境,并启动
- 推荐文档
- [Docker] Docker 基础教程(概念/原理/基础操作) - 博客园/千千寰宇
- [Docker] Docker Compose 基础教程(概念/基础操作) - 博客园/千千寰宇
- [虚拟化/Docker] Windows上 Docker Desktop 的安装与使用 - 博客园/千千寰宇 【推荐】
安装本篇的步骤操作即可。
- 环境信息(本章节的实验)
- Windows 8
- CPU Arch: X86/AMD64
- Docker Desktop Backend : WSL 2
- 查验版本 : docker / docker compose
$ docker version
Client:
Version: 29.7.2
API version: 1.55
Go version: go1.26.5
Git commit: a7dcaa6
Built: Wed Aug 5 18:31:33 2026
OS/Arch: windows/amd64
Context: desktop-linux
Server: Docker Desktop 4.87.0 (236836)
Engine:
Version: 29.7.2
API version: 1.55 (minimum version 1.40)
Go version: go1.26.5
Git commit: 6a43e3d
Built: Wed Aug 5 18:28:36 2026
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.5
GitCommit: e53c7c1516c3b2bff98eb76f1f4117477e6f4e66
runc:
Version: 1.3.6
GitCommit: v1.3.6-0-g491b69ba
docker-init:
Version: 0.19.0
GitCommit: de40ad0
$ docker compose version
Docker Compose version v5.4.0
Step2 下载 RAGFlow 项目源码
git clone -b v0.27.0 https://github.com/infiniflow/ragflow.git
Step3 拉取镜像,并启动
- 切到目标Git分支、目标目录下
$ cd ragflow
$ git checkout v0.27.0
$ ls -l
total 4736
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 admin/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 agent/
-rw-r--r-- 1 xxxUser 197121 8755 20 19:38 AGENTS.md
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 api/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 bin/
-rwxr-xr-x 1 xxxUser 197121 23812 20 19:38 build.sh*
-rw-r--r-- 1 xxxUser 197121 9 20 19:38 CLAUDE.md
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 cmd/
-rw-r--r-- 1 xxxUser 197121 54 20 19:38 codecov.yml
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 common/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 conf/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 deepdoc/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 docker/
-rw-r--r-- 1 xxxUser 197121 4890 20 19:38 Dockerfile
-rw-r--r-- 1 xxxUser 197121 1969 20 19:38 Dockerfile.scratch.oc9
-rw-r--r-- 1 xxxUser 197121 9699 20 19:38 Dockerfile_base
-rw-r--r-- 1 xxxUser 197121 2812 20 19:38 Dockerfile_deepdoc_oss
-rw-r--r-- 1 xxxUser 197121 999 20 19:38 Dockerfile_tei
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 docs/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 example/
-rw-r--r-- 1 xxxUser 197121 11819 20 19:38 go.mod
-rw-r--r-- 1 xxxUser 197121 76853 20 19:38 go.sum
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 helm/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 internal/
-rw-r--r-- 1 xxxUser 197121 4553 20 19:38 lefthook.yml
-rw-r--r-- 1 xxxUser 197121 11558 20 19:38 LICENSE
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 mcp/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 memory/
-rw-r--r-- 1 xxxUser 197121 15063 20 19:38 pyproject.toml
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 rag/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 ragflow_deps/
-rw-r--r-- 1 xxxUser 197121 18108 20 19:38 README.md
-rw-r--r-- 1 xxxUser 197121 21377 20 19:38 README_ar.md
-rw-r--r-- 1 xxxUser 197121 19477 20 19:38 README_fr.md
-rw-r--r-- 1 xxxUser 197121 16760 20 19:38 README_id.md
-rw-r--r-- 1 xxxUser 197121 20076 20 19:38 README_ja.md
-rw-r--r-- 1 xxxUser 197121 18682 20 19:38 README_ko.md
-rw-r--r-- 1 xxxUser 197121 19089 20 19:38 README_pt_br.md
-rw-r--r-- 1 xxxUser 197121 20773 20 19:38 README_ru.md
-rw-r--r-- 1 xxxUser 197121 19356 20 19:38 README_tr.md
-rw-r--r-- 1 xxxUser 197121 18373 20 19:38 README_tzh.md
-rw-r--r-- 1 xxxUser 197121 18367 20 19:38 README_zh.md
-rwxr-xr-x 1 xxxUser 197121 776 20 19:38 run_go_tests.sh*
-rwxr-xr-x 1 xxxUser 197121 12443 20 19:38 run_tests.py*
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 sdk/
-rw-r--r-- 1 xxxUser 197121 2022 20 19:38 SECURITY.md
-rwxr-xr-x 1 xxxUser 197121 1824 20 19:38 show_env.sh*
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 test/
-rw-r--r-- 1 xxxUser 197121 265 20 19:38 test.py
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 tools/
-rw-r--r-- 1 xxxUser 197121 886039 20 19:38 uv.lock
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 web/
$ cd docker
$ ls -la
total 1920
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 ./
drwxr-xr-x 1 xxxUser 197121 0 20 19:37 ../
-rw-r--r-- 1 xxxUser 197121 15682 20 19:38 .env
-rw-r--r-- 1 xxxUser 197121 3833 20 19:38 .env.single-bucket-example
-rw-r--r-- 1 xxxUser 197121 6290 20 19:38 docker-compose.yml
-rw-r--r-- 1 xxxUser 197121 11898 20 19:38 docker-compose-base.yml
-rw-r--r-- 1 xxxUser 197121 2112 20 19:38 docker-compose-CN-oc9.yml
-rw-r--r-- 1 xxxUser 197121 1647 20 19:38 docker-compose-macos.yml
-rwxr-xr-x 1 xxxUser 197121 12135 20 19:38 entrypoint.sh*
-rw-r--r-- 1 xxxUser 197121 1669 20 19:38 infinity_conf.toml
-rw-r--r-- 1 xxxUser 197121 54 20 19:38 init.sql
-rw-r--r-- 1 xxxUser 197121 40 20 19:38 init-clickhouse.sql
-rwxr-xr-x 1 xxxUser 197121 8698 20 19:38 launch_backend_service.sh*
-rwxr-xr-x 1 xxxUser 197121 11424 20 19:38 migration.sh*
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 nginx/
drwxr-xr-x 1 xxxUser 197121 0 20 19:38 oceanbase/
-rwxr-xr-x 1 xxxUser 197121 3066 20 19:38 oceanbase-entrypoint.sh*
drwxr-xr-x 1 xxxUser 197121 0 20 20:11 ragflow-logs/
-rw-r--r-- 1 xxxUser 197121 15948 20 19:38 README.md
-rw-r--r-- 1 xxxUser 197121 7648 20 19:38 service_conf.yaml.template
- 拉取镜像,并启动
$ docker compose -f docker-compose.yml up -d
启动成功后,可查验状态:
$ docker images
IMAGE ID DISK USAGE CONTENT SIZE EXTRA
elasticsearch:8.11.3 58a3a280935d 2.1GB 676MB U
infiniflow/ragflow:v0.27.0 860da0b6a63a 11.9GB 3.43GB U
mysql:8.0.40 d58ac93387f6 826MB 186MB U
pgsty/silo:RELEASE.2026-08-06T00-00-00Z 29a498b24669 216MB 54.6MB U
valkey/valkey:8 f0ba22526631 163MB 43MB U

$ docker compose ps
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
docker-es01-1 elasticsearch:8.11.3 "/bin/tini -- /usr/l鈥▒" es01 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:1200->9200/tcp, [::]:1200->9200/tcp
docker-minio-1 pgsty/silo:RELEASE.2026-08-06T00-00-00Z "/usr/bin/docker-ent鈥▒" minio 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:9000-9001->9000-9001/tcp, [::]:9000-9001->9000-9001/tcp
docker-mysql-1 mysql:8.0.40 "docker-entrypoint.s鈥▒" mysql 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp
docker-ragflow-cpu-1 infiniflow/ragflow:v0.27.0 "./entrypoint.sh --e鈥▒" ragflow-cpu 17 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:9380-9384->9380-9384/tcp, [::]:9380-9384->9380-9384/tcp
docker-redis-1 valkey/valkey:8 "docker-entrypoint.s鈥▒" redis 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cfb833c377f infiniflow/ragflow:v0.27.0 "./entrypoint.sh --e鈥▒" 17 minutes ago Up 16 minutes 0.0.0.0:80->80/tcp, [::]:80->80/tcp, 0.0.0.0:443->443/tcp, [::]:443->443/tcp, 0.0.0.0:9380-9384->9380-9384/tcp, [::]:9380-9384->9380-9384/tcp docker-ragflow-cpu-1
451f9f6ce52f mysql:8.0.40 "docker-entrypoint.s鈥▒" 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp docker-mysql-1
75cb22e02f94 pgsty/silo:RELEASE.2026-08-06T00-00-00Z "/usr/bin/docker-ent鈥▒" 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:9000-9001->9000-9001/tcp, [::]:9000-9001->9000-9001/tcp docker-minio-1
76ab741e73e9 elasticsearch:8.11.3 "/bin/tini -- /usr/l鈥▒" 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:1200->9200/tcp, [::]:1200->9200/tcp docker-es01-1
ef303303d2a6 valkey/valkey:8 "docker-entrypoint.s鈥▒" 17 minutes ago Up 17 minutes (healthy) 0.0.0.0:6379->6379/tcp, [::]:6379->6379/tcp

Step4 访问 RAGFlow,并注册使用
- 访问: http://127.0.0.1:80 ,用邮箱注册账号,并登录

Step5 验证与使用
CASE 检索效果验证
- 改用 Q & A 解析模板 + 调整个别参数(向量检索的权重:0.7,启用跨语言检索:英文+中文)后:

CASE Python应用调用RAGFlow
from ragflow_sdk import RAGFlow
# step0 安装依赖: pip install ragflow-sdk -i https://mirrors.aliyun.com/pypi/simple/
# step1 RAGFlow客户端的初始化 | api_key 和 base_url 是必填项,所有请求都会自动带上 Authorization: Bearer <api_key> 头
rag = RAGFlow(
api_key="ragflow-xxxxxxxxxxxxxxxxxxx", # 在 RAGFlow Web UI → 头像 → API 里创建
base_url="https://cloud.ragflow.io" # http://<你的RAGFlow地址>:9380,默认端口 9380,docker 部署若映射 80 就写 80
)
# step2 检索已有数据集里的 chunks | 假设在 Web UI 里已经建好了知识库(dataset)并上传文档、解析完成,现在开始检索
# step2.1 拿到目标数据集对象
dataset = rag.get_dataset(name="bigdata-develop-knowledge-dataset") # 或用 id 获取:rag.get_dataset(id="xxx")
# step2.2 直接检索
chunks = rag.retrieval(
question="HDFS 的组件?",
datasets=[dataset],
offset=0,
limit=6, # 返回几条 chunk
similarity_threshold=0.2, # 相似度门槛,低于此分丢弃
vector_similarity_weight=0.7, # 向量余弦权重,1-weight 是关键词 BM25 权重
top_k=1024 # 参与向量计算的候选 chunk 数
)
for c in chunks:
print(f"得分: {c.similarity} | 内容: {c.content}")
print(f"来源: {c.source}")
CASE 基于知识库的对话助手(企业AI智能问答客服、...)
- 创建的对话助手,其内部需要配置:
- System Prompt
- LLM模型、重排序模型
- 混合检索的配置参数:向量检索的相似度阈值、权重、...
- ...

CASE 基于 RAGFlow 及其原生的 QQBot Chat Channel + QQ 实现【在线问答助手】
总体思路
- 基于 RAGFlow 原生 (QQ Bot)Chat Channel 直连方案 (候选方案:QQBot 桥接 RAGFlow HTTP API(自定义编排))
这是官方支持的方式,RAGFlow 内置 QQ Bot 频道,只需在 User Settings → Chat channels 中创建 QQ Bot 频道并填入 AppID + ClientSecret,再绑定到一个 Chat 即可。
RAGFlow 目前还支持的 Chat Channel 还有:
flowchart TB
subgraph UserSide["用户侧"]
U["QQ 用户<br/>(私聊 / 群聊 / 频道)"]
end
subgraph Tencent["腾讯开放平台"]
QQBot["QQ Bot 开放平台<br/>AppID + AppSecret 鉴权"]
end
subgraph RAGFlow["RAGFlow 服务"]
Channel["Chat Channel 模块<br/>QQ Bot 频道接入与消息转发"]
Chat["Chat 助手<br/>(绑定知识库 + LLM)"]
Retriever["检索与重排<br/>Vector + BM25 + Rerank"]
KB[("知识库 Dataset<br/>MinIO / ES / Infinity")]
LLM["大模型推理<br/>Generative Answer + Citation"]
end
U -->|发送消息| QQBot
QQBot -->|WebSocket / 回调推送| Channel
Channel -->|转发用户 query| Chat
Chat -->|召回相关片段| Retriever
Retriever -->|向量 + 关键词检索| KB
KB -->|候选 chunks| Retriever
Retriever -->|重排后 top-k| Chat
Chat -->|拼装 prompt + 引用| LLM
LLM -->|流式回答 + 溯源| Chat
Chat -->|回复文本| Channel
Channel -->|原路回传| QQBot
QQBot -->|消息送达| U
style Channel fill:#e1f5ff
style Chat fill:#fff4e1
style KB fill:#ffe1f0
- 关键协作点:
- QQ Bot 频道只做消息搬运,不承载 RAG 逻辑
- 回答质量、知识范围、模型能力完全由 RAGFlow 侧绑定的 Chat 决定
- 频道启用但未绑定 Chat 时,RAGFlow 能收消息但不会回复
Step1 QQ开放平台: 申请/创建 QQBot
- QQ开放平台: 可通过邮箱、或登录QQ号来申请/创建 QQBot


- 创建 QQBot成功后,即可获取其 AppId / Secret 信息。
- QQ开放平台 会给 QQBot 赋予1个新的QQ号码、1个AppId
- 查看 QQBot 列表: https://q.qq.com/qqbot/dashboard/


Step2 RAGFlow: 创建 Dataset => 创建 Chat Assistant(对话助手)
- 参见本文档本章节 : CASE 创建对话助手
Step3 RAGFlow: 配置 QQBot 的连接信息 => 绑定关联的 Chat Assistant

Step4 QQ App: 体验 RAGFlow 的智能对话

CASE 基于Dataset构建专属的智能搜索应用(Search)
- 创建 Search 实例,并简单配置、使用

- Search 列表

- 做一定的调优后:

CASE 存储【记忆】
尚未深度体验。

CASE 上传和管理【文件】
尚未深度体验。


CASE 创建Agent(未深度体验)
尚未深度体验,还有点懵。
可参见官方文档: https://ragflow.com.cn/docs/category/components

StepEnd 停止运行
docker compose down
2 RAGFlow 功能操作篇
基础设置操作
配置模型
- 配置模型
http://127.0.0.1/user-setting/model
https://cloud.siliconflow.cn 笔者选择的【硅基流动】

配置默认模型(LLM模型、嵌入模型、重排序模型、...)
- 创建 Dataset 前即要求设置默认的词嵌入模型等模型。

配置数据源

配置 Chat Channel

配置 MCP

生成并获取 API Key

- api key : 用于的AI应用程序(Dify、LangChain等智能应用)在集成 RAGFlow 时需要基于此密钥做身份认证。
例如:
ragflow-3UjnQOYxxxxxxxxxxfMRxxxxK-Imz_3Vxxxxxxxxx-E
- api url:
http(s)://<你的RAGFlow地址>:80,docker 部署若映射 80 就写 80
例如:
https://cloud.ragflow.io
Dataset/知识库 管理
创建 Dataset(指定嵌入模型、构建方式、构建模板)
- 可选的构建模板: General / Q&A / Manual / Table / Paper / Book / Laws / Presentation / One / Tag


创建/上传 文件(夹) 到 Dataset,完成文档解析


- 支持对指定文件添加【元数据】


设置Dataset参数

检索效果验证
- 改用 Q & A 解析模板 + 调整个别参数(向量检索的权重:0.7,启用跨语言检索:英文+中文)后:

查看Dataset的运行日志

Chat 模块
基于Dataset的聊天

Z FAQ for RAGFlow 部署与使用
Q: RAGFlow 官方云服务(ragflow.io 托管版)的套餐权限?
- 详情参见官网:
| 套餐 | 价格 | Apps | 存储 | 每月 Credits | API Key |
|---|---|---|---|---|---|
| Free | $0 | 5 | 0.1 GB | 500 | ❌ 不开放 |
| Starter | $29/mo | 促销期,之后 | $59/mo | 50 | 5 GB | 5,000 | ✅ 开放 |
| Pro | $129/mo | 促销期,之后 $259/mo | 无限 | 50 GB | 20,000 | ✅ 开放 |
| Enterprise | 定制 | 定制 | BYOC/私有部署 | 定制 | ✅开放 |
- 如果是 Free 用户,调用RAGFlow 官方云服务API时会报错:
免费账户只能在 Web UI 里点着用,不能通过 HTTP/Python/MCP 接口程序化调用 。
{'code': 403, 'data': None, 'message': 'You need to upgrade to a Starter or Pro plan to use an API key.'}
浙公网安备 33010602011771号