这篇教程带你用 LiteLLM 和 Ollama,把同一段材料分别交给两个本地模型,保存回答、耗时和用量,再人工比较事实是否正确。完成后,你会得到一个 CSV 结果文件,可用 Excel 打开。示例以 Windows PowerShell 为例;本地模型占用的磁盘、内存和运行速度取决于具体模型和电脑配置。

一、准备工作

你需要 Python、已安装并运行的 Ollama,以及两个已经下载的文本模型。先打开 PowerShell,检查环境:

python --version
ollama --version
ollama list

如果 Python 命令不可用,请先安装 Python 并重新打开终端;如果 Ollama 命令不可用,参考 Ollama 安装页面。ollama list 会显示本机模型名称;下文必须填写实际存在的两个名称。没有模型时,可到 Ollama 模型库查看大小、要求和下载方式。不要把示例名称当成已经安装。

二、创建练习目录并安装依赖

mkdir model-compare
cd model-compare
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install litellm

以上直接调用虚拟环境中的 Python,无须修改 PowerShell 执行策略。安装后用下面的命令确认 LiteLLM 可被导入:

.\.venv\Scripts\python.exe -c "import litellm; print('LiteLLM 已安装')"

三、保存对比脚本

在当前目录新建 compare.py,复制以下完整代码。把 MODELS 里的两个名称替换成 ollama list 显示的名称;例如列表显示 qwen3:4b,就填写 ollama_chat/qwen3:4b。LiteLLM 的 Ollama 文档推荐使用 ollama_chat 前缀。

import csv
import time
from litellm import completion

# 替换成 ollama list 输出的两个真实名称
MODELS = ["ollama_chat/模型一", "ollama_chat/模型二"]
SAMPLES = [
    {"id": "01", "text": "软件 A 支持 Windows 和 macOS。安装后打开设置,选择中文并点击保存。"},
    {"id": "02", "text": "软件 B 的免费版可创建三个项目。付费版支持更多项目,具体价格未在此说明。"},
]
PROMPT = "仅根据材料回答:一句概述、两个事实、材料未说明的信息。不要猜测。\n材料:"

def run(completion_fn=completion):
    rows = []
    for sample in SAMPLES:
        for model in MODELS:
            started = time.perf_counter()
            row = {"sample_id": sample["id"], "model": model, "status": "ok",
                   "seconds": "", "input_tokens": "", "output_tokens": "", "answer": "", "error": ""}
            try:
                result = completion_fn(model=model, api_base="http://localhost:11434",
                    messages=[{"role": "user", "content": PROMPT + sample["text"]}], timeout=120)
                row["answer"] = result.choices[0].message.content or ""
                usage = result.usage
                if usage:
                    row["input_tokens"] = usage.prompt_tokens
                    row["output_tokens"] = usage.completion_tokens
            except Exception as exc:
                row["status"] = "error"
                row["error"] = type(exc).__name__ + ": " + str(exc)
            row["seconds"] = round(time.perf_counter() - started, 2)
            rows.append(row)
            print(sample["id"], model, row["status"], row["seconds"], "秒")
    with open("results.csv", "w", encoding="utf-8-sig", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=rows[0].keys())
        writer.writeheader()
        writer.writerows(rows)
    print("已保存 results.csv,共", len(rows), "条记录")

if __name__ == "__main__":
    run()

四、执行并查看结果

保持 Ollama 服务运行,在脚本所在目录执行:

.\.venv\Scripts\python.exe compare.py

程序会依次执行四次调用:两段材料各交给两个模型。终端会显示样例编号、模型名、状态和耗时;运行结束后,用 Excel 或表格软件打开同目录的 results.csv。该文件使用 UTF-8 带签名编码,方便 Windows 表格软件识别中文。再次运行会覆盖同名文件,需要保留记录时先重命名。

首次加载模型可能较慢,同一个模型后续运行可能受缓存影响。想比较稳定耗时,可先预热,再对两者用相同方式各运行多次,并保留全部结果;这四次调用只是打通流程。

五、逐条核对内容

示例 01 的依据是:支持 Windows 和 macOS;打开设置选择中文并保存。材料没有说明价格或其他系统。示例 02 的依据是:免费版可创建三个项目;付费版支持更多项目;具体价格未说明。如果回答填出了一个具体价格,记为事实错误。

在表格旁增加“事实正确”“遗漏”“虚构”“格式合格”列,按样例逐一填写。先看正确性,再比较耗时;用量字段为空时记为未返回,不要填 0。示例记录总耗时,不测首字延迟;本地运行不代表没有硬件和电力成本。

六、常见错误

连接失败怎么办?

确认 Ollama 正在运行,检查本机 http://localhost:11434 是否可访问;如果你的服务地址不同,修改代码中的 api_base。查看 CSV 的 error 列,再检查防火墙及服务地址。

提示模型不存在?

重新运行 ollama list,将完整名称填在 ollama_chat/ 后面。模型未下载时,先按模型库说明下载。

运行超时或内存不足?

选择适合本机资源的较小模型,关闭其他占用资源的软件。timeout 是等待上限,不保证模型在限定时间内完成;不要无限重试。

能直接换成云端模型吗?

可以参考 提供商文档配置模型标识、服务地址及认证变量。云端调用可能产生费用,也会将材料发送到所选服务;本例的 localhost 地址与模型名前缀不能原样套用。

项目来源

参考 LiteLLM 项目、Ollama 接入文档及 项目许可。本文的对比样例和代码由本站编写;不同模型的输出和运行时间需要在自己的环境中核对。