DB-GPT学习指南:Chat Dashboard与SQL微调能力
本文详细介绍了DB-GPT开源框架中Chat Dashboard和Text2SQL微调两大核心功能,涵盖架构、配置、实现原理、学习路径及进阶方向,适合开发者快速上手。
DB-GPT学习指南:Chat Dashboard与SQL微调能力
一、项目概述
DB-GPT是一个开源的AI原生数据应用开发框架(AI Native Data App Development framework with AWEL and Agents),旨在构建大模型领域的基础设施。项目通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单便捷。
https://cdn.nlark.com/yuque/__mermaid_v3/423144ead42b709173f8975ab00edf64.svg
二、Chat Dashboard功能学习
1. 整体架构与设计思路
Chat Dashboard是DB-GPT中的核心功能之一,允许用户通过自然语言与数据库交互,生成数据分析报告和可视化图表。
2. 配置PostgreSQL数据库连接
使用通义模型启动DB-GPT服务:
配置文件configs/dbgpt-proxy-temp-tongyi.toml中关键部分:
连接PostgreSQL数据库的步骤:
- 在DB-GPT界面选择“数据源管理”
- 选择PostgreSQL数据库类型
- 填写连接信息:主机、端口、用户名、密码、数据库名
- 验证连接并保存
3. Chat Dashboard核心实现原理
3.1 数据库表结构识别
DB-GPT使用向量检索技术识别与用户查询相关的数据库表结构:
工作流程:
- 首次连接数据库时,系统提取表结构信息并创建向量索引
- 用户提问时,系统使用语义检索找出相关表结构
- 将检索到的表结构作为上下文提供给大语言模型
3.2 动态提示词设计与SQL生成
系统使用精心设计的提示词引导模型生成高质量的分析:
3.3 图表生成思路
系统根据数据特性自动设计和生成图表:
图表生成流程:
- LLM根据数据特性选择合适的图表类型(柱状图、折线图、饼图等)
- 系统执行SQL获取数据
- 数据转换为图表所需的格式
- 前端渲染图表
4. Chat Dashboard关键文件
| 文件路径 | 主要功能 |
|---|---|
chat_dashboard/chat.py |
主要实现类,处理用户输入并生成分析结果 |
chat_dashboard/data_loader.py |
负责从数据库加载数据并处理为图表格式 |
chat_dashboard/prompt.py |
定义与LLM交互的提示词模板 |
chat_dashboard/out_parser.py |
解析LLM输出并转换为应用需要的格式 |
datasource/service/db_summary_client.py |
处理数据库表结构的提取和向量化 |
rag/summary/rdbms_db_summary.py |
生成关系型数据库的表结构摘要 |
三、Text2SQL微调能力学习
1. Text2SQL微调概述
DB-GPT通过微调来持续提升Text2SQL效果,该部分功能主要在DB-GPT-Hub项目中实现。
https://cdn.nlark.com/yuque/__mermaid_v3/d36f972d8b6c886d6ba800491e8499e4.svg
2. 微调的核心流程
Text2SQL微调流程主要包括以下环节:
- 数据准备: 收集和整理SQL训练数据集
- 数据处理: 将数据转换为训练所需的格式
- 模型选择: 选择适合的基础模型进行微调
- 微调训练: 使用LoRA/QLoRA/P-tuning等技术进行微调
- 模型评估: 评估微调后的模型效果
- 模型集成: 将微调模型集成到DB-GPT中
3. 微调环境配置
推荐使用conda虚拟环境构建Text2SQL微调环境:
4. 训练数据配置
Text2SQL训练数据配置示例:
5. 模型训练命令
使用以下命令进行模型训练:
四、学习路径与资源
1. Chat Dashboard学习路径
- 基础配置:
- 学习如何配置PostgreSQL数据源
- 了解DB-GPT的基本架构和组件
- 核心概念:
- 理解RAG(检索增强生成)在数据分析中的应用
- 学习向量检索如何用于表结构识别
- 代码学习:
- 从
chat.py开始,了解整体流程 - 研究
prompt.py中的提示词设计 - 分析
data_loader.py中的数据处理逻辑 - 学习
db_summary_client.py中的表结构提取方法 - 实践应用:
- 配置自己的PostgreSQL数据库
- 尝试不同类型的分析问题
- 观察系统如何选择图表类型
2. Text2SQL微调学习路径
- 环境搭建:
- 配置conda环境
- 安装dbgpt-hub包
- 数据处理:
- 学习数据集格式要求
- 了解数据预处理流程
- 模型训练:
- 学习LoRA/QLoRA等微调方法
- 掌握训练参数调优技巧
- 实战应用:
- 使用自己的SQL数据进行微调
- 将微调模型集成到DB-GPT中
3. 关键资源链接
- DB-GPT-Hub项目: Text2SQL微调专用项目 + Text2SQL微调文档: 详细的微调教程 + DB-GPT官方文档: 项目全面文档
五、进阶学习方向
1. 自定义提示词优化
修改prompt.py中的模板以优化分析质量和添加特定领域的分析方法指导。
2. 扩展图表类型
在template/report/dashboard.json中添加新的图表类型并实现对应的数据处理逻辑。
3. 优化表结构识别
调整向量检索参数提高相关性,为特定领域数据库添加自定义表结构描述。
4. 自定义模型微调
针对特定业务领域的SQL数据集进行微调,提升模型在特定场景下的表现。
5. 多模态分析集成
将图像识别和文本分析结合,实现更复杂的数据分析场景。
六、总结
核心点在于掌握DB-GPT项目中的Chat Dashboard功能和Text2SQL微调能力。这两个模块结合使用,能够显著提升数据分析效率和SQL生成准确性,为数据驱动的业务决策提供强大支持。
graph TD
A[用户自然语言输入] --> B[数据库表结构识别]
B --> C[生成SQL查询]
C --> D[执行SQL获取数据]
D --> E[数据分析处理]
E --> F[生成可视化图表]
F --> G[展示分析结果]
subgraph 表结构识别流程
H[首次连接提取表结构] --> I[创建向量索引]
I --> J[语义检索相关表结构]
J --> K[提供上下文给LLM]
end# 使用uv运行DB-GPT服务
uv run dbgpt start webserver --config configs/dbgpt-proxy-temp-tongyi.toml[models]
[[models.llms]]
name = "qwen-max-latest"
provider = "${env:LLM_MODEL_PROVIDER:-proxy/tongyi}"
api_base = "https://dashscope.aliyuncs.com/compatible-mode/v1"
api_key = "${env:DASHSCOPE_API_KEY:-sk-xxxxxxxxxxxxxx}"
[[models.embeddings]]
name = "text-embedding-v3"
provider = "${env:EMBEDDING_MODEL_PROVIDER:-proxy/tongyi}"
api_url = "https://dashscope.aliyuncs.com/compatible-mode/v1/embeddings"
api_key = "${env:DASHSCOPE_API_KEY:-sk-xxxxxxxxxxxxxx}"# 核心方法: db_summary_client.py中的get_db_summary
def get_db_summary(self, dbname, query, topk):
"""获取与用户查询相关的表信息"""
table_vector_connector, field_vector_connector = self._get_vector_connector_by_db(dbname)
retriever = DBSchemaRetriever(
top_k=topk,
table_vector_store_connector=table_vector_connector,
field_vector_store_connector=field_vector_connector,
separator="--table-field-separator--",
)
table_docs = retriever.retrieve(query)
ans = [d.content for d in table_docs]
return ans# prompt.py中的核心提示词模板
_DEFAULT_TEMPLATE = """
根据以下表结构定义:
{table_info}
提供专业的数据分析以支持用户的目标:
{input}
根据用户目标提供至少4个且最多8个维度的分析。
分析的输出数据不能超过4列,且不要使用pay_status等列作为SQL where条件进行数据过滤。
根据分析数据的特点,从下面提供的图表中选择最适合的一种进行数据展示,图表类型:
{supported_chat_type}
注意分析结果输出内容的长度,不要超过4000个token
给出正确的{dialect}分析SQL
1.不要使用未提供的值,如'paid'
2.所有查询的值必须有别名,如select count(*) as count from table
3.如果表结构定义使用{dialect}的关键字作为字段名,需要使用转义字符,如select `count` from table
4.仔细检查SQL的正确性,SQL必须正确,显示方法和简要分析思路的总结,并以以下json格式回复:
{response}
"""# chat.py中的do_action方法
def do_action(self, prompt_response):
chart_datas: List[ChartData] = []
dashboard_data_loader = DashboardDataLoader()
for chart_item in prompt_response:
try:
field_names, values = dashboard_data_loader.get_chart_values_by_conn(
self.database, chart_item.sql
)
chart_datas.append(
ChartData(
chart_uid=str(uuid.uuid1()),
chart_name=chart_item.title,
chart_type=chart_item.showcase,
chart_desc=chart_item.thoughts,
chart_sql=chart_item.sql,
column_name=field_names,
values=values,
)
)
except Exception as e:
logger.warning(f"Failed to get chart data: {str(e)}")# 创建虚拟环境
conda create -n dbgpt-hub python=3.10
conda activate dbgpt-hub
# 安装依赖
pip install dbgpt-hub{
"example_text2sql_train": {
"file_name": "example_text2sql_train.json"
},
"example_text2sql_dev": {
"file_name": "example_text2sql_dev.json"
}
}CUDA_VISIBLE_DEVICES=0 python -m dbgpt_hub.train.sft \
--stage sft \
--model_name_or_path baichuan-inc/Baichuan2-7B-Base \
--do_train \
--dataset example_text2sql_train \
--finetuning_type lora \
--output_dir output_baichuan2 \
--overwrite_cache \
--per_device_train_batch_size 4 \
--gradient_accumulation_steps 4 \
--lr_scheduler_type cosine \
--logging_steps 10 \
--save_steps 1000 \
--learning_rate 5e-5 \
--num_train_epochs 40.0 \
--plot_loss \
--bf16