本文介绍如何通过Dify快速搭建RAG应用,并使用Tablestore作为向量数据库,提高知识库检索的准确性和效率。
方案介绍
Dify 是一款开源的大语言模型(LLM) 应用开发平台。它融合了后端即服务(Backend as Service)和 LLMOps 的理念,使开发者可以快速搭建生产级的生成式 AI 应用。即使您是非技术人员,也能参与到 AI 应用的定义和数据运营过程中。
表格存储(Tablestore)是低成本、高性能的海量数据存储与检索系统,可以提供高召回(多路召回、标量/向量混合检索)、高性能(实时索引、毫秒级查询、单表上限百亿向量)、稳定安全(独立VPC、可用性99.99%、数据可靠性12个9)的向量检索功能。
RAG(Retrieval-Augmented Generation,检索增强生成)技术通过从外部知识库检索相关信息,并将其与用户输入合并后传入大语言模型(LLM),从而增强模型在私有领域知识问答方面的能力。使用Tablestore作为RAG应用的向量检索库时,知识库文件上传、存储以及检索的流程如下图所示。
准备工作
准备表格存储向量数据库。
开通表格存储服务并创建实例。
为阿里云账号或具有表格存储访问权限的RAM用户创建AccessKey。
准备部署Dify的服务器。由于网络原因,本文使用的是中国香港地域的ECS实例,实例规格为
ecs.e-c1m2.xlarge
,操作系统为Alibaba Cloud Linux 3.2104 LTS 64位。
部署流程
本文示例通过Docker Compose的方式部署Dify,如果您希望以本地源码方式部署Dify,请参见附录1:本地代码部署。
步骤一:安装Docker
安装dnf-plugins-core。
dnf -y install dnf-plugins-core
设置Docker仓库。
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker 和 Docker Compose。
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动Docker。
systemctl enable --now docker
步骤二:部署Dify
安装Git。
yum -y install git
下载源码。
git clone https://github.com/langgenius/dify.git
进入
docker
目录。cd dify/docker
复制配置文件。
cp .env.example .env
修改配置文件。
vi .env
修改以下配置,指定向量数据库为tablestore,并提供表格存储的访问地址Endpoint、实例名称以及AccessKey信息。如果您使用的是ECS,请根据地域情况选择访问地址:
ECS与表格存储在同一地域:选择公网地址或者VPC地址。
ECS与表格存储不在同一地域:选择公网地址。
VECTOR_STORE=tablestore TABLESTORE_ENDPOINT=https://k01r********.cn-hangzhou.ots.aliyuncs.com TABLESTORE_INSTANCE_NAME=k01r******** TABLESTORE_ACCESS_KEY_ID=LTAI******************** TABLESTORE_ACCESS_KEY_SECRET=******************************
启动Docker容器。
docker compose up -d
启动成功后,您可以看到以下输出。
✔ Network docker_default Created 0.1s ✔ Network docker_ssrf_proxy_network Created 0.1s ✔ Container docker-sandbox-1 Started 0.8s ✔ Container docker-redis-1 Started 1.0s ✔ Container docker-ssrf_proxy-1 Started 1.3s ✔ Container docker-web-1 Started 1.0s ✔ Container docker-db-1 Started 0.9s ✔ Container docker-plugin_daemon-1 Started 2.4s ✔ Container docker-api-1 Started 2.4s ✔ Container docker-worker-1 Started 2.3s ✔ Container docker-nginx-1 Started 3.8s
搭建RAG应用
步骤一:访问Dify
您可以通过 http://server_ip
访问Dify。初次登录会自动跳转初始化页面设置管理员账户,设置完成后跳转登录页进行登录。本文示例中,server_ip
为ECS实例的公网IP。
如果您使用的是ECS,需要添加安全组规则,在入方向规则中添加自定义TCP端口的允许访问策略,访问目的端口为80。
步骤二:系统模型设置
您可以根据需要选择模型供应商进行安装并设置API-KEY。本文以通义千问为例进行操作,操作前需要获取百炼的API Key。
在首页单击右上角头像,在弹出的菜单中单击设置。
在设置页面单击模型供应商,根据需要选择模型供应商,单击安装。
安装完成后,在待配置的模型列表中设置模型供应商的API-KEY。
配置完API-KEY后,将自动设置系统模型(需要手动刷新,例如切换菜单或重新进入设置)。您可以单击系统模型设置查看或修改模型。
步骤三:创建知识库
在首页单击知识库,在知识库页签单击创建知识库。
单击创建一个空知识库。在创建空知识库对话框中,输入知识库名称,单击创建,完成知识库创建。
在知识库页面单击添加文件,选择需要上传的文件,单击下一步进入文本分段与清洗设置。
根据需要设置文本分段与清洗方式,设置完成后单击保存并处理,等待文件上传完成。
上传完成后,您可以单击前往文档查看已上传的文档列表。
您也可以在表格存储控制台查看保存到表格存储的向量数据。
步骤四:创建和使用聊天助手
在首页单击工作室,然后单击创建空白应用。
在创建空白应用页面,选择聊天助手,输入应用名称后,单击创建。
直接对聊天助手进行提问,此时聊天助手的回答并不准确。
在聊天助手中选择知识库后,再对聊天助手进行提问。结合知识库文档,聊天助手能提供准确的回答。
相关文档
Dify环境变量说明
Dify部署常见问题
Dify应用案例
附录
附录1:本地代码部署
步骤一:安装依赖软件
安装Docker,用于启动Dify服务之前部署PostgreSQL、Redis等依赖。
安装dnf-plugins-core。
dnf -y install dnf-plugins-core
设置Docker仓库。
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
安装 Docker 和 Docker Compose。
dnf -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
启动Docker。
systemctl enable --now docker
安装Git,用于下载Dify源码。
yum -y install git
安装Python,运行Dify需要Python 3.12及以上版本,本文使用Pyenv方式进行安装。
安装Pyenv。
curl -fsSL https://pyenv.run | bash
配置环境变量。
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc echo '[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc echo 'eval "$(pyenv init - bash)"' >> ~/.bashrc
重启Shell。
exec "$SHELL"
安装Python依赖。
yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel xz-devel libffi-devel libuuid-devel libtirpc-devel libnsl2-devel
安装Python。
pyenv install 3.12
切换Python环境。
pyenv global 3.12
安装Poetry,Dify API服务使用Poetry来管理依赖。
安装Poetry。
curl -sSL https://install.python-poetry.org | python3 -
配置环境变量。
echo 'export PATH="/root/.local/bin:$PATH"' >> ~/.bashrc
重启Shell。
exec "$SHELL"
安装Node.js,用于部署Dify Web服务。
安装Unzip。
yum -y install unzip
安装fnm。
curl -o- https://fnm.vercel.app/install | bash
重启环境变量配置。
source /root/.bashrc
安装Node.js。
fnm install 22
安装Pnpm。
npm install pnpm -g
步骤二:下载源码
git clone https://github.com/langgenius/dify.git
步骤三:部署PostgreSQL等依赖
进入源码的 docker
目录,进行以下操作。
复制配置文件。
cp middleware.env.example middleware.env
部署启动依赖。
docker compose -f docker-compose.middleware.yaml up -d
步骤四:启动API服务
进入源码的 api
目录,进行以下操作。
复制配置文件。
cp .env.example .env
生成随机密钥。
awk -v key="$(openssl rand -base64 42)" '/^SECRET_KEY=/ {sub(/=.*/, "=" key)} 1' .env > temp_env && mv temp_env .env
请按提示输入
y
进行文件覆盖。修改配置文件。
vi .env
修改以下配置,指定向量数据库为tablestore,并提供表格存储的访问地址Endpoint、实例名称以及AccessKey信息。如果您使用的是ECS,请根据地域情况选择访问地址:
ECS与表格存储在同一地域:选择公网地址或者VPC地址。
ECS与表格存储不在同一地域:选择公网地址。
VECTOR_STORE=tablestore TABLESTORE_ENDPOINT=https://k01r********.cn-hangzhou.ots.aliyuncs.com TABLESTORE_INSTANCE_NAME=k01r******** TABLESTORE_ACCESS_KEY_ID=LTAI******************** TABLESTORE_ACCESS_KEY_SECRET=******************************
您还需要根据实际情况修改
CONSOLE_API_URL
、CONSOLE_WEB_URL
、SERVICE_API_URL
、APP_WEB_URL
和FILES_URL
。本文示例中,需要将127.0.0.1
替换为 ECS实例的公网IP地址。指定Python环境。
poetry env use 3.12
使用Poetry管理依赖。
poetry install
执行数据库迁移。
poetry run flask db upgrade
启动API服务。
poetry run flask run --host 0.0.0.0 --port=5001 --debug
运行成功后您可以看到以下输出。
2025-04-10 02:42:41,916 INFO [utils.py:162] NumExpr defaulting to 4 threads. * Debug mode: on 2025-04-10 02:42:50,438 INFO [_internal.py:97] WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on all addresses (0.0.0.0) * Running on http://127.0.0.1:5001 * Running on http://172.25.42.112:5001 2025-04-10 02:42:50,438 INFO [_internal.py:97] Press CTRL+C to quit 2025-04-10 02:42:50,445 INFO [_internal.py:97] * Restarting with stat 2025-04-10 02:42:54,32 INFO [utils.py:162] NumExpr defaulting to 4 threads. 2025-04-10 02:42:57,640 WARNING [_internal.py:97] * Debugger is active! 2025-04-10 02:42:57,642 INFO [_internal.py:97] * Debugger PIN: 792-769-991
步骤五:启动Worker服务
进入源码的 api
目录,运行以下命令启动Worker服务,用于消费异步队列任务,如知识库文件导入、更新知识库文档等异步操作。
poetry run celery -A app.celery worker -P gevent -c 1 -Q dataset,generation,mail,ops_trace --loglevel INFO
运行成功后您可以看到以下输出。
2025-04-10 02:48:11,265 INFO [connection.py:22] Connected to redis://:**@localhost:6379/1
2025-04-10 02:48:11,268 INFO [mingle.py:40] mingle: searching for neighbors
2025-04-10 02:48:12,282 INFO [mingle.py:49] mingle: all alone
2025-04-10 02:48:12,300 INFO [pidbox.py:111] pidbox: Connected to redis://:**@localhost:6379/1.
2025-04-10 02:48:12,311 INFO [worker.py:175] celery@iZj6c8qls7on04kyr3cw79Z ready.
步骤六:启动Web服务
进入源码的 web
目录,进行以下操作。
安装依赖。
pnpm install
复制配置文件。
cp .env.example .env.local
修改配置文件。
vi .env.local
根据实际API服务地址修改
NEXT_PUBLIC_API_PREFIX
和NEXT_PUBLIC_PUBLIC_API_PREFIX
。本文示例中,需要将127.0.0.1
替换为 ECS实例的公网IP地址。构建代码。
pnpm build
如果在构建过程中出现
FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out of memory
报错,可以尝试重新执行构建命令。运行Web服务。
pnpm start
运行成功后,您可以看到以下输出。
▲ Next.js 15.2.3 - Local: http://localhost:3000 - Network: http://0.0.0.0:3000 ✓ Starting... ✓ Ready in 80ms