- 大模型
- 人工智能
- 基础模型
- AI Agent
【免费下载链接】InternLM
Official release of InternLM series (InternLM, InternLM2, InternLM2.5, InternLM3).
本指南以 agent/README.md 为核心,系统讲解如何基于 InternLM2.5-Chat 强大的代码解释器与工具调用能力,使用 Lagent 框架构建智能体(Agent),并在 MATH 数学基准上完成端到端的推理与自动化评估。读完本文,你将掌握依赖环境的搭建、ReAct 智能体的构建方法、streaming_inference.py全部命令行参数的语义,以及推理结果 jsonl 文件的结构与二次评估的完整流程。
背景:InternLM2.5-Chat 的 Agent 能力
InternLM2.5-Chat 于 2024 年 6 月 30 日开源,在代码解释器(code interpreter)和通用工具调用方面的能力得到进一步提升。它具备更强、更具泛化性的指令理解、工具筛选与结果反思(reflection)能力,可以更可靠地支持复杂智能体的搭建,支持对工具进行有效的多轮调用,从而完成较复杂的任务。在配合代码解释器的条件下,InternLM2.5-Chat 在 MATH 基准上可以达到与 GPT-4 相仿的水平;基于在数理和工具方面强大的基础能力,它还提供了实用的数据分析能力。
这与 model_cards/internlm2.5_7b.md 中关于 InternLM2.5-Chat 的描述相互印证:其通过监督微调(SFT)和在线 RLHF 对齐,在指令遵循、聊天体验和函数调用(function calling)方面表现更佳,被推荐用于下游应用。
数学代码解释器上的评测结果
以下是 InternLM2.5-Chat 在 MATH 测试集上使用数学代码解释器(Tool-Integrated)的评测结果:
| 模型 | 是否集成工具 | MATH |
|---|---|---|
| InternLM2-Chat-7B | w/ | 45.1 |
| InternLM2-Chat-20B | w/ | 51.2 |
| InternLM2.5-7B-Chat | w/ | 63.0 |
| gpt-4-0125-preview | w/o | 64.2 |
可以看到,同为 7B 量级,InternLM2.5-7B-Chat 相比上一代 InternLM2-Chat-7B 提升了近 18 个百分点,体现了 Agent 范式 + 代码解释器对数学推理能力的大幅增益。需要说明的是,表中的 gpt-4-0125-preview 未集成工具,仅作为参考基线。
准备工作:安装依赖
仓库的 agent/requirements.txt 集中列出了运行 Agent 推理与评测所需的全部依赖:
pip install -r requirements.txt该文件的关键依赖及其作用如下:
lagent @ git+https://github.com/InternLM/lagent@main:核心 Agent 框架,直接从 Lagent 仓库 main 分支安装;lmdeploy>=0.2.2:LMDeploy 推理引擎后端,用于高效的流式推理与张量并行部署;datasets:用于加载 MATH、GSM8K 等 HuggingFace 数据集;jsonlines:读写 jsonl 格式的推理结果文件;sympy==1.12:用于对模型输出的数学表达式做符号化简与等价性判定;pebble:基于进程池的并发库,评估阶段用于并行计算得分;numpy、tqdm:数值运算与进度条展示;antlr4-python3-runtime==4.11.0、einops:LMDeploy 及模型运行时的配套依赖。
如果你希望直接复用文档中的 ReAct 示例代码,还需要自行安装streamlit(网页 Demo 用)以及 Lagent 对 HuggingFace 后端的可选依赖(见下文)。
用 Lagent 构建 InternLM2.5-Chat 智能体
agent/lagent.md 给出了 Lagent 的基本用法。Lagent 是一个轻量级、开源的基于大语言模型的智能体框架,支持快速将一个大语言模型转变为多种类型的智能体,并提供了一些典型工具(如搜索引擎、Python 解释器)为模型赋能。
安装 Lagent
通过 pip 安装(推荐):
pip install lagent如果你希望修改框架源码,也可以从源码安装:
git clone https://github.com/InternLM/lagent.git cd lagent pip install -e .注意:若需要运行 HuggingFace 模型(
HFTransformer),请先执行pip install -e .[all]安装完整依赖。
构建一个 ReAct 智能体
下面的示例演示了如何用 InternLM2.5-Chat 构建一个同时具备搜索引擎和 Python 解释器能力的 ReAct 智能体:
# 导入 lagent 库中必要的模块与类 from lagent.agents import ReAct from lagent.actions import ActionExecutor, GoogleSearch, PythonInterpreter from lagent.llms import HFTransformer # 初始化基于 HFTransformer 的大语言模型,并指定模型名称 llm = HFTransformer('internlm/internlm2_5-7b-chat') # 初始化 Google 搜索工具,并传入你的 API Key search_tool = GoogleSearch(api_key='Your SERPER_API_KEY') # 初始化 Python 解释器工具 python_interpreter = PythonInterpreter() # 通过配置 ReAct agent 创建聊天机器人 chatbot = ReAct( llm=llm, # 传入大语言模型实例 action_executor=ActionExecutor( actions=[search_tool, python_interpreter] # 指定聊天机器人可执行的动作 ), ) # 向聊天机器人提出一个 LaTeX 格式的数学问题 response = chatbot.chat('若$z=-1+\sqrt{3}i$,则$\frac{z}{{z\overline{z}-1}}=\left(\ \ \right)$') # 打印聊天机器人的回答 print(response.response) # 输出智能体生成的回答 >>> $-\frac{1}{3}+\frac{\sqrt{3}}{3}i$该示例清晰展示了 Lagent 的三层组合方式:llm负责生成推理与决策、ActionExecutor统一调度工具、actions列表声明可用工具集合。模型内部以 ReAct(Reasoning + Acting)循环的方式,交替输出自然语言推理和工具调用指令。
运行 ReAct 网页 Demo
Lagent 还提供了一个基于 Streamlit 的网页版交互 Demo,可方便地在浏览器中体验智能体对话:
# 需要先安装 streamlit # pip install streamlit streamlit run examples/react_web_demo.pystreaming_inference.py:全参数解析
agent/streaming_inference.py 是本仓库的核心推理与评估脚本。其逻辑源于 Microsoft 的 ToRA 项目(脚本头部有版权声明),通过 Lagent 的Internlm2Agent驱动模型在 MATH 测试集上"逐步推理 + 编写并执行 Python 代码"来解题。
脚本通过argparse定义了以下参数(定义见 参数解析入口):
| 参数 | 默认值 | 说明 |
|---|---|---|
--backend | lmdeploy | 使用的推理框架,可选lmdeploy或hf(HuggingFace Transformers) |
--model_path | internlm/internlm2-chat-7b | 模型路径或 HuggingFace 模型标识符 |
--output_path | (必填) | 推理结果保存路径,必须是jsonl文件 |
--batch_size | 100 | Agent 推理的批大小,脚本按此切分 MATH 测试集分批处理 |
--max_turn | 5 | 智能体与环境之间最大交互轮数,即"推理-调用工具-拿到结果"的循环次数上限 |
--tp | 1 | 张量并行(Tensor Parallelism)数,在 LMDeploy 后端下可能需要调整 |
--temperature | 0.1 | 下一个 token 预测的温度参数 |
--top_p | 0.8 | Top-P 采样概率阈值 |
--top_k | 40 | Top-K 采样候选数 |
--stop_words | ['<\|action_end\|>', '<\|im_end\|>'] | 停止词列表,遇到这些 token 即停止生成,可多次追加 |
--max_new_tokens | 512 | 单次生成的最大新 token 数 |
--do_infer/--no-do_infer | True | 是否启动模型推理;已准备好结果文件时可关闭(BooleanOptionalAction,需 Python > 3.8) |
--do_eval | False | 是否对推理结果进行评估 |
--overwrite | False | 是否覆盖已存在的结果文件 |
源码级说明:这些采样参数(temperature、top_p、top_k、stop_words、max_new_tokens)会在init_agent中被透传给底层模型实例;而batch_size、max_turn则分别控制数据集的分批处理规模和 Agent 的单题最大交互轮数,直接决定推理耗时与解题成功率之间的权衡。--stop_words使用action='append',意味着可重复传入多个停止词。
在 MATH 测试集上推理并评估
完整流程:推理 + 评估
运行以下脚本,即可在 MATH 测试集上执行推理并在结束后自动评估:
python streaming_inference.py \ --backend=lmdeploy \ # 对于 HuggingFace 模型使用 hf --model_path=internlm/internlm2_5-7b-chat \ --tp=1 \ --temperature=1.0 \ --top_k=1 \ --output_path=math_lmdeploy.jsonl \ --do_eval注意:--top_k=1与--temperature=1.0组合时生成接近贪心解码(每次只取概率最高 token),有利于评测的可复现性。
内部执行流程:从数据加载到结果落盘
从 预测主流程 可以看到,脚本内部按以下步骤工作:
- 加载
lighteval/MATH数据集的test分片; - 对每条样本做预处理:记录
idx,将problem复制为query,并从官方solution中通过正则提取标准答案gt(例如提取\boxed{...}中的内容); - 通过
init_agent构建Internlm2Agent实例,批式调用agent.batch_chat解题; - 把每一步的
steps(包含 language 推理、tool 调用、environment 返回)写入 jsonl 文件,并从最后一步 language 内容中提取pred; - 每批处理结束后调用
agent._interpreter_executor.actions['IPythonInteractiveManager'].reset()重置解释器环境,避免状态串扰; - 任何异常都会被捕获并记录到该样本的
error字段,保证整个测试集不会因单题失败而中断。
关键源码:Agent 与后端的初始化
init_agent(见 agent/streaming_inference.py#L507-L535)展示了两种后端的构建方式:
- lmdeploy 后端:使用
LMDeployPipeline,配合INTERNLM2_META元模板与TurbomindEngineConfig(tp=tp)配置张量并行; - hf 后端:使用
HFTransformer,同样绑定INTERNLM2_META。
无论哪种后端,最终都封装为Internlm2Agent,其protocol=Internlm2Protocol(meta_prompt=None, interpreter_prompt=DEFAULT_PROMPT)中,DEFAULT_PROMPT就是引导模型"逐步推理并编写 Jupyter 代码解题、最终用\boxed{}输出 LaTeX 结果"的系统提示(定义于 agent/streaming_inference.py#L48-L54);interpreter_executor则挂载了支持多进程并发的IPythonInteractiveManager(max_workers=200)作为代码执行环境。
输出文件格式:jsonl 逐行结构
--output_path指定的jsonl文件每一行是一条样本的完整推理记录,形如:
{ "problem": "The midpoint of the line segment between $(x,y)$ and $(2,4)$ is $(-7,0)$. Find $(x,y)$.", "level": "Level 3", "type": "Algebra", "solution": "Applying the midpoint formula gives $$\\left(\\frac{2+x}{2},\\frac{4+y}{2}\\right)=(-7,0).$$Solving $\\frac{2+x}{2}=-7$ for $x$ and $\\frac{4+y}{2} = 0$ for $y$ we find $(x,y)$ to be $\\boxed{(-16,-4)}$.", "idx": 306, "query": "The midpoint of the line segment between $(x,y)$ and $(2,4)$ is $(-7,0)$. Find $(x,y)$.", "gt": "(-16,-4)", "pred": [ "(-16,-4)" ], "steps": [ { "role": "language", "content": "To find the coordinates of the point $(x,y)$, we can use the midpoint formula. The midpoint $M$ of a line segment with endpoints $(x_1, y_1)$ and $(x_2, y_2)$ is given by:\n\n\\[M = \\left(\\frac{x_1 + x_2}{2}, \\frac{y_1 + y_2}{2}\\right)\\]\n\nGiven that the midpoint is $(-7,0)$ and one endpoint is $(2,4)$, we can set up equations to solve for $x$ and $y$.\n\nLet's start by setting up the equations based on the midpoint formula:\n\n\\[\\frac{x + 2}{2} = -7\\]\n\\[\\frac{y + 4}{2} = 0\\]\n\nNow, let's solve these equations using Python to find the values of $x$ and $y$." }, { "role": "tool", "content": { "name": "AsyncIPythonInteractiveManager", "parameters": { "command": "```python\nfrom sympy import symbols, Eq, solve\n\n# Define symbols\nx, y = symbols('x y')\n\n# Define equations based on the midpoint formula\neq1 = Eq((x + 2)/2, -7)\neq2 = Eq((y + 4)/2, 0)\n\n# Solve equations\nsolution = solve((eq1, eq2), (x, y))\n\nsolution\n```" } }, "name": "interpreter" }, { "role": "environment", "content": "{x: -16, y: -4}", "name": "interpreter" }, { "role": "language", "content": "After solving the equations, we find that the coordinates of the point $(x,y)$ are $(-16, -4)$. Therefore, the solution to the problem is:\n\n\\[\\boxed{(-16, -4)}\\]" } ], "error": null }这段记录完整还原了一次典型的"工具增强"推理链:
- language 步骤:模型用自然语言阐述解题思路;
- tool 步骤:模型以 JSON 形式请求调用
interpreter,命令体是一段调用 sympy 求解方程的 Python 代码; - environment 步骤:代码解释器实际执行后返回
{x: -16, y: -4}; - language 步骤:模型基于执行结果组织最终回答,并用
\boxed{(-16,-4)}输出标准答案。
这也印证了前面的结论:InternLM2.5-Chat 的数学能力提升,关键并不在于"死记答案",而在于它能够自主生成可执行的代码、读取解释器的执行结果并据此推理反思。
跳过推理、直接评估
如果已经生成了上述格式的结果文件,无需重新推理,直接评估即可:
python streaming_inference.py \ --output_path=math_lmdeploy.jsonl \ --no-do_infer \ --do_eval从 主入口逻辑 可以看到两个值得注意的细节:
- 若结果文件已存在且未指定
--overwrite,脚本会自动把do_infer置为False,并提示"如需覆盖请加--overwrite标志"; - 若同时指定了推理与评估,脚本会通过
subprocess以--no-do_infer --do_eval重新调用自身来完成评估,保证两个阶段职责分离。
评估原理:数值相等与符号相等
评估环节调用math_equal(见 agent/streaming_inference.py#L372-L451),其"判定两答案相等"的核心逻辑值得展开:
- 数值相等:若预测与标准答案都能转为浮点数,则先做
isclose相对误差比较(默认容差1e-4);若开启include_percentage,还会把标准答案的 1/100、1 倍、100 倍三种形态都纳入比较,兼容百分比表述差异; - 文本规范化相等:对字符串做去括号、去空白等规范化后比较;
- 符号相等:分别尝试
parse_latex(解析 LaTeX)与parse_expr(解析 Python 表达式),然后通过 sympy 的simplify(a - b) == 0判断两个表达式是否恒等;若简化失败,再退化为数值近似比较(rel_tol=1e-3); - 超时保护:
symbolic_equal在超时选项开启时会放入独立进程执行并限制 1 秒超时(见call_with_timeout),防止个别表达式化简卡死主流程。
评估输出会汇总Num samples、Num scores、Sum scores、Timeout samples、Empty samples、Mean score,并按type(如 Algebra、Geometry 等)输出分题型得分。
补充范式:PAL(Program-Aided Language Models)
仓库中的 agent/pal_inference.py 提供了另一种"让模型写代码解题"的经典范式——PAL。与 Agent 的"推理 + 工具调用 + 反思"不同,PAL 由模型一次性生成完整的solution()函数代码,再交给 Python 解释器执行得到答案,更适合 GSM8K 这类直接求解的题目:
python pal_inference.py \ <model> \ <out_dir> \ [--dataset <dataset>] \ [--max_length <length>] \ [--top_p <threshold>] \ [--eoh <end token>] \ [--eoa <end token>] \ [--eos <end token>] \ [--temperature <temp>] \ [--time_out <time>] \ [--verbose, -v] \ [--append, -a]其中--max_length默认 2048,--top_p默认 0.8,--temperature默认 1.0,--time_out默认 100 秒(执行代码的超时上限)。其在 GSM8K 上对 InternLM-Chat-7B 的带工具/不带工具评测对比为:不使用工具 34.5,使用工具 39.2,展示了程序化求解对数学推理的稳定增益。完整参数说明可参考 agent/pal_inference_zh-CN.md。
小结与建议
围绕 agent/README.md 的技术主线,本文完整覆盖了:InternLM2.5-Chat 的 Agent 与代码解释器能力背景、Lagent 框架的安装与 ReAct 智能体构建、streaming_inference.py的每个命令行参数、MATH 推理与评估的完整执行链路,以及 jsonl 结果文件的结构解析。几个实战要点总结如下:
- 后端选择:追求吞吐与多卡部署优先
lmdeploy,需要原生 Transformers 生态兼容时选择hf; - 采样配置:评测场景建议使用确定性较高的采样参数(如
--top_k=1)以获得可复现结果,探索性场景再放开温度; - 断点续跑:结果文件已存在时脚本默认跳过推理,可用
--overwrite强制重新推理,避免重复耗时; - 结果复用:jsonl 文件包含完整 steps,既是评测数据,也是分析模型工具调用行为的第一手素材。
后续可进一步结合 model_cards 中的各模型卡片,尝试在 InternLM2.5-20B-Chat 等更大规模模型上复现评测,观察规模与工具调用能力的关系;也可以基于同样的 Agent 框架,为智能体扩展更多自定义工具以覆盖数据分析、网页检索等更复杂的任务场景。
- 大模型
- 人工智能
- 基础模型
- AI Agent
【免费下载链接】InternLM
Official release of InternLM series (InternLM, InternLM2, InternLM2.5, InternLM3).
相关推荐
AI-Researcher 数学推理评测指南:在 MATH-500 上运行 DeepSeek-Chat 推理与自动评分
AI Researcher 数学推理评测指南:在 MATH 500 上运行 DeepSeek Chat 推理与自动评分 本指南面向希望复现 AI Researc
人工智能大模型AI Agent自主智能体深度研究Agent 工作流科研AI 评测Lagent 智能体框架接入 InternLM-Chat-7B-V1.1:基于 ReAct 与 Python 解释器插件的数学问题求解实战
Lagent 智能体框架接入 InternLM Chat 7B V1.1:基于 ReAct 与 Python 解释器插件的数学问题求解实战 《开源大模型食用指南
大模型人工智能教程本地部署微调Agent Arena:LLM智能体对战平台与评估体系
Agent Arena:LLM智能体对战平台与评估体系 Agent Arena是一个先进的LLM智能体对战平台,采用现代化的前后端分离架构,集成了实时对战、评估
人工智能大模型模型评测工具调用AI AgentAgent 评测RAG微调
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考