#AI 实战营–上海站# 基于 OBCloud 构建 Dify x OceanBase 构建 “应用级” 的 AI 助手

基于 OBCloud 构建 Dify x OceanBase 构建 “应用级” 的 AI 助手

实验环境

系统 环境
Centos 7.9 Docker、git、mariadb.x86_64、OBCloud

注意

  1. 如果是做过之前 AI 实践营实验的,请重新创建新的超级用户(或者赋予对应的权限)。因为当时做这个实践的时候我沿用的就是之前 AI 实践营所创建的超级用户,导致后面多次重做都是出现同样的问题

    1. 正确的迁移:正常情况下会创建 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)
      
    2. 正确超级用户权限:新的用户将具备 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)
      
  2. 错误示范:当时采用之前 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)
    
  3. 官方最近有活动可以申请免费试用365天的云数据库,版本也更新到了4.3,支持向量功能。就可以不用起 Docker 环境了,申请地址:https://www.oceanbase.com/free-trial ,申请创建成功需要5~10 分钟


  4. 现场使用云数据库,需要准备好阿里云百炼账号并获取 API Key(首次注册用户请留意上方有提示开通服务,选择开通并同意,不然后面模型加载会报错),然后关于后面环境变量文件的设置请注意里面说明要对应填写信息

  5. 确保实例工作台中设置了 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 按钮即可开始聊天。

十、参考链接

  1. 【创意工坊】试用 Dify x OceanBase 构建 “应用级” 的 AI 助手
  2. dify@oceanbase-workshop 实验文档
  3. 【创意工坊】试用 Dify x OceanBase 构建应用级的 AI 助手

感谢兹拉坦与义 两位老师的帮助解决前面提到的表的缺失以及权限问题

十一、敬请下回分解

1 个赞

太高产了:cow: