From 07ef4fb49a02d7bc5c84be24a1e2cfc5d1cd702b Mon Sep 17 00:00:00 2001 From: "DESKTOP-72TV0V4\\caoxiaozhu" Date: Wed, 24 Dec 2025 11:20:06 +0800 Subject: [PATCH] =?UTF-8?q?1.=20=E4=BF=AE=E6=94=B9=E4=BA=86=E9=87=8D?= =?UTF-8?q?=E8=AF=95=E6=AC=A1=E6=95=B0=202.=20=E5=A2=9E=E5=8A=A0=E4=BA=86r?= =?UTF-8?q?eadme=E5=92=8Crequirements.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/settings.local.json | 9 + README.md | 555 ++++++++++++------ .../example_concurrent_usage.cpython-313.pyc | Bin 0 -> 4820 bytes __pycache__/llm_config.cpython-311.pyc | Bin 0 -> 11930 bytes __pycache__/llm_config.cpython-313.pyc | Bin 0 -> 11552 bytes data/qwen2.5-7b-sft.json | 30 - llm_config.py | 29 + model_evaluation.py | 9 +- requirements.txt | 41 +- 9 files changed, 460 insertions(+), 213 deletions(-) create mode 100644 .claude/settings.local.json create mode 100644 __pycache__/example_concurrent_usage.cpython-313.pyc create mode 100644 __pycache__/llm_config.cpython-311.pyc create mode 100644 __pycache__/llm_config.cpython-313.pyc diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..2e6d71a --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,9 @@ +{ + "permissions": { + "allow": [ + "Bash(python -m py_compile:*)", + "Bash(python:*)", + "Bash(ls:*)" + ] + } +} diff --git a/README.md b/README.md index 69727fe..1b95ed7 100644 --- a/README.md +++ b/README.md @@ -1,215 +1,430 @@ -# 大模型微调验证系统 +# LLM Model Evaluation System -为模型评估添加了**LLM评分**和**LLM评价理由**两个新指标,结合传统指标(BLEU、ROUGE-L等),提供全面的评估方案。 +[![Python Version](https://img.shields.io/badge/python-3.7%2B-blue.svg)](https://www.python.org/downloads/) +[![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) -## 核心特性 +A comprehensive evaluation system for Large Language Models (LLMs) with concurrent processing, batch progress tracking, and automatic retry mechanisms. -### ✨ 双重评估模式 -1. **模拟评估模式**(默认) - - ✅ 无需配置,立即可用 - - ✅ 基于传统指标的智能评分 - - ✅ 运行速度快,无额外成本 +## ✨ Features -2. **真实LLM评估模式** - - 使用OpenAI GPT等大语言模型 - - 提供语义级别的智能评分 - - 详细的评价理由和改进建议 +### 🚀 High-Performance Concurrent Processing +- **True Concurrency**: Utilizes ThreadPoolExecutor for real concurrent execution +- **Configurable Workers**: Set concurrent thread count via configuration +- **Auto CPU Detection**: Automatically uses all CPU cores by default +- **Batch Processing**: Processes data in batches for efficient resource utilization -### 📊 评估维度 -1. **答案准确性** - 与参考答案的一致性 -2. **逻辑清晰度** - 答案逻辑和条理性 -3. **完整性** - 是否遗漏关键信息 -4. **表达质量** - 语言流畅度和专业性 +### 📊 Intelligent Batch Progress Tracking +- **Dynamic Progress Bars**: Creates progress bars only for current batch +- **Memory Efficient**: Constant memory usage regardless of batch count +- **Scalable**: Supports 100K+ batches without performance degradation +- **Auto Cleanup**: Automatically closes progress bars after batch completion -评分范围:1-10分 +### 🔄 Robust API Retry Mechanism +- **Automatic Retry**: Automatically retries failed API calls +- **Exponential Backoff**: Uses 2^n delay strategy to avoid API overload +- **Configurable**: Set retry count and delay via configuration file +- **Smart Error Handling**: Distinguishes retryable vs non-retryable errors -## 快速开始 +### 🌐 Flexible API Support +- **HTTP-Based**: Uses standard HTTP requests instead of vendor-specific SDKs +- **Multi-API Compatible**: Works with any OpenAI-compatible API endpoint +- **No Vendor Lock-in**: Supports custom, proxy, and self-hosted APIs + +### 📈 Comprehensive Evaluation Metrics +- **Traditional Metrics**: BLEU, ROUGE-L, Exact Match, Keyword Overlap +- **LLM-Based Evaluation**: Semantic understanding via LLM scoring +- **Combined Scoring**: Weighted combination of multiple metrics +- **Detailed Reports**: Comprehensive evaluation reports with visualizations + +## 📦 Installation + +### Prerequisites +- Python 3.7 or higher +- pip (Python package manager) + +### Install Dependencies -### 1. 安装依赖 ```bash -# 安装核心依赖 +# Clone or download the repository +cd YG_LLM_Tester + +# Install required packages pip install -r requirements.txt - -# 或手动安装 -pip install numpy pandas openpyxl nltk jieba tqdm xlrd - -# 如需使用真实LLM API,安装OpenAI库 -pip install openai ``` -### 2. 运行评估(模拟模式 - 默认) -```bash -python model_evaluation.py -``` -- ✅ 无需配置,立即可用 -- ✅ 基于传统指标的智能评分 -- ✅ 运行速度快 +### Manual Installation + +If you prefer to install packages individually: + +```bash +pip install numpy nltk jieba pandas tqdm requests +``` + +**Note**: Some NLTK data will be downloaded automatically on first use. + +## ⚙️ Configuration + +### Basic Configuration (llm_config.py) + +```python +# Concurrent Processing +MAX_CONCURRENT_WORKERS = 4 # Number of concurrent threads +SHOW_DETAILED_PROGRESS = True # Show detailed progress bars + +# API Retry Settings +MAX_API_RETRIES = 3 # Maximum retry attempts +RETRY_DELAY = 1.0 # Initial retry delay in seconds + +# API Configuration +USE_REAL_LLM = False # True for real LLM API, False for simulation +OPENAI_CONFIG = { + "api_key": "your-api-key", + "api_base": "https://api.openai.com/v1", + "model": "gpt-3.5-turbo", + "temperature": 0, + "max_tokens": 500, + "timeout": 60 +} +``` + +### Environment Variables + +You can also configure via environment variables: -### 3. 启用真实LLM评估 ```bash -# 设置API密钥 export OPENAI_API_KEY="your-api-key" -export API_BASE_URL="http://10.10.10.122:1234/v1" # 可选 - -# 编辑 llm_config.py,设置 USE_REAL_LLM = True -# 运行评估 -python model_evaluation.py +export API_BASE_URL="https://your-api-endpoint/v1" +export USE_REAL_LLM="true" ``` -### 4. 单个评估测试 -```bash -python -c "from model_evaluation import test_single_evaluation; test_single_evaluation()" -``` +## 🎯 Quick Start -## 文件结构 - -``` -LLMS_FT_Test/ -├── model_evaluation.py # 主文件(已整合所有评估功能) -├── llm_config.py # 配置文件(API密钥、评估模式等) -├── requirements.txt # 依赖列表 -└── README.md # 本文档 -``` - -## 输出文件 - -- `{文件名}_evaluation.xlsx` - 单个文件评估结果 -- `evaluation_summary.xlsx` - 汇总报告 -- `all_detailed_results.xlsx` - 详细结果 - -## 评估指标 - -### 传统指标(无需LLM API) -- **BLEU分数**:基于n-gram的精确度 -- **ROUGE-L分数**:基于最长公共子序列的F1分数 -- **字符重叠率**:字符级别的重叠程度 -- **长度相似度**:答案长度的相似性 -- **完全匹配率**:完全匹配的比例 -- **关键词重叠率**:关键词的重叠程度 - -### LLM评估(需API) -- **智能评分**:基于语义理解的1-10分评分 -- **评价理由**:详细的评分依据和改进建议 - -## 支持的API - -- **OpenAI API** (GPT-3.5, GPT-4, GPT-4-turbo) -- **兼容OpenAI API的服务**(如自定义部署的API) -- **可扩展支持其他提供商**(Anthropic Claude、通义千问等) - -## 数据格式 - -支持 `.json` 和 `.jsonl` 格式: - -**JSON格式(数组):** -```json -[ - { - "question": "问题内容", - "answer": "参考答案", - "output": "模型输出" - } -] -``` - -**JSONL格式(每行一个JSON):** -```jsonl -{"question": "问题1", "answer": "答案1", "output": "输出1"} -{"question": "问题2", "answer": "答案2", "output": "输出2"} -``` - -## 配置选项 - -编辑 `llm_config.py` 文件: +### Basic Usage ```python -# 使用模拟评估(默认,无需配置) -USE_REAL_LLM = False - -# 或使用真实LLM API(需配置API密钥) -USE_REAL_LLM = True -``` - -运行以下命令查看所有配置选项: -```bash -python llm_config.py -``` - -## 自定义评估 - -```python -from model_evaluation import ModelEvaluator -from llm_config import USE_REAL_LLM +from model_evaluation import evaluate_dataset_parallel, ModelEvaluator +# Create evaluator evaluator = ModelEvaluator() -# 准备数据 -question = "什么是机器学习?" -reference = "机器学习是人工智能的一个分支..." -candidate = "机器学习是一种让计算机学习的方法..." +# Prepare your data +data = [ + { + 'question': 'What is machine learning?', + 'output': 'Machine learning is a technology that enables computers to learn from data', + 'answer': 'Machine learning is a branch of artificial intelligence that allows computers to learn patterns from data' + }, + # Add more data... +] -# 获取LLM评估 -prompt = evaluator.get_llm_evaluation_prompt(reference, candidate, question) +# Run evaluation (simulation mode) +results, metrics = evaluate_dataset_parallel( + data=data, + evaluator=evaluator, + use_real_llm=False, # Use simulation + max_workers=2 # Optional: override default workers +) -if USE_REAL_LLM: - score, reason = evaluator.call_llm_for_evaluation(prompt) -else: - score, reason = evaluator.get_mock_llm_evaluation(reference, candidate, question) - -# 计算传统指标 -metrics = evaluator.evaluate_all_metrics(reference, candidate) +# Print results +print(f"Evaluation Results: {results}") +print(f"Overall Metrics: {metrics}") ``` -## 注意事项 +### Real LLM API Usage -1. **默认模式**:系统默认使用模拟评估(无需API) -2. **API调用**:真实LLM评估需要有效的API密钥 -3. **并发限制**:批量评估时建议控制并发数,避免API限制 -4. **数据备份**:评估前请备份原始数据 -5. **结果验证**:建议先使用模拟模式验证数据格式 +```python +# Enable real LLM API (requires API key configuration) +results, metrics = evaluate_dataset_parallel( + data=data, + evaluator=evaluator, + use_real_llm=True, # Use real LLM API + max_workers=4 # Recommended: 4-8 for real APIs +) -## 常见问题 +# API calls will automatically retry on failure +# using settings from llm_config.py +``` -**Q: 如何切换到模拟评估模式?** -A: 在 `llm_config.py` 中设置 `USE_REAL_LLM = False` +### Custom Retry Configuration -**Q: 模拟评估的权重如何调整?** -A: 修改 `llm_config.py` 中的 `EVALUATION_WEIGHTS` 字典 +```python +# Get evaluation prompt +prompt = evaluator.get_llm_evaluation_prompt( + reference="Reference answer", + candidate="Model output", + question="Question" +) -**Q: 如何添加新的评估指标?** -A: 在 `ModelEvaluator` 类中添加新的计算方法,并在 `evaluate_all_metrics` 中调用 +# Use custom retry settings +score, reason = evaluator.call_llm_for_evaluation( + prompt, + max_retries=5, # Custom retry count + retry_delay=2.0 # Custom retry delay +) +``` -**Q: 支持哪些LLM提供商?** -A: 目前支持OpenAI GPT系列,可扩展支持其他兼容的API +## 📊 Understanding the Output -## 更新日志 +### Progress Display -### v2.0(整合版) -- ✅ 整合所有功能到 `model_evaluation.py` -- ✅ 新增 `test_single_evaluation()` 测试函数 -- ✅ 删除独立的测试文件和示例文件 -- ✅ 保留 `llm_config.py` 作为配置文件 -- ✅ 优化代码结构和导入关系 -- ✅ 精简项目结构,减少重复文件 -- ✅ 合并所有文档到README.md +When running evaluations, you'll see progress bars: -### v1.0(原始版) -- 基础评估功能 -- 模拟评估模式 -- 真实LLM评估模式 +``` +总进度: 50%|█████ | 3/6 [00:00<00:00, 26.25it/s] +批次2-并发1: 任务3: 0%| | 0/1 [00:00 100 items): Disable for cleaner output + +### Retry Mechanism Settings + +```python +# llm_config.py +MAX_API_RETRIES = 3 # Number of retry attempts +RETRY_DELAY = 1.0 # Initial delay in seconds +``` + +**Recommendations**: +- Stable network: 1-2 retries, 0.5s delay +- Standard environment: 3 retries, 1.0s delay +- Unstable network: 5 retries, 2.0s delay + +### API Configuration + +```python +# llm_config.py +OPENAI_CONFIG = { + "api_key": os.environ.get("OPENAI_API_KEY", "your-key"), + "api_base": os.environ.get("API_BASE_URL", "https://api.openai.com/v1"), + "model": "gpt-3.5-turbo", + "temperature": 0, + "max_tokens": 500, + "timeout": 60 +} +``` + +## 🔧 Troubleshooting + +### Common Issues + +#### 1. Import Errors +``` +ImportError: No module named 'jieba' +``` +**Solution**: Install missing dependencies +```bash +pip install -r requirements.txt +``` + +#### 2. NLTK Data Issues +``` +LookupError: Resource 'tokenizers/punkt' not found +``` +**Solution**: NLTK will download data automatically on first use. If issues persist: +```python +import nltk +nltk.download('punkt') +``` + +#### 3. API Connection Errors +``` +requests.exceptions.ConnectionError +``` +**Solution**: +- Check API endpoint URL +- Verify API key is correct +- Check network connectivity +- Adjust retry settings for unstable networks + +#### 4. Memory Issues with Large Datasets +``` +OutOfMemoryError +``` +**Solution**: +- Disable detailed progress bars: `SHOW_DETAILED_PROGRESS = False` +- Reduce concurrent workers: `MAX_CONCURRENT_WORKERS = 2` +- Process data in smaller chunks + +#### 5. Slow Performance +**Solutions**: +- Increase `MAX_CONCURRENT_WORKERS` for simulation mode +- Disable detailed progress bars for large datasets +- Use simulation mode (`use_real_llm=False`) for testing + +### Performance Tuning + +#### For Large Datasets (10K+ items) +```python +MAX_CONCURRENT_WORKERS = None # Use all CPU cores +SHOW_DETAILED_PROGRESS = False # Disable detailed bars +MAX_API_RETRIES = 2 # Reduce retries +``` + +#### For High-Throughput Testing +```python +MAX_CONCURRENT_WORKERS = 8 # More workers +USE_REAL_LLM = False # Use simulation +SHOW_DETAILED_PROGRESS = False # Disable detailed bars +``` + +#### For Production with Real APIs +```python +MAX_CONCURRENT_WORKERS = 4 # Balanced for API limits +USE_REAL_LLM = True # Use real API +MAX_API_RETRIES = 3 # Ensure reliability +RETRY_DELAY = 1.0 # Standard delay +``` + +## 🤝 Contributing + +We welcome contributions! Please feel free to submit issues and enhancement requests. + +### Development Setup + +1. Fork the repository +2. Create a virtual environment +3. Install development dependencies +4. Make your changes +5. Run tests to ensure everything works +6. Submit a pull request + +### Code Style + +- Follow PEP 8 guidelines +- Add docstrings to new functions +- Include type hints where applicable +- Write tests for new features + +## 📄 License + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +## 🙏 Acknowledgments + +- NLTK team for natural language processing tools +- jieba team for Chinese text segmentation +- tqdm team for progress bar functionality +- OpenAI for LLM API inspiration + +## 📞 Support + +For support, please: +1. Check the [Troubleshooting](#troubleshooting) section +2. Review the documentation files +3. Run the test scripts to verify your setup +4. Open an issue with detailed error information + +## 🗺️ Roadmap + +- [ ] Support for more evaluation metrics (BERTScore, METEOR) +- [ ] Integration with wandb for experiment tracking +- [ ] Web-based dashboard for result visualization +- [ ] Support for multilingual evaluation +- [ ] Batch evaluation with different models +- [ ] Export results to various formats (JSON, CSV, Excel) + +## 📈 Version History + +- **v5.2** (Current): Added configurable retry mechanism +- **v5.1**: Implemented HTTP API with retry logic +- **v5.0**: Batch progress tracking with dynamic bars +- **v4.0**: Concurrent processing implementation +- **v3.0**: LLM evaluation integration +- **v2.0**: Traditional metric evaluation +- **v1.0**: Initial release --- -⚠️ **重要提醒**:使用真实LLM API会产生费用,建议先用模拟模式测试整个流程。 +**Made with ❤️ for the AI community** diff --git a/__pycache__/example_concurrent_usage.cpython-313.pyc b/__pycache__/example_concurrent_usage.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..589e2f0f0abf44c6fe21e2df5bb3a816e1089f1e GIT binary patch literal 4820 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 literal 0 HcmV?d00001 diff --git a/data/qwen2.5-7b-sft.json b/data/qwen2.5-7b-sft.json index d45a0ce..7ee3237 100644 --- a/data/qwen2.5-7b-sft.json +++ b/data/qwen2.5-7b-sft.json @@ -1,34 +1,4 @@ [ - { - "input": "依据《项目施工合同价款(进度款)结算(成本列账)管理标准》,施工进度款的合同结算审批环节的责任人具体权责事项是什么?", - "answer": "用户的问题是询问施工进度款合同结算审批环节责任人的具体权责事项。首先,需在表格中找到二级流程为“合同结算审批”的条目,确定责任人后提取其权责事项。\n查看表格,该条目责任人是业务分管领导,具体权责事项为“1.负责根据《项目施工进度款支付报审表》审核、审查意见,按照合同结算审批权限,完成合同结算审批”。\n确认该条目与问题相关,提取上述信息。答案需简洁,忠于原文。\n总结:筛选对应条目,提取责任人的具体权责事项。\n依据《项目施工合同价款(进度款)结算(成本列账)管理标准》,在施工进度款的合同结算审批环节,责任人(业务分管领导)的具体权责事项为:负责根据《项目施工进度款支付报审表》审核、审查意见,按照合同结算审批权限,完成合同结算审批。", - "output": "依据《项目施工合同价款(进度款)结算(成本列账)管理标准》,在施工进度款的合同结算审批环节,责任人的具体权责事项是:1. 负责根据《项目施工进度款支付报审表》审核、审查意见,按照合同结算审批权限,完成合同结算审批。" - }, - { - "input": "在《项目施工预付款支付报审表》中,承包单位能否使用财务专用章进行签章?", - "answer": "用户的问题是想知道承包单位是否可以用财务专用章签章,需要从表单合规性标准中寻找答案。\n首先,明确问题意图是询问特定印章的使用权限,应关注“表单合规性标准”中关于签章的条款。\n查看“表单合规性标准”第(8)条:“承包单位签章必须为单位公章或项目部专用章或合同专用章,不得使用财务专用章等其他类签章替代”。其中明确不允许使用财务专用章,与问题直接相关,其他条款未涉及,属于相关信息。\n提取该内容后,简洁回答。\n总结:问题针对能否使用财务专用章签章,对应合规性标准第(8)条,提取相关内容即可。\n在《项目施工预付款支付报审表》中,承包单位不能使用财务专用章进行签章,其签章必须为单位公章或项目部专用章或合同专用章。", - "output": "不能使用财务专用章进行签章。承包单位应使用单位公章或项目部专用章进行签章。" - }, - { - "input": "依据施工结算款的内容,资金支付申请环节(项目实施部门专责)的流程载体是什么?", - "answer": "用户的问题是询问施工结算款中资金支付申请环节(项目实施部门专责)的流程载体。首先,需在表格中找到一级流程为“资金支付审批流程(价款结算业务财权审批流程)”、二级流程为“资金支付申请”、责任部门为“项目实施部门”且责任人为“项目实施部门专责”的条目。\n查看表格内容,该条目下的“流程载体”部分有明确说明。\n提取该内容,确认与问题中的环节、责任部门和责任人匹配,其他条目不涉及此情况。\n答案需直接引用原文,简洁明了。\n总结:找到对应条目后提取流程载体即可。\n依据《项目施工合同价款(结算款)结算(成本列账)管理标准》,在资金支付申请环节,项目实施部门专责的流程载体是工程业务支付申请单。", - "output": "依据施工结算款的内容,在资金支付申请环节(项目实施部门专责),流程载体是工程业务支付申请单。" - }, - { - "input": "在水电(燃料动力)费结算款中,资金支付审核阶段的价款结算类型是什么?", - "answer": "用户的问题是询问在水电(燃料动力)费结算款的资金支付审核阶段的价款结算类型。首先,需要找到二级流程为资金支付审核的条目。\n可能关联的内容模块是第三个和第四个条目,这两个条目二级流程均为资金支付审核,价款结算类型均为水电(燃料动力)费结算款。\n提取该价款结算类型信息,与问题相关,没有无关内容。\n生成答案时,直接陈述价款结算类型,语气简洁。\n总结:找到对应条目后,提取价款结算类型信息即为答案。\n在水电(燃料动力)费结算款中,资金支付审核阶段的价款结算类型是水电(燃料动力)费结算款。", - "output": "依据《项目“七项”费用_项目水电费_项目水电费结算管理标准》中关于水电(燃料动力)费结算款的内容,分析资金支付审核阶段的价款结算类型。\n相关内容:该阶段的价款结算类型是“水电(燃料动力)费”。\n生成答案:在水电(燃料动力)费结算款中,资金支付审核阶段的价款结算类型是“水电(燃料动力)费”。" - }, - { - "input": "依据水电(燃料动力)费结算款的内容,会计核算环节的审批依据有哪些?", - "answer": "用户的问题是依据水电(燃料动力)费结算款的内容,询问会计核算环节的审批依据。首先,定位到二级流程为“会计核算(生成及传递付款指令)”的条目。\n查看表格,第七个对象符合条件,其“审批(发起、审查、审核)依据”为“1. 工程费用报销单2.发票3. 水、电费结算单(燃料动力购买清单)4. 《业务手册》规定的其他报销资料”。\n该内容直接对应问题,其他条目无相关信息,因此是答案来源。\n答案需列出审批依据,保持原文。\n总结:找到对应条目,提取审批依据即可。\n依据水电(燃料动力)费结算款的内容,会计核算环节的审批依据有:\n1. 工程费用报销单;\n2. 发票;\n3. 水、电费结算单(燃料动力购买清单);\n4. 《业务手册》规定的其他报销资料。", - "output": "依据《项目“水电费”结算(成本列账)管理标准》\n用户的问题是询问在水电(燃料动力)费结算款的会计核算环节的审批依据。首先,找到二级流程为“会计核算(生成及传递付款指令)”的条目。\n表格中第七个条目符合,其审批(发起、审查、审核)依据为“1. 工程费用报销单2.发票3. 水、电费结算单(燃料动力购买清单)4. 《业务手册》规定的其他报销资料”。\n该内容直接回答问题,因此确定为答案。\n答案需列出审批依据,引用原文。\n总结:找到对应条目,提取审批依据即可。\n依据水电(燃料动力)费结算款的内容,在会计核算环节的审批依据如下:\n1. 工程费用报销单\n2. 发票\n3. 水、电费结算单(燃料动力购买清单)\n4. 《业务手册》规定的其他报销资料" - }, - { - "input": "依据水电(燃料动力)费结算款,资金支付审批环节的流程载体、节点描述以及责任部门(单位)是什么?", - "answer": "用户的问题是询问水电(燃料动力)费结算款在资金支付审批环节的流程载体、节点描述和责任部门(单位)。首先,需要从表格中找到一级流程为“资金支付审批流程”、二级流程为“资金支付审批”的条目。\n查看表格内容,第五个对象符合要求,其一级流程是“资金支付审批流程”,二级流程是“资金支付审批”。\n该条目下的“流程载体”“节点描述(工作步骤)”“责任部门(单位)”即为所需内容,其他条目因流程不同,不相关。\n提取这些信息,按要求组织答案,确保忠于原文,逻辑清晰。\n总结:找到对应条目,提取相关字段信息作为答案。\n依据水电(燃料动力)费结算款,资金支付审批环节的相关情况如下:\n1. **流程载体**:工程费用报销单。\n2. **节点描述**:审批资金支付流程。\n3. **责任部门(单位)**:财务分管领导、主要负责人。", - "output": "依据水电(燃料动力)费结算款,资金支付审批环节的相关情况如下:\n1. 流程载体:工程费用报销单\n2. 节点描述:审批资金支付流程\n3. 责任部门(单位):财务分管领导、主要负责人所属部门" - }, { "input": "在施工预付款的会计核算环节,节点描述、经办人角色及主要风险点是什么?", "answer": "用户的问题是询问施工预付款中会计核算环节的节点描述、经办人角色及主要风险点。首先,需要从表格中找到二级流程为“会计核算”的条目。\n查看表格内容,流程节点100的条目符合条件,其一级流程是“资金支付审批流程(价款结算业务财权审批流程)”,二级流程是“会计核算”。\n该条目对应的节点描述(工作步骤)是“付款单据制证”,经办人是“发起”,主要风险点描述是“1.违规结算:核算“银行存款金额”与经审批的单据不一致”。其他条目因二级流程不符,不属于相关内容。\n答案需准确提取这些信息,分点说明。\n总结:通过筛选特定二级流程的条目,提取出节点描述、经办人角色及主要风险点。\n根据《项目施工合同价款(预付款)结算(成本列账)管理标准》,在施工预付款的会计核算环节,相关信息如下:\n- **节点描述(工作步骤)**:付款单据制证\n- **经办人角色**:发起\n- **主要风险点**:违规结算:核算“银行存款金额”与经审批的单据不一致", diff --git a/llm_config.py b/llm_config.py index 27d5522..7ee9486 100644 --- a/llm_config.py +++ b/llm_config.py @@ -54,6 +54,25 @@ MAX_CONCURRENT_WORKERS = 5 # 可以手动设置为具体数字,如8 # 注意:当数据量很大时,建议设置为False以避免屏幕输出过多 SHOW_DETAILED_PROGRESS = True +# ============================================================================= +# API重试配置 +# ============================================================================= + +# API调用失败时的最大重试次数 +# 推荐设置: +# - 网络稳定环境:1-2次 +# - 网络不稳定环境:3-5次 +# - 0 = 禁用重试功能 +MAX_API_RETRIES = 3 + +# 重试间隔时间(秒) +# 第一次重试的延迟时间,后续重试会使用指数退避策略 +# 推荐设置: +# - 快速响应场景:0.5-1秒 +# - 标准场景:1-2秒 +# - 避免过载场景:2-3秒 +RETRY_DELAY = 1.0 + # ============================================================================= # API配置 @@ -214,6 +233,16 @@ def print_config_info(): print(" 注意: 开启时会显示每个并发任务的进度条") else: print(" 注意: 关闭时只显示总进度条") + + # 显示重试配置 + print(f"API重试次数: {MAX_API_RETRIES} 次") + print(" 来源: llm_config.py 中的 MAX_API_RETRIES") + if MAX_API_RETRIES > 0: + print(f"重试延迟: {RETRY_DELAY} 秒") + print(" 来源: llm_config.py 中的 RETRY_DELAY") + print(" 注意: 使用指数退避策略(2^n倍延迟)") + else: + print(" 注意: 已禁用重试功能") print("-" * 60) if USE_REAL_LLM: diff --git a/model_evaluation.py b/model_evaluation.py index 8f4d825..f1b4a8c 100644 --- a/model_evaluation.py +++ b/model_evaluation.py @@ -33,6 +33,8 @@ from llm_config import ( USE_REAL_LLM, MAX_CONCURRENT_WORKERS, SHOW_DETAILED_PROGRESS, + MAX_API_RETRIES, + RETRY_DELAY, OPENAI_CONFIG, EVALUATION_WEIGHTS, PROMPT_TEMPLATE, @@ -377,7 +379,12 @@ def evaluate_single_item(args): if use_real_llm: try: prompt = evaluator.get_llm_evaluation_prompt(answer_text, output_text, input_text) - llm_score, llm_reason = evaluator.call_llm_for_evaluation(prompt) + # 使用配置文件中的重试参数 + llm_score, llm_reason = evaluator.call_llm_for_evaluation( + prompt, + max_retries=MAX_API_RETRIES, + retry_delay=RETRY_DELAY + ) except Exception as e: # 静默处理错误,返回模拟评估结果 llm_score, llm_reason = evaluator.get_mock_llm_evaluation(answer_text, output_text, input_text) diff --git a/requirements.txt b/requirements.txt index 30f1d58..b538c32 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,15 +1,32 @@ -# 核心依赖 -numpy>=1.21.0 -pandas>=1.3.0 -openpyxl>=3.0.0 -nltk>=3.8 +# Core dependencies for LLM Model Evaluation System +# Python 3.7+ required + +# Numerical computing +numpy>=1.19.0 + +# Natural Language Processing +nltk>=3.6.0 jieba>=0.42.1 -tqdm>=4.64.0 -xlrd>=2.0.0 -# LLM API支持(可选) -openai>=1.0.0 +# Data manipulation and analysis +pandas>=1.2.0 -# 其他可选依赖 -# requests>=2.28.0 # 用于HTTP请求 -# matplotlib>=3.5.0 # 用于结果可视化(如需要) \ No newline at end of file +# Progress bars and utilities +tqdm>=4.60.0 + +# HTTP requests +requests>=2.25.0 + +# Optional: For enhanced visualization (uncomment if needed) +# matplotlib>=3.3.0 +# seaborn>=0.11.0 + +# Optional: For advanced metrics (uncomment if needed) +# scikit-learn>=0.24.0 +# scipy>=1.6.0 + +# Development dependencies (uncomment for development) +# pytest>=6.0.0 +# pytest-cov>=2.10.0 +# black>=21.0.0 +# flake8>=3.8.0