myspace / README.md
StarHidden's picture
新增cpue和sprfmo查询函数;优化工程结构
5d4bed3
|
Raw
History Blame Contribute Delete
9.31 kB
---
title: Myspace
emoji: 📊
colorFrom: yellow
colorTo: blue
sdk: gradio
sdk_version: 6.20.0
python_version: '3.13'
app_file: app.py
pinned: false
license: mit
short_description: 测试空间
---
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
# 渔业数据智能查询代理
基于 Hugging Face **smolagents** 框架构建的自然语言查询智能代理,面向渔业科研数据场景,支持查询 logbook 捕捞日志可用性、以及 GFW 渔船作业努力量检索,通过 Gradio Web 界面提供交互式体验。
## 主要功能
- **自然语言查询**:用户以中文自然语言描述需求,代理自动提取参数并调用对应工具
- **Logbook 可用性查询**:按海区、年份范围、物种、数据类型筛选捕捞日志数据
- **GFW 作业努力量查询**:按时间(2012-2024)、空间范围、船旗国、渔具类型检索渔船作业数据
- **CPUE 文献查询**:查询单位捕捞努力量渔获量相关研究文献,支持按海区、年份、物种等筛选
- **SPRFMO 数据查询**:查询南太平洋区域渔业管理组织数据,支持捕捞量/努力量查询和聚合统计
- **交互式 Web 界面**:基于 Gradio 的 Chat 界面,支持流式输出和步骤可视化
## 目录结构
```
myspace/
├── app.py # 主程序入口,包含 Agent 定义、Tool 类、Web 界面启动
├── query_tools/ # 查询工具模块目录
│ ├── __init__.py # 模块初始化文件
│ ├── logbook_availability_query.py # Logbook 数据可用性查询函数
│ ├── query_gfw.py # GFW 渔船作业努力量查询函数(2012-2024)
│ ├── literature_cpue_query.py # 文献 CPUE 数据查询函数
│ └── query_sprfmo.py # SPRFMO 南太平洋数据查询函数
├── requirements.txt # Python 依赖清单
└── .gradio/ # Gradio 自动生成的 SSL 证书目录
└── certificate.pem
```
| 文件/目录 | 说明 |
|------|------|
| `app.py` | 项目核心文件,包含 5 个 Tool 类(参数提取、Logbook 查询、GFW 查询、CPUE 文献查询、SPRFMO 查询)、Agent 工厂函数和 GradioUI 启动入口 |
| `query_tools/` | 查询工具模块目录,统一管理所有数据查询工具 |
| `query_tools/logbook_availability_query.py` | Logbook 查询模块,读取本地 CSV 数据并支持多维度筛选与文件输出 |
| `query_tools/query_gfw.py` | GFW 查询模块,从嵌套 ZIP 中提取月度 CSV 数据并按时空范围筛选(仅支持 2012-2024 年数据) |
| `query_tools/literature_cpue_query.py` | 文献 CPUE 数据查询模块,已集成到 Agent |
| `query_tools/query_sprfmo.py` | SPRFMO 南太平洋数据查询模块,已集成到 Agent |
| `requirements.txt` | 项目 Python 依赖包清单 |
## 技术栈
| 类别 | 技术 | 用途 |
|------|------|------|
| Agent 框架 | smolagents | 智能代理核心框架(ToolCallingAgent) |
| LLM 接入 | OpenAIServerModel / DeepSeek API | 大语言模型推理,支持工具调用 |
| Web 界面 | GradioUI (Gradio) | 交互式 Chat 界面,流式输出 |
| 数据处理 | pandas | 数据读取、筛选、格式转换 |
| 数据源 | Hugging Face Datasets | 远程数据集下载(huggingface_hub) |
| 文件解析 | zipfile / openpyxl / csv | ZIP 解压、Excel/CSV 解析 |
| 模块组织 | Python Package (query_tools) | 查询工具统一管理 |
| 编程语言 | Python 3.12+ | 项目开发语言 |
## 环境要求与前置条件
- **Python**:3.12 或更高版本
- **Hugging Face Token**:拥有 HF 账号并在 Settings 中申请 Read 权限的 Access Token(用于访问数据集)
- **LLM API Key**:DeepSeek API Key 或其他 OpenAI 兼容服务的 API Key
- **数据文件**(Logbook/GFW 查询需要):
- Logbook:本地需有 `../data/logbook_availability.csv` 数据文件
- GFW:本地需有 GFW ZIP 数据包,或自动从 `~/Desktop/资料下载/柔鱼数据/` 搜索
## 安装与配置
### 1. 克隆项目
```bash
cd /your/workspace
git clone <repository-url> testAgent
cd testAgent
```
### 2. 创建虚拟环境(推荐)
```bash
conda create -n agentproject python=3.12
conda activate agentproject
```
### 3. 安装依赖
```bash
pip install -r requirements.txt
```
依赖清单:
| 包名 | 最低版本 | 用途 |
|------|---------|------|
| `smolagents[gradio]` | >=1.0.0 | Agent 框架 + Gradio 集成 |
| `requests` | >=2.31.0 | HTTP 请求 |
| `pandas` | >=2.0.0 | 数据处理 |
| `huggingface_hub` | >=0.23.0 | HF 数据集 API |
| `openpyxl` | >=3.1.0 | Excel 文件解析 |
| `openai` | >=2.0.0 | OpenAI 兼容 LLM 接入 |
### 4. 配置常量
编辑 `readData.py` 文件顶部的常量:
```python
# Hugging Face 数据集访问 Token
HF_TOKEN = "hf_你的Token"
# LLM API 配置
OPENAI_API_KEY = "sk-你的APIKey"
OPENAI_API_BASE = "https://api.deepseek.com/v1" # API 地址
MODEL_ID = "deepseek-chat" # 模型 ID
# DeepSeek 思考模式
THINKING_MODE_ENABLED = True # True 启用,False 禁用
THINKING_EFFORT = "high" # low/medium/high/max
```
**常见 API 地址配置**
| 服务 | `OPENAI_API_BASE` | `MODEL_ID` |
|------|-------------------|------------|
| DeepSeek | `https://api.deepseek.com/v1` | `deepseek-chat` |
| OpenAI | `https://api.openai.com/v1` | `gpt-4o-mini` |
| 本地 Ollama | `http://localhost:11434/v1` | 模型名称 |
| 智谱 GLM | `https://open.bigmodel.cn/api/paas/v4` | `glm-4-flash` |
> **注意**:使用 DeepSeek 思考模式时必须选择 `deepseek-chat`,`deepseek-reasoner` 不支持工具调用。
## 本地开发启动
```bash
cd /your/workspace/myspace
python3 app.py
```
启动后终端将输出:
```
正在启动 GradioUI Web 界面...
Running on local URL: http://127.0.0.1:7860
Running on public URL: https://xxxxx.gradio.live (72小时有效)
```
浏览器打开上述地址即可使用 Chat 界面进行查询。
## 生产环境部署
### 方式一:直接运行
```bash
# 前台运行
python3 app.py
# 后台运行(使用 nohup)
nohup python3 app.py > agent.log 2>&1 &
```
### 方式二:Docker 部署
```dockerfile
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 暴露 Gradio 默认端口
EXPOSE 7860
CMD ["python3", "app.py"]
```
```bash
docker build -t fishery-agent .
docker run -d -p 7860:7860 \
-e HF_TOKEN=hf_你的Token \
-e OPENAI_API_KEY=sk_你的Key \
fishery-agent
```
### 方式三:Systemd 服务
```ini
[Unit]
Description=Fishery Data Query Agent
After=network.target
[Service]
Type=simple
User=your_user
WorkingDirectory=/your/workspace/myspace
ExecStart=/your/venv/bin/python3 app.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
```
## 使用示例
### 示例 1:查询 Logbook 数据可用性
```
用户:2010到2020年东南太平洋有哪些鱿鱼捕捞日志数据?
```
代理将调用 `logbook_query` 工具,参数提取为 `region="东南太平洋"`, `year_start=2010`, `year_end=2020`, `species="鱿鱼"`
### 示例 2:查询 GFW 渔船作业努力量
```
用户:查询2012年1月太平洋区域中国渔船的作业努力量
```
代理将调用 `gfw_query` 工具,参数提取为 `year=2012`, `month=1`, `flag="CN"`,以及对应的经纬度范围。
注意:GFW 查询仅支持 **2012-2024 年** 的数据,超出范围会返回错误。
### 示例 3:无明确工具指向的查询
```
用户:帮我查一下有什么数据可以用
```
代理将根据系统提示词中加载的数据集文件列表,告知用户可用的数据和查询方式。
## Agent 工具一览
| 工具名 | 类名 | 功能 | 必填参数 |
|--------|------|------|---------|
| `parameter_extractor` | `ParameterExtractionTool` | 从自然语言提取数据集查询参数 | `user_input` |
| `logbook_query` | `LogbookQueryTool` | 查询 Logbook 捕捞日志可用性 | 无(均为可选) |
| `gfw_query` | `GfwQueryTool` | 查询 GFW 渔船作业努力量(2012-2024) | `year`, `month`, `lat_min`, `lat_max`, `lon_min`, `lon_max` |
| `literature_cpue_query` | `LiteratureCpueQueryTool` | 查询 CPUE 相关文献数据 | 无(均为可选) |
| `sprfmo_query` | `SprfmoQueryTool` | 查询 SPRFMO 南太平洋数据 | `data_type` |
**注意:**
- `logbook_query` 支持可选参数:`region`(海区)、`year_start`(起始年份)、`year_end`(结束年份)、`species`(物种)、`data_type`(数据类型)
- `gfw_query` 仅支持查询 **2012-2024 年**的数据,超出范围会返回错误
- `gfw_query` 支持可选参数:`flag`(船旗国)、`geartype`(渔具类型)、`min_fishing_hours`(最小捕捞小时数)
- `literature_cpue_query` 支持可选参数:`region`(海区)、`year_start``year_end``species``response_variable`(响应变量)、`paper_type`(论文类型)
- `sprfmo_query` 必须指定 `data_type`('catch' 或 'effort'),支持可选参数:`country`(国家)、`year_start``year_end``species`(仅捕捞量)、`gear_type`(仅努力量)、`group_by`(聚合维度)