# ai-context-test **Repository Path**: pioneerdk/ai-context-test ## Basic Information - **Project Name**: ai-context-test - **Description**: 并发AI接口测试工具,用于并发测试AI接口的性能表现,支持流式/非流式响应,自动拼接不同上下文量的测试数据,记录详细日志并输出统计报表。 - **Primary Language**: Python - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-05-01 - **Last Updated**: 2026-05-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AI上下文并发压测 用于并发测试AI接口的性能表现,支持流式/非流式响应,动态选择上下文模板并截断到指定token长度,记录详细日志并输出统计报表。 ## 功能概要 - **动态上下文token长度**:`--context` 接受任意 `Nk` 格式(如 `3k`, `50k`, `100k`),支持模板组合。最大支持约 540k tokens(所有 10 个模板文件组合)。模板选取策略:`= 精确匹配不截取`;`> 取最小的 >= 目标,需截取`;`< 从大到小组合模板直到 >= 目标`。每个模板文件只使用一次。 - **灵活模板组合**:当单个模板文件不足以满足 target 时,自动从大到小组合多个模板文件(简单顺序拼接),再按 =/ > 策略判断是否需要截断。 - **并发控制**:按并发序号循环,每次开启对应数量的线程同时请求 - **循环测试**:`--loop` 参数支持重复测试,`0` 不循环,`N>0` 额外执行 N 次,`-1` 无限循环(Ctrl+C 终止) - **智能参数生成**:从100个预设人名中随机选取5人作为参会者,随机1人提问 - **流式/非流式支持**:通过 `--stream` 开关切换 - **详细日志**:每次请求自动生成独立日志文件,包含请求参数和响应数据 - **性能统计**:计算请求/返回token数、首token时间、总耗时、生成速度 ## 前置要求 - Python 3.8+ - `requests` 库 - `tiktoken` 库(通用 tokenizer) - `qwen_tokenizer` 库(Qwen 模型专用 tokenizer) ### Ubuntu 24 ```bash sudo apt update && sudo apt install python3-venv python3 -m venv vt-venv source vt-venv/bin/activate pip3 install requests tiktoken qwen_tokenizer ``` ### Windows 10 推荐安装 [Python 3.12](https://www.python.org/downloads/)(安装时勾选 **Add Python to PATH**)。 ```powershell python -m venv vt-venv vt-venv\Scripts\activate pip install requests tiktoken qwen_tokenizer ``` ## Token 计数器 工具内置了两种 token 计数器,根据 `--model` 参数自动选择: | 模型名称 | 使用的计数器 | 说明 | |----------|------------|------| | 包含 `qwen`(如 `Qwen3.6-35B`) | `qwen_tokenizer` | Qwen 模型专用 tokenizer,结果与 API 侧一致 | | 其他模型(如 `gpt-4`、`claude`) | `tiktoken`(cl100k_base) | OpenAI 通用 tokenizer | **重要**:不同模型使用不同的 tokenizer,同一份文本的 token 数可能差异很大。例如: ``` 文本: "你好世界测试" Qwen tokenizer: 4 tokens tiktoken (cl100k_base): 6 tokens ``` 因此: - **上下文截断**:如果测试 Qwen 模型,必须安装 `qwen_tokenizer`,否则截断会用 `tiktoken`(每个 token 对应更多字符),导致截断后内容偏少 - **API 返回 token 数**:API 侧使用模型自身的 tokenizer,可能与客户端统计不一致。这是正常现象,不是 bug - **建议**:始终安装 `qwen_tokenizer` 和 `tiktoken`,工具会根据模型自动选择最优方案 ## 使用方法 ### 基本用法(测试10k上下文,1并发,非流式) ```bash python act.py --context 10k ``` ### 测试50k上下文,并发序号1~5,流式 ```bash python act.py --context 50k --stream --concurrency-end 5 ``` ### 指定AI接口地址 ```bash python act.py --context 20k --url http://localhost:8000/v1/chat/completions ``` ### 从第2个并发序号开始测试 ```bash python act.py --context 30k --concurrency-start 2 --concurrency-end 5 ``` ### 自定义模型和采样参数 ```bash python act.py --context 40k --model my-model --temperature 0.5 --max-tokens 2048 ``` ### 循环测试 ```bash # 额外再执行1次测试(总共2次) python act.py --context 20k --loop 1 # 无限循环测试,Ctrl+C 终止 python act.py --context 30k --loop -1 ``` ## 参数说明 | 参数 | 默认值 | 说明 | |------|--------|------| | --context | 10k | 上下文token长度,格式如 3k/50k/100k(`k` 表示 1024,如 `3k`=3072,自动选取 >= 目标的模板并截断) | | --url | http://localhost:8000/v1/chat/completions | AI接口URL | | --model | Qwen3.6-35B-A3B-FP8 | 模型名称(包含 `qwen` 自动使用 qwen_tokenizer) | | --max-tokens | 1k | 最大生成token数,支持k后缀如 1k/4k(`k` 表示 1024,如 `1k`=1024, `4k`=4096) | | --temperature | 0.7 | 采样温度 | | --top-k | 10 | Top-K参数 | | --top-p | 0.9 | Top-P参数 | | --concurrency-start | 1 | 并发起始序号 | | --concurrency-end | 1 | 并发结束序号,start > end 时自动设为 start | | --loop | 0 | 循环测试次数:0=不循环,>0=额外再执行N次,-1=无限循环(Ctrl+C终止) | | --stream | false | 启用流式请求 | | --timeout | 120 | 单次请求超时秒数 | | --output-dir | ./logs | 日志输出目录 | ## 输出说明 ### 控制台输出 测试完成后输出统计表格,包含: - 上下文、并发数、并发序号 - 请求/返回token数 - 首token返回时间、总耗时、每秒生成token数 - 汇总统计(平均值、总数) ### 日志文件 日志保存在 `logs/时间戳/` 目录下,每个并发请求对应一个日志文件: ``` logs/20260430110000/ ├── 10k-1-1.log # 10k上下文, 1并发, 第1个请求 ├── 10k-2-1.log # 10k上下文, 2并发, 第1个请求 └── 10k-2-2.log # 10k上下文, 2并发, 第2个请求 ``` 每个日志文件包含: - 请求参数 - AI返回信息(流式/非流式) - 统计信息