基于 OBCloud 构建 Dify x OceanBase 构建 “应用级” 的 AI 助手
实验环境
系统 | 环境 |
---|---|
Centos 7.9 | Docker、git、mariadb.x86_64、OBCloud |
注意
-
如果是做过之前 AI 实践营实验的,请重新创建新的超级用户(或者赋予对应的权限)。因为当时做这个实践的时候我沿用的就是之前 AI 实践营所创建的超级用户,导致后面多次重做都是出现同样的问题
-
正确的迁移:正常情况下会创建 72 张表,迁移完成的时候可能会有 Redis 相关的报错,这是 Redis 加锁超时的问题
mysql> use op; Database changed mysql> show tables; +-----------------------------------+ | Tables_in_op | +-----------------------------------+ | account_integrates | | accounts | | alembic_version | | api_based_extensions | | api_requests | | api_tokens | | app_annotation_hit_histories | | app_annotation_settings | | app_dataset_joins | | app_model_configs | | apps | | celery_taskmeta | | celery_tasksetmeta | | conversations | | data_source_api_key_auth_bindings | | data_source_oauth_bindings | | dataset_collection_bindings | | dataset_keyword_tables | | dataset_permissions | | dataset_process_rules | | dataset_queries | | dataset_retriever_resources | | datasets | | dify_setups | | document_segments | | documents | | embeddings | | end_users | | external_knowledge_apis | | external_knowledge_bindings | | installed_apps | | invitation_codes | | load_balancing_model_configs | | message_agent_thoughts | | message_annotations | | message_chains | | message_feedbacks | | message_files | | messages | | operation_logs | | pinned_conversations | | provider_model_settings | | provider_models | | provider_orders | | providers | | recommended_apps | | saved_messages | | sites | | tag_bindings | | tags | | tenant_account_joins | | tenant_default_models | | tenant_preferred_model_providers | | tenants | | tidb_auth_bindings | | tool_api_providers | | tool_builtin_providers | | tool_conversation_variables | | tool_files | | tool_label_bindings | | tool_model_invokes | | tool_providers | | tool_published_apps | | tool_workflow_providers | | trace_app_config | | upload_files | | whitelists | | workflow_app_logs | | workflow_conversation_variables | | workflow_node_executions | | workflow_runs | | workflows | +-----------------------------------+ 72 rows in set (0.04 sec)
-
正确超级用户权限:新的用户将具备
REFERENCES
权限mysql> show grants; +------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for centenary3@% | +------------------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALTER, CREATE, DELETE, DROP, INSERT, UPDATE, SELECT, INDEX, CREATE VIEW, SHOW VIEW, REFERENCES, ALTER ROUTINE, CREATE ROUTINE ON *.* TO 'centenary3' | +------------------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.04 sec)
-
-
错误示范:当时采用之前 AI 实践营实验的所创建的旧超级用户,发生了部分关键表缺失提示迁移失败,比如我的就是只有69张表,权限不足没有
REFERENCES
权限mysql> use gz; Database changed mysql> select database(); +------------+ | database() | +------------+ | gz | +------------+ 1 row in set (0.14 sec) mysql> show tables; +-----------------------------------+ | Tables_in_gz | +-----------------------------------+ | account_integrates | | accounts | | alembic_version | | api_based_extensions | | api_requests | | api_tokens | | app_annotation_hit_histories | | app_annotation_settings | | app_dataset_joins | | app_model_configs | | apps | | celery_taskmeta | | celery_tasksetmeta | | conversations | | data_source_api_key_auth_bindings | | data_source_oauth_bindings | | dataset_collection_bindings | | dataset_keyword_tables | | dataset_permissions | | dataset_process_rules | | dataset_queries | | dataset_retriever_resources | | datasets | | dify_setups | | document_segments | | documents | | embeddings | | end_users | | external_knowledge_apis | | external_knowledge_bindings | | installed_apps | | invitation_codes | | load_balancing_model_configs | | message_agent_thoughts | | message_chains | | message_feedbacks | | message_files | | operation_logs | | pinned_conversations | | provider_model_settings | | provider_models | | provider_orders | | providers | | recommended_apps | | saved_messages | | sites | | tag_bindings | | tags | | tenant_account_joins | | tenant_default_models | | tenant_preferred_model_providers | | tenants | | tidb_auth_bindings | | tool_api_providers | | tool_builtin_providers | | tool_conversation_variables | | tool_files | | tool_label_bindings | | tool_model_invokes | | tool_providers | | tool_workflow_providers | | trace_app_config | | upload_files | | whitelists | | workflow_app_logs | | workflow_conversation_variables | | workflow_node_executions | | workflow_runs | | workflows | +-----------------------------------+ 69 rows in set (0.14 sec) mysql> show grants; +------------------------------------------------------------------------------------------------------------------------------------------------+ | Grants for centenary2@% | +------------------------------------------------------------------------------------------------------------------------------------------------+ | GRANT ALTER, CREATE, DELETE, DROP, INSERT, UPDATE, SELECT, INDEX, CREATE VIEW, SHOW VIEW, ALTER ROUTINE, CREATE ROUTINE ON *.* TO 'centenary2' | +------------------------------------------------------------------------------------------------------------------------------------------------+ 1 row in set (0.07 sec)
-
官方最近有活动可以申请免费试用365天的云数据库,版本也更新到了4.3,支持向量功能。就可以不用起 Docker 环境了,申请地址:https://www.oceanbase.com/free-trial ,申请创建成功需要5~10 分钟
-
现场使用云数据库,需要准备好阿里云百炼账号并获取 API Key(首次注册用户请留意上方有提示开通服务,选择开通并同意,不然后面模型加载会报错),然后关于后面环境变量文件的设置请注意里面说明要对应填写信息
-
确保实例工作台中设置了
ob_vector_memory_limit_percentage
参数,以启用向量检索功能。推荐设置值为30
一、Docker 安装与启动镜像
打开阿里源的docker-ce源里面也有教程:docker-ce镜像_docker-ce下载地址_docker-ce安装教程-阿里巴巴开源镜像站
镜像加速
这里采用阿里云的镜像加速,阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://niphmo8u.mirror.aliyuncs.com"]
}
EOF
systemctl daemon-reload
systemctl enable --now docker
二、获取 OceanBase 数据库
进行实验之前,我们需要先获取 OceanBase 数据库,目前可行的方式有两种:使用 OBCloud 实例或者使用 Docker 本地部署单机版 OceanBase 数据库。这里采用 OBCloud 实例进行实验
2.1 使用 OBCloud 实例
2.1.1 注册并开通实例
进入OB Cloud 云数据库 365 天免费试用页面,点击“立即试用”按钮,注册并登录账号,填写相关信息,开通实例,等待创建完成,申请创建成功需要5~10 分钟。
2.1.2 获取数据库实例连接串
进入实例详情页的 “实例工作台”,点击 “连接” — “获取连接串” 按钮来获取数据库连接串,将其中的连接信息填入后续步骤中创建的 .env 文件内。
2.1.3 创建多个数据库
为了分别存放结构化数据(满足 alembic 的数据库结构迁移方案要求)和向量数据,我们需要至少创建两个数据库。可在实例详情页面中的 “数据库管理” 功能中创建数据库。
2.1.4 修改参数启用向量模块
实例工作台中设置了 ob_vector_memory_limit_percentage
参数,以启用向量检索功能。推荐设置值为 30
下面标注的地方也有详细教程
想用命令的话
mysql -h OBCloud实例连接串 -P 3306 -u 用户 -D 库 -p -A -e "alter system set ob_vector_memory_limit_percentage = 30"
三、克隆项目
git clone https://github.com/oceanbase-devhub/dify.git
# 如果网络条件差
git clone https://gitee.com/oceanbase-devhub/dify.git
四、拉取 Docker 镜像
进入到 dify 的工作目录中的docker
目录下,执行docker compose --profile workshop pull
,拉取所需要的镜像,这些镜像不一定都能够顺利拉取,请大家先自行寻求解决方案。
cd dify/docker
docker compose --profile workshop pull
五、修改环境变量
在docker
目录下存放着一个.env.example
文件,其中包含了若干 Dify 运行所需的环境变量,我们需要在这里把几个重要的配置项填写上。先把示例文件复制成为正式的版本。
cp .env.example .env
5.1 修改 DB_XXX 配置项
这部分配置项是关系型数据库的配置项,.env.example
中的171-189
行是这样的
# ------------------------------
# Database Configuration
# The database uses PostgreSQL. Please use the public schema.
# It is consistent with the configuration in the 'db' service below.
# ------------------------------
DB_PASSWORD=******
DB_DATABASE=dify
# For MySQL Database
# SQLALCHEMY_DATABASE_URI_SCHEME=mysql+pymysql
# DB_USERNAME=root
# DB_HOST=mysql-db
# DB_PORT=3306
# For PostgresQL (By default)
DB_USERNAME=postgres
DB_HOST=db
DB_PORT=5432
需要改成如下所示的样子,也就是改成用MySQL
而不是 PG 作为 Dify 的元数据库。需要注意的是,如果使用的是在本地机器上部署的 OceanBase 数据库,xxx_HOST
需要填写172.17.0.1
。
# ------------------------------
# Database Configuration
# The database uses PostgreSQL. Please use the public schema.
# It is consistent with the configuration in the 'db' service below.
# ------------------------------
DB_PASSWORD=****** # 更新密码
DB_DATABASE=****** # 更新数据库名
# For MySQL Database
SQLALCHEMY_DATABASE_URI_SCHEME=mysql+pymysql # 取消这一行的注释很关键!
DB_USERNAME=**** # 更新用户名
DB_HOST=******** # 更新 Host
DB_PORT=**** # 更新端口
# For PostgresQL (By default)
# DB_USERNAME=postgres
# DB_HOST=db
# DB_PORT=5432
5.2 修改 OCEANBASE_VECTOR_XXX 配置项
这个是将 OceanBase 作为 Dify 的向量数据库的配置,这里需要注意的是OCEANBASE_VECTOR_DATABASE
变量不能和5.1
步骤中填写的DB_DATABASE
一致,因为元数据库是需要做数据库结构升级的,每次都需要比对库中所有表的结构来生成结构升级脚本,如果有向量表在其中会影响数据库结构升级工具(alembic)的正常工作。
这五个变量需要修改成你的 OceanBase 数据库的连接信息,OBCloud 也好,Docker 部署的版本也好。但需要注意的是,如果使用的是在本地机器上部署的 OceanBase 数据库,xxx_HOST
需要填写172.17.0.1
。
# OceanBase Vector configuration, only available when VECTOR_STORE is `oceanbase`
OCEANBASE_VECTOR_HOST=***
OCEANBASE_VECTOR_PORT=***
OCEANBASE_VECTOR_USER=***
OCEANBASE_VECTOR_PASSWORD=***
OCEANBASE_VECTOR_DATABASE=***
5.3 修改 VECTOR_STORE 选项
将 .env 中的VECTOR_STORE
变量的值改为oceanbase
,选用 oceanbase 作为 Dify 的向量数据库。
# The type of vector store to use.
# Supported values are `weaviate`, `qdrant`, `milvus`, `myscale`, `relyt`, `pgvector`, `pgvecto-rs`, `chroma`, `opensearch`, `tidb_vector`, `oracle`, `tencent`, `elasticsearch`, `analyticdb`, `couchbase`, `vikingdb`, `oceanbase`.
VECTOR_STORE=oceanbase
六、启动 Dify 容器组
启动之前先看看第 2 步开始拉取的镜像是否就绪,如果已经完成,可以使用下列命令启动 Dify 的容器组。
docker compose --profile workshop up -d
七、查看 Dify 后端服务日志
docker logs -f docker-api-1
docker logs -f docker-worker-1
如果在其中任意一个容器的日志中看到了Database migration successful!
这一条信息,则说明数据库结构升级完成(另一个容器中可能会有Database migration skipped
表示在该容器中跳过了数据库结构迁移),如果没有其他ERROR
信息,则说明可以正常打开 Dify 界面了。
八、访问 Dify 应用
默认情况下,Dify 的前端页面会启动在本机的80
端口上,也就是说可以通过访问当前机器的 IP 来访问 Dify 的界面。也就是说如果我在笔记本上运行的话,我在浏览器上访问localhost
即可(或者是内网 IP);如果在服务器上部署 Dify,则需要访问服务器的公网 IP。初次访问 Dify 应用会进入“设置管理员账户”的页面,设置完成后即可使用该账号登录。
九、应用开发
在该步骤当中将使用**阿里云百炼**的模型服务,通过 Dify 搭建一个文档 RAG 问答助手。
首次注册用户请留意上方有提示开通服务,选择开通并同意,不然后面会报错,然后关于环境变量文件的设置请注意里面说明要对应填写信息
9.1 设置模型供应商和系统模型
添加模型qwen-turbo-2024-11-01
完成系统模型设置,将系统推理模型设置为qwen-turbo-2024-11-01
,Embedding 模型设置为text-embedding-v3
9.2 创建知识库并上传文档
9.2.1 克隆文档仓库
将 OceanBase 数据库的开源文档仓库克隆下来,作为数据来源。
git clone --single-branch --branch V4.3.4 https://github.com/oceanbase/oceanbase-doc.git ~/oceanbase-doc
# 如果访问 Github 仓库速度较慢,可以使用以下命令克隆 Gitee 的镜像版本
git clone --single-branch --branch V4.3.4 https://gitee.com/oceanbase-devhub/oceanbase-doc.git ~/oceanbase-doc
9.2.2 将指定文档上传到知识库中
回到首页,顶端中部的“知识库”标签页,进入知识库管理界面,点击创建知识库。
为了节省时间和模型服务调用量,仅处理 OceanBase 向量检索有关的几篇文档,这些文档相对于oceanbase-doc
目录的相对路径是zh-CN/640.ob-vector-search
,需要将这个目录下面所有的文档都上传。
索引方式选择“高质量”,点击“保存并处理”。
Dify 会提示知识库“已创建”,后续可能会看到某些文档已经在此处理完成。点击“前往文档”。
点击“前往文档”后会看到该知识库中的文档列表。
9.2.3 创建对话应用并选中知识库
点击“工作室”标签页,进入应用管理界面,点击“创建空白应用”。
保持默认选项“聊天助手”和“基础编排”即可,应用名称可以自行填写,例如 “OB 向量文档助手”。输入完成后点击“创建”按钮。
创建完成后会进入应用编排界面,首先关注右上角的默认模型设置,如果不是qwen-turbo-2024-11-01
则修改为qwen-turbo-2024-11-01
点击“上下文”卡片中的“添加”按钮,选中刚才我们创建的知识库并点击“添加”按钮
可以在右侧聊天框里进行应用调试,例如询问“请介绍一下 OceanBase 的向量功能”
9.3 应用发布
点击应用详情右上角的“发布”下面的“运行”按钮,会打开该应用的专属页面。
点击 Start Chat 按钮即可开始聊天。
十、参考链接
- 【创意工坊】试用 Dify x OceanBase 构建 “应用级” 的 AI 助手
- dify@oceanbase-workshop 实验文档
- 【创意工坊】试用 Dify x OceanBase 构建应用级的 AI 助手
感谢兹拉坦、与义 两位老师的帮助解决前面提到的表的缺失以及权限问题