唠唠闲话

DB-GPT 是一个开源的 AI 原生数据应用开发框架 AI Native Data App Development framework with AWEL and Agents。该项目旨在构建大模型领域的基础设施,通过开发:

  • 多模型管理(SMMF, Service-oriented Multi-model Management Framework)
  • Text2SQL 效果优化
  • RAG 框架以及优化
  • Multi-Agents 框架协作
  • AWEL(智能体工作流编排)

等多种技术能力,让围绕数据库构建大模型应用更简单,更方便。数据 3.0 时代,基于模型、数据库,企业/开发者可以用更少的代码搭建自己的专属应用。

当前发展趋势的变化:

  • 服务类型的变化:IaaS/PaaS/SaaS => AaaS
  • 开发模式的变化:DevOps => LLMOps

DB-GPT 官方文档:

注:中文文档更新不全,且存在错误,建议以英文文档为准。

项目特性

项目示意图:
项目示意图

名词 说明
DB-GPT 一个开源的 AI 原生数据应用开发框架
AWEL Agentic Workflow Expression Language, 智能体工作流表达式语言
AWEL Flow 使用智能体工作流语言编排的工作流
LLMOps 大语言模型操作框架,提供标准的端到端工作流程,用于训练、调整、部署和监控 LLM,以加速生成 AI 模型的应用程序部署
Plugin 插件, 主要用来完成某一个或者某一类具体的动作。
Datasource 数据源,比如 MySQL、PG、StarRocks、Clickhouse 等。
Text2SQL/NL2SQL Text to SQL,利用大语言模型能力,根据自然语言生成 SQL 语句,或者根据 SQL 语句给出解释说明
KBQA Knowledge-Based Q&A 基于知识库的问答系统
GBI Generative Business Intelligence 生成式商业智能,基于大模型与数据分析,通过对话方式提供商业智能分析与决策
Embedding 将文本、音频、视频等资料转换为向量的方法
RAG Retrieval-Augmented Generation 检索能力增强

博客定位

博客将从实践角度,围绕以下几个要点介绍 DB-GPT 的特性:

  1. 支持的知识库有哪些,怎么添加,以及怎么使用
  2. 智能体的构建方式,以及如何使用 AWEL Flow
  3. 前端的可视化,以及与用户的交互方式

实践的 DB-GPT 版本为 0.5.0,这个版本开始为 DB-GPT 第一个长期维护的版本。

服务部署

DB-GPT 提供了。这部分本身也可以单独作为一个工具使用。

0. 安装环境

通过源码安装,其中 Python 版本建议小于 3.10

1
2
3
4
5
6
7
8
9
10
11
git clone https://github.com/eosphoros-ai/DB-GPT.git
cd DB-GPT
conda create -n dbgpt_env "python=3.10"
conda activate dbgpt_env
# 等待安装完成
# pip install transformers==4.35.0
pip install -e ".[openai]"
pip install -e ".[default]"
pip install cryptography # 连接 MySQL 数据库需要
# pip install -U langchain-community
# pip install -e ".[vllm]"

如果遇到环境依赖问题,再根据报错信息灵活处理。

1. 模型管理

启动模型控制器:

1
dbgpt start controller # 默认端口 8000 --port 修改

以下假设服务在 172.23.148.37 下启动,其他模型则通过局域网的其他服务器启动。

添加本地模型

启动本地模型,比如 chatglm3-6b:

1
2
3
4
5
6
7
# CUDA_VISIBLE_DEVICES=0,1
dbgpt start worker --model_name chatglm3-6b \
--model_path /sshfs/pretrains/THUDM/chatglm3-6b \
--port 8001 \
--load_4bit \
--num_gpus 2 \
--controller_addr http://172.23.148.37:8000

其中 --controller_addr 填写控制器所在的服务器地址,如果是本地则填写 127.0.0.1

回到控制器服务器,查看模型列表:

1
2
3
4
5
6
7
❯ dbgpt model list
+---------------+------------+---------------+------+---------+---------+-----------------+----------------------------+
| Model Name | Model Type | Host | Port | Healthy | Enabled | Prompt Template | Last Heartbeat |
+---------------+------------+---------------+------+---------+---------+-----------------+----------------------------+
| chatglm3-6b | llm | 172.23.148.35 | 8001 | True | True | | 2024-03-04T23:37:01.359224 |
| WorkerManager | service | 172.23.148.35 | 8001 | True | True | | 2024-03-04T23:37:01.414130 |
+---------------+------------+---------------+------+---------+---------+-----------------+----------------------------+

测试模型:

1
2
3
4
❯ dbgpt model chat --model_name chatglm3-6b
Chatbot started with model chatglm3-6b. Type 'exit' to leave the chat.
You: hello
Bot: Hello 👋! I'm ChatGLM3-6B, the artificial intelligence assistant, nice to meet you. Feel free to ask me any questions.

注意事项:

  1. 一个端口只能注册一个模型,注册后,该端口会启动一个 WorkerManager 服务
  2. 模型关闭后,dbgpt model list 仍会显示注册过但已关闭的模型,其 HealthyFalse。同样地,网页端也仍会显示
    20240305021511
  3. Worker 默认会使用所有可用的 GPU,且 --num_gpus 参数似乎没用,还是得用 CUDA_VISIBLE_DEVICES 控制。
  4. 如果指定了 worker_type,则参数规则会改变,比如 vllm 是用 --tensor_parallel_size 参数指定 tensor 并行的数量,用 --num_gpus 参数会报错。

添加嵌入模型

添加 Embedding 模型:

1
2
3
4
5
dbgpt start worker --model_name text2vec-large-chinese \
--model_path /sshfs/pretrains/GanymedeNil/text2vec-large-chinese \
--worker_type text2vec \
--port 8002 \
--controller_addr http://172.23.148.37:8000

这里 worker_type 设置为 text2vec

vLLM 加载模型

这部分需要安装 vllm 模块,使用 pip install -e ".[vllm]" 安装。

1
2
3
4
5
6
dbgpt start worker --model_name chatglm3-6b \
--model_path /sshfs/pretrains/THUDM/chatglm3-6b \
--port 8001 \
--model_type vllm \
--tensor_parallel_size 2\
--controller_addr http://localhost:8011

似乎没有正常启动,尽管推理时显存有占用,但回答结果空白,可能需要设置停止词之类的。

添加 API 模型

文档这部分写得一言难尽,这些参数的规则需要结合 .env 文件和网页端推理出来。

添加 OpenAI 模型:

1
2
3
4
5
6
7
dbgpt start worker --model_name chatgpt \
--model_path chatgpt_proxyllm \
--worker_type llm \
--port 8003 \
--proxy_server_url https://api.chatanywhere.tech/v1/chat/completions \
--proxy_api_key $OPENAI_API_KEY \
--controller_addr http://172.23.148.37:8000

添加智谱模型:

1
2
3
4
5
6
7
8
dbgpt start worker --model_name zhipu_proxyllm \
--model_path zhipu_proxyllm \
--worker_type llm \
--port 8004 \
--proxy_server_url https://open.bigmodel.cn/api/paas/v4/chat/completions \
--proxy_api_key $ZHIPU_API_KEY \
--proxyllm_backend glm-4 \
--controller_addr http://172.23.148.37:8000

添加 OpenAI Embedding 模型:

1
2
3
4
5
6
7
8
dbgpt start worker --model_name openai-embedding \
--model_path chatgpt_proxyllm \
--worker_type llm \
--port 8005 \
--proxy_server_url https://api.chatanywhere.tech/v1/embeddings \
--proxy_api_key $OPENAI_API_KEY \
--proxyllm_backend text-embedding-ada-002\
--controller_addr http://172.23.148.37:8000

谷歌,微软等模型的添加方式类似。

实测环境变量也有影响。

模型推理

模型能以兼容 OpenAI 的方式推理,具体地,先启动 API Server 服务:

1
dbgpt start apiserver --api_keys EMPTY --controller_addr http://127.0.0.1:8000 # 默认值,可以不填

参数说明:

  • --api_keys:API 的 key,如果有多个,用逗号分隔;如果不填写,则允许所有密钥;这里将密钥设置为 EMPTY 这个单词。
  • --controller_addr:控制器地址,可不填,与上边等同。
  • --port:端口号,默认 8100。
  • --host:监听的地址,默认 0.0.0.0

测试模型:

1
2
3
4
curl http://127.0.0.1:8100/api/v1/chat/completions \
-H "Authorization: Bearer EMPTY" \
-H "Content-Type: application/json" \
-d '{"model": "chatglm3-6b", "messages": [{"role": "user", "content": "hello"}]}'

吐槽一下:官方的中文文档,这部分把端口的规则写反了。。。

2. 启动服务

加载 Embedding 模型

需要下载 Embedding 模型才能正常启动,尽管启动选项提供了 --remote_embedding 来使用 Worker 中的模型,但实际运行会报错,待处理。

下载模型到仓库目录:

1
2
3
4
# cd DB-GPT
mkdir models && cd models
# download embedding model, eg: text2vec-large-chinese
git clone https://huggingface.co/GanymedeNil/text2vec-large-chinese

配置环境变量

复制环境变量文件并修改

1
cp .env.template .env

一个简单的配置例子,可以直接粘贴,或者修改对应选项:

1
2
3
4
5
6
# .env
LANGUAGE=zh # 语言
LLM_MODEL=zhipu_proxyllm # 模型名称
MODEL_SERVER=http://127.0.0.1:8000 # 控制器地址
ZHIPU_MODEL_VERSION=glm-4
ZHIPU_PROXY_API_KEY={your_api_key}

启动服务:

1
dbgpt start webserver --light # 默认端口 5000

由于使用多模型管理,这里必须用 --light 参数,将模型加载交给控制器,而不是使用 .env 的模型配置。其中变量 LLM_MODEL 将用作默认模型,请确保模型列表中有该模型。

这里还有些参数,后续有需要再补充。

变量的读取规则尚不清楚,应该是:环境变量 > .env 文件 > 默认值。待确认。

服务介绍

通过 服务器IP:5000 访问服务,如下图所示,启动了四个模型:

20240305025702

左侧为对话列表,下方包括五个模块:

  1. APP 应用
  2. AWEL Flow 智能体工作流
  3. Models 模型管理
  4. Database 数据库
  5. Knowledge 知识库

从 0.5.0 版本开始,DB-GPT 项目原生集成了 data-centric 程序的管理和分发。dbgpts 项目管理和分享的资源分为以下几类:

  • 应用程序:使用 DB-GPT 框架开发的原生智能数据应用程序。
  • 工作流:使用 AWEL(Agentic Workflow Expression Language)构建的工作流程。
  • 智能代理:可以执行各种任务的智能代理。
  • 操作算子:可以在工作流程中使用的基本操作单位。

以上主要介绍了服务部署和模型管理。下边我们将在实战过程中,介绍这些板块的用法。

知识问答

第一部分,针对文件知识库的 RAG 问答,针对结构化知识库的工具问答。

知识库问答

Q:支持的知识库有哪些,怎么添加,以及怎么使用。

  1. 支持:纯文本、URL抓取、PDF、Word、Markdown 等多种文档类型

  2. 创建对话:选择知识库对话,结合知识库的文档进行问答。初始 Prompt 可以在知识库中修改,聊天会自动使用 RAG 抽取信息,拼接到 Prompt 中。

  3. 在知识库对话下,允许用户直接上传文件进行对话,且默认会触发文档的总结能力。上传的文件也会传入该知识库。


  1. 潜在问题:.py 等文件直接导入会显示 TODO。直接上传也一样

  2. 大文件导入比较久,RUNNING 默认用了 CPU 推理,怎么修改。

  3. 空白对话也有默认 Prompt,暂时不知道怎么改。

1
2
PROMPT_SCENE_DEFINE_EN = "You are a helpful AI assistant."
PROMPT_SCENE_DEFINE_ZH = "你是一个有用的 AI 助手。"

总结:能够按知识库进行归类,进行问答。待修缮:文件导入,Prompt 修改,GPU 设置。

注:从模型调用结果来看,其结合了 RAG 检索知识库和模板拼接。

数据问答

1
pip install cryptography

添加数据后,在 ChatData 板块进行问答。会根据用户问题,生成代码,进行回答。

亲测除了 chatglm3-6b,基本都能完成。界面的 Editor 支持对代码记性修改。

Q:生成过程是怎么进行的?

A:从日志可以看出,基于形如下边的 Prompt

1
2
3
4
5
6
7
8
9
10
11
12
请根据用户选择的数据库和该库的部分可用表结构定义来回答用户问题.
数据库名:
case_1_student_manager 表结构定:['']
约束
1. 请根据用户问题理解用户意图,使用给出表结构定义创建一个语法正确的 mysql sql,如果不需要sql,则直接回答用户问题。
2. 除非用户在问题中指定了他希望获得的具体数据行数,否则始终将查询限制为最多 50 个结果。
3. 只能使用表结构信息中提供的表来生成 sql,如果无法根据提供的表结构中生成 sql ,请说:“提供的表结构信息不足以生成 sql 查询。” 禁止随意捏造信
...
用户问题:
查询前十个学生的信息
请一步步思考并按照以下JSON格式回复: "{\n \"thoughts\": \"thoughts summary to say to user\",\n \"sql\": \"SQL Query to run\",\n \"display_type\": \"Data display method\"\n}"
确保返回正确的json并且可以被 Python json.loads 方法解析.

思考过程:

1
{"thoughts": "为了查询前十个学生的信息,我们可以使用 `SELECT` 语句从 `students` 表中选择 `student_id` 和 `student_name` 列,并按照 `student_id` 升序排列。", "sql": "SELECT student_id, student_name FROM students ORDER BY student_id LIMIT 10","display_type": "Data display method"

系统背后:

1
editor_sql_run:{'db_name': 'case_1_student_manager', 'sql': 'SELECT student_id, student_name FROM students ORDER BY student_id LIMIT 10'}

Q1:ChatDB 做什么用的,似乎只能看到结构,不能执行动作。

Q2: ChatExcel 似乎当成数据库来操作了

Q3: ChatDashboard 支持分析需要的功能,但当前的前端页面容易丢失信息。


还有个问题,所有对话,不支持修改历史记录,或者重新生成这一类操作。

开发设计

1
pip install Poetry

目前支持三个内容:

  1. 插件开发,比如调用百度搜索
  2. AWEL 流
  3. 应用构建

BIChat:

直接启动,推理停止词

1
2
# BIChat
pip install einops transformers_stream_generator
1
2
3
4
5
6
7
8
dbgpt start worker --model_name bichat \
--model_path chatgpt_proxyllm \
--worker_type llm \
--port 8008 \
--proxy_server_url http://172.23.148.39:8111/v1/chat/completions \
--proxy_api_key sk-123 \
--stop "<|endoftext|>"\
--proxyllm_backend bichat --controller_addr http://localhost:8000

API 启动

示例:

前端页面魔改

npm install @emotion/react @emotion/styled

npm config get registry

npm config set registry https://r.cnpmjs.org
npm install @mui/material @mui/icons-material