本文件为 Claude Code (claude.ai/code) 在此代码仓库中工作时提供指导。
SQLBot 是一个智能数据查询系统(ChatBI),使用大语言模型(LLM)和 RAG(检索增强生成)技术将自然语言问题转换为 SQL 查询。它由三个主要组件组成:
- 后端 (Python/FastAPI):核心 API 服务器,负责 LLM 编排
- 前端 (Vue 3/TypeScript):聊天界面和数据可视化的 Web UI
- g2-ssr (Node.js):服务端图表渲染服务
后端使用 uv(快速 Python 包安装器)进行依赖管理,而不是 pip 或 poetry。
cd backend
# 安装依赖(需要 Python 3.11)
uv sync --extra cpu # 仅 CPU 版本的 PyTorch
uv sync --extra cu128 # CUDA 12.8 版本的 PyTorch
# 运行开发服务器
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# 运行 MCP 服务器(模型上下文协议)
uvicorn main:mcp_app --reload --host 0.0.0.0 --port 8001
# 代码检查和格式化
ruff check . # 检查代码风格
ruff format . # 格式化代码
mypy . # 类型检查
# 运行测试并生成覆盖率报告
pytest
coverage run --source=. -m pytest
coverage report --show-missing
# 数据库迁移
alembic upgrade head # 应用迁移
alembic revision --autogenerate -m "description" # 创建新迁移cd frontend
# 安装依赖
npm install
# 运行开发服务器(包含 TypeScript 编译)
npm run dev # 运行在 http://localhost:5173
# 生产环境构建
npm run build # TypeScript 检查 + Vite 构建
# 代码检查和修复
npm run lintcd g2-ssr
# 安装依赖
npm install
# 运行服务
node app.js # 运行在 3000 端口
# 或使用 PM2
pm2 start app.js将自然语言转换为 SQL 的核心工作流:
- 用户问题 → 通过
/api/chat/send端点接收 - 上下文检索 (RAG):
- 使用向量相似度检索相关业务术语(pgvector)
- 从训练数据中检索相似的 SQL 示例
- 检索相关的表/列元数据
- 提示词构建:使用数据库模式 + 上下文 + 用户问题构建 LLM 提示词
- LLM 生成:调用配置的 LLM(OpenAI/Azure/通义/vLLM)生成 SQL
- SQL 执行:在目标数据库上执行,带有安全限制
- 图表生成:LLM 根据结果生成图表配置
- 图表渲染:g2-ssr 服务渲染图表图像
- 响应:将结果 + 图表返回给用户
-
apps/chat/:聊天会话管理和 LLM 编排task/llm_service.py:使用 LangGraph 的核心 LLM 工作流crud/chat.py:聊天 CRUD 操作
-
apps/datasource/:数据库连接管理- 支持:MySQL、PostgreSQL、SQL Server、Oracle、ClickHouse、Redshift、Elasticsearch
task/datasource_task.py:数据库操作和元数据提取
-
apps/data_training/:带嵌入向量的 SQL 训练示例- 存储问题-SQL 对用于 RAG 检索
task/data_training_task.py:嵌入向量生成
-
apps/terminology/:业务术语词典- 带嵌入向量的自定义术语和定义
- 在 SQL 生成期间用于语义搜索
-
apps/ai_model/:LLM 模型配置task/llm_factory.py:创建 LLM 实例的工厂类- 支持多个提供商的统一接口
-
apps/system/:用户、工作空间和权限管理- 多工作空间隔离
- 基于角色的访问控制(管理员/成员)
- 行级数据权限
-
apps/mcp/:模型上下文协议服务器- 支持与 AI 助手(Claude Desktop 等)集成
- 将 SQLBot 功能暴露为 MCP 工具
核心表:
sys_user、sys_workspace、sys_user_ws:用户和工作空间管理ai_model:LLM 配置core_datasource、core_table、core_field:数据库元数据terminology:带嵌入向量的业务术语(pgvector)data_training:带嵌入向量的 SQL 训练示例(pgvector)chat、chat_record、chat_log:聊天会话和详细日志core_dashboard:仪表板定义
- Vue 3 使用 Composition API 和
<script setup>语法 - Pinia 用于状态管理(stores 在
src/stores/) - Element Plus 作为主要 UI 组件库
- AntV G2/S2 用于数据可视化
- Vue Router 用于导航
- Axios 用于 API 调用(客户端在
src/api/)
核心视图:
views/chat/:带流式响应的聊天界面views/dashboard/:仪表板构建器和查看器views/ds/:数据源管理views/system/:系统设置和用户管理
- 系统使用 shibing624/text2vec-base-chinese 进行文本嵌入
- 嵌入向量使用 pgvector 扩展存储在 PostgreSQL 中
- 维护三种类型的嵌入向量:
- 术语嵌入(业务术语)
- 数据训练嵌入(SQL 示例)
- 表/列嵌入(数据库元数据)
- 嵌入向量在启动时和数据变化时异步生成
- 相似度搜索使用余弦距离,阈值可配置
- LLM 调用使用 LangChain 和 LangGraph 进行编排
LLMFactory模式抽象了不同的 LLM 提供商- 流式响应使用服务器发送事件(SSE)
- 所有 LLM 交互都记录在
chat_log表中用于调试 - 提示词模板在
apps/template/中,支持多语言
- 使用 Alembic 进行模式迁移
- 迁移在应用启动时通过
main.py:run_migrations()自动运行 - 迁移文件在
backend/alembic/versions/ - 提交前务必在本地测试迁移
- 数据库凭证使用 AES 加密(参见
common/utils/crypto.py) - JWT 令牌用于身份验证(环境变量中的 SECRET_KEY)
- 外部集成的 API 密钥
- 查询应用行级安全过滤器
- 通过参数化查询防止 SQL 注入
- 后端测试使用 pytest 和 fixtures
- 测试数据库配置在
backend/tests/ - 使用
coverage工具生成覆盖率报告 - 前端测试未广泛实现(有贡献机会)
应用在单个容器中运行三个服务:
- 端口 8000:主 FastAPI 应用(Web UI + API)
- 端口 8001:MCP 服务器
- 端口 3000:g2-ssr 图表渲染(内部)
- 端口 5432:PostgreSQL(内部)
start.sh 脚本编排服务启动:
- 启动 PostgreSQL
- 使用 PM2 启动 g2-ssr
- 在后台启动 MCP 服务器
- 启动主 FastAPI 应用
关键环境变量(参见 docker-compose.yaml):
POSTGRES_*:数据库连接设置SECRET_KEY:JWT 签名密钥DEFAULT_PWD:默认管理员密码SERVER_IMAGE_HOST:MCP 图像服务 URLBACKEND_CORS_ORIGINS:CORS 允许的源LOG_LEVEL:日志详细程度
- 在
apps/ai_model/task/llm_factory.py中创建提供商类 - 实现 LLM 接口(继承自 LangChain 基类)
- 在
apps/ai_model/schemas/ai_model.py中添加提供商配置 - 在
views/system/ai-model/中更新前端模型选择 UI
- 在
apps/datasource/task/datasource_task.py中添加数据库引擎 - 实现连接字符串生成
- 在
apps/template/中添加 SQL 方言特定的模板 - 在
views/ds/中更新前端数据源表单
- 编辑
apps/template/中的提示词模板 - 模板支持带占位符的 Jinja2 语法
- 使用不同的数据库模式和问题类型进行测试
- 监控
chat_log表以调试 LLM 响应
- 创建带嵌入列的新表(类型:
vector(768)) - 添加嵌入生成逻辑(参见
common/utils/embedding_threads.py) - 在
apps/chat/task/llm_service.py中集成检索 - 更新提示词构建以包含新上下文
- 遵循 PEP 8 风格指南
- 所有函数签名使用类型提示(由 mypy 强制执行)
- 使用 Ruff 进行代码检查和格式化(在
pyproject.toml中配置) - I/O 操作使用 Async/await
- 请求/响应模式使用 Pydantic 模型
- CRUD 模式:将 CRUD 操作与 API 路由分离
- 使用 Composition API 和
<script setup>语法 - TypeScript 用于类型安全
- ESLint + Prettier 用于代码格式化
- 组件命名:组件使用 PascalCase,文件使用 kebab-case
- Props 和 emits 应该有类型
- 使用 Pinia stores 管理共享状态
- 检查 Python 版本(必须是 3.11)
- 确保 PostgreSQL 正在运行且可访问
- 验证环境变量已设置
- 检查
backend/logs/中的日志
- 检查嵌入模型是否已下载(首次运行会下载模型)
- 验证 PostgreSQL 中已安装 pgvector 扩展
- 检查启动日志中的
fill_empty_*_embeddings()函数
- 验证系统设置中已配置 LLM API 密钥
- 检查到 LLM 提供商的网络连接
- 查看
chat_log表获取详细错误消息 - 确保 LLM 模型名称对提供商正确
- 清除 node_modules 并重新安装:
rm -rf node_modules && npm install - 检查 TypeScript 错误:
vue-tsc -b - 验证所有导入是否正确(Linux 上区分大小写)