internlm2-chat-1.8b性能实测:数学推理+编程能力对比Qwen2-1.5B详细步骤
最近,小参数的大语言模型越来越受到关注。它们体积小,部署方便,对硬件要求低,非常适合个人开发者、学生或者想快速验证想法的人。今天,我们就来实测两款热门的小参数模型:InternLM2-Chat-1.8B和Qwen2-1.5B。
我们的目标很明确:抛开复杂的参数和理论,直接上手测试,看看这两个模型在数学推理和编程这两个核心能力上,到底谁更胜一筹。我会把测试过程、代码和结果都完整地展示出来,让你看完就能自己动手验证。
1. 模型简介与部署准备
在开始“比武”之前,我们先简单认识一下两位“选手”,并准备好测试环境。
1.1 认识两位选手:InternLM2-1.8B 与 Qwen2-1.5B
InternLM2-Chat-1.8B来自上海人工智能实验室,是第二代书生·浦语模型家族中的“小个子”成员。别看它只有18亿参数,官方宣称它在推理、数学和编程能力上相比前代有显著提升,并且能有效处理长达20万字符的文本,在长文本任务上表现不错。我们测试的是其经过对齐优化的聊天版本(Chat),指令遵循和对话体验更好。
Qwen2-1.5B则来自阿里通义千问团队,是Qwen2系列的最小版本,拥有15亿参数。Qwen2系列在开源社区口碑很好,以强大的代码能力和均衡的性能著称。1.5B版本是其轻量化的代表,旨在保持核心能力的同时降低使用门槛。
简单来说,一个强调长上下文和综合能力提升,一个以代码能力见长且生态成熟。纸上谈兵没用,我们直接看实战。
1.2 快速部署:使用Ollama一键启动
为了公平对比,我们使用Ollama这个工具来部署和运行这两个模型。Ollama就像是一个模型管理器和运行器,它把下载、配置、运行模型这些麻烦事都打包好了,我们只需要几条简单的命令。
首先,你需要确保电脑上已经安装了Ollama。如果还没安装,可以去Ollama官网根据你的操作系统下载安装,过程非常简单。
安装好后,打开终端(或命令提示符),分别拉取这两个模型:
# 拉取并部署 InternLM2-Chat-1.8B ollama pull internlm2:1.8b # 拉取并部署 Qwen2-1.5B ollama pull qwen2:1.5b拉取完成后,模型就准备好了。你可以通过以下命令与模型进行交互测试:
# 与 InternLM2 对话 ollama run internlm2:1.8b # 与 Qwen2 对话 (运行后,在出现的提示符后输入问题) ollama run qwen2:1.5b不过,为了进行系统性的测试和记录,我们更推荐使用Ollama提供的API接口,用Python脚本来进行测试,这样结果更规范,也便于我们后续对比。
2. 构建自动化测试脚本
手动提问效率太低,也不够客观。我们来写一个Python脚本,用相同的题目去“考”这两个模型,并自动记录它们的回答。
2.1 准备测试环境与依赖
创建一个新的Python文件,比如叫做model_benchmark.py。首先,我们需要安装必要的库,主要是用来发送HTTP请求的requests。
pip install requests2.2 编写模型调用函数
Ollama默认会在本地11434端口提供一个API服务。我们编写一个通用的函数来向这个API发送请求,获取模型回复。
import requests import json import time def ask_ollama(model_name, prompt, system_prompt=None): """ 向本地Ollama服务发送请求,询问模型。 参数: model_name: 模型名称,如 'internlm2:1.8b' prompt: 用户输入的问题 system_prompt: 系统指令,用于设定模型角色(可选) 返回: model_response: 模型的文本回复 response_time: 请求耗时(秒) """ url = "http://localhost:11434/api/generate" # 构造请求数据 payload = { "model": model_name, "prompt": prompt, "stream": False, # 设为False,一次性获取完整回复 "options": { "temperature": 0.1, # 低温度,让输出更确定、更专注推理 "num_predict": 512 # 限制生成长度,避免无关输出 } } # 如果有系统指令,则加入 if system_prompt: payload["system"] = system_prompt start_time = time.time() try: response = requests.post(url, json=payload, timeout=120) # 设置超时时间 response.raise_for_status() # 检查请求是否成功 result = response.json() end_time = time.time() response_time = end_time - start_time model_response = result.get("response", "").strip() return model_response, response_time except requests.exceptions.RequestException as e: print(f"请求模型 {model_name} 时出错: {e}") return f"[错误: {e}]", 0 except json.JSONDecodeError as e: print(f"解析模型 {model_name} 的响应时出错: {e}") return f"[响应解析错误]", 0 # 测试一下函数是否工作 if __name__ == "__main__": test_response, test_time = ask_ollama('internlm2:1.8b', '你好,请介绍一下你自己。') print(f"回复: {test_response}") print(f"耗时: {test_time:.2f}秒")这个函数是测试的核心,它会以相同的参数调用不同的模型,确保测试条件一致。
3. 数学推理能力实测
数学能力是衡量模型逻辑思维和分步推理水平的重要标尺。我们设计几个不同难度的题目来考考它们。
3.1 测试题目设计
我们选择三类题目:
- 基础算术与逻辑:考察基本计算和一步推理。
- 多步文字应用题:考察从自然语言中提取信息并分步计算的能力。
- 基础代数与逻辑推理:考察简单的方程和逻辑理解。
以下是我们的测试题目列表:
math_tests = [ { "category": "基础算术", "question": "一个篮子里有12个苹果,小明拿走了3个,小红又放进去5个,请问现在篮子里有多少个苹果?请一步步计算。" }, { "category": "多步应用题", "question": "火车以每小时80公里的速度行驶,3小时后,它提速到每小时100公里。请问火车行驶5小时后的总路程是多少?" }, { "category": "代数与逻辑", "question": "如果 x + 2y = 10,且 2x - y = 5,那么 x 和 y 的值分别是多少?请展示求解过程。" }, { "category": "逻辑推理", "question": "一个池塘里,荷叶每天覆盖的面积翻倍。如果第10天荷叶覆盖了整个池塘,那么第几天覆盖了池塘的一半?" } ]3.2 执行测试并记录结果
接下来,我们编写一个循环,让两个模型依次回答这些问题,并把结果保存下来。
def run_math_tests(): """运行数学测试并打印结果""" models = ['internlm2:1.8b', 'qwen2:1.5b'] results = {model: [] for model in models} print("="*60) print("开始数学推理能力测试") print("="*60) for test in math_tests: print(f"\n【{test['category']}】问题: {test['question']}") for model in models: answer, time_used = ask_ollama(model, test['question']) results[model].append({ 'category': test['category'], 'question': test['question'], 'answer': answer, 'time': time_used }) print(f"\n {model} 回答 (耗时{time_used:.2f}s):") print(f" {answer[:200]}..." if len(answer) > 200 else f" {answer}") # 打印前200字符 print("-"*40) return results # 运行数学测试 math_results = run_math_tests()3.3 数学测试结果分析与对比
运行完脚本后,我们得到了详细的回答。这里我直接给出对两个模型回答的人工分析和总结:
| 测试类别 | InternLM2-1.8B 表现 | Qwen2-1.5B 表现 | 简要分析 |
|---|---|---|---|
| 基础算术 | 正确。清晰列出了“12-3+5”的步骤,得出答案14。 | 正确。同样列出了计算步骤,答案正确。 | 两者均能轻松处理基础算术,表现相当。 |
| 多步应用题 | 正确且优秀。清晰分两步计算:80km/h * 3h = 240km;100km/h * 2h = 200km;总路程440km。逻辑完整。 | 存在错误。它错误地计算了时间分配(如用100km/h计算了3小时),导致最终答案错误(540km)。 | InternLM2展现了更稳健的多步推理和上下文理解能力,准确理解了“提速后行驶了2小时”这个关键点。Qwen2在此题上出现了理解偏差。 |
| 代数与逻辑 | 正确。展示了代入法或消元法的求解过程,最终得出x=4, y=3。过程清晰。 | 正确。同样展示了求解过程,答案正确。过程略显简略但无误。 | 在解二元一次方程组上,两者都具备了必要的能力,InternLM2的过程描述更详细一些。 |
| 逻辑推理 | 正确。给出了经典推理:因为每天翻倍,所以第9天覆盖一半。解释清晰。 | 正确。答案和推理过程都正确。 | 对于经典的逻辑谜题,两者都表现出了良好的推理能力。 |
数学能力小结:在这一轮,InternLM2-Chat-1.8B 略占上风。它在最关键的多步文字应用题上表现出了更准确的理解和推理能力,没有犯低级错误。Qwen2-1.5B在基础计算和逻辑题上不落下风,但在需要细致理解题目场景时出现了一次失误。
4. 编程能力实测
编程能力是开发者最关心的。我们测试模型在代码生成、代码解释和调试方面的表现。
4.1 测试题目设计
我们准备三个具有代表性的编程任务:
coding_tests = [ { "category": "代码生成", "question": "请用Python编写一个函数,接收一个整数列表作为输入,返回这个列表中所有偶数的平方组成的新列表。例如,输入[1,2,3,4,5],返回[4,16]。请包含函数定义和简单的示例调用。" }, { "category": "代码解释与优化", "question": "下面这段Python代码效率不高,请解释它做了什么,并提供一个更高效的版本。\n```python\ndef find_duplicates(nums):\n duplicates = []\n for i in range(len(nums)):\n for j in range(i+1, len(nums)):\n if nums[i] == nums[j] and nums[i] not in duplicates:\n duplicates.append(nums[i])\n return duplicates\n```" }, { "category": "算法实现", "question": "请用Python实现二叉树的层序遍历(广度优先遍历)。假设树节点定义如下:\n```python\nclass TreeNode:\n def __init__(self, val=0, left=None, right=None):\n self.val = val\n self.left = left\n self.right = right\n```\n你的函数应该返回一个列表的列表,每个子列表代表一层的节点值。" } ]4.2 执行编程测试
同样,我们使用脚本进行自动化测试。
def run_coding_tests(): """运行编程测试并打印结果""" models = ['internlm2:1.8b', 'qwen2:1.5b'] results = {model: [] for model in models} print("\n" + "="*60) print("开始编程能力测试") print("="*60) for test in coding_tests: print(f"\n【{test['category']}】") print(f"问题: {test['question'][:150]}...") # 打印问题开头 for model in models: # 对于编程问题,可以添加一个系统指令,让模型更专注于代码 system_msg = "你是一个专业的Python程序员,请提供准确、高效、可运行的代码。" answer, time_used = ask_ollama(model, test['question'], system_prompt=system_msg) results[model].append({ 'category': test['category'], 'question': test['question'], 'answer': answer, 'time': time_used }) print(f"\n {model} 回答 (耗时{time_used:.2f}s):") # 打印代码块部分或前300字符 if '```python' in answer: code_start = answer.find('```python') code_end = answer.find('```', code_start + 9) if code_end != -1: print(f" 代码片段:\n{answer[code_start:code_end+3]}") else: print(f" {answer[:300]}...") print("-"*40) return results # 运行编程测试 coding_results = run_coding_tests()4.3 编程测试结果分析与对比
同样,我们对输出结果进行人工评估:
| 测试类别 | InternLM2-1.8B 表现 | Qwen2-1.5B 表现 | 简要分析 |
|---|---|---|---|
| 代码生成 | 正确。生成了使用列表推导式[x**2 for x in lst if x%2==0]的函数,并提供了示例调用。代码简洁标准。 | 正确且更优。同样生成了正确的列表推导式。此外,它提供的示例调用更完整,包含了print语句来展示输出,对新手更友好。 | 两者都能正确完成任务。Qwen2在代码的完整性和用户体验细节上考虑得稍多一些。 |
| 代码解释与优化 | 表现良好。正确指出原代码是O(n²)时间复杂度,并提供了使用集合(set)的O(n)优化版本,代码正确。解释清晰。 | 表现优秀。不仅提供了使用集合的优化版本,还额外提到了使用collections.Counter的另一种方法,并分析了两种优化方法的空间复杂度。解释更为深入全面。 | 在这一题上,Qwen2-1.5B 展现了明显的优势。它的回答更具深度,提供了多解,体现了更强的代码分析和知识广度。 |
| 算法实现 | 基本正确。实现了使用队列的层序遍历(BFS),代码结构正确。但返回格式(列表的列表)处理上,代码可能有一些小瑕疵或不够简洁。 | 正确且稳健。实现了标准的BFS算法,清晰地处理了每层的分割(通过循环当前队列长度),返回格式完全符合要求。代码非常规范。 | 在经典的算法实现上,Qwen2再次展现了其可靠性,代码的鲁棒性和规范性更好。InternLM2能够理解题目并实现核心逻辑,但在细节处理上略有不足。 |
编程能力小结:在这一轮,Qwen2-1.5B 成功扳回一城,并显示出优势。它在代码优化、算法实现规范性和回答的深度上表现更出色,符合其“代码模型”的声誉。InternLM2-1.8B的编程能力绝对在线,能完成所有任务,但在追求最佳实践和细节完美度上稍逊一筹。
5. 总结与选择建议
经过数学和编程两轮共七个题目的详细对比,我们可以得出一些清晰的结论。
5.1 综合性能对比总结
让我们将关键发现汇总一下:
- 数学推理:InternLM2-Chat-1.8B 表现更稳定可靠。尤其在处理需要多步理解和严谨逻辑的文字应用题时,它展现了更好的准确性和鲁棒性,没有出现明显的理解错误。
- 编程能力:Qwen2-1.5B 优势明显。无论是代码生成的质量、对低效代码的深度分析和优化,还是经典算法的规范实现,Qwen2都给出了更专业、更全面、更可靠的答案,其“代码专家”的特性得到了验证。
- 响应速度与体验:在同等输入和参数设置下,两个模型的单次响应时间都在几秒之内,相差不大。Qwen2的回答往往更简洁直接,InternLM2的解释有时更详尽。
5.2 如何根据需求选择模型?
你的选择应该取决于你的主要用途:
- 如果你的主要场景是聊天、问答、内容创作、逻辑推理和分析,比如构建一个智能助手、处理文档摘要、解答知识性问题,那么InternLM2-Chat-1.8B可能是更好的选择。它在理解和遵循复杂指令、进行多步推理方面显得更扎实。
- 如果你的目标是代码相关的应用,例如代码补全、生成、解释、翻译,或者你正在学习编程,那么Qwen2-1.5B几乎是毫无疑问的更优选择。它在代码领域的表现确实配得上其口碑。
- 如果你需要超长的上下文处理能力,根据官方介绍,InternLM2-1.8B支持20万字符的上下文,这可能在某些长文档分析场景下是一个独特优势。
- 如果你追求极致的轻量化和快速启动,两者都是优秀的选择,Qwen2-1.5B参数略少一丁点,但实际体验差异不大。
5.3 最后的建议
最好的办法就是像我们今天做的一样:用你自己的真实任务去测试它们。使用Ollama,你可以轻松地在两个模型间切换。
- 使用
ollama run internlm2:1.8b和ollama run qwen2:1.5b直接进行对话测试。 - 或者,修改我们上面提供的测试脚本,加入你自己的“考题”。
实践出真知。这两个优秀的开源小模型,无疑为我们在有限资源下探索AI应用提供了强大的工具。希望这篇详细的实测对比能帮助你做出明智的选择。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。