minimind/THREEGPP_AGENT.md

83 lines
5.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 3GPP 提案阅读助手
读取本地 TDoc 元数据和 DOCX 原文,再调用 Qwen2.5-3B-Instruct 生成带来源编号的中文回答。MiniMind 的模型实现和训练代码是另一条独立路径。
## 启动
在项目目录下运行:
```powershell
.\.venv\Scripts\python.exe -m streamlit run app_web.py
```
默认选中“只查原文,不调用模型”。点击“比较两篇 XR 提案”,再点击检索按钮,可查看文件、段落位置和原文片段;取消“只查原文”后才加载模型生成回答。
现有虚拟环境已含所需依赖。新环境参考 `requirements-3gpp.txt`,按硬件安装对应的 PyTorch CUDA 版本。检索不需要下载模型。
默认模型位置是当前用户目录下的 `.cache/modelscope/hub/models/Qwen/Qwen2___5-3B-Instruct`。也可以在启动前指定:
```powershell
$env:THREEGPP_MODEL_DIR = 'D:\models\Qwen2.5-3B-Instruct'
$env:THREEGPP_LORA_DIR = 'D:\models\ran2_adapter'
```
仅从本地加载模型,不自动下载。默认禁用现有 LoRA,网页可勾选以比较。本轮少量实测中,现有适配器出现了引用缺失和无依据的流程描述,不据此判断总体优劣。其训练数据质量和专业效果仍需独立核实。
## 已改进的行为
- 按编号检索时保留所有请求的提案,最多 6 篇。比较两篇时不再只保留第一篇。
- 无编号时按标题、提交单位和会议元数据进行 BM25 词项排序,并支持少量明确列出的中英文查询别名。这不是向量检索,也不是整个原文库的全文检索。
- 在候选 DOCX 正文中选择相关片段,每篇最多两个片段,每片段最多 900 字符。每个片段有来源编号、文件路径和 XML 段落范围。段落编号含空段和表格内段落,不是 Word 页码。
- 提取 Word 可见文本,规范化空白。未覆盖图片、公式对象、页眉页脚、脚注和外部附件。所选片段不一定足以概括整篇提案。
- 不再把训练集的助手回答当作参考原文。元数据、旧版 `.doc` 或读取失败都不算正文证据。
- 任何明确询问的提案缺少可读原文时,展示缺失情况并停止生成内容分析;已找到的其他片段仍可查看。补充材料会标为未经核实,目前不能替代缺失的原文。
- 要求区分提案主张、推断与资料不足,要求标注 `[S1]` 等来源。程序检测不存在的来源编号和遗漏引用,未判断引用是否真正支持结论。
- 去掉“协议合规率”和旧综合分的准确率暗示。网页示例改为实际存在且能读取的 XR、NTN 文档,不预先编造提案内容。
- 首次需要生成时才加载模型;支持 CUDA 4-bit、CPU 全精度回退、串行生成、异常传递和生成超时。CPU 路径未在本轮执行,其内存和耗时可能很大。
生成超时从完成模型加载后开始计算,默认 120 秒。程序能请求停止并结束等待,但不能强制中断卡住的 CUDA 操作;后台未结束时继续拒绝新请求。输入预算最多 4096 token,超过时提示缩短材料,不会静默截去第二篇提案;最多生成 2048 token。
## 代码入口
| 文件 | 作用 |
| --- | --- |
| `agent_core.py` | 保持已有导入名称的入口 |
| `rag_evidence.py` | 编号识别、BM25、DOCX 提取、来源记录 |
| `agent_runtime.py` | 模型加载、流式生成、证据不足处理、引用格式检查 |
| `app_web.py` | Streamlit 页面及 Markdown/JSON 导出 |
| `server_demo.py` | 本地 FastAPI 接口 |
| `tests/test_3gpp_agent.py` | 行为回归及生成异常测试 |
## 验证
```powershell
.\.venv\Scripts\python.exe -m unittest discover -s tests -v
.\.venv\Scripts\python.exe eval_agent_retrieval.py
.\.venv\Scripts\python.exe scripts/check_agent_interfaces.py
.\.venv\Scripts\python.exe scripts/check_3gpp_generation.py --compare --max-tokens 384
```
检索检查在 8 个固定本地案例上比较本轮备份的旧检索器与当前代码,检查原文覆盖及资料不足时是否停止生成。它不是独立抽样的质量评测,不能用通过比例宣传专业准确率。报告保存至 `output/agent_retrieval_regression.json`。
真实生成检查保存至 `output/agent_generation_smoke.json`,保留问题、来源、输出、引用检查和耗时。生成成功和引用格式通过都不代表事实正确,需要逐条对照原文才能比较原模型和 LoRA 的实际质量。
网页的首段文本时间从收到问题开始,包含检索和可能发生的模型加载,不是纯模型首 token 延迟。冷启动和热启动耗时不能直接混作性能提升。
## HTTP 接口
```powershell
.\.venv\Scripts\python.exe server_demo.py
```
- `GET /health`:服务状态及模型是否已加载。
- `POST /v1/proposals/analyze`:SSE 返回提案检索、来源、生成内容、完成或错误事件。请求示例:`{"question":"对比 R2-2408133 和 R2-2408134","retrieval_only":true}`。
- `POST /v1/chat/completions`:基础聊天兼容接口,支持 `stream=true/false`。此接口不检索原文;文档分析使用上一个接口。未实现完整 OpenAI 功能,如工具调用、usage、鉴权、finish_reason 的精细区分。
默认只监听 `127.0.0.1:8000`。
## 评测边界
后续应固定一组具有完整原文的问题,由懂协议的人标注所需段落和可验证结论。在相同来源及生成预算下,比较“原模型+检索”和“LoRA+检索”的事实错误数、原文支持情况、资料不足识别及耗时。现有字符相似度、术语数量和结构词得分不承担这项判断。
本轮修改前的三个入口文件保存在 `output/agent_upgrade_backup_20261021/`。本轮未修改已有模型权重、训练数据或 MiniMind 代码。