🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

基于taotoken与python在ubuntu上构建多轮对话测试工具

在AI应用开发与模型选型过程中,对多个大语言模型的回答质量、风格一致性和稳定性进行系统性评估,是一项关键且耗时的工作。对于AI质量评估工程师或开发团队而言,手动切换不同厂商的API、管理各自的密钥、并统一测试流程,效率低下且容易出错。本文将介绍如何在Ubuntu工作站上,利用Taotoken平台提供的统一API接入能力,结合Python SDK,构建一个自动化多轮对话测试工具,实现高效、可复现的模型质量横向数据收集。

1. 场景核心价值与工具设计思路

该工具的核心目标是自动化执行预设的多轮对话测试集,并将不同模型的响应结果、耗时等关键指标记录下来,形成结构化的评估报告。其设计思路围绕以下几个关键点展开:

统一接入层:借助Taotoken的OpenAI兼容API,我们无需为每个待测模型单独编写适配代码或管理多个API端点。只需在Taotoken平台创建一个API Key,并在其模型广场获取所需模型的唯一标识符(如gpt-4oclaude-3-5-sonnetdeepseek-chat等),即可通过同一套代码调用它们。

测试集与流程定义:测试集应包含一系列具有代表性的问题或对话场景,可能涵盖事实问答、逻辑推理、创意写作、代码生成、安全合规响应等多个维度。测试流程需要模拟真实的多轮交互,即根据模型上一轮的回答,自动或按规则生成下一轮的问题。

结果收集与分析:工具需要精确记录每轮对话的输入、输出、响应时间(如response_ms)、使用的Token数量等信息。这些数据将输出为结构化的格式(如JSON Lines、CSV),便于后续进行统计分析、可视化或导入数据库。

环境与依赖:选择Ubuntu作为运行环境,因其在服务器和开发工作站中广泛使用,稳定性好,且与Python生态兼容性极佳。核心依赖是官方的openai Python SDK,以及用于数据处理和报告生成的常用库(如pandas, json)。

2. 环境准备与Taotoken配置

首先,确保你的Ubuntu系统已安装Python 3.8或更高版本。可以通过python3 --version命令检查。接着,创建一个独立的项目目录并初始化虚拟环境,这有助于隔离依赖。

mkdir model_qa_evaluator && cd model_qa_evaluator
python3 -m venv venv
source venv/bin/activate

安装必要的Python包。我们主要需要openai库来调用Taotoken API,同时可以安装pandastqdm来辅助数据处理和显示进度。

pip install openai pandas tqdm

接下来,访问Taotoken平台。注册并登录后,在控制台的“API密钥”页面创建一个新的密钥。请妥善保存此密钥,它将在脚本中作为身份凭证使用。

然后,前往“模型广场”页面,浏览并记录下你计划测试的模型ID。例如,你可能对gpt-4oclaude-3-5-sonnet-20241022qwen-plus感兴趣。这些模型ID将在后续的脚本中直接使用。

3. 核心脚本编写与实现

我们将编写一个Python脚本,其核心是一个测试运行器类。这个类负责加载测试用例、初始化Taotoken客户端、按顺序对每个模型执行多轮对话,并收集结果。

首先,创建一个名为evaluator.py的文件,并开始编写代码。第一部分是导入模块和配置常量。

import os
import json
import time
from openai import OpenAI
from typing import List, Dict, Any
import pandas as pd
from tqdm import tqdm

# 配置
TAOTOKEN_API_KEY = os.getenv("TAOTOKEN_API_KEY", "your_taotoken_api_key_here")  # 建议通过环境变量设置
TAOTOKEN_BASE_URL = "https://taotoken.net/api"
TEST_CASES_FILE = "test_cases.jsonl"  # 测试用例文件
RESULTS_FILE = "evaluation_results.jsonl"  # 结果输出文件
MODELS_TO_TEST = [
    "gpt-4o",
    "claude-3-5-sonnet-20241022",
    "qwen-plus",
    # 添加更多从Taotoken模型广场获取的模型ID
]

重要提示:在实际项目中,强烈建议将TAOTOKEN_API_KEY通过环境变量传入(例如export TAOTOKEN_API_KEY='your_key'),避免将密钥硬编码在脚本中。

接下来,定义测试用例的数据结构。一个简单的多轮对话测试用例可以是一个字典列表,每个字典代表一轮对话,包含roleuserassistant)和content。初始轮次由user开始。我们假设测试用例存储在JSON Lines格式的文件中。

然后,实现核心的ModelEvaluator类。

class ModelEvaluator:
    def __init__(self, api_key: str, base_url: str):
        self.client = OpenAI(
            api_key=api_key,
            base_url=base_url,
        )

    def run_single_conversation(self, model: str, messages: List[Dict]) -> Dict[str, Any]:
        """对单个模型运行一轮对话(可包含历史消息),并返回结果。"""
        start_time = time.time()
        try:
            response = self.client.chat.completions.create(
                model=model,
                messages=messages,
                max_tokens=1024,
                temperature=0.7,  # 可根据测试需求调整
            )
            end_time = time.time()

            completion = response.choices[0].message
            usage = response.usage

            return {
                "model": model,
                "input_messages": messages,
                "output_message": completion.content,
                "response_time_ms": round((end_time - start_time) * 1000, 2),
                "input_tokens": usage.prompt_tokens,
                "output_tokens": usage.completion_tokens,
                "total_tokens": usage.total_tokens,
                "finish_reason": response.choices[0].finish_reason,
                "success": True,
            }
        except Exception as e:
            return {
                "model": model,
                "input_messages": messages,
                "output_message": None,
                "response_time_ms": None,
                "input_tokens": None,
                "output_tokens": None,
                "total_tokens": None,
                "finish_reason": str(e),
                "success": False,
            }

    def run_multi_turn_test(self, model: str, test_case: List[Dict]) -> List[Dict[str, Any]]:
        """对一个模型执行一个多轮对话测试用例。"""
        conversation_history = []
        results_per_turn = []

        for turn in test_case:
            # 假设test_case中每一轮都是用户输入
            conversation_history.append({"role": "user", "content": turn["content"]})
            turn_result = self.run_single_conversation(model, conversation_history.copy())
            results_per_turn.append(turn_result)

            if turn_result["success"] and turn_result["output_message"]:
                # 将模型回复加入历史,用于下一轮
                conversation_history.append({"role": "assistant", "content": turn_result["output_message"]})
            else:
                # 如果本轮失败,可能终止测试或记录错误
                break

        return results_per_turn


def load_test_cases(file_path: str) -> List[List[Dict]]:
    """从JSON Lines文件加载测试用例。"""
    test_cases = []
    with open(file_path, 'r', encoding='utf-8') as f:
        for line in f:
            data = json.loads(line.strip())
            # 假设每行是一个测试用例,包含多轮用户输入列表
            test_cases.append([{"role": "user", "content": q} for q in data["questions"]])
    return test_cases


def main():
    evaluator = ModelEvaluator(TAOTOKEN_API_KEY, TAOTOKEN_BASE_URL)
    test_cases = load_test_cases(TEST_CASES_FILE)

    all_results = []

    for model in tqdm(MODELS_TO_TEST, desc="Testing Models"):
        for case_id, test_case in enumerate(test_cases):
            case_results = evaluator.run_multi_turn_test(model, test_case)
            for turn_idx, turn_result in enumerate(case_results):
                record = {
                    "case_id": case_id,
                    "turn_idx": turn_idx,
                    **turn_result  # 合并字典
                }
                all_results.append(record)

    # 保存结果到JSON Lines文件
    with open(RESULTS_FILE, 'w', encoding='utf-8') as f:
        for record in all_results:
            f.write(json.dumps(record, ensure_ascii=False) + '\n')

    print(f"测试完成!结果已保存至 {RESULTS_FILE}")
    # 可选:使用pandas进行快速摘要
    df = pd.DataFrame(all_results)
    print(df.groupby('model')[['success', 'response_time_ms', 'total_tokens']].mean())


if __name__ == "__main__":
    main()

4. 测试执行与结果分析示例

在运行脚本前,需要准备测试用例文件test_cases.jsonl。这是一个简单的示例:

{"questions": ["请用Python写一个函数,判断一个数是否为素数。", "如果输入是负数,你的函数会如何处理?", "请为这个函数添加文档字符串。"]}
{"questions": ["简述牛顿第一定律。", "这个定律在非惯性参考系中是否成立?为什么?"]}

运行脚本:

python evaluator.py

脚本将遍历MODELS_TO_TEST列表中的每个模型,对每个测试用例执行多轮对话,并在控制台显示进度条。测试完成后,所有详细结果将保存在evaluation_results.jsonl中。

结果文件中的每条记录都包含了模型、测试用例、轮次、输入输出、耗时、Token用量和成功状态等信息。你可以使用Python数据分析库(如pandas)或可视化工具(如matplotlib, seaborn)对这些数据进行深入分析。例如,可以计算每个模型在所有测试用例上的平均响应时间、成功率、总Token消耗成本(结合Taotoken平台的计价规则),并对回答内容进行质量评分(可引入人工或自动化评分规则)。

通过这种方式,你获得的不再是主观印象,而是基于相同测试集和统一接口的客观数据。这些数据能为团队在模型选型、成本预算和性能调优等方面提供坚实的决策依据。整个流程可以集成到持续集成(CI)系统中,定期运行,以监控模型服务的稳定性与表现变化。


通过上述步骤,你可以在Ubuntu环境下快速搭建一个专业的模型自动化测试流水线。Taotoken的统一接入能力简化了多模型调用的复杂性,让工程师能够更专注于测试设计与结果分析本身。你可以根据实际需求扩展此工具,例如增加更复杂的对话逻辑、集成自动化评分模型、或生成更丰富的图表报告。开始你的模型评估之旅吧,访问Taotoken获取API Key并探索更多可用模型。

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度

更多推荐