# Data-Juicer Q&A Copilot
Q&A Copilot 是 Data-Juicer Agents 系统中的智能问答组件,基于 AgentScope 框架构建,是一款面向 Data-Juicer 的专业 AI 助手。
你可以在官方[文档页](https://datajuicer.github.io/data-juicer/zh_CN/main/index_ZH.html)和我们的 [问答 Copilot](./README.md) ***Juicer*** 聊天! 欢迎向 ***Juicer*** 提出任何与 Data-Juicer 生态相关的问题。
### 核心组件
- **Agent**:基于 ReActAgent 构建的智能问答代理
- **FAQ RAG 系统**:基于 Qdrant 向量数据库和 DashScope 文本嵌入模型,提供快速准确的 FAQ 检索能力
- **MCP 集成**:通过 GitHub MCP Server 提供在线 GitHub 搜索能力
- **Redis 存储**:支持会话历史记录和用户反馈数据的持久化存储
- **Web API**:提供 RESTful 接口,便于前端集成
## 快速开始
### 前置要求
- 3.10 <= Python <= 3.12
- Docker(用于运行 Qdrant 向量数据库)
- Redis 服务器(可选,通过 `SESSION_STORE_TYPE=redis` 启用)
- DashScope API Key(用于调用大语言模型和文本嵌入)
### 安装步骤
1. 安装依赖项
```bash
cd ..
uv pip install .[qa]
cd qa-copilot
```
2. 安装 Docker(用于 Qdrant 向量数据库)
```bash
# Ubuntu/Debian
sudo apt-get install docker.io
sudo systemctl start docker
# macOS
brew install docker
```
**注意**:系统启动时会自动检查并启动 Qdrant Docker 容器。如果 FAQ 数据未初始化,系统会自动从 `qa-copilot/rag_utils/faq.txt` 文件读取并初始化 RAG 数据。
3. 安装并启动 Redis(可选 —— 使用默认 `SESSION_STORE_TYPE=json` 时可跳过)
```bash
# Ubuntu/Debian
sudo apt-get install redis-server
redis-server --daemonize yes
# macOS
brew install redis
brew services start redis
```
**注意**:
- 如果设置 `SESSION_STORE_TYPE=json`(默认),会话历史将作为 JSON 文件存储在 `SESSION_STORE_DIR` 目录中,并自动进行基于 TTL 的清理。
- 如果设置 `SESSION_STORE_TYPE=redis`,需要运行 Redis 服务器。会话状态由 RedisMemory 自动管理,TTL 由 Redis 服务器配置处理。
### 配置说明
1. 设置必需环境变量
```bash
export DASHSCOPE_API_KEY="your_dashscope_api_key"
export GITHUB_TOKEN="your_github_token" # 必需:用于 GitHub MCP 集成
```
2. 设置可选环境变量
**会话存储配置:**
```bash
# 会话存储类型:"json"(默认)或 "redis"
export SESSION_STORE_TYPE="json" # 或 "redis"
# JSON 模式(默认):
export SESSION_STORE_DIR="./sessions" # 会话文件存储目录(默认:"./sessions")
export SESSION_TTL_SECONDS="21600" # 会话 TTL(秒)(默认:21600 = 6 小时)
export SESSION_CLEANUP_INTERVAL="1800" # 清理间隔(秒)(默认:1800 = 30 分钟)
# Redis 模式:
export REDIS_HOST="localhost" # Redis 服务器主机(默认:"localhost")
export REDIS_PORT="6379" # Redis 服务器端口(默认:6379)
export REDIS_DB="0" # Redis 数据库编号(默认:0)
export REDIS_PASSWORD="" # Redis 密码(默认:None,可选)
export REDIS_MAX_CONNECTIONS="10" # Redis 最大连接数(默认:10)
# 注意:Redis TTL 由 Redis 服务器配置处理,而非应用程序
```
**模型配置:**
```bash
export MAX_TOKENS="200000" # 上下文窗口最大 token 数(默认:200000)
# 注意:此值在传递给 DashScopeChatFormatter 时会乘以 3
# 因为 CharTokenCounter 基于字符计数,中英文混合文本约 3 个字符 ≈ 1 个 token
```
**Qdrant 向量数据库:**
```bash
export QDRANT_HOST="127.0.0.1" # Qdrant 服务器主机(默认:"127.0.0.1")
export QDRANT_PORT="6333" # Qdrant 服务器端口(默认:6333)
```
**服务配置:**
```bash
export DJ_COPILOT_SERVICE_HOST="127.0.0.1" # 服务主机地址(默认:"127.0.0.1")
export DJ_COPILOT_ENABLE_LOGGING="true" # 启用会话日志(默认:"true")
export DJ_COPILOT_LOG_DIR="./logs" # 日志目录(默认:"./logs")
```
**高级配置:**
```bash
export FASTAPI_CONFIG_PATH="" # FastAPI 配置 JSON 文件路径(可选)
export SAFE_CHECK_HANDLER_PATH="" # 自定义安全检查处理器模块路径(可选)
```
2. 配置 FAQ 文件(可选)
系统默认使用 `qa-copilot/rag_utils/faq.txt` 作为 FAQ 数据源。您可以编辑此文件来自定义 FAQ 内容。FAQ 文件格式示例:
```
'id': 'FAQ_001', 'question': '什么是 Data-Juicer?', 'answer': 'Data-Juicer 是一个...'
'id': 'FAQ_002', 'question': '如何安装?', 'answer': '您可以通过...'
```
3. 启动服务
```bash
bash setup_server.sh
```
首次启动时,系统会自动:
- 检查并启动 Qdrant Docker 容器(端口 6333)
- 初始化 FAQ RAG 数据(如果尚未初始化)
- 启动 Web API 服务
## 使用方式
### Web API 接口
服务启动后,系统将提供以下 API 接口:
#### 1. 问答对话
```http
POST /process
Content-Type: application/json
{
"input": [
{
"role": "user",
"content": [{"type": "text", "text": "如何使用 Data-Juicer 进行数据清洗?"}]
}
],
"session_id": "your_session_id",
"user_id": "user_id"
}
```
#### 2. 获取会话历史
```http
POST /memory
Content-Type: application/json
{
"session_id": "your_session_id",
"user_id": "user_id"
}
```
#### 3. 清除会话历史
```http
POST /clear
Content-Type: application/json
{
"session_id": "your_session_id",
"user_id": "user_id"
}
```
#### 4. 提交用户反馈
```http
POST /feedback
Content-Type: application/json
{
"data": {
"message_id": "message_id_here",
"feedback_type": "like",
"comment": "可选的用户评论"
},
"session_id": "your_session_id",
"user_id": "user_id"
}
```
**参数说明:**
- `message_id`:要反馈的消息 ID(必填)
- `feedback_type`:反馈类型,可选值为 `"like"`(点赞)或 `"dislike"`(点踩)(必填)
- `comment`:可选的用户评论文本(选填)
**响应示例:**
```json
{
"status": "ok",
"message": "Feedback recorded successfully"
}
```
### WebUI 界面
您只需在终端中运行以下命令即可启动 WebUI:
```bash
npx @agentscope-ai/chat agentscope-runtime-webui --url http://localhost:8080/process
```
更多详情请参考 [AgentScope Runtime WebUI](https://runtime.agentscope.io/en/webui.html#method-2-quick-start-via-npx)。
## 配置详解
### 环境变量汇总
| 变量名 | 必需 | 默认值 | 说明 |
|--------|------|--------|------|
| `DASHSCOPE_API_KEY` | ✅ 是 | - | DashScope API 密钥,用于 LLM 和嵌入模型 |
| `GITHUB_TOKEN` | ✅ 是 | - | GitHub token,用于 MCP 集成 |
| `SESSION_STORE_TYPE` | ❌ 否 | `"json"` | 会话存储类型:`"json"` 或 `"redis"` |
| `SESSION_STORE_DIR` | ❌ 否 | `"./sessions"` | 会话文件目录(仅 JSON 模式) |
| `SESSION_TTL_SECONDS` | ❌ 否 | `21600` | 会话 TTL(秒)(仅 JSON 模式,6 小时) |
| `SESSION_CLEANUP_INTERVAL` | ❌ 否 | `1800` | 清理间隔(秒)(仅 JSON 模式,30 分钟) |
| `REDIS_HOST` | ❌ 否 | `"localhost"` | Redis 服务器主机(仅 Redis 模式) |
| `REDIS_PORT` | ❌ 否 | `6379` | Redis 服务器端口(仅 Redis 模式) |
| `REDIS_DB` | ❌ 否 | `0` | Redis 数据库编号(仅 Redis 模式) |
| `REDIS_PASSWORD` | ❌ 否 | `None` | Redis 密码(仅 Redis 模式,可选) |
| `REDIS_MAX_CONNECTIONS` | ❌ 否 | `10` | Redis 最大连接数(仅 Redis 模式) |
| `QDRANT_HOST` | ❌ 否 | `"127.0.0.1"` | Qdrant 服务器主机 |
| `QDRANT_PORT` | ❌ 否 | `6333` | Qdrant 服务器端口 |
| `MAX_TOKENS` | ❌ 否 | `200000` | 上下文窗口最大 token 数(传递给 CharTokenCounter 时会乘以 3) |
| `DJ_COPILOT_SERVICE_HOST` | ❌ 否 | `"127.0.0.1"` | 服务主机地址 |
| `DJ_COPILOT_ENABLE_LOGGING` | ❌ 否 | `"true"` | 启用会话日志 |
| `DJ_COPILOT_LOG_DIR` | ❌ 否 | `"./logs"` | 日志目录 |
| `FASTAPI_CONFIG_PATH` | ❌ 否 | `""` | FastAPI 配置 JSON 文件路径 |
| `SAFE_CHECK_HANDLER_PATH` | ❌ 否 | `""` | 自定义安全检查处理器路径 |
### 模型配置
在 `app_deploy.py` 文件中,您可以配置所使用的语言模型:
```python
model=DashScopeChatModel(
"qwen3-max-2026-01-23", # 模型名称
api_key=os.getenv("DASHSCOPE_API_KEY"),
stream=True, # 启用流式响应
enable_thinking=True, # 启用思考模式
)
```
格式化器使用 `MAX_TOKENS` 环境变量(默认:200000)来限制上下文窗口大小。由于 `CharTokenCounter` 基于字符计数,中英文混合文本约 3 个字符 ≈ 1 个 token,因此在传递给 `DashScopeChatFormatter` 时会将该值乘以 3。
### 会话存储配置
**JSON 模式(默认):**
- 会话历史作为 JSON 文件存储在 `SESSION_STORE_DIR` 目录中
- 自动 TTL 清理每 `SESSION_CLEANUP_INTERVAL` 秒运行一次
- 会话在 `SESSION_TTL_SECONDS` 秒无活动后过期
- 无需外部依赖
**Redis 模式:**
- 会话历史存储在 Redis 中
- 会话状态由 `RedisMemory` 自动管理
- TTL 由 Redis 服务器配置处理(非应用层)
### FAQ RAG 配置
FAQ RAG 系统使用以下配置:
- **向量数据库**:Qdrant(通过 Docker 容器运行)
- **嵌入模型**:DashScope text-embedding-v4
- **向量维度**:1024
- **数据源**:`qa-copilot/rag_utils/faq.txt`
- **存储位置**:`qa-copilot/rag_utils/qdrant_storage`
- **Qdrant 主机**:可通过 `QDRANT_HOST` 配置(默认:`127.0.0.1`)
- **Qdrant 端口**:可通过 `QDRANT_PORT` 配置(默认:`6333`)
系统会在启动时自动检查 RAG 数据是否已初始化。如果未初始化,会自动读取 FAQ 文件并创建向量索引。
## 故障排查
### 常见问题
1. **Docker/Qdrant 相关问题**
- 确保 Docker 服务正在运行:`docker --version`
- 检查 Qdrant 容器状态:`docker ps | grep qdrant`
- 手动启动 Qdrant 容器:`docker start qdrant`
- 检查 Qdrant 端口是否被占用:`netstat -tlnp | grep 6333`
- 如果需要重新初始化 RAG 数据,删除 `qa-copilot/rag_utils/qdrant_storage` 目录后重启服务
2. **Redis 连接失败**(使用 `SESSION_STORE_TYPE=redis` 时)
- 确保 Redis 服务正在运行:`redis-cli ping`
- 检查 Redis 端口是否被占用:`netstat -tlnp | grep 6379`(或您配置的 `REDIS_PORT`)
- 验证 Redis 配置:检查 `REDIS_HOST`、`REDIS_PORT`、`REDIS_DB` 和 `REDIS_PASSWORD` 环境变量
- 注意:Redis TTL 由 Redis 服务器管理,而非应用程序
3. **MCP 服务启动失败**
- 确保 `GITHUB_TOKEN` 已设置且正确(必需环境变量)
- 验证 GitHub token 是否具有 MCP 集成所需的权限
4. **API Key 错误**
- 检查 `DASHSCOPE_API_KEY` 环境变量是否已正确配置
- 确认该 API Key 有效且配额充足
5. **FAQ 检索无结果**
- 确认 FAQ 文件 `qa-copilot/rag_utils/faq.txt` 存在且格式正确
- 检查 Qdrant 容器是否正常运行
- 查看日志确认 RAG 数据是否已成功初始化
## 致谢
本项目的部分代码参考并改编自以下开源项目:
- **FAQ RAG 系统 & GitHub MCP 集成**:基于 [AgentScope Samples - Alias](https://github.com/agentscope-ai/agentscope-samples/tree/main/alias) 项目的实现进行改编
感谢 AgentScope 团队提供的优秀框架和示例代码!
## 许可证
本项目采用与主项目相同的许可证。详细信息请参阅 [LICENSE](../LICENSE) 文件。
## 相关链接
- [Data-Juicer 官方仓库](https://github.com/datajuicer/data-juicer)
- [AgentScope 框架](https://github.com/agentscope-ai/agentscope)
- [AgentScope Samples](https://github.com/agentscope-ai/agentscope-samples)
- [GitHub MCP Server](https://github.com/github/github-mcp-server)