221 lines
5.3 KiB
Markdown
221 lines
5.3 KiB
Markdown
# LLM Proxy - OpenAI API 代理和训练数据收集工具
|
||
|
||
一个透明的 HTTP 代理服务器,用于拦截和保存 LLM API 请求,自动导出为 JSONL 格式的训练数据。
|
||
|
||
## 功能特性
|
||
|
||
- ✅ **透明代理**:拦截所有 `/v1/` 开头的 LLM API 请求
|
||
- ✅ **零配置**:无需在代理中配置 API Key,直接使用客户端的 Key
|
||
- ✅ **多提供商支持**:支持 OpenAI、Anthropic、GLM、OpenRouter 等所有 OpenAI 兼容的 API
|
||
- ✅ **智能解析**:自动识别和解析 LLM 请求,忽略其他请求
|
||
- ✅ **思考过程保存**:自动保存模型的推理内容(reasoning)
|
||
- ✅ **多轮对话支持**:完整保存对话上下文
|
||
- ✅ **JSONL 导出**:一键导出为标准训练数据格式
|
||
- ✅ **SQLite 存储**:轻量级数据库,无需额外配置
|
||
|
||
## 安装
|
||
|
||
### 1. 克隆项目
|
||
|
||
```bash
|
||
git clone https://github.com/mitmproxy/mitmproxy.git
|
||
cd mitmproxy
|
||
```
|
||
|
||
### 2. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
```
|
||
|
||
## 使用方法
|
||
|
||
### 启动代理服务器
|
||
|
||
```bash
|
||
python start_proxy.py
|
||
```
|
||
|
||
默认监听 `127.0.0.1:8080`
|
||
|
||
### 配置系统代理
|
||
|
||
#### Windows
|
||
|
||
1. 打开"设置" → "网络和 Internet" → "代理"
|
||
2. 开启"使用代理服务器"
|
||
3. 地址:`127.0.0.1`
|
||
4. 端口:`8080`
|
||
|
||
#### macOS
|
||
|
||
```bash
|
||
networksetup -setwebproxy Wi-Fi 127.0.0.1 8080
|
||
networksetup -setsecurewebproxy Wi-Fi 127.0.0.1 8080
|
||
```
|
||
|
||
#### Linux
|
||
|
||
在浏览器或系统设置中配置 HTTP/HTTPS 代理为 `127.0.0.1:8080`
|
||
|
||
### 使用客户端
|
||
|
||
#### Trae
|
||
|
||
1. 启动代理服务器
|
||
2. 配置系统代理(见上)
|
||
3. 在 Trae 中正常使用,配置任何 API 提供商和 Key
|
||
4. 所有请求自动被拦截和保存
|
||
|
||
#### CherryStudio
|
||
|
||
**方法 1:配置自定义提供商**
|
||
1. 打开 CherryStudio 设置 → 模型服务
|
||
2. 添加自定义提供商
|
||
3. API 地址:`http://127.0.0.1:8080/v1`
|
||
4. API Key:任意值(代理会忽略)
|
||
5. 添加你使用的模型
|
||
|
||
**方法 2:使用系统代理**
|
||
1. 启动代理服务器
|
||
2. 配置系统代理(见上)
|
||
3. 在 CherryStudio 中正常使用
|
||
|
||
### 导出训练数据
|
||
|
||
```bash
|
||
# 导出所有对话(包含思考过程)
|
||
python export.py
|
||
|
||
# 导出指定文件
|
||
python export.py --output my_data.jsonl
|
||
|
||
# 不包含思考过程
|
||
python export.py --no-reasoning
|
||
|
||
# 包含元数据
|
||
python export.py --with-metadata
|
||
|
||
# 查看数据库统计
|
||
python export.py --stats
|
||
```
|
||
|
||
## 配置文件
|
||
|
||
编辑 `config.json` 来自定义配置:
|
||
|
||
```json
|
||
{
|
||
"proxy": {
|
||
"listen_port": 8080,
|
||
"listen_host": "127.0.0.1"
|
||
},
|
||
"database": {
|
||
"path": "llm_data.db"
|
||
},
|
||
"filter": {
|
||
"enabled": true,
|
||
"path_patterns": ["/v1/"],
|
||
"save_all_requests": false
|
||
},
|
||
"export": {
|
||
"output_dir": "exports",
|
||
"include_reasoning": true,
|
||
"include_metadata": false
|
||
}
|
||
}
|
||
```
|
||
|
||
## JSONL 格式
|
||
|
||
导出的 JSONL 文件格式:
|
||
|
||
```jsonl
|
||
{"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello!"}, {"role": "assistant", "content": "Hi there!", "reasoning": "The user greeted me, so I should respond politely."}]}
|
||
{"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "What is 2+2?"}, {"role": "assistant", "content": "2+2 equals 4.", "reasoning": "This is a simple arithmetic problem. 2+2 = 4."}]}
|
||
```
|
||
|
||
## 数据库结构
|
||
|
||
### conversations 表
|
||
- `id`: 主键
|
||
- `conversation_id`: 对话 ID
|
||
- `created_at`: 创建时间
|
||
- `updated_at`: 更新时间
|
||
|
||
### requests 表
|
||
- `id`: 主键
|
||
- `request_id`: 请求 ID
|
||
- `conversation_id`: 对话 ID(外键)
|
||
- `model`: 模型名称
|
||
- `messages`: 消息列表(JSON)
|
||
- `request_body`: 完整请求体(JSON)
|
||
- `created_at`: 创建时间
|
||
|
||
### responses 表
|
||
- `id`: 主键
|
||
- `request_id`: 请求 ID(外键)
|
||
- `response_body`: 完整响应体(JSON)
|
||
- `reasoning_content`: 思考过程
|
||
- `tokens_used`: 使用的 token 数量
|
||
- `created_at`: 创建时间
|
||
|
||
## 工作原理
|
||
|
||
1. **拦截请求**:代理拦截所有 `/v1/` 开头的 HTTP 请求
|
||
2. **智能解析**:尝试解析请求体,识别是否为 LLM API 请求
|
||
3. **保存请求**:将请求信息保存到 SQLite 数据库
|
||
4. **透明转发**:保持原始 Authorization header,转发到目标服务器
|
||
5. **保存响应**:接收响应后,保存响应内容和思考过程
|
||
6. **导出数据**:随时导出为 JSONL 格式用于训练
|
||
|
||
## 注意事项
|
||
|
||
### HTTPS 证书
|
||
|
||
如果客户端使用 HTTPS 连接到 API(如 `https://api.openai.com`),需要:
|
||
|
||
1. 安装 mitmproxy 证书到系统信任库
|
||
2. 或者在客户端配置中使用 HTTP(如 `http://api.openai.com`)
|
||
|
||
### 证书安装
|
||
|
||
首次运行代理时,mitmproxy 会生成证书:
|
||
|
||
- Windows: `%USERPROFILE%\.mitmproxy\mitmproxy-ca-cert.pem`
|
||
- macOS/Linux: `~/.mitmproxy/mitmproxy-ca-cert.pem`
|
||
|
||
将证书安装到系统信任库即可。
|
||
|
||
### 隐私和安全
|
||
|
||
- 代理不会保存 API Key
|
||
- 所有数据存储在本地 SQLite 数据库
|
||
- 请妥善保管导出的训练数据
|
||
|
||
## 故障排除
|
||
|
||
### 请求没有被拦截
|
||
|
||
1. 检查系统代理是否正确配置
|
||
2. 检查代理服务器是否正在运行
|
||
3. 检查请求路径是否包含 `/v1/`
|
||
|
||
### HTTPS 请求失败
|
||
|
||
1. 安装 mitmproxy 证书到系统信任库
|
||
2. 或者在客户端配置中使用 HTTP 而不是 HTTPS
|
||
|
||
### 数据库错误
|
||
|
||
1. 检查数据库文件权限
|
||
2. 删除 `llm_data.db` 重新初始化
|
||
|
||
## 许可证
|
||
|
||
MIT License
|
||
|
||
## 贡献
|
||
|
||
欢迎提交 Issue 和 Pull Request!
|